En uno de los proyectos anteriores “Robot inalámbrico controlado por gestos con las manos”, se discutió cómo los controles remotos con interruptores o botones utilizados para controlar robots inalámbricos tienen una desventaja a la hora de controlar el robot debido al factor de tiempo de respuesta humana de quien lo manipula. Como solución al problema, se sugirió el uso de interfaces avanzadas entre humanos y computadoras, como el reconocimiento de gestos, el seguimiento de los movimientos oculares y las ondas cerebrales. De los cuales, en el proyecto anterior se utilizaron gestos con las manos para controlar el robot. En este tutorial se diseñará un robot inalámbrico que será controlado por un joystick. Un joystick no es un dispositivo de entrada nuevo, pero proporciona un mejor control sobre el sujeto. Es más fácil de usar y manejar por un operador humano.
Un joystick no se diferencia mucho del mando a distancia desarrollado en el proyecto anterior. Un joystick funciona de manera similar a un sensor de acelerómetro. Así como un sensor acelerómetro genera el cambio en las dimensiones de los ejes X, Y y Z de la orientación del sensor en el espacio, de manera similar, un joystick genera el cambio en los ejes X, Y y Z. dimensiones del eje del palo montado en él. Sólo se requieren cambios en los ejes X e Y para mover el robot sobre una superficie. En este proyecto, el robot puede moverse hacia adelante, hacia atrás, hacia la izquierda o hacia la derecha según la inclinación del módulo del joystick. El módulo de joystick interactúa con el microcontrolador AVR Atmega 32.
Hay un módulo RF de 434 MHz conectado al circuito AVR para conectar el circuito remoto al circuito de control inalámbrico del robot. En el circuito del robot, en pocas palabras, un circuito receptor de RF interactúa con el CI del controlador del motor. El robot está construido sobre dos ruedas y un cuerpo con ruedas. Hay dos motores de CC con engranajes conectados a las ruedas y acoplados al CI del controlador del motor L293D para mover el robot.
Se conecta una pantalla LCD al circuito remoto del robot para monitorear el cambio en los valores de los ejes durante la prueba del circuito de control. El robot debe calibrarse para que tenga una sensibilidad adecuada al movimiento del joystick. El módulo LCD interconectado en el circuito remoto parpadea algunos mensajes iniciales al inicio y luego comienza a mostrar el cambio en los valores de los ejes X e Y junto con el comando de control correspondiente a los mismos.
El circuito de control del robot inalámbrico no tiene ningún controlador. El robot se controla directamente mediante datos digitales transmitidos a través de la interfaz RF. El circuito remoto tiene AVR Atmega 32 como microcontrolador sentado. El código que puede interpretar las señales del joystick y pasar los datos digitales apropiados al robot de forma inalámbrica se ejecuta en el controlador AVR. El código AVR se escribe y compila utilizando AVR Studio.
Fig. 1: Prototipo de robot inalámbrico controlado por joystick basado en AVR
Componentes necesarios –
Fig. 2: Lista de componentes necesarios para un robot inalámbrico controlado por joystick basado en AVR
Diagrama de bloques -
El circuito remoto se construye reuniendo los siguientes componentes básicos:
Fig. 3: Diagrama de bloques del lado del transmisor de un robot inalámbrico controlado por joystick basado en AVR
Fig. 4: Diagrama de bloques del lado del receptor de un robot inalámbrico controlado por joystick basado en AVR
El circuito de control del control remoto inalámbrico se construye ensamblando los siguientes bloques de construcción:
Conexiones de circuito –
Hay dos circuitos que componen el proyecto: uno es el circuito remoto basado en el microcontrolador AVR y el otro es el circuito receptor montado en el robot. El circuito remoto tiene el AVR Atmega 32 como microcontrolador sentado. El módulo LCD, el módulo de joystick ADXL335, el codificador IC y el transmisor de RF interactúan con el controlador AVR en el circuito remoto. Las conexiones del circuito remoto son las siguientes:
Fig. 5: Imagen del circuito transmisor de un robot inalámbrico controlado por joystick basado en AVR
Fuente de alimentación: el circuito remoto requiere una fuente de alimentación de 5 V para funcionar. El microcontrolador AVR Atmega 32, el transmisor de RF, el codificador IC, la pantalla LCD de caracteres y el módulo de joystick funcionan con 5 V CC. Para suministrar energía al circuito remoto, se utiliza una batería NIMH de 12 V. La energía de la batería se regula a 5 VCC mediante el regulador de voltaje IC 7805. El pin 1 del regulador de voltaje IC está conectado al ánodo de la batería y el pin 2 está conectado a tierra. La salida de voltaje regulado se toma del pin 3 del IC. También se conecta un LED junto con una resistencia pull-up de 10 K Ω entre la tierra común y el pin de salida para obtener una señal visual de la continuidad de la energía.
AVR Atmega 32: este es un microcontrolador basado en AVR RISC de 8 bits. Viene en un paquete de 40 pines y tiene 2 KB de RAM, 32 KB de memoria flash, 1 KB EEPROM, 32 pines de entrada y salida de propósito general (GPIO), 8 canales ADC de 10 bits, un SPI, un UART y un Interfaz TWI en chip. El controlador tiene tres temporizadores incorporados, de los cuales 2 son temporizadores de 8 bits y uno es un temporizador de 16 bits. El controlador opera hasta una frecuencia de reloj de 16 MHz. Al ejecutar potentes instrucciones en un solo ciclo de reloj, el Atmega 32 logra velocidades de transferencia cercanas a 1 MIPS por MHz, lo que permite a los diseñadores de sistemas optimizar el consumo de energía en relación con la velocidad de procesamiento. El controlador está disponible en un paquete en línea dual (DIP) de 40 pines. Consulte el diagrama de pines y la configuración de pines de este controlador AVR aquí.
En este proyecto se utilizan 17 pines GPIO del controlador, de los cuales 11 pines se usan para conectar la pantalla LCD de caracteres, 2 pines se usan para conectar el módulo de joystick y 4 pines se usan para conectar los pines de datos del codificador IC.
LCD 16X2: La pantalla LCD 16X2 se utiliza para monitorear los valores del sensor. Interactúa con el microcontrolador AVR conectando sus pines de datos al puerto B del controlador. Los pines de datos del LCD de caracteres DB0 a DB7 interactúan con AVR Atmega de 32 pines PB0 a PB7, respectivamente. Los pines RS, RW y E de la pantalla LCD están conectados a los pines PD0, PD1 y PD2 del AVR, respectivamente. Las conexiones del circuito LCD de caracteres al controlador AVR se resumen en la siguiente tabla:
Fig. 6: Tabla que enumera las conexiones del circuito entre Arduino Uno y el LCD de caracteres
Módulo de joystick: en el proyecto se utiliza un módulo de joystick personalizado. El módulo tiene cinco terminales para tierra, VCC, salida analógica del eje X, salida analógica del eje Y y salida analógica del eje Z y tierra están conectados al VCC y tierra común, respectivamente. La salida analógica del eje X y la salida analógica del eje Y del módulo sensor se utilizan y se conectan al pin 0 del puerto A y al pin 1 del puerto A del controlador AVR, respectivamente.
Transmisor de RF: el transmisor de RF se utiliza para transmitir las señales de control para controlar el motor. El módulo transmisor de RF es un pequeño subconjunto de PCB. El módulo de RF, como su nombre indica, funciona con radiofrecuencia. El rango de frecuencia correspondiente de dichos módulos varía entre 30 kHz y 300 GHz. En este sistema de RF, los datos digitales se representan como variaciones en la amplitud de la onda portadora. Este tipo de modulación se conoce como modulación por desplazamiento de amplitud (ASK). Este módulo RF opera a una frecuencia de 433 MHz y utiliza la técnica de modulación ASK. La configuración de pines del módulo transmisor es la siguiente
Fig. 7: Tabla que enumera la configuración de pines del transmisor de RF
Los datos serializados del codificador se reciben en el pin 2 del módulo y se pasan a la antena desde el pin 4 del módulo.
HT12E IC: el HT12E IC convierte los datos paralelos en datos en serie para pasarlos al transmisor de RF. El codificador IC HT12E pertenece a la serie 212 de codificadores. Se combina con decodificadores de la serie 212 con la misma cantidad de direcciones y formato de datos. El HT12E es capaz de codificar 12 bits, de los cuales 8 son bits de dirección y 4 son bits de datos. Por lo tanto, la señal codificada son datos paralelos serializados de 12 bits compuestos por datos de 4 bits que se transferirán adjuntos al byte de dirección.
Los pines de datos D0, D1, D2 y D3 del IC están conectados a los pines PC0, PC1, PC2 y PC3 del controlador AVR respectivamente. Todos los pines de dirección del codificador IC están conectados a tierra, por lo que tiene un byte de dirección de 0x00. El pin 17 del IC está conectado al pin 2 del transmisor de RF. Por lo tanto, los datos serializados pasan desde el pin 17 del IC al pin de entrada de datos del transmisor de RF.
El HT12E tiene un pin de habilitación de transmisión que está activo bajo. Cuando se recibe una señal de activación en el pin TE, las direcciones/datos programados se transmiten junto con los bits del encabezado a través de un medio de transmisión de RF o infrarrojos. El HT12E inicia un ciclo de transmisión de 4 palabras después de recibir una habilitación de transmisión. Este ciclo se repite mientras el TE se mantenga bajo. Tan pronto como TE vuelve al nivel alto, la salida del codificador completa su ciclo final y luego se detiene.
El circuito de control del robot consta de un receptor de RF, un CI decodificador de RF y un CI controlador de motor L293D. Las conexiones del circuito del receptor son las siguientes:
Fig. 8: Imagen del circuito receptor de un robot inalámbrico controlado por joystick basado en AVR
Receptor de RF: el receptor de RF detecta la señal de radio que transporta señales de control del motor. El módulo receptor de RF tiene 8 pines y la siguiente configuración de pines:
Fig. 9: Tabla que enumera la configuración de pines del receptor de RF
El receptor de RF pasa los datos en serie recibidos por frecuencia de RF desde el pin 2 al pin 16 del decodificador IC.
Decodificador HT12D: la señal detectada por el receptor de RF pasa al decodificador HT12D. Convierte datos en serie nuevamente en datos paralelos después de separar datos y direcciones. El HT12D pertenece a la serie 212 de decodificadores y se puede emparejar con la serie 212 de codificadores con la misma cantidad de direcciones y formato de datos. El HT12D es capaz de decodificar 12 bits, de los cuales 8 son bits de dirección y 4 son bits de datos. Los datos de 4 bits son de tipo pestillo y cuando se pasan a los pines de datos de salida permanecen sin cambios hasta que se reciben nuevos datos.
Los datos en serie recibidos por el receptor de RF se emiten en paralelo desde sus pines de datos tal como están. Los pines de datos del IC del decodificador interactúan con los pines de entrada del IC del controlador del motor L293D. Por lo tanto, la lógica digital en los pines de datos del decodificador controla la rotación de los motores de CC. Todos los pines de dirección del IC del decodificador están conectados a tierra para hacer coincidir el byte de dirección con 0x00, igual que el circuito del transmisor.
IC de controlador de motor de CC L293D: el L293D es un circuito integrado (IC) de controlador de motor de puente H dual. Los controladores de motor actúan como amplificadores de corriente en el sentido de que reciben una señal de control de corriente baja y suministran una señal de corriente más alta. Esta señal de corriente más alta se utiliza para accionar los motores. Tiene 16 pines con la siguiente configuración de pines:
Fig. 10: Tabla que enumera la configuración de pines del CI del controlador del motor L293D
Se utilizan dos motores de CC para fabricar el automóvil robótico. Los motores de CC interactúan entre los pines 3 y 6 y los pines 14 y 11 del IC del controlador del motor.
IC L293D controla motores de CC según las siguientes tablas de verdad:
Fig. 11: Tabla de verdad del CI del controlador del motor L293D
Los pines 4, 5, 13 y 12 del L293D están conectados a tierra mientras que los pines 1, 16 y 9 están conectados a 5 VCC y el pin 8 está conectado a 12 VCC. Los pines 2, 7, 10 y 15 del IC del controlador del motor están conectados a los pines de datos D0, D1, D2 y D3 del IC del decodificador. El motor de CC conectado a la rueda derecha está conectado a los pines 11 y 14, mientras que el motor conectado a la rueda izquierda está conectado a los pines 3 y 6 del IC del controlador del motor.
Motores de CC con engranajes: en este robot, los motores de CC con engranajes de 12 V están conectados a las ruedas. Los motores de CC con engranajes están disponibles con una amplia gama de RPM y par, lo que permite que un robot se mueva según la señal de control que recibe del controlador IC del motor.
Fuente de alimentación: en el circuito receptor, el CI del controlador del motor necesita 12 VCC, mientras que el CI del receptor y decodificador de RF necesita 5 VCC para su funcionamiento. Se utiliza una batería NIMH de 12 V como fuente principal de energía en el circuito. La energía de la batería se regula a 5 V y 12 V mediante circuitos integrados 7805 y 7812. El pin 1 de ambos circuitos integrados reguladores de voltaje está conectado al ánodo de la batería y el pin 2 de ambos circuitos integrados está conectado a tierra. Las respectivas salidas de voltaje se toman del pin 3 de los respectivos circuitos integrados reguladores de voltaje. También se conecta un LED junto con una resistencia pull-up de 10 K Ω entre la tierra común y el pin de salida para obtener una señal visual de la continuidad de la energía. A pesar de utilizar una batería de 12 V, el 7812 se utiliza para proporcionar una fuente de alimentación regulada y estable al circuito integrado del controlador del motor.
Fig. 12: Imagen que muestra un robot inalámbrico controlado por joystick basado en AVR
Cómo funciona el circuito –
A medida que la batería se conecta al robot, el receptor de RF se configura para emparejarse con el transmisor de RF y comienza a recibir datos. En el lado del transmisor, primero los mensajes iniciales parpadean en la pantalla LCD y el microcontrolador AVR comienza a leer los datos de los ejes X e Y del módulo de joystick en forma de voltaje analógico. El voltaje es detectado por los pines de entrada analógica y convertido a una lectura digitalizada utilizando canales ADC integrados. Los canales ADC tienen 10 bits de longitud, por lo que la lectura digitalizada de la salida del eje X y del eje Y del módulo oscila entre 0 y 1023.
Los valores digitalizados se muestran en el módulo LCD junto con el comando de control pasado a los valores de los ejes respectivos. La lectura se manipula para determinar si el joystick está inclinado hacia adelante, hacia atrás, hacia la izquierda o hacia la derecha. Dependiendo de la inclinación del joystick, el controlador pasa los bits de datos apropiados al codificador de RF para accionar motores de CC para el movimiento del robot hacia adelante, hacia atrás, hacia la izquierda o hacia la derecha.
La misma lógica digital se refleja en los pines de datos del decodificador IC. El robot se puede mover hacia adelante, hacia atrás, hacia la izquierda o hacia la derecha implementando la siguiente lógica de entrada en los pines del controlador del motor:
Fig. 13: Tabla lógica del IC del controlador del motor L293D para el robot AVR
Consulte la guía de programación para aprender cómo el controlador AVR lee datos del módulo de joystick y manipula los valores de los ejes X e Y para determinar los comandos de control. Aprenda a través del código cómo se transmiten los datos digitales al módulo de RF para controlar el robot.
Guía de programación –
Para programar el microcontrolador Atmega 32, AVR Studio 4 y el compilador GCC son las herramientas de software necesarias. Para saber cómo se utiliza AVR Studio 4, consulte el siguiente tutorial:
Trabajar con AVR Studio
En primer lugar, se importan archivos de encabezado separados para la inicialización del módulo LCD, ADC y joystick. LCD.h, adc.h y joystick.h se incluyen para programar el módulo LCD, ADC y joystick, respectivamente.
#incluir
#incluir
#incluir
Para que los archivos de encabezado funcionen, deben copiarse en la siguiente carpeta: C > WinAVR-20090313 > avr > include > avr y pegar los archivos de encabezado descargados en la carpeta.
Tenga en cuenta que en la ruta WinAVR-20090313, 20090313 hay un número añadido a la carpeta de instalación. Este número puede ser diferente en una instalación diferente de AVR Studio.
Fig. 14: Captura de pantalla de inicialización en código AVR para robot inalámbrico controlado por joystick
Los puertos que están conectados al módulo LCD y Joystick se definen a continuación. Se inicializan a los valores máximo y mínimo de los ejes x e y en el rango donde se va a controlar el robot.
Fig. 15: Captura de pantalla de la función principal en código AVR para robot inalámbrico controlado por joystick
La función principal proporciona lógica para todas las operaciones del circuito remoto. En esta función los pines se declaran como pines de entrada o salida del puerto que ya ha sido inicializado.
Fig. 16: Captura de pantalla del bucle infinito en código AVR para robot inalámbrico controlado por joystick
El bucle while dentro de la función principal es un bucle infinito, donde se leen los datos del sensor y se implementan las condiciones para que el robot funcione. consulte el código AVR completo.
Código fuente del proyecto
###
//Programa para #ifndef _ADC_H_ #definir _ADC_H_ 1 #incluir#incluir vacío adc_init(vacío); // Esta función está declarada para leer el valor digital de la conversión ADC int read_adc_channel (canal de caracteres sin firmar); /*Definiciones de funciones*/ vacío adc_init (vacío) { ADCSRA=(1< ADMUX=(1< _delay_ms(1); temperatura=ADCL; adc_value=ADCH; adc_value=(adc_value<<8) temp; devolver valor_adc; } #terminara si //************************************************ **************// //microcontrolador :ATmega32 //Reloj del sistema :1MHz //Proyecto :robot inalámbrico controlado por joystick //Software :AVR Estudio 4 //Interfaz de datos LCD :8 bits //Te dio :julio 2017 //************************************************ **************// //Incluye el archivo de encabezado io.h donde se encuentran todos los registros de entrada/salida y sus Bits están definidos para todos los microcontroladores AVR #incluir//Define la macro para el archivo de encabezado delay.h. F_CPU es el valor de frecuencia del microcontrolador para el archivo de encabezado delay.h. El valor predeterminado de F_CPU en el archivo de encabezado delay.h es 1000000(1MHz) #definir F_CPU 1000000 //Incluye el archivo de encabezado delay.h que define dos funciones, _delay_ms (retraso de milisegundos) y _delay_us (retraso de microsegundos) #incluir //Define una macro para el archivo de encabezado lcd.h. LCD_DATA_PORT es el registro PORT del microcontrolador al que están conectados los pines de datos de la pantalla LCD. El registro PORT predeterminado para los pines de datos en el archivo de encabezado lcd.h es PORTA #definir LCD_DATA_PORT PUERTO //Define una macro para el archivo de encabezado lcd.h. LCD_CONT_PORT es el registro PORT del microcontrolador al que están conectados los pines de control de la pantalla LCD. El registro PORT predeterminado para los pines de control en el archivo de encabezado lcd.h es PORTB* #definir LCD_CONT_PORT PORTADO //Define una macro para el archivo de encabezado lcd.h. LCD_RS es el pin del puerto del microcontrolador al que está conectado el pin RS de la pantalla LCD. El pin de puerto predeterminado para el pin RS en el archivo de encabezado lcd.h es PB0 #definir LCD_RS PD0 //Define una macro para el archivo de encabezado lcd.h. LCD_RW es el pin del puerto del microcontrolador al que está conectado el pin RW de la pantalla LCD. El pin de puerto predeterminado para el pin RW en el archivo de encabezado lcd.h es PB1 #definir LCD_RW PD1 //Define una macro para el archivo de encabezado lcd.h. LCD_EN es el pin del puerto del microcontrolador al que está conectado el pin EN de la pantalla LCD. El pin de puerto predeterminado para el pin EN en el archivo de encabezado lcd.h es PB2 #definir LCD_ES PD2 //Incluye el archivo de encabezado lcd.h que define diferentes funciones para todos los LCD alfanuméricos (método de interfaz de 8 bits) #incluir //Incluye el archivo de encabezado adc.h que define diferentes funciones para el convertidor analógico a digital. #incluir //Incluye el archivo de encabezado joystick.h que define diferentes funciones para el joystick #incluir //Define el umbral inferior para el valor del eje x del joystick #definir X_MIN 100 //Define el umbral superior para el valor del eje x del joystick #definir X_MAX 900 //Define el umbral inferior para el valor del eje y del joystick #definir Y_MIN 100 //Define el umbral superior para el valor del eje y del joystick #definir Y_MAX 900 ent principal { //Los 8 pines del PortB se declaran como salida (los pines de datos del LCD están conectados) DDRB=0xff; //Los pines PD0, PD1 y PD2 del PortD se declaran como salida (los pines de control del LCD están conectados) DDRD=0x07; //Los pines PC0,PC1,PC2 y PC3 de PortC se declaran como salida (Los pines i/p1,i/p2,i/p3,i/p4 del controlador del motor de CC están conectados) DDRC=0x0f; //Declaraciones de variables int eje_x,eje_y; //inicialización del ADC adc_init; //inicialización LCD lcd_init; // Visualización de cadenas en la primera fila de la pantalla LCD lcd_string_write("Garaje de ingenieros"); //El cursor se mueve a la 2.ª fila, 1.ª columna de la pantalla LCD lcd_command_write(0xc0); // Visualización de cadenas en la segunda fila de la pantalla LCD lcd_string_write("EG LABORATORIO"); //La pantalla permanece durante 2 segundos _delay_ms(500); _delay_ms(500); _delay_ms(500); _delay_ms(500); //Pantalla clara*/ lcd_command_write(0x01); // Visualización de cadenas en la primera fila de la pantalla LCD lcd_string_write("Inclina tu mano:"); //El cursor se mueve a la 2.ª fila, 1.ª columna de la pantalla LCD lcd_command_write(0xc0); //Inicio del bucle infinito mientras(1) { //Leyendo el valor del eje x del joystick x_axis=read_joystick_x_value(0); //Lectura del valor del eje y del joystick y_axis=read_joystick_x_value(1); //El cursor se mueve a la 2.ª fila, 1.ª columna de la pantalla LCD lcd_command_write(0xc0); //Comprobando el movimiento del joystick para mover el robot en diferentes direcciones si(eje_x>X_MAX) { //El robot avanzará en dirección PORTC=0x0A; // Visualización de cadenas en la segunda fila de la pantalla LCD lcd_string_write("Avanzando "); } de lo contrario si (eje x Y_MAX) { //El robot se moverá en la dirección correcta PORTC=0x08; // Visualización de cadenas en la segunda fila de la pantalla LCD lcd_string_write("Moviéndose hacia la derecha "); } de lo contrario si (eje y_eje
###
Diagramas de circuito
Diagrama-de-circuito-Robot-inalámbrico-controlado-por-joystick-AVR-lateral-del-transmisor | |
Diagrama-de-circuito-Robot-inalámbrico-controlado-por-joystick-AVR-lateral-del-receptor |