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 -hUsage: ./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