## page was copied from Robotica/ControlJoystick #acl BecariosGrupo:read,write,revert All:read #acl Default All:read = 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: 1. '''Control. PWM a 14KHz y 8-bits, UART 9600bps 8N1.''' Primer programa de control con 8-bits de resolución del PWM. 1. '''Control. PWM a 20KHz y 12-bits, UART 38400bps 8N1.''' Siminar al anterior con modificación de la señal del PWM. 1. '''Control y lectura de encoders.''' Se agregó decodificación de encoders y petición y reset de cuenta desde la PC. 1. '''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 ] ... 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] [[http://www.easysw.com/~mike/serial/serial.html | Serial Programming Guide for POSIX Operating Systems]] [2] [[http://libserial.sourceforge.net/ | LibSerial]]