Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
You are viewing an older revision! See the latest version
Robot Piccolo
ROBOT PICCOLO OPERADO POR SERIAL¶
DESCRIPCION Y CARACTERÍSTICAS GENERALES¶
Este robot dibuja por medio de instrucciones especificas enviadas por comunicación serial lo que el usuario desee. El Piccolo posee un par de ruedas operadas por motores para que este se mueva por cuadrantes, es decir que el robot se desplace para dibujar en diferentes sectores de una misma recta. Ademas posee un método de visualización en el que se muestra a través de una matriz de leds el numero de motor y el sentido de giro que realice el robot.
El Piccolo posee los siguientes componentes para su pleno funcionamiento: - Dos motores paso a paso 28bjy con sus respectivos controladores ULN2003 para el desplazamiento de las ruedas. - Max7219 junto con la matriz 8x8 con el fin de realizar la visualización del movimiento de los motores por medio del protocolo SPI - Tres servo motores pequeños que se encargan del movimiento de los tres ejes del Robot Piccolo, es decir los que hacen posible los trazos de dibujo. - Un módulo Wi-fi usado para enviar de manera inalámbrica los datos correspondientes al movimiento del robot.
A continuación se presentara un marco teórico-conceptual de los dispositivos y metodos usados para llevar a cabo el robot.
VISUALIZACION¶
MATRIZ DE LEDS¶
Una Matriz está compuesta por diodos organizados en forma de matriz, es decir en filas y columnas. Estas según el fabricante pueden estar configuradas con ánodo común o con cátodo común. Si los diodos se unen por el positivo se dice que son de ánodo común; por el contrario si está unidos por el negativo su configuración es con Cátodo común.
Como mostrar una figura o carácter¶
Para encender las columnas de la matriz y realizar alguna figura o carácter se debe usar la técnica de multiplexado por medio de un microcontrolador (por código) ya que es el método que permite encender mayor cantidad de leds con una cantidad de pines razonable, es decir que para una matriz 8x8 se necesitan 16 pines de salida en el microcontrolador, ocho para controlar los datos de las filas y otros ocho para las columnas.
Por ejemplo, en una matriz 8x8 para mostrar un dato en la columna 1 teniendo una matriz de ánodo común, se debe enviar por el pin de salida del microcontrolador al que está conectada dicha columna un 0 y un 1 a las demás columnas, luego se procede a enviar el dato que se quiera mostrar por cada fila, teniendo en cuenta que 0 es apagado y 1 es encendido. Lo anterior describe la visualización de un dato por una sola columna; si se desea visualizar un carácter en toda la matriz el procedimiento es realizar la acción anteriormente descrita con la columna 1, pero después, esta misma columna debe ponerse en 0, colocar un retardo pequeño (se recomienda usar 0.5 ms) y enviar un 1 a la columna 2 -teniendo en cuenta que las demás columnas no utilizadas deben ser 0 también- y enviar el dato por cada fila para esta columna; esta acción se realizara sucesivamente con cada columna hasta llegar a la última, es decir la octava columna, y reiniciar todo el procedimiento anterior desde la columna 1. En este punto, el lector deberá usar sus conocimientos de programación para realizar esta secuencia de manera práctica y eficiente.
PROTOCOLO SPI¶
El Protocolo SPI (Serial Peripherical Interface) o en español Interfaz Periférica Serial es un protocolo síncrono que trabaja de modo full dúplex para recibir y transmitir información, permitiendo que los dos dispositivos pueden comunicarse entre sí al mismo tiempo utilizando canales diferentes o líneas diferentes en el mismo cable. Al ser un protocolo síncrono el sistema cuenta con una línea adicional a la de datos encargada de llevar el proceso de sincronismo.
Dentro de este protocolo se define un maestro que será aquel dispositivo encargado de transmitir información a sus esclavos. Los esclavos serán aquellos dispositivos que se encarguen de recibir y enviar información al maestro. Existen cuatro líneas lógicas encargadas de realizar todo el proceso:
• MOSI (Master Out Slave In):. Línea utilizada para llevar los bits que provienen del maestro hacia el esclavo. • MISO (Master In Slave Out):. Línea utilizada para llevar los bits que provienen del esclavo hacia el maestro. • CLK (Clock):. Línea proviniente del maestro encarga de enviar la señal de reloj para sincronizar los dispositivos. • SS (Slave Select):. Línea encargada de seleccionar y a su vez, habilitar un esclavo.
MAX7219¶
El MAX7219 es un chip capaz de controlar por SPI hasta 64 diodos LED independientes. Este incorpora un decoder BCD code-B, realiza multiplexado y una memoria RAM interna de 8x8 para almacenar el valor de cada dígito. Posee cinco pines, dos de alimentación (VCC y GND) y tres del SPI: MOSI (DIN), CS (Chip Select) y CLK (Clock). Aquí cabe mencionar que en este chip no se encuentra una línea lógica MISO ya que lo único que se necesita en la matriz 8x8 es mostrar datos, es decir que el Maestro envíe los datos al esclavo y no lo contrario.
EJEMPLO VISUALIZACIÓN DINÁMICA¶
Para la visualización dinámica en la matriz 8x8 se realizo una secuencia numérica descendiente desde 9 hasta 0. Para realizarla por el protocolo SPI se tuvo que realizar la configuración del SPI en la plataforma de desarrollo de código de mbed
CONFIGURACION MAX7231 EN MBED¶
Clase SPI¶
La librería mbed posee una clase llamada SPI. Para crear una variable de este tipo se debe seguir una de las siguientes dos sintaxis: Por software: SPI nombre_variable(Pin_MOSI, Pin_MISO, Pin_Clock, Pin ChipSelect) Por hardware: SPI nombre_variable(Pin_MOSI, Pin_MISO, Pin_Clock) DigitalOut nombre_variableCS(Pin_ChipSelect)
Para hallar los pines correspondientes al SPI se debe ver la descripción del Nucleo a usar en la pagina de mbed.
Como se puede observar, existen 3 canales de SPI (SPI1, SPI2 y SPI3) con sus respectivos pines (MOSI, MISO, CLK, CS). Para este ejemplo se usaron los pines correspondientes al SPI2 PB_15, PB_14, PC_7 y PB_9 respectivamente. La conexion se muestra a continuación:
Para acceder a las configuraciones de la matriz o interactuar con los datos de las columnas se deben reconocer los bits correspondientes para cada función, esta informacion se detalla en el datasheet del MAX7219 (https://www.sparkfun.com/datasheets/Components/General/COM-09622-MAX7219-MAX7221.pdf). A partir de esto se observa que los primeros 4 son de condición no importa "x", los siguientes ocho bits describen la dirección, en la cual se encuentra el acceso a columnas y a configuraciones de la matriz; los últimos ocho bits hacen referencia a los datos pertenecientes a la dirección seleccionada. En la siguiente imagen se puede observar una tabla con las direcciones de registro:
El código de prueba de visualización se encuentra aquí: https://developer.mbed.org/users/jose96luis/code/Matriz8x8_visual/file/8338e683eb14/matriz2.cpp
RESULTADOS¶
/media/uploads/jose96luis/vid-20170316-wa0025.mp4
*SERVOMOTOR*¶
Un servomotor (también llamado Servo) es un dispositivo similar a un motor de corriente continua, que tiene la capacidad de ubicarse en cualquier posición dentro de su rango de operación, y mantenerse estable en dicha posición. Está conformado por un motor, una caja reductora y un circuito de control. Los servos se utilizan frecuentemente en sistemas de radio control y en robótica, pero su uso no está limitado a estos. Es posible modificar un servomotor para obtener un motor de corriente continua que, si bien ya no tiene la capacidad de control del servo, conserva la fuerza, velocidad y baja inercia que caracteriza a estos dispositivos.
Circuito de control de un servomotor.¶
Este circuito es el encargado del control de la posición del motor. Recibe los pulsos de entrada y ubica al motor en su nueva posición dependiendo de los pulsos recibidos. Tiene además de los circuitos de control un potenciómetro conectado al eje central del motor. Este potenciómetro permite a la circuitería de control, supervisar el ángulo actual del servo motor. Si el eje está en el ángulo correcto, entonces el motor está apagado. Si el circuito chequea que el ángulo no es correcto, el motor volverá a la dirección correcta, hasta llegar al ángulo que es correcto. El eje del servo es capaz de llegar alrededor de los 180 grados. Normalmente, en algunos llega a los 210 grados, pero varía según el fabricante.
Conexión del servomotor.¶
Los servomotores tienen 3 terminales:
Terminal positivo: Recibe la alimentación del motor (4 a 8 voltios)
Terminal negativo: Referencia tierra del motor (0 voltios)
Entrada de señal: Recibe la señal de control del motor
Los colores del cable de cada terminal varían con cada fabricante: el cable del terminal positivo siempre es rojo; el del terminal negativo puede ser marrón o negro; y el del terminal de entrada de señal suele ser de color blanco, naranja o amarillo.
PWM¶
La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.
La construcción típica de un circuito PWM se lleva a cabo mediante un comparador con dos entradas y una salida. Una de las entradas se conecta a un oscilador de onda dientes de sierra, mientras que la otra queda disponible para la señal moduladora. En la salida la frecuencia es generalmente igual a la de la señal dientes de sierra y el ciclo de trabajo está en función de la portadora.
Aplicaciones¶
En la actualidad existen muchos circuitos integrados en los que se implementa la modulación PWM, además de otros muy particulares para lograr circuitos funcionales que puedan controlar fuentes conmutadas, controles de motores, controles de elementos termoeléctricos, choppers para sensores en ambientes ruidosos y algunas otras aplicaciones. Se distinguen por fabricar este tipo de integrados compañías como Texas Instruments, National Semiconductor, Maxim, y algunas otras más.
Calculo de tiempo por grados.¶
Para calcular los grados del servomotor se utilizo la ecuación de la recta hallando la pendiente y haciendo las respectivas operaciones matemáticas obteniendo así la siguiente ecuación con la cual determinamos los grados en función del tiempo.
y=185/18 x+160
MOTOR PASO A PASO¶
El motor paso a paso conocido también como motor de pasos es un dispositivo electromecánico que convierte una serie de impulsos eléctricos en desplazamientos angulares discretos, lo que significa que es capaz de girar una cantidad de grados (paso o medio paso) dependiendo de sus entradas de control. El motor paso a paso se comporta de la misma manera que un conversor digital-analógico (D/A) y puede ser gobernado por impulsos procedentes de sistemas digitales.
Control de las bobinas.¶
Para el control del motor paso a paso de este tipo (bipolar), se establece el principio de "Puente H", si se activan T1 y T4, permiten la alimentación en un sentido; si cambiamos el sentido de la alimentación activando T2 y T3, cambiaremos el sentido de alimentación y el sentido de la corriente.
TIPOS DE MOTORES PASO A PASO.¶
Existen dos tipos de motores paso a paso:
Motores Unipolares: este tipo de motor tiene dos bobinas en cada uno de los estatores y cada par de bobinas tienen un punto común, es decir, tiene 5 ó 6 terminales.
Motores Bipolares: este tipo de motor tiene dos bobinas y no poseen puntos comunes, es decir tiene cuatro terminales. Para controlar este tipo de motor paso a paso bipolar es necesaria usar 8 transistores o circuitos integrados especiales.
¿Cómo reconocer cada tipo de motor?¶
Cuando trabajamos con motores paso a paso, muchas veces podemos no tener la ficha técnica del motor y por tanto no saber de qué tipo es o de cómo lo podemos conectar a un circuito de control. Lo primero que debemos mirar son los hilos que salen del interior del motor:
Si salen 4 hilos: Tenemos un motor bipolar. Los 4 hilos que salen son los de las bobinas, ya que no tienen toma central. Además, son de menor tamaño que los unipolares.
Si salen 5,6 u 8 hilos: Tenemos un motor unipolar con 5 hilos: las bobinas tienen una toma central que las une y que va unida a la toma de tierra.
SECUENCIA.¶
La secuencia utilizada para está practica es la secuencias doble paso. Paso doble:
Con el paso doble activamos las bobinas de dos en dos con lo que hacemos un campo magnético más potente que atraerá con más fuerza y retendrá el rotor del motor en el sitio. Los pasos también serán algo más bruscos debidos a que la acción del campo magnético es más poderosa que en la secuencia del paso simple.
Ejemplo de funcionamiento de Motor PAP por codigo usando Timer¶
Prueba de funcionamiento del motor paso a paso por código usando la función Timer. En primer lugar se declaran los pines digitales que serán las entradas al ULN2003.
DigitalOut in1(PA_10); DigitalOut in2(PB_3); DigitalOut in3(PB_5); DigitalOut in4(PB_4);
En la función principal, se declaran cinco variables. Una para el timer, otra de tipo booleano que se usara como bandera, dos numéricas que servirán para leer el tiempo transcurrido del timer y otra numérica que tendrá un valor constante.
Timer timer; bool a=true; uint8_t interval = 2; unsigned long leer_d, leer_a;
Para declarar los pasos del motor, se declara una variable matricial 4x4 de ceros y unos según el tipo de paso que se quiera realizar, en este caso se realizara por paso medio.
uint8_t bobinas[4][4] { {1, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1}, };
Se procede a iniciar el timer y seguidamente se obtiene el valor en milisegundos del tiempo transcurrido. timer.start(); leer_a = timer.read_ms(); Aquí comienza el procedimiento para el movimiento del motor. Se realizan dos bucles for anidados con el fin de relacionar el número de pasos que se desee con los valores de la variable matricial. Dentro de este último, se hace uso de un bucle while que tendrá como condición que la variable booleana a este en 1, dentro del bucle se volverá a tomar el valor del tiempo transcurrido hasta aquí por medio de la variable leer_d y se restara con el valor pasado de leer_a y dicha diferencia se comparara con el valor de la variable interval; si es mayor quiere decir que el valor del tiempo entre ambas lecturas supera el valor en milisegundos establecido en interval y procederá a energizar las bobinas según los valores de la variable matricial, luego se coloca a en 0 para asegurar que salga del while, permitiendo que realice la operación nuevamente hasta que se complete el numero de pasos propuestos.
timer.start(); leer_a = timer.read_ms();
for(int j=0; j<256; j++){
for(int i=0; i<4; i++){ a=true; while(a) { leer_d= timer.read_ms(); if((leer_d - leer_a) > interval) { in4= bobinas[i][0]; in3= bobinas[i][1]; in2= bobinas[i][2]; in1= bobinas[i][3]; leer_a = leer_d; a=false; } } }
En este programa se establecen 256 pasos, lo que corresponde a que el eje del motor rote 180 grados.
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. 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 un 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.
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 representa 300 bits por segundo. Cuando se hace referencia a los ciclos de reloj se está hablando de la velocidad de transmisión.
Bits de datos¶
Se refiere a la cantidad de bits en la transmisión. Cuando la 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. Si el tipo de datos que se está transfiriendo es texto simple (ASCII estándar), entonces es suficiente con utilizar 7 bits por paquete para la comunicación. Un paquete se refiere a una transferencia de byte, incluyendo los bits de inicio/parada, bits de datos, y paridad.
Bits de parada¶
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. La opción de no usar paridad alguna también está disponible. Para paridad par e impar, el puerto serial fijará el bit de paridad (el último bit después de los bits de datos) a un valor para asegurarse que la transmisión tenga un número par o impar de bits en estado alto lógico.
PLACA DE CIRCUITO IMPRESO¶
El Robot Piccolo está conformado por una placa de circuito impreso que posee los componentes necesarios para el funcionamiento adecuado del movimiento, comunicación y visualización del mismo. Para la realización de la PCB se hizo uso del software KiCad.
DISEÑO Y PCB==
¶
Diseño esquemático¶
Diseño de pistas¶

Donde las líneas verdes representan las pistas que quedaran impresas por la cara posterior (es decir por la cara en la que van soldados los componentes), y las líneas rojas representan las pistas que están en la cara opuesta. Las líneas amarillas corresponden al área total de corte con las mediciones correspondientes que son las medidas reales finales de la PCB.
La zona roja corresponde a la zona de relleno de tierra en la cara que se encuentran los componentes.
Zona de relleno en la cara en la que están soldados los componentes.
PCB Final¶