Dispositivo Android controlado por Arduino controlado por Bluetooth - ciclo completo (parte 1)

Introduccion


Una historia detallada de cómo el automóvil Arduino, controlado por un dispositivo Android a través de Bluetooth, se ensambló a partir de tres motores. En varias docenas de párrafos intentaré explicar lo más posible paso a paso dónde conectar cada uno de los cables, cómo escribir una aplicación patentada y en qué rastrillo de niños tuve que saltar durante más de una semana.

Un poco sobre nivel, autor y advertencias


Yo, un autor, un niño de 16-17 años de un pueblo cerca de Moscú, me especializo en escribir aplicaciones de Android (y allí es más difícil quemar algo), así que me quito la responsabilidad de un enfoque óptimo para resolver problemas.

Prácticamente cada uno de los pasos descritos a continuación me llevó más de lo que valdría la pena. Probablemente por este motivo quiero compartir mi experiencia. Y al mismo tiempo, estaré muy feliz si me regañas por los errores y me pides una optimización.

Desafío


La tarea más fácil es hacer que el auto sea controlado por Arduino y reemplazar el control remoto con un Android. Pero en la mayoría de los momentos tuve que reinventar la rueda, porque no se encontró una solución adecuada en Internet.

Necesitará


  1. Arduino
  2. Motor Shield (en mi caso dos)
  3. Bluetooth
  4. Android
  5. Alambres convencionales

Base de diseño


El Lego Outdoor Challenger se tomó como base (en realidad, parece menos patético). Todo lo que queda de ella: el estuche (se eliminan todos los elementos de decoración) y tres motores.
imagen
La máquina tenía su propio tablero, pero una de las tareas implicaba universalidad: lo hice, otros pueden repetirlo. Sacó los cerebros, puso el Arduino Uno.

Instalación Arduino


Por alguna razón, los creadores no proporcionaron espacio para el Arduino, por lo que lo sujetaron a los tornillos perforando plástico. Colocó madera contrachapada debajo del tablero para que nada se cortocircuitara. Es mejor deslizar algo de plástico debajo de los tornillos (un trozo de botella), porque el tablero no está protegido de los pernos de hierro.



En la parte superior del tablero, puse inmediatamente dos motores, así sea. Para controlar el segundo, tendrá que lanzar un cable desde cualquier puerto digital a H1 (dirección) y el segundo desde un pin con soporte de cuña (marcado con un "~", generalmente 10, 11) a E1 (velocidad).



Determinación del ángulo de rotación.


Sorprendentemente, no es el servoaccionamiento el que responde a la rotación de la máquina, sino el motor ordinario. Hay un problema: sería bueno no quemarlo, porque el ángulo de rotación es limitado y el motor puede girar tanto como desee.

La opción con el método de empuje desaparece, ya que a un nivel de batería diferente, la cantidad de corriente suministrada al motor cambiará, lo que conducirá a un ángulo en constante cambio. También es imposible girar hasta detenerse, tarde o temprano los engranajes se desmoronarán.

Solución: siga el ángulo a través del circuito. La foto muestra una cosa pequeña, que está montada cerca del mecanismo giratorio. En la parte que gira con las ruedas izquierda / derecha junto al motor, se adjunta una vieira con contactos de hierro.





Principio de funcionamiento: se suelda un cable a cada línea (hay cuatro en total), la parte inferior se conecta al más (siempre se sujeta con un peine, vea la imagen), los cables restantes se ponen a menos. Cuando el diente de vieira cae en la fila inferior y, por ejemplo, en el tercero, se produce un cortocircuito, la corriente fluye, esto lo nota Arduino.



Gracias a las diversas combinaciones de las tres bandas, se pueden definir hasta siete ángulos. Por ejemplo, cuando hay corriente en todas las líneas, las ruedas se giran a la posición más a la derecha, cuando hay corriente solo en la parte superior, las ruedas se giran hacia la izquierda tanto como sea posible. La tabla proporciona todas las opciones.



Ángulo de conexión y código


Cada color tiene su propio color: el fondo es verde, el primero debajo es rojo, el segundo es negro y el tercero es blanco. En la etapa inicial, la placa de pruebas y los LED se utilizaron para la depuración visual.



El diagrama de conexión se muestra en la figura. Además, tiramos a verde, los otros estiramos a menos. A través de la resistencia instalada para eliminar la interferencia y la ausencia de cortocircuito, conecte los cables a las salidas A0-A2. Se seleccionan simplemente al guardar otros puertos.



El código se da con comentarios. Conectamos pines y los interrogamos a través de digitarRead (). Si hay voltaje, se devolverá verdadero. A continuación, observamos si el resultado significa que las ruedas están en posiciones extremas, prohibimos un giro adicional en esta dirección.

Un pequeño truco: dado que se necesitarán salidas en 5V y 3.3V en el futuro, puede poner un plus en uno de los pines digitales. Antes de cada verificación de ángulo, proporcione una corriente a través de digitalWrite (whitePin), luego verifique el ángulo y elimine la corriente.

int speedTurn = 180; // ,  0  255 //    int pinRed = A0; int pinWhite = A1; int pinBlack = A2; int pinAngleStop = 12; //   ,    ,  //   void setup() { //    pinMode(pinRed, INPUT); pinMode(pinBlack, INPUT); pinMode(pinWhite, INPUT); // pinMode(pinAngleStop, OUTPUT); //  ,    pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); Serial.begin(9600); } //   loop(),      void turn(int angle) { digitalWrite(pinAngleStop, HIGH); //   ,    delay(5); // ,   ""  if(angle > 149) { if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); } else if (angle < 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } digitalWrite(pinAngleStop, LOW); //     delay(5); } 

Paralelización de ruedas rodantes


Inicialmente, dos motores de propulsión están conectados entre sí. Se desconectaron por dos razones: un giro es más efectivo si las ruedas giran en diferentes direcciones, y dos motores potentes no tiran de una tabla.

Problema: el blindaje del motor tiene dos salidas, cada una de las cuales produce hasta 2 amperios. Cada motor come 0.7A. Parece menos, pero no a cargas máximas. Digamos que la máquina está atrapada en la arena o descansada, la corriente se eleva por encima del amperio. No es crítico, pero es potencialmente peligroso.

Pero resultó ser crítico que el tablero se calienta. Minutos y medio después de la carrera, el escudo del motor se estaba calentando y comenzó a funcionar feo: las corrientes no eran las correctas, las ruedas no giraban, y así sucesivamente.

La solución a ambos problemas: un motor conectado a un escudo del motor, el segundo al otro. Por extraño que parezca, ayudó. La temperatura ha bajado, no hay sobrecalentamiento. Podrías poner un radiador, pero es difícil de montar.



Conexión Bluetooth


Usé el modelo HC-05, que jugó una broma fatal. Todos los bluetooth están conectados de la misma manera: un cable a 3.3V (a veces comenzó a funcionar solo desde 5V), el segundo a menos, dos más en el puerto 0 y 1 (leer y enviar, respectivamente). Un cable firmado por RXD en bluetooth está atascado en TXD arduino y TXD en RXD (si lo mezcla, no verá los datos).

Hay una advertencia: los puertos 0 y 1 son utilizados por defecto por Serial, a través del cual se inunda el boceto. Es decir, mientras el bluetooth está atascado, el boceto no se inundará. Hay dos formas: sacar el bluetooth durante el tiempo de llenado o reasignar las entradas y salidas del bluetooth. La segunda opción se lleva a cabo en dos líneas.

 #include <SoftwareSerial.h> \\  SoftwareSerial BTSerial(8, 9); \\ 8  9   0  1 

La trampa que me ha comido durante tres días de trabajo es la velocidad de comunicación. Por costumbre, instalé 9600 y fui a probar. O bien los datos no llegaron, luego hubo un lío de caracteres. ¡Y al final la respuesta es que el HC-05 se comunica por 38400! Preste mucha atención al hecho de que en Setup () ejecutaré BTSerial.begin (39400), aunque Serial.begin (9600).

Sistema de envío de comandos


El artículo se está alargando demasiado, por lo que eliminaré la consideración del código Arduino y Android en una segunda parte separada, y ahora describiré el principio.

Hay un joystick en el dispositivo Android (un círculo, cuya implementación también se encuentra en la segunda parte). Android lee las lecturas y las convierte en números adecuados para arduino: la velocidad de los píxeles se convierte en un valor de -255 a 255 (negativo - inverso), y también determina el ángulo. Deliberadamente le di esta tarea al teléfono, ya que es mucho más potente y fácil de hacer frente al cálculo de varios cientos de valores por segundo.



Después de instalar el socket, los datos se envían en el siguiente formato: @ speed # * angle #. @ - indica que los siguientes dígitos contienen la velocidad, # - indica el final del valor de la velocidad, * - el comienzo del valor del ángulo, # - termina de registrar el ángulo. El ciclo es interminable, los comandos se envían cada 100 milisegundos (se selecciona el número óptimo). Si no se presiona nada en el Android, no se envía nada.

El algoritmo de recepción de datos se describe en detalle en el código de boceto. Se correspondió más de una vez y, en cuanto a mí, funciona perfectamente.

Conclusión de la primera parte.


En este artículo, intenté revelar todo lo relacionado con la parte física de la máquina. Lo más probable es que me haya perdido algo, así que asegúrese de preguntar.

Pero lo más interesante, en cuanto a mí, permaneció por un segundo: el programa Arduino y la aplicación de Android, la verdadera magia está ocurriendo allí, al menos para los jóvenes.

Si no encuentra la respuesta a alguna parte y quiere meterme personalmente en las deficiencias, espero - dendolg1@mail.ru ,.

UPD: la segunda parte ya está disponible - habr.com/post/424813

Source: https://habr.com/ru/post/es424087/


All Articles