Piccolo tercer corte

Dependencies:   mbed

Homepage

SISTEMAS EMBEBIDOS TERCER CORTE

Álvaro Cortes Nelson Posada Edison Ahumada Cristian Montero.

Universidad ECCI.

INTRODUCCION

En el siguiente documento se describe el ensamble y programación usada para un robot de tres ejes, que nos brinda la posibilidad de dibujar figuras geométricas en 2D, generando movimientos en los tres ejes de coordenadas X, Y, Z, por medio de servomotores, con ayuda de la plataforma de programación Mbed se da conocer el código creado con la serie de instrucciones para darle los diferentes comandos de movimiento y así hacer posible el dibujo de piezas geométricas. En este tercer corte se incluirá comunicación serial que por medio del Bluetooth de un celular será enviado ciertos caracteres en código hexadecimal para luego ser enviado a la tarjeta Nucleo 446 y así realizar la acción el piccolo. Otro elemento que se incluyo fue la pantalla LCD 16*2 con el fin de mostrar todos los comandos digitados por el usurario.

DESCRIPCIÓN DEL ENSAMBLE Y CONEXIÓN.

Es un sistema de dibujo por coordenadas, el cual está compuesto por los tres ejes principales Y, X y Z controlados por servomotores, el diseño fue extraído de la página http://piccolo.cc/ y por medio de cortadora láser es envían a cortar sus diferentes partes dichas partes fueron cortadas en acrílico de 3 mm. El sistema de coordenados Z está compuesto por 11 partes que unen el piñón ya ensamblado con el servomotor y una pieza tipo cadenilla donde el piñón Z tendrá un desplazamiento 10 cm. Los servomotores del eje X, Y están ubicados paralelamente, el servomotor en X está 2 cm más arriba que el servomotor en Y esto con el fin de ubicar sus respectivas cadenillas una encima de la otra y no tener problemas de que se vayan a chocar cuando se estén desplazando en sus respectivos ejes.

/media/uploads/Edisonap/pic.png

Para la conexión del Bluetooth se utilizan los puertos RX y TX y se conectan a los puertos PA_9 y PA_10 de la tarjeta núcleo 446.

/media/uploads/Edisonap/bluettoth.png

LA conexión de la LCD 16*2 esta comprendida por los puertos D8 a D14 de la tarjeta nucleo 446 y seran conectados a la LCD de D0 a D7.

/media/uploads/Edisonap/lcd.png

MARCO TEORICO

LCD o (Liquid Crystal Dysplay): Es un dispositivo empleado para la visualización de contenidos o información de una forma gráfica, mediante caracteres, símbolos o pequeños dibujos dependiendo del modelo. Está gobernado por un microcontrolador el cual dirige todo su funcionamiento. En el caso de nuestro para nuestro piccolo vamos a emplear un LCD de 16x2, esto quiere decir que dispone de 2 filas de 16 caracteres cada una.

Conexión

/media/uploads/Edisonap/lcd_1.png

Pines de alimentación: VSS: Gnd VDD: +5 voltios VEE: Corresponde al pin de contraste, lo regularemos con un potenciómetro de 10K conectado a Vdd.

Pines de control:

RS: Corresponde al pin de selección de registro de control de datos (0) o registro de datos(1). Es decir el pin RS funciona paralelamente a los pines del bus de datos. Cuando RS es 0 el dato presente en el bus pertenece a un registro de control/instrucción. y cuando RS es 1 el dato presente en el bus de datos pertenece a un registro de datos o un carácter. RW: Corresponde al pin de Escritura (0) o de Lectura (1). Nos permite escribir un dato en la pantalla o leer un dato desde la pantalla.

E: Corresponde al pin Enable o de habilitación. Si E (0) esto quiere decir que el LCD no está activado para recibir datos, pero si E(1) se encuentra activo y podemos escribir o leer desde el LCD.

Pines de Bus de datos:

El Bus de datos bidireccional comprende desde los pines D0 a D7. Para realizar la comunicación con el LCD podemos hacerlo utilizando los 8 bits del bus de datos (D0 a D7) o empleando los 4 bits más significativos del bus de datos (D4 a D7). En este caso vamos a explicar la comunicación con el bus de 4 bits.

Modulo bluetooth H05 Modulo bluetooth hc-05 como esclavo: Cuando está configurado de esta forma, se comporta similar a un HC-06, espera que un dispositivo bluetooth maestro se conecte a este, generalmente se utiliza cuando se necesita comunicarse con una PC o Celular, pues estos se comportan como dispositivos maestros.

Modulo bluetooth hc-05 como Maestro: En este modo, EL HC-05 es el que inicia la conexión. Un dispositivo maestro solo se puede conectarse con un dispositivo esclavo. Generalmente se utiliza este modo para comunicarse entre módulos bluetooth. Pero es necesario antes especificar con que dispositivo se tiene que comunicar, esto se explicará más adelante.

Conexión

VCC: Alimentación del módulo entre 3,6V y 6V. GND: Masa del módulo. TXD: Pin para la transmisión de datos. RXD: Pin para la recepción de datos. Trabaja a un voltaje de 3,3V, aunque la mayoría de módulos ya trae conversor de niveles lógicos integrado, con lo que lo podemos conectar directamente a la tarjeta. EN: Pin para entrar en el modo de configuración del módulo (solo en el modelo HC-05). STATE: Pin de estado (salida) para conectar un led y visualizar cuando se está comunicando el módulo (solo en el modelo HC-05).

/media/uploads/Edisonap/bluetooth.png

Estados del modulo

Estado Desconectado: Entra a este estado tan pronto alimentas el modulo, y cuando no se ha establecido una conexión bluetooth con ningún otro dispositivo, EL LED del módulo en este estado parpadea rápidamente pero no interpreta todavía los comandos AT

Estado Conectado o de comunicación: Entra a este estado cuando se establece una conexión con otro dispositivo bluetooth, El LED hace un doble parpadeo, en este sábado ya se pueden enviar comandos para su recepción.

Comunicación Serial

La comunicación serial es un protocolo muy común (no hay que confundirlo con el Bus Serial de Comunicación, o USB) para comunicación entre dispositivos que se incluye de manera estándar en prácticamente cualquier computadora. La mayoría de las computadoras incluyen dos puertos seriales RS-232. La comunicación serial es también un protocolo común utilizado por varios dispositivos para instrumentación; existen varios dispositivos compatibles con GPIB que incluyen un puerto RS-232. Además, la comunicación serial puede ser utilizada para adquisición de datos si se usa en conjunto con un dispositivo remoto de muestreo.

Típicamente, la comunicación serial se utiliza para transmitir datos en formato ASCII. Para realizar la comunicación se utilizan 3 líneas de transmisión: (1) Tierra (o referencia), (2) Transmitir, (3) Recibir. Debido a que la transmisión es asincrónica, es posible enviar datos por una línea mientras se reciben datos por otra. Existen otras líneas disponibles para realizar handshaking, o intercambio de pulsos de sincronización, pero no son requeridas. Las características más importantes de la comunicación serial son la velocidad de transmisión, los bits de datos, los bits de parada, y la paridad. Para que dos puertos se puedan comunicar, es necesario que las características sean iguales.

Comunicación serial asíncrona: En esta comunicación uno de los hilos será para la transmisión de los datos de un dispositivo a otro y el otro hilo será para la recepción de datos entre un dispositivo a otro, la transmisión y la recepción pueden ocurrir en forma simultánea, lo que si se tiene que cumplir es que la frecuencia de trabajo de ambos dispositivos tiene que ser la misma.

Velocidad de transmisión (baud rate): Indica el número de bits por segundo que se transfieren, y se mide en baudios (bauds). Por ejemplo, 300 baudios representan 300 bits por segundo. Cuando se hace referencia a los ciclos de reloj se está hablando de la velocidad de transmisión. Por ejemplo, si el protocolo hace una llamada a 4800 ciclos de reloj, entonces el reloj está corriendo a 4800 Hz, lo que significa que el puerto serial está muestreando las líneas de transmisión a 4800 Hz.

Bits de datos: Se refiere a la cantidad de bits en la transmisión por ejemplo una computadora envía un paquete de información, el tamaño de ese paquete no necesariamente será de 8 bits. Las cantidades más comunes de bits por paquete son 5, 7 y 8 bits. El número de bits que se envía depende en el tipo de información que se transfiere. Por ejemplo, el ASCII estándar tiene un rango de 0 a 127, es decir, utiliza 7 bits; para ASCII extendido es de 0 a 255, lo que utiliza 8 bits. Un paquete se refiere a una transferencia de byte, incluyendo los bits de inicio/parada, bits de datos, y paridad. Debido a que el número actual de bits depende en el protocolo que se seleccione, el término paquete se usar para referirse a todos los casos.

Bits de parada: Es usado para indicar el fin de la comunicación de un solo paquete. Los valores típicos son 1, 1.5 o 2 bits. Debido a la manera como se transfiere la información a través de las líneas de comunicación y que cada dispositivo tiene su propio reloj, es posible que los dos dispositivos no estén sincronizados. Por lo tanto, los bits de parada no sólo indican el fin de la transmisión sino además dan un margen de tolerancia para esa diferencia de los relojes. Mientras más bits de parada se usen, mayor será la tolerancia a la sincronía de los relojes, sin embargo, la transmisión será más lenta.

Paridad: Es una forma sencilla de verificar si hay errores en la transmisión serial. Existen cuatro tipos de paridad: par, impar, marcada y espaciada. Por ejemplo, si la información a transmitir es 011 y la paridad es par, el bit de paridad sería 0 para mantener el número de bits en estado alto lógico como par. Si la paridad seleccionada fuera impar, entonces el bit de paridad sería 1, para tener 3 bits en estado alto lógico. La paridad marcada y espaciada en realidad no verifican el estado de los bits de datos; simplemente fija el bit de paridad en estado lógico alto para la marcada, y en estado lógico bajo para la espaciada. Esto permite al dispositivo receptor conocer de antemano el estado de un bit, lo que serviría para determinar si hay ruido que esté afectando de manera negativa la transmisión de los datos, o si los relojes de los dispositivos no están sincronizados.

Monitor serial: Es una herramienta muy importante para todos los desarrolladores de software y hardware que trabajan con puertos serie. Esta interfaz permite capturar, mostrar, analizar, grabar y reproducir todos los datos de puerto serie intercambiados entre la aplicación de Windows y el dispositivo serie. Nos representa una gran ayuda en cuando a la facilidad de enviar datos y orientar las diferentes variables que se ejecutan en función de las necesidades, podemos realizar pruebas fácilmente de nuestro programa sin intervenir el código directamente y volver a compilar.

DESCRIPCIÓN DEL CODIGO

1. int coord2pulse(float coord) 2. { 3. if(0 <= coord <= MAXPOS) 4. return int(coord*1000/150+750); 5. return 750; }

Se introduce un valor menor a 255 en binario que es la máxima posición que puede tener los servos dentro de su rango de trabajo es decir 180°.

6. uint8_t buffer_command[BUFF_SIZE]={0,0,0,0};

Se establece un carácter que va guardar el inicio, fin del comando, los parámetros del comando y el comando o función que va realizar el piccolo.

7. void print_num(uint8_t val) 8. { 10. if (val <) 9. command.putc(val+0x30); 10. else 11. command.putc(val-9+0x40); } 12. void print_bin2hex (uint8_t val)} 13. command.printf(" 0x"); 14. print_num(val>>4); 15. print_num(val&0x0f); }

Se realiza una operación para convertir el carácter decimal porque nuestro monitor serial solo puede leer carácter en forma hexadecimal y ASQUI.

16. void Read_command() 17. { 18. for (uint8_t i=0; i<BUFF_SIZE;i++) 19. buffer_command[i]=command.getc(); }

Atreves de un for recorre todas las posiciones, que se dejaron en el tamaño del buffer, obteniendo el comando que se desea realizar.

20. void echo_command() 21. { 22. for (uint8_t i=0; i<BUFF_SIZE;i++) 23. print_bin2hex(buffer_command[i]); }

La función de este void es recorrer las posiciones para identificar los parámetro asignados en

24.(buffer_command[INITPARAMETER]); 25. uint8_t check_command() 26. { 27. if (buffer_command[BUFF_SIZE-1]== '>'){ 28. #if DEBUG 29. command.printf("\nComando:"); 30. print_bin2hex(buffer_command[COMM_N]); 31. command.printf(" -> "); 32. #endif 39. return 1; } 33. #if DEBUG 42. command.printf("\n ERROR COMANDO -> "); 34. echo_command(); 35. #endif 36. return 0; }

Esta función retorna de 0 a 1, imprimiendo el comando que se ingresa en hexadecimal, por medio de comunicación serial en nuestro caso es enviado por coolterm. Este if imprime el comando que decidimos ejecutar, con sus respectivos parámetros, en caso de que el código en hexadecimal se encuentre errado, dicho if arrojara un mensaje de error de comando.

37. void command_led(int tm) { 38. led=1; wait(tm); 39. led=0; }

Este es un ejemplo de comando, en este caso es el led donde se declara la variable tm (tiempo) y a continuación indica la función de encendido del led, tiempo en el cual estará prendido el led. Este tiempo es definido por el usuario cuando se digita en el tercer parámetro en hexadecimal por el programa coolterm, después de haber trascurrido este tiempo el led se apaga.

40. int main() { 41. #if DEBUG 42. command.printf("inicio con debug\n"); 43. #else 44. command.printf("inicio sin debug\n"); 45. #endif

En el main se busca primero la comunicación serial con el coolterm al enviar como dato un 1 o un byte completo, ya que se envía por comunicación serial la tarjeta núcleo “responde “ si está en “Inicio con debug” o “inicio sin debug”

46. uint8_t val; 47. while(1){ 61. val=command.getc(); 48. if (val== '<'){

Haya iniciado una trasmision de comando

49. Read_command(); 50. if (check_command()){ a. command_led(buffer_command[INITPARAMETER]); b. #if DEBUG c. echo_command(); d. #endif } 51. } 52. else command.printf("error inicio trama: "); 53. command.putc(val); }

En esta última parte del main declaramos un carácter entero llamada val, y realizamos la siguiente operación. Mientras el debug este en 1 esperamos un comando con la función getc, SI el valor ya inicio el comando de trasmisión por medio del carácter “<” ir a la función leer comando, después ejecuta otro IF con la función check_command, para verificar cada uno de los comandos establecidos y revisar en qué valor se encuentra la primera posición del BUFF_SIZE, al saber que parámetro es, comienza a ejecutarlo por medio de la función echo_command. En caso de no reconocer el comando ingresado, arrojara un mensaje “error inicio de trama”.

60. uint8_t posx_old=0; posición anterior del eje X uint8_t posy_old=0; posición anterior del eje Y uint8_t ss_time=100; tiempo de espera para moverse 1 mm en microsegundos uint8_t buffer_command[BUFF_SIZE]={0,0,0,0,0,0}; Matriz del Comando enviado uint8_t buffer[BUFF_SIZE]={0,0,0,0,0,0};

Diseño.

/media/uploads/Edisonap/lcd_picccolo_2.jpg

/media/uploads/Edisonap/lcd_piccolo_1.jpg

/media/uploads/Edisonap/lcd_piccolo_3.jpg

GLOSARIO Buffer: Es un espacio de memoria, en el que se almacenan datos de manera temporal, normalmente para un único uso. Su principal uso es para evitar que el programa o recurso que los requiere, ya sea hardware o software, se quede sin datos durante una transferencia (entrada/salida) de datos irregular o por la velocidad del proceso. Define: Es una constante o valor que no puede ser alterado/modificado durante la ejecución de un programa, únicamente puede ser leído. Una constante corresponde a una longitud fija de un área reservada en la memoria principal del ordenador, donde el programa almacena valores fijos. uint8_t: Número entero sin signo de 1 byte, es un alias para un tipo de dato usigned char que ocupa 1 byte de memoria codificando números de 0 a 255. INITPARAMETER: Posición número de comando, esta constante se declara, para saber dónde inicia los parámetros, de ejecución. Void: Función que retorna un valor en 0, devolviendo un valor en nada “vacío”.

CONCLUSIONES

  • Gracias a la comunicación serial podemos tener un intercambio de información con la tarjeta núcleo la cual está conectada con el Picccolo, generando una comunicación en línea, que nos facilita los cambios de funciones que va realizar nuestro Piccolo.
  • Por medio de la LCD podemos demostrar las funciones programadas y previa mente comprobadas en la tarjeta núcleo 446. De esta forma para el usuario va ser más fácil ver lo que está dibujando el piccolo, como la resolución, posición home entre otras.

REFERENCIAS

https://www.google.com.co/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0ahUKEwjVwOLsoc7XAhUC6yYKHYkUDu0QjhwIBQ&url=https%3A%2F%2Fcircuitdigest.com%2Farticle%2F16x2-lcd-display-module-pinout-datasheet&psig=AOvVaw07_Ow42sL1PyKtO08gxmjQ&ust=1511305089116815 https://github.com/DiatomStudio/Piccolo/wiki/Piccolo-Assembly-Instructions


All wikipages