Programas de Control mediante Joystick
Objetivos
A fin de disponer de un modo simple de probar la plataforma móvil se desarrollaron diferentes programas para controlar el vehículo mediante un joystick comandando directamente las velocidades de ambos motores mediante los ejes (controles) del joystick.
Desarrollo
Los programas desarrollados son los siguientes:
Control. PWM a 14KHz y 8-bits, UART 9600bps 8N1. Primer programa de control con 8-bits de resolución del PWM.
Control. PWM a 20KHz y 12-bits, UART 38400bps 8N1. Siminar al anterior con modificación de la señal del PWM.
Control y lectura de encoders. Se agregó decodificación de encoders y petición y reset de cuenta desde la PC.
Control lazo cerrado con trama ASCII y lectura de encoders. Se modificó la trama para enviar una referencia signada y cerrar el lazo mediante un control Proporcional (Kp).
El código fuente de los programas se encuentran en =//champaqui/DesarrollosCIII/plataforma_movil/control_joystick/= (=$ctrl_joy)
Se muestran a continuación las diferentes versiones en la que ha ido evolucionando el software de control de la plataforma móvil.
Software PC
Del lado de la PC se necesita poder manejar el puerto serie para la comunicación con el uC ARM y el Joystick USB.
Para el Joystick USB se utiliza la librería "Joystick Wrapper Library" libjsw2 (libjsw-dev: headers files). Para gnome existe la aplicación "jscalibrator" que hace uso de libjsw para calibrar el Joystick que genera un archivo de calibración generalmente en ~/.joystick.
En en caso del puerto serial se uso en algunos programas el manejo director de la interfaz termios (termios.h) en Linux, que es compatible con cualquier sistema POSIX [1]; y en otros programas la librería LibSerial [2] (la cual hace uso de termios) que es una colección de clases C++ tipo objetos iostream.
1) Tracción - PWM con 8 bits
Se envian comandos de velocidad a los motores Izquierdo y Derecho con una referencia para el PWM de 8-bits de ancho.
ARM
El programa configura un PWM para cada llaveH/motor con una frecuencia de 14KHz y 0-255 de cuenta (8-bits), donde un valor de cuenta de 128 corresponde a un ciclo de trabajo del PWM de 50%. Se utiliza la UART del uC a 9600bps en configuración 8N1.
La trama recibida tiene el siguiente formato:
0xFF |
motor speed 1 |
motor speed 2 |
El código del programa para el ARM se encuentra en =$ctrl_joy/ARM/pwm_8bits/=
PC
==- joyLR8b:== Control motor izq. y der. con cada eje del joystick
==- joySteer8b:== Control de velocidad lineal y dirección con cada eje del joystick
El código fuente y binario se encuentra en =$ctrl_joy/PC/pwm_8bits/=
Para compilar el programa se debe ejecutar:
gcc -o joyLR8b joyLR8b.c -ljsw
2) Tracción - PWM con 12 bits
ARM
Configura el PWM para trabajar con 12-bits de ancho con una frecuencia de 20KHz y la UART a 38400bps 8N1. Los valores de referencia del PWM van de 0-3000 con 1500 para un ciclo de trabajo de 50%. Se utiliza la UART del uC a 38400bps en configuración 8N1.
La trama recibida tiene el siguiente formato:
byte1 |
byte2 |
byte3 |
byte4 |
byte5 |
0xFF |
00xxxxxx |
00xxxxxx |
00xxxxxx |
00xxxxxx |
donde los 12 bits de las velocidades de ambos motores se envian de a 6 bits.
El código del programa para el ARM se encuentra en =$ctrl_joy/ARM/pwm_12bits/=
PC
==- joyLR12b:== Control motor izq. y der. con cada eje del joystick
==- joySteer12b:== Control de velocidad lineal y dirección con cada eje del joystick
El código fuente y binario se encuentra en =$ctrl_joy/PC/pwm_12bits/=
Para compilar el programa se debe ejecutar:
gcc -o joyLR12b joyLR12b.c -ljsw
3) Tracción - PWM con 12 bits y lectura de encoders
Se envian comandos de velocidad a los motores Izquierdo y Derecho con una referencia para el PWM de 12-bits de ancho.
ARM
Configura el PWM para trabajar con 12-bits de ancho con una frecuencia de 20KHz y la UART a 38400bps 8N1.
La trama recibida tiene el siguiente formato:
byte1 |
byte2 |
byte3 |
byte4 |
byte5 |
0xFF |
abxxxxxx |
00xxxxxx |
00xxxxxx |
00xxxxxx |
Los dos bits mas significativos del segundo byte enviado, indica el comando, los cuales son:
- SET_VEL 0x00
- READ_ENC 0x40
- RESET_ENC 0x80
Trama de seteo de velocidad
- 1º Byte: Inicio de Trama 0xFF
- 2º Byte: Los 2 bits mas significativos son 00, y los 6 bits restantes conforman la parte mas significativa de la velocidad 1
- 3º Byte: Se eliminan los 2 bits mas significativos y los 6 bits restantes conforman la parte menos significativa de la velocidad 1
- 4º Byte: Se eliminan los 2 bits mas significativos y los 6 bits restantes conforman la parte mas significativa de la velocidad 2
- 5º Byte: Se eliminan los 2 bits mas significativos y los 6 bits restantes conforman la parte menos significativa de la velocidad 2
Trama de lectura de encoders
- 1º Byte: Inicio de Trama 0xFF
- 2º Byte: Los 2 bits mas significativos son 01. Luego el LPC envia los 4 bytes correspondiente al encoder1 y los 4 bytes correpondientes al encoder 2, siempre enviando el menos significativo primero. Tambien se envia el Timer Counter
Trama de reset contadores de encoders
- 1º Byte: Inicio de Trama 0xFF
- 2º Byte: Los 2 bits mas significativos son 10. Luego el LPC resetea la cuenta de posicion de los 2 encoders y el timer.
El código del programa para el ARM se encuentra en =$ctrl_joy/ARM/pwm_enc/=
PC
==- joyLR12b_enc:== Control motor izq. y der. con cada eje del joystick y lectura/reset de encoders
El código fuente y binario se encuentra en =$ctrl_joy/PC/pwm_enc/=
Para compilar el programa se debe ejecutar:
g++ -o joyLR12b_enc joyLR12b_enc.cpp -ljsw -lserial
4) Tracción y cuenta de encoders a lazo cerrado (trama ASCII)
ARM
La trama serie es la siguiente:
- INIT_FRAME '*'
- SET_VEL 's'
- READ_ENC 'r'
- RESET_ENC 't'
Para setear las velocidades de los motores la trama queda
- Inicio de Trama ('*')
- Comando ('s')
- Signo de vel1
- Vel 1 centena
- Vel 1 decena
- Vel 1 unidad
- Signo de vel2
- Vel 2 centena
- Vel 2 decena
- Vel 2 unidad
por ejemplo : "*s+010-020".
El código del programa para el ARM se encuentra en =$ctrl_joy/ARM/pwm_lazo_irq_enc/=
PC
==- joy_enc_ascii:== Control motor izq. y der. y lectura/reset de la cuenta de los encoders
El código fuente y binario se encuentra en =$ctrl_joy/PC/pwm_lazo_irq_enc/=
Para compilar el programa se debe ejecutar:
g++ -o joy_enc_ascii joy_enc_ascii.cpp -ljsw -lserial
Uso del programa
$ ./joy_enc_ascii -h Usage: ./joy_enc_ascii [options <arg>] ... options: -t tty_dev : serial port device (default: /dev/ttyS0) -b baudrate : serial port baudrate (default: 38400) 9600 - 19200 - 38400 - 57600 - 115200 -j joy_dev : joystick device (default: /dev/input/js0) -c calib_file : calibration file (default: ~/.joystick) -p info_level : print information level, info_level: 1, 2, 3 (default: 3) 1: all debug info - 2: speed info - 3: encoders info -h : this help
Referencias
[1] Serial Programming Guide for POSIX Operating Systems
[2] LibSerial