# Sistema de dirección



# Esquema

[![Captura de pantalla 2025-04-07 185906.png](https://wiki.racarla.es/uploads/images/gallery/2025-09/scaled-1680-/captura-de-pantalla-2025-04-07-185906.png)](https://wiki.racarla.es/uploads/images/gallery/2025-09/captura-de-pantalla-2025-04-07-185906.png)

# Electrónica

La electrónica del sistema de dirección está ubicado en la parte frontal del vehículo. Como podemos observar, se encuentra dentro de la caja metálica indicada en la imagen.

[![photo_2023-12-14_15-47-00.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/photo-2023-12-14-15-47-00.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/photo-2023-12-14-15-47-00.jpg)

  
  
La caja del steering controller tiene varios cables de entrada y salida estos se resumen en 4 grupos:

Grupo 1:

- Encoder Motor DC (Bristish Encoder Product Company Modelo 15/T/HV PPR 1000)

Grupo 2:

- Motor DC (Koyo Seiko NO 45262??8)

Grupo 3:

- 48V Filtrados
- 24V
- Cable RS-232 configuración del driver (CONECTOR DB9 - PIN 3 RX VERDE, PIN 2 AMARILLO, PIN 5 GND MARRÓN)

Grupo 4:

- Cable BUS CAN
- Encoder Dirección
- Endstops Dirección (para limitar el rango de la dirección)

[![photo_2023-12-14_15-47-11.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/photo-2023-12-14-15-47-11.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/photo-2023-12-14-15-47-11.jpg)

[![SteeringController_EsquemaGeneral-GENERAL_SCHEMATIC.drawio.png](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/steeringcontroller-esquemageneral-general-schematic-drawio.png)](https://wiki.racarla.es/uploads/images/gallery/2025-04/steeringcontroller-esquemageneral-general-schematic-drawio.png)

  
**Grupo 1 y 2** actuan en conjunto:

***Motor DC***

Koyo Seiko NO 45262??8

[![8PW1744047006147.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/8pw1744047006147.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/8pw1744047006147.jpg)

***Encoder Motor DC***

Bristish Encoder Products Company

Modelo 15/T/HV PPR 1000

Cableado:

<table border="1" id="bkmrk-black-0-volts-%28gnd%29-" style="border-collapse: collapse; width: 100%; height: 273.766px; border-width: 1px;"><colgroup><col style="width: 50.0618%;"></col><col style="width: 50.0618%;"></col></colgroup><tbody><tr style="height: 35.3906px;"><td style="height: 35.3906px;">BLACK</td><td style="height: 35.3906px;">0 Volts (GND)

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">WHITE</td><td style="height: 29.7969px;">VCC (+5V)</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">BROWN</td><td style="height: 29.7969px;">CH A</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">RED</td><td style="height: 29.7969px;">CH B</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">ORANGE</td><td style="height: 29.7969px;">CH Z</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">YELLOW</td><td style="height: 29.7969px;">CH -A</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">GREEN</td><td style="height: 29.7969px;">CH -B</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">BLUE</td><td style="height: 29.7969px;">CH -Z</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">SCREEN</td><td style="height: 29.7969px;">CASE GROUND</td></tr></tbody></table>

[![1744047006155_mod.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/1744047006155-mod.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/1744047006155-mod.jpg)

***Grupo 4***:

***ENDSTOP DIRECCIÓN***

<table border="1" id="bkmrk-derecha-gnd-none-%28nc" style="border-collapse: collapse; width: 100%; border-width: 1px;"><colgroup><col style="width: 33.2335%;"></col><col style="width: 33.2335%;"></col><col style="width: 33.2335%;"></col></colgroup><tbody><tr><td>DERECHA</td><td>GND</td><td>NONE (NC)</td></tr><tr><td>RIGHT</td><td>  
</td><td>ROJO (NO)</td></tr><tr><td>IZQUIERDA </td><td>GND</td><td>NONE (NC)</td></tr><tr><td>LEFT</td><td>  
</td><td>AMARILLO (NO)</td></tr></tbody></table>

[![SteeringController_EsquemaGeneral-ENDSTOP.drawio.png](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/steeringcontroller-esquemageneral-endstop-drawio.png)](https://wiki.racarla.es/uploads/images/gallery/2025-04/steeringcontroller-esquemageneral-endstop-drawio.png)

***ENCODER CAN DIRECCIÓN***

Bristish Encoder Products Company

Modelo <span style="text-decoration: underline;">SA36H Single Turn Absolute (01 o 04) POR CONFIRMAR</span> SF 12-V3-P1-C1-A EMK

<table border="1" id="bkmrk-negro-gnd-blanco-vcc" style="border-collapse: collapse; width: 100%; border-width: 1px;"><colgroup><col style="width: 33.2335%;"></col><col style="width: 33.2335%;"></col><col style="width: 33.2335%;"></col></colgroup><tbody><tr><td>NEGRO</td><td>GND</td><td>  
</td></tr><tr><td>BLANCO</td><td>VCC (12V o 24V)</td><td>Lo más seguro 24V</td></tr><tr><td>AMARILLO</td><td>CAN H (CNH)</td><td>BUS CAN CONECTOR NEGRO TRASERO </td></tr><tr><td>VERDE</td><td>CAN L (CNL)</td><td>BUS CAN CONECTOR NEGRO TRASERO</td></tr><tr><td>MARRÓN</td><td>GND CAN (GNDI)</td><td>BUS CAN CONECTOR NEGRO TRASERO</td></tr></tbody></table>

[![1744047006183_mod.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/1744047006183-mod.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/1744047006183-mod.jpg)

[![1744047006173.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/1744047006173.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/1744047006173.jpg)

  
  
***CONTROLADOR DIRECCIÓN DZCANTE-020L080***  
  
  
[![motor_driver.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/motor-driver.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/motor-driver.jpg)[![photo_2023-12-14_15-47-04.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/photo-2023-12-14-15-47-04.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/photo-2023-12-14-15-47-04.jpg)  
[![1744047006191_rot.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/1744047006191-rot.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/1744047006191-rot.jpg)

<table border="1" id="bkmrk-ma-mot-dc-dir-%2B-%28roj" style="border-collapse: collapse; width: 100%; border-width: 1px;"><colgroup><col style="width: 50.0618%;"></col><col style="width: 50.0618%;"></col></colgroup><tbody><tr><td>MA

</td><td>MOT DC DIR + (ROJO)</td></tr><tr><td>MB</td><td>NONE</td></tr><tr><td>MC</td><td>MOT DC DIR - (NEGRO)</td></tr><tr><td>GND</td><td>NONE</td></tr><tr><td>GND</td><td>GND 48V FILT (NEGRO)</td></tr><tr><td>HVIN</td><td>POS 48V FILT (ROJO)</td></tr><tr><td>GND</td><td>VOUT- TRACO DC-DC 5V</td></tr><tr><td>5VIN</td><td>VOUT+ TRACO DC-DC 5V</td></tr><tr><td>GND</td><td>NONE</td></tr><tr><td>PAI1-</td><td>NONE</td></tr><tr><td>PAI1</td><td>NONE</td></tr><tr><td>GND</td><td>DB9 RS-232 (MARRÓN) PIN 5 GND</td></tr><tr><td>PDO1</td><td>NONE</td></tr><tr><td>PDO2</td><td>NONE</td></tr><tr><td>PDO3</td><td>NONE</td></tr><tr><td>GND</td><td>NONE</td></tr><tr><td>PDI1</td><td>NONE</td></tr><tr><td>PDI2</td><td>END STOP DIR LEFT (AMARILLO)</td></tr><tr><td>PDI3</td><td>END STOP DIR RIGHT (ROJO)</td></tr><tr><td>GND</td><td>END STOP DIR GND (AZUL Y MARRÓN)</td></tr><tr><td>PDI4-</td><td>NONE</td></tr><tr><td>PDI4</td><td>NONE</td></tr><tr><td>PDI5-</td><td>NONE</td></tr><tr><td>PDI5</td><td>NONE</td></tr><tr><td>RX</td><td>DB9 RS-232 (VERDE) PIN 3 RX</td></tr><tr><td>TX</td><td>DB9 RS-232 (AMARILLO) PIN 2 TX</td></tr><tr><td>GNDI (CAN GND)</td><td>ENC CAN DIR GND (MARRÓN) + CABLE COM CAN CONECTOR NEGRO TRASERO</td></tr><tr><td>CNL (CAN L)</td><td>ENC CAN DIR CAN L (VERDE) + CABLE COM CAN CONECTOR NEGRO TRASERO</td></tr><tr><td>CNH (CAN H</td><td>ENC CAN DIR CAN H

(AMARILLO) + CABLE COM CAN CONECTOR NEGRO TRASERO

</td></tr><tr><td>H-A</td><td>NONE</td></tr><tr><td>H-B</td><td>NONE</td></tr><tr><td>H-C</td><td>NONE</td></tr><tr><td>ENI-</td><td>ENC MOT DC - CH -Z (AZUL)</td></tr><tr><td>ENI</td><td>ENC MOT DC - CH Z (NARANJA)</td></tr><tr><td>ENB-</td><td>ENC MOT DC - CH -B (VERDE)</td></tr><tr><td>ENB</td><td>ENC MOT DC - CH B (ROJO)</td></tr><tr><td>ENA-</td><td>ENC MOT DC - CH -A (AMARILLO)</td></tr><tr><td>ENA</td><td>ENC MOT DC - CH A (MARRÓN)</td></tr><tr><td>GND</td><td>ENC MOT DC - GND (NEGRO)</td></tr><tr><td>5V-O</td><td>ENC MOT DC - VCC (5V) (BLANCO)</td></tr></tbody></table>

***CONVERTIDOR DC-DC***

Modelo TRACO POWER TEN 15-2411WI

Este controlador también necesita un convertidor DC-DC para ser alimentado a 5V, este está alimentado a los 24V que entran en la caja y está conectado a la entrada 5IN y GND.

[  
![1744047006200_mod.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-04/scaled-1680-/1744047006200-mod.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-04/1744047006200-mod.jpg)

# Introducción



# Conversión del proyecto de ROS 1 a ROS 2

### Análisis inicial del proyecto rbcar\_steering\_controller (enfoque hardware)

A alto nivel, este paquete ROS controla el giro (steering) de un vehículo (Rbcar) usando:

- Un variador/drive de motor (AMC DZCANTE-020L080) controlado por CANopen para mover el actuador de dirección en modo posición.
- Un encoder absoluto EPC (familia MA) conectado también por CANopen para medir el ángulo real de la dirección.
- Una tarjeta CAN PEAK (PCAN) como interfaz física con el bus CAN.

A continuación desgloso los bloques de hardware y cómo se integran:

#### 1) Bus CAN y hardware de comunicaciones

- Interfaz: PEAK PCAN (usuarios típicamente PCAN-PCI, PCAN-USB, etc.). En el launch se usa el dispositivo “/dev/pcanpci1”; por defecto en código “/dev/pcan32”.
- Velocidad: 1 Mbit/s (CAN\_BAUD\_1M).
- Librerías: libpcan (PCan.h/PCan.cc) para abrir y configurar el canal, y enviar/recibir tramas CAN.
- Protocolo: CANopen “ligero” implementado manualmente, sin stack externo. Se envían NMT (Start, Stop, Reset Comm/Node), SDO (objetos de configuración/lectura) y PDOs (tramas de proceso).
- Mecanismo de supervisión: Node Guard/Heartbeat (cíclicamente se lanza un RTR a 0x700+NodeID y se comprueba el estado; si no hay respuesta dentro de NMT\_TIMEOUT=2s se considera fallo de comunicación).

#### 2) Drive de motor: AMC DZCANTE-020L080

- Función: accionar el actuador de dirección en modo posición (Position Mode).
- Nodo CAN: ID configurable (por defecto can\_motor\_id=1).
- Clase base **Dzcante020l080**.\* encapsula objetos CAN (índices SDO/PDO) para este drive: 
    - ControlWord (0x6040) con comandos: ENABLE\_OP, SHUTDOWN, SWITCH\_ON, QUICK\_STOP, DISABLE\_VOLT, RESET.
    - Modos de operación (0x6060) = Position/Velocity/Home.
    - RPDO y TPDO: configuración de COB-IDs y modos de transmisión (objetos 0x140x/0x180x y similares).
    - Lecturas: StatusWord (0x6041), Drive Status extendido (0x2002 subíndices 1..6), posición (0x6064), velocidad (0x60FF), corriente (0x6077), tensión bus DC (0x200F.01).
- Clase **MotorDrive**.\* añade: 
    - State machine interna (INIT/READY/EMERGENCY...) y comunicación (OPERATIONAL/FAULT...).
    - Hilos auxiliares: 
        - ControlCommunicationThread: envía Node Guard y vigila tiempos para marcar FAULT si no hay respuesta.
        - ReadSDOMessagesThread: lectura cíclica de Drive Status, tensión del bus, entradas digitales, posición actual, etc., y cálculo de medias.
    - Configuración CAN: 
        - Reset/Preoperational, setting de Node Guard (Guard Time 0x100C, Life Factor 0x100D), Event Action (0x2065.21), Recovery Time, TPDOs/RPDOs para posición/velocidad.
    - Gestión de estados de variador: dsDesiredStatus vs dsStatus. Cambia de estados enviando ControlWord con tiempos de guarda.
    - Señales de diagnóstico: descompone StatusWord y 0x2002.\* en flags con máscaras y temporizadores para logging-control.
- Clase **MotorPosition**.\* especializa a Position Mode: 
    - Inicialización: secuencia ControlWord (Disable Voltage, Shutdown, Switch On, Enable Operation) y lectura de modo operación.
    - Homing: soportado (START\_HOME / STOP\_HOME), flags de homing completo y cambio a modo posición.
    - SetMotorPosition: envía objetivo vía RPDO21 (POSITION\_PDO\_MSG) en cuentas (counts).

#### 3) Encoder absoluto EPC (familia MA) por CANopen

- Función: medir posición de la dirección en cuentas absolutas.
- Nodo CAN: por defecto can\_encoder\_id=0x7F.
- Clase **EpcMaCanOpen**.\* maneja NMT/SDO/PDO básicos para estos encoders (IDs TPDO1 0x180+ID, TPDO2 0x280+ID).
- Clase **EpcEncoder**.\*: 
    - State machine similar (OPERATIONAL/FAULT...).
    - Hilo de comunicación para Node Guard.
    - Procesa TPDO1/TPDO2 con cuentas del encoder (encoder\_counts).
- El nodo de alto nivel convierte estas cuentas a ángulo mediante una calibración lineal.

#### 4) Nodo ROS de control de dirección

- Binario: rbcar\_steering\_controller.cpp.
- Flujos: 
    - Parametrización vía ROS params y YAML (config/config.yaml): rangos de encoder, zero, resolución, calibración lineal (y=Ax+B), límites angulares y puntos extremos.
    - Inicializa PCan (a 1M), crea objetos MotorPosition (drive) y EpcEncoder (encoder) con sus IDs y desired\_freq (50 Hz).
    - start(): Setup y Start de ambos (abre CAN, setea, pone OPERATIONAL, lanza hilos).
    - Loop spin(): a 50 Hz: 
        - Envío SYNC (0x80).
        - Lectura de hasta 100 mensajes CAN y dispatch a Motor/Encoder para proceso (PDO/SDO/NMT/EMCY).
        - Publicación del estado: SteeringControllerStatus (estado motor+encoder, cuentas abs y motor, posición angular).
    - Suscripciones: 
        - command\_position\_counts (std\_msgs/Int32): manda counts al motor (posición absoluta en cuentas del motor).
        - command\_angle (std\_msgs/Float64): convierte ángulo deseado a cuentas absolutas y luego a cuentas de motor según relación abs\_to\_motor, y envía referencia de posición al drive.
    - Servicio: 
        - set\_motor\_status (SetMotorStatus.srv): permite fijar estado del drive: OPERATION\_ENABLED, QUICK\_STOP, READY\_TO\_SWITCH\_ON.
    - Diagnósticos: 
        - diagnostic\_updater reporta estado de comunicación y estado del drive, y supervisa frecuencia de comandos.

Qué tener en cuenta para replicar:

- **Calibración mecánica**: el YAML aporta relación entre encoder absoluto y cuentas del motor, y los extremos físicos. Esto es clave para que el comando en rad -&gt; counts funcione correctamente.
- La variable abs\_to\_motor se calcula como motor\_counts\_range / abs\_counts\_range. Debes medir ambos rangos en tu mecánica y actualizar config.yaml.
- value\_calibrate\_a y value\_calibrate\_b definen la recta ángulo = -a\*counts + b. Ajustarlos a tu encoder y cinemática.
- Límites de ángulo: extrem\_angle\_left/right y sus points asociados (extrem\_points\_left/right) fijan saturaciones de seguridad.

#### 5) Resumen de la secuencia de arranque/operación

1. PCan abre el dispositivo y configura el bitrate.
2. MotorDrive: 
    - Reset CAN Comm -&gt; Preoperational
    - Configura PDOs/Node Guard/Eventos
    - Init drive (ControlWord sequence), lee modo operación
    - Start Communication (NMT Start), pasa a OPERATIONAL
    - Lanza hilos de Node Guard y lecturas SDO periódicas
3. EpcEncoder: 
    - Reset/Preoperational
    - (En este código no reconfigura PDOs del encoder)
    - Start Communication a OPERATIONAL
    - Lanza hilo de Node Guard
4. Bucle 50 Hz: 
    - Envía SYNC
    - Lee paquetes CAN y los distribuye
    - Publica estado (counts + angle)
5. Comandos: 
    - command\_angle -&gt; se traduce a counts del encoder y luego a counts del motor y se envía la posición al drive por RPDO21.

#### 6) Señales CAN-clave y mapeo rápido

- NMT (ID 0x000): Start 0x01, Stop 0x02, Reset Comm 0x82, Reset Node 0x81, Preop 0x80 (DATA\[0\]=cmd, DATA\[1\]=node).
- Node Guard RTR a 0x700+NodeID, respuesta en 0x700+NodeID con estado (OPERATIONAL=0x05/0x85, PREOP=0x7F/0xFF, STOPPED=0x04/0x84).
- SYNC: 0x80 sin datos.
- Drive: 
    - SDO server 0x600+ID (Write/Read a objetos 0x6040 ControlWord, 0x6060 Mode, 0x607A Position, 0x60FF Velocity, 0x2002 Drive Status, 0x200F.01 DC Bus, 0x6064 Position actual).
    - RPDO21 (0x280+ID) para consigna de posición (4 bytes little-endian).
    - TPDO1/21/22 para StatusWord/Position/Velocity según configuración.
- Encoder EPC: 
    - TPDO1 (0x180+ID) / TPDO2 (0x280+ID): se usan los 2 bytes bajos como cuentas (el código así lo interpreta).
    - Node Guard/Heartbeat igual que el drive.

#### 7) Qué adaptar en tu nuevo proyecto (hardware)

- Si cambias: 
    - Interfaz CAN: sustituye PCan.\* por tu driver y conserva la API Send/Read/Setup/Configure.
    - Drive: si el drive no es AMC DZCANTE-020L080, necesitarás: 
        - Revisar/actualizar índices SDO, COB-IDs, TPDO/RPDO, escalados, y status words.
        - Ajustar secuencias de ControlWord y modos de operación.
    - Encoder absoluto: si otro fabricante/protocolo, cambiar mapeo de TPDOs y cómo se extraen cuentas.
    - Mecánica: recalibrar config.yaml para rangos, cero y linealización ángulo–cuentas.
- Mantener: 
    - Supervisión de comunicación (Node Guard/Heartbeat) o migrar a Heartbeat puro si tus nodos no usan Node Guard clásico.
    - Seguridad: QUICK\_STOP y manejo de fallos del drive.

[![photo_2025-10-13_08-33-26.jpg](https://wiki.racarla.es/uploads/images/gallery/2025-10/scaled-1680-/photo-2025-10-13-08-33-26.jpg)](https://wiki.racarla.es/uploads/images/gallery/2025-10/photo-2025-10-13-08-33-26.jpg)