Tabla de contenido:

Móvil controlado por gestos usando un acelerómetro y un par de transmisor-receptor de RF: 4 pasos
Móvil controlado por gestos usando un acelerómetro y un par de transmisor-receptor de RF: 4 pasos

Video: Móvil controlado por gestos usando un acelerómetro y un par de transmisor-receptor de RF: 4 pasos

Video: Móvil controlado por gestos usando un acelerómetro y un par de transmisor-receptor de RF: 4 pasos
Video: Carro controlado con la mano mediante comunicación Xbee 2024, Mes de julio
Anonim
Móvil controlado por gestos utilizando un acelerómetro y un par de transmisor-receptor de RF
Móvil controlado por gestos utilizando un acelerómetro y un par de transmisor-receptor de RF

Hola, ¿Alguna vez deseó construir un rover que pudiera conducir con simples gestos con las manos, pero nunca pudo reunir el coraje para aventurarse en las complejidades del procesamiento de imágenes y la interconexión de una cámara web con su microcontrolador, sin mencionar la batalla cuesta arriba para superar el rango deficiente y la línea de … problemas de vista? Bueno, no temas … ¡porque hay una salida fácil! ¡Mirad, como os presento el poderoso ACELERÓMETRO! * ba dum tsss *

Un acelerómetro es un dispositivo realmente genial que mide la aceleración gravitacional a lo largo de un eje lineal. Representa esto como un nivel de voltaje que fluctúa entre tierra y el voltaje de suministro, que nuestro microcontrolador lee como un valor analógico. Si aplicamos un poco nuestro cerebro (solo un poco de matemáticas y algo de física newtoniana), no solo podemos usarlo para medir el movimiento lineal a lo largo de un eje, sino que también podemos usarlo para determinar el ángulo de inclinación y detectar vibraciones. ¡No te preocupes! No necesitaremos matemáticas o física; solo trataremos con valores brutos que escupe el acelerómetro. De hecho, no es necesario que se preocupen mucho por los tecnicismos de un acelerómetro para este proyecto. Me limitaré a mencionar algunos detalles y detallaré solo lo que sea necesario para comprender el panorama general. Aunque, si estás interesado en estudiar su mecánica interna, echa un vistazo aquí.

Solo debes tener esto en cuenta por ahora: un acelerómetro es el artilugio (a menudo junto con un giroscopio) que abre las puertas a todos esos juegos de sensores de movimiento que jugamos en nuestros teléfonos inteligentes; un juego de carreras de coches, por ejemplo, en el que dirigimos el vehículo simplemente inclinando nuestros dispositivos en cualquier dirección. Y podemos imitar este mismo efecto colocando un acelerómetro (con algunos auxiliares, por supuesto) en un guante. Simplemente nos ponemos nuestros guantes mágicos e inclinamos nuestras manos hacia la izquierda o hacia la derecha, hacia adelante o hacia atrás y vemos a nuestros rovers bailar con nuestras melodías. Todo lo que tenemos que hacer aquí es traducir las lecturas del acelerómetro a señales digitales que los motores del móvil pueden interpretar y diseñar un mecanismo para transmitir estas señales al móvil. Para lograr esto, recurrimos al buen Arduino y sus ayudantes para el experimento de hoy, un par de transmisor-receptor de RF que opera a 434MHz, lo que produce un rango de aproximadamente 100-150 m en espacio abierto, lo que también nos salva de la línea de … problemas de vista.

Todo un truco ingenioso, ¿eh? Vamos a sumergirnos …

Paso 1: Reúna sus suministros

Reúna sus suministros
Reúna sus suministros
Reúna sus suministros
Reúna sus suministros
Reúna sus suministros
Reúna sus suministros
Reúna sus suministros
Reúna sus suministros
• Arduino Nano x1
• Acelerómetro (ADXL335) x1
• Motor de 5 V CC + ruedas x2 cada uno
• Rueda bovina * x1
• Controlador de motor L293D + zócalo IC de 16 pines x1 cada uno
• Transmisor de RF de 434 MHz x1
• Receptor de RF de 434 MHz x1
• Codificador HT-12E IC + toma IC de 18 pines x1 cada uno
• IC decodificador HT-12D + toma IC de 18 pines x1 cada uno
• Regulador de voltaje LM7805 x1
• Interruptor de botón x2
• LED rojo + resistencia 330O x2 cada uno
• LED amarillo + resistencia de 330O x1 cada uno
• LED verde + resistencia de 330O (opcional) x4 cada uno
• Resistencias de 51kO y 1MO x1 cada uno
• Condensadores radiales de 10 µF x2
Baterías, conectores de batería, cable USB, cables de puente, conectores hembra, terminales de tornillo de 2 pines, PCB, chasis y sus accesorios de soldadura habituales

Si se pregunta por qué estamos usando una rueda bovina, la cuestión es que los módulos transmisor y receptor de RF solo tienen 4 pines de datos, lo que significa que solo podemos conducir 2 motores y, por lo tanto, el uso de una rueda bovina para Apoyar la estructura. Sin embargo, si cree que su vehículo se vería un poco más genial con cuatro ruedas, no se preocupe, ¡hay una solución! En este caso, simplemente borre la rueda bovina de la lista y agregue otro par de motores de 5 V CC, acompañados de una rueda cada uno, y busque el truco simple que se discutió hacia el final del paso 3.

Finalmente, para los valientes, existe la posibilidad de otra pequeña modificación en el diseño, que implica diseñar su propio Arduino. Dirígete a la sección de bonificación en el siguiente paso y compruébalo por ti mismo. También necesitará algunos suministros adicionales: un ATmega328P, un zócalo IC de 28 pines, un oscilador de cristal de 16 Mhz, dos tapas de cerámica de 22pF, otro regulador de voltaje 7805, dos tapas radiales más de 10μF y resistencias de 10kΩ, 680Ω, 330Ω, y sí, menos el Arduino!

Paso 2: Conecte el transmisor

Conecte el transmisor
Conecte el transmisor
Conecte el transmisor
Conecte el transmisor
Conecte el transmisor
Conecte el transmisor
Conecte el transmisor
Conecte el transmisor

Dividiremos el proyecto en dos componentes: los circuitos transmisor y receptor. El transmisor consta de un acelerómetro, un Arduino y un módulo transmisor de RF junto con un codificador IC HT-12E, todos conectados según el esquema adjunto.

El acelerómetro, como se presentó anteriormente, sirve para reconocer nuestros gestos con las manos. Usaremos un acelerómetro de tres ejes (básicamente tres acelerómetros de un solo eje en uno) para satisfacer nuestras necesidades. Se puede utilizar para medir la aceleración en las tres dimensiones y, como habrás adivinado, no produce uno, sino un conjunto de tres valores analógicos en relación con sus tres ejes (x, y y z). En realidad, solo necesitamos la aceleración a lo largo de los ejes xey, ya que solo podemos conducir el vehículo en cuatro direcciones: hacia atrás o hacia atrás (es decir, a lo largo del eje y) e izquierda o derecha (es decir, a lo largo del eje x). Habríamos necesitado el eje z si estuviéramos construyendo un dron, para poder controlar también su ascenso o descenso mediante gestos. En cualquier caso, estos valores analógicos que arroja el acelerómetro deben convertirse en señales digitales para poder accionar los motores. El Arduino se encarga de esto, que también transmite estas señales, tras la conversión, al móvil a través del módulo transmisor de RF.

El transmisor de RF solo tiene una función: transmitir los datos "en serie" disponibles en el pin 3 por la antena en el pin 1. Esto aboga por el uso del HT-12E, un codificador de datos paralelo a serie de 12 bits, que recopila hasta 4 bits de datos paralelos del Arduino en las líneas AD8 a AD11, lo que nos permite hacer espacio para hasta 24 = 16 combinaciones de E / S diferentes en lugar del pin de datos único en el transmisor de RF. Los 8 bits restantes, extraídos de las líneas A0 a A7 del codificador, constituyen el byte de dirección, lo que facilita el emparejamiento del transmisor de RF con el receptor de RF correspondiente. Luego, los 12 bits se juntan y serializan, y se pasan al pin de datos del transmisor de RF, que a su vez, ASK-modula los datos en una onda portadora de 434MHz y los dispara a través de la antena en el pin 1.

Conceptualmente, cualquier receptor de RF que escuche a 434Mhz debería poder interceptar, demodular y decodificar estos datos. Sin embargo, las líneas de dirección en el HT-12E y las de la contraparte HT-12D (un decodificador de datos de serie a paralelo de 12 bits), nos permiten hacer que un par de transmisor-receptor de RF sea único al enrutar los datos solo al receptor previsto, lo que limita la comunicación con todos los demás. Todo lo que se requiere de nosotros es configurar las líneas de dirección de manera idéntica en ambos frentes. Por ejemplo, dado que hemos conectado a tierra todas las líneas de dirección para nuestro HT-12E, debemos hacer lo mismo para el HT-12D en el extremo receptor o, de lo contrario, el móvil no podrá recibir las señales. De esta manera, también podemos controlar varios móviles con un solo circuito transmisor configurando de manera idéntica las líneas de dirección en los HT-12D en cada uno de los receptores. O bien, podríamos ponernos dos guantes, cada uno con un circuito transmisor que contiene una configuración de línea de dirección distinta (por ejemplo, uno con todas las líneas de dirección conectadas a tierra y el otro con todas en alto, o uno con una línea conectada a tierra mientras que las siete restantes se mantienen alto y el otro con dos líneas conectadas a tierra mientras que las seis restantes se mantienen en alto, o cualquier otra combinación de las mismas) y cada una de ellas dirige múltiples rovers configurados de manera idéntica. ¡Juega al maestro en una sinfonía de Android!

Una cosa importante a tener en cuenta al montar el circuito es el valor de Rosc. El HT-12E tiene un circuito oscilador interno entre los pines 15 y 16, que se habilita conectando una resistencia, llamada Rosc, entre esos pines. El valor seleccionado para Rosc determina realmente la frecuencia del oscilador, que puede variar según la tensión de alimentación. ¡Seleccionar un valor apropiado para Rosc es crucial para el funcionamiento del HT-12E! Idealmente, la frecuencia del oscilador del HT-12E debería ser 1/50 veces mayor que la del HT-12D. Por lo tanto, dado que estamos operando con 5V, elegimos resistencias de 1MΩ y 51kΩ como Rosc para los circuitos HT-12E y HT-12D respectivamente. Si planea operar los circuitos con un voltaje de suministro diferente, consulte el gráfico “Frecuencia del oscilador frente al voltaje de suministro” en la página 11 de la hoja de datos del HT-12E adjunta para determinar la frecuencia exacta del oscilador y el resistor que se utilizará.

Además, como nota al margen, emplearemos encabezados hembra aquí (con un propósito similar a los enchufes IC) para conectar el acelerómetro, el transmisor de RF y el Arduino en el circuito en lugar de soldarlos directamente en la PCB. La intención es la acomodación de un pequeño componente de reutilización. Digamos, ha pasado un tiempo desde que diseñó su rover controlado por gestos y está sentado allí, medio cubierto de polvo, encima de su estante de trofeos y se topa con otro gran instructable que aprovecha la eficacia de un acelerómetro. Entonces, ¿Qué haces? Simplemente sáquelo de su vehículo y empújelo en su nuevo circuito. No es necesario convocar a las "Amazonas" para conseguir una nueva:-p

Bono: ¡Olvídese del Arduino y, sin embargo, no lo haga

En caso de que te sientas un poco más aventurero, y especialmente si crees que gastar esta maravilla bellamente diseñada (el Arduino, por supuesto) para una tarea tan trivial como la nuestra es un poco exagerado, ten paciencia conmigo un poco más.; y si no, no dude en pasar al siguiente paso.

Nuestro objetivo aquí es hacer del Arduino (el cerebro del Arduino, de hecho; sí, ¡estoy hablando del ATmega IC!) Un miembro permanente del equipo. El ATmega estaría programado para ejecutar un solo boceto una y otra vez para que pudiera servir como una parte perpetua del circuito, al igual que el HT-12E, un simple IC, simplemente sentado allí, haciendo lo que se supone que debe hacer. ¿No es así como se supone que es un sistema embebido real?

De todos modos, para continuar con esta actualización, simplemente modifique el circuito según el segundo esquema adjunto. Aquí, simplemente reemplazamos los encabezados hembra para el Arduino con un zócalo IC para el ATmega, agregamos una resistencia pull-up de 10K en el pin de reinicio (pin 1) del IC y lo bombeamos con un reloj externo entre los pines 9 y 10 Desafortunadamente, si eliminamos el Arduino, también soltaremos sus reguladores de voltaje incorporados; ergo, debemos replicar el circuito LM7805 que habíamos empleado para el receptor aquí también. Además, también utilizamos un divisor de voltaje para extraer los 3,3 V necesarios para alimentar el acelerómetro.

Ahora, el único otro inconveniente aquí es programar el ATmega para que haga su trabajo. Sin embargo, tendrás que esperar hasta el paso 4. Así que estad atentos…

Paso 3: Y el receptor

Y, el receptor
Y, el receptor
Y, el receptor
Y, el receptor
Y, el Receptor
Y, el Receptor
Y, el receptor
Y, el receptor

El receptor consta de un módulo receptor de RF acoplado con un decodificador IC HT-12D y un par de motores de CC operados con la ayuda de un controlador de motor L293D, todos conectados según el esquema adjunto.

El único trabajo del receptor de RF es demodular la onda portadora (recibida a través de su antena en el pin 1) y renderizar los datos "en serie" recuperados en el pin 7 desde donde los recoge el HT-12D para la deserialización. Ahora, asumiendo que las líneas de dirección (A0 a A7) en el HT-12D están configuradas de manera idéntica a su contraparte HT-12E, los 4 bits paralelos de datos se extraen y pasan, a través de las líneas de datos (D8 a D11) en el HT-12D, al controlador del motor, que a su vez interpreta estas señales para impulsar los motores.

Nuevamente, preste atención al valor de Rosc. El HT-12D también tiene un circuito oscilador interno entre los pines 15 y 16, que se habilita conectando una resistencia, llamada Rosc, entre esos pines. El valor seleccionado para Rosc determina realmente la frecuencia del oscilador, que puede variar según la tensión de alimentación. ¡Seleccionar un valor apropiado para Rosc es crucial para el funcionamiento del HT-12D! Idealmente, la frecuencia del oscilador del HT-12D debería ser 50 veces mayor que la del HT-12E. Por lo tanto, dado que estamos operando con 5V, elegimos resistencias de 1MΩ y 51kΩ como Rosc para los circuitos HT-12E y HT-12D respectivamente. Si planea operar los circuitos con un voltaje de suministro diferente, consulte el gráfico “Frecuencia del oscilador frente al voltaje de suministro” en la página 5 de la hoja de datos del HT-12D adjunta para determinar la frecuencia exacta del oscilador y el resistor que se utilizará.

Además, no olvide los conectores hembra para el receptor de RF.

Opcionalmente, se puede conectar un LED a través de una resistencia limitadora de corriente de 330 Ω a cada uno de los 4 pines de datos del HT-12D para ayudar a determinar el bit recibido en ese pin. El LED se encenderá si el bit recibido es ALTO (1) y se atenuará si el bit recibido es BAJO (0). Alternativamente, se podría conectar un solo LED al pin VT del HT-12D (nuevamente, a través de una resistencia limitadora de corriente de 330Ω), que se iluminaría en caso de una transmisión válida.

Ahora, si está buscando el truco con los motores del que estaba hablando en el paso uno, ¡es muy fácil! Simplemente conecte los dos motores en cada conjunto en paralelo como se muestra en el segundo esquema. Esto funciona como se supone que debe hacerlo porque los motores de cada conjunto (los motores delantero y trasero a la izquierda y los motores delantero y trasero a la derecha) nunca funcionan en direcciones opuestas. Es decir, para girar el rover a la derecha, los motores delantero y trasero de la izquierda deben impulsarse hacia adelante y los motores delantero y trasero de la derecha deben impulsarse hacia atrás. De manera similar, para que el rover gire a la izquierda, los motores delantero y trasero de la izquierda deben impulsarse hacia atrás y los motores delantero y trasero de la derecha deben impulsarse hacia adelante. Por lo tanto, es seguro alimentar el mismo par de voltajes a ambos motores en un conjunto. Y, la forma de hacerlo es simplemente conectando los motores en paralelo.

Paso 4: Pasar al código

Pasando al Código
Pasando al Código

Solo queda una cosa por hacer para poner el rover en funcionamiento. ¡Sí, lo has adivinado bien! (Espero que lo haya hecho) Todavía tenemos que traducir las lecturas del acelerómetro a una forma que el conductor del motor pueda interpretar para poder conducir los motores. Si está pensando que, dado que las lecturas del acelerómetro son analógicas y el controlador del motor espera señales digitales, tendremos que implementar algún tipo de ADC, bueno, no técnicamente, pero eso es lo que tenemos que hacer. Y es bastante sencillo.

Sabemos que un acelerómetro mide la aceleración gravitacional a lo largo de un eje lineal y que esta aceleración se representa como un nivel de voltaje que fluctúa entre el suelo y el voltaje de suministro, que nuestro microcontrolador lee como un valor analógico que varía entre 0 y 1023. Pero, dado que nosotros Si está operando el acelerómetro a 3.3V, es aconsejable que establezcamos la referencia analógica para el ADC de 10 bits (que viene integrado en el ATmeaga a bordo de un Arduino) en 3.3V. Simplemente hará que las cosas sean más fáciles de entender; aunque no importará mucho para nuestro pequeño experimento, incluso si no lo hiciéramos (solo tendremos que modificar un poco el código). Sin embargo, para hacerlo, simplemente conectamos el pin AREF en el Arduino (pin 21 en el ATmega) a 3.3V y denotamos este cambio en el código llamando a analogReference (EXTERNAL).

Ahora, cuando colocamos el acelerómetro plano y analógico. Lee la aceleración a lo largo de los ejes xey (¿recuerdas? Solo necesitamos estos dos ejes), obtenemos un valor de aproximadamente 511 (es decir, a mitad de camino entre 0 y 1023), que es solo un forma de decir que hay 0 aceleración a lo largo de estos ejes. En lugar de profundizar en los detalles del hecho, imagínese esto como los ejes xey en un gráfico, con el valor 511 denotando el origen y 0 y 1023 los puntos finales como se muestra en la figura; oriente el acelerómetro de tal manera que sus pines apunten hacia abajo y se mantengan más cerca de usted o de lo contrario podría invertir / intercambiar los ejes. Esto significa que, si inclinamos el acelerómetro hacia la derecha, deberíamos leer un valor mayor que 511 a lo largo del eje x, y si inclinamos el acelerómetro hacia la izquierda, deberíamos obtener un valor menor que 511 a lo largo del eje x. De manera similar, si inclinamos el acelerómetro hacia adelante, deberíamos leer un valor mayor que 511 a lo largo del eje y, y si inclinamos el acelerómetro hacia atrás, deberíamos leer un valor menor que 511 a lo largo del eje y. Y así es como deducimos, en código, la dirección en la que se debe conducir el rover. Pero esto también significa que debemos mantener el acelerómetro realmente estable y alineado paralelo a una superficie plana para poder leer un 511 a lo largo de ambos ejes. para tener el rover estacionado todavía. Para facilitar un poco esta tarea, definimos ciertos umbrales que forman un límite, como lo muestra la figura, de modo que el rover permanezca estacionario siempre que las lecturas xey se encuentren dentro de los límites y sepamos con certeza que el rover debe establecerse en movimiento una vez superado el umbral.

Por ejemplo, si el eje y marca 543, sabemos que el acelerómetro está inclinado hacia adelante, por lo tanto, debemos dirigir el vehículo hacia adelante. Hacemos esto configurando los pines D2 y D4 HIGH y los pines D3 y D5 LOW. Ahora, dado que estos pines están conectados directamente al HT-12E, las señales se serializan y disparan el transmisor de RF solo para ser captadas por el receptor de RF que se encuentra en el móvil, que con la ayuda del HT-12D deserializa las señales y los pasa al L293D, que a su vez interpreta estas señales y hace avanzar los motores

Sin embargo, es posible que desee cambiar estos umbrales para calibrar la sensibilidad. Una manera fácil de hacerlo es simplemente conectar su acelerómetro a su Arduino y ejecutar un boceto que escupe las lecturas xey en el monitor en serie. Ahora simplemente mueva el acelerómetro un poco, eche un vistazo a las lecturas y decida los umbrales.

¡Y eso es! Sube el código a tu Arduino y disfruta !! O, quizás no tan pronto:-(Si no omitió la sección de bonificación, cargar el código en su ATmega significaría un poco más de trabajo. Tiene dos opciones:

Opción A: Utilice un dispositivo USB a serie, como la placa de conexión básica FTDI FT232. Simplemente ejecute los cables desde el encabezado TTL a los pines correspondientes en el ATmega según el mapeo a continuación:

Pines en el tablero de conexiones Pines en el microcontrolador
DTR / GRN RST / Reset (Pin 1) a través de una tapa de 0,1 µF
Rx Tx (Pin 3)
Tx Rx (Pin 2)
Vcc + 5v de salida
CTS (no usado)
Gnd Suelo

Ahora, conecte un extremo de un cable USB a la placa de conexión y el otro a su PC y cargue el código como lo haría normalmente: inicie el IDE de Arduino, seleccione un puerto serie apropiado, configure el tipo de placa, compile el boceto y presione cargar.

Opción B: use un UNO si tiene uno por ahí. Simplemente conecte su ATmega al UNO, cargue el código como lo haría normalmente, extraiga el IC y vuelva a colocarlo en el circuito del transmisor. ¡Tan fácil como un pastel!

Cualquiera de estas opciones debería funcionar, asumiendo que fue lo suficientemente inteligente como para grabar el gestor de arranque en su ATmega, o, si fue aún más inteligente, para comprar un ATmega con el gestor de arranque ya instalado en primer lugar. Si no es así, continúe y hágalo siguiendo los pasos que se describen aquí.

Andddd, ¡hemos terminado oficialmente! Espero que hayas disfrutado de este instructivo extrañamente largo. Ahora, continúe, termine de construir su rover si aún no ha terminado, juegue con él por un tiempo y vuelva a inundar la sección de comentarios a continuación con consultas y / o críticas constructivas.

¡Gracias

PD La razón por la que no subí ninguna foto del proyecto terminado es, bueno, porque no lo terminé yo mismo. A la mitad de su construcción, pensé en algunos aumentos, como el control de velocidad, la evitación de obstáculos y quizás una pantalla LCD en el móvil, que en realidad no es tan difícil si usamos un microcontrolador tanto en el extremo transmisor como en el receptor. Pero, ¿por qué no hacerlo por las malas? Por lo tanto, actualmente estoy trabajando en esa dirección y publicaré una actualización tan pronto como dé algún fruto. Sin embargo, probé el código y el diseño con la ayuda de un prototipo rápido que construí usando módulos de uno de mis proyectos anteriores; puedes ver el video aquí.

Recomendado: