Este artículo es una secuela del trabajo de
Love, Death and Robots, "La máquina basada en Arduino controlada por el dispositivo Android a través de Bluetooth es un ciclo completo", que consta de dos partes (
una ,
dos ). Las cosas descritas allí fueron ligeramente modificadas, rehechas, y el robot mismo de una máquina de viaje se convirtió en un jugador de fútbol. En general, hay material interesante sobre cómo hacerlo.
La instrucción anterior se dividió en dos partes: software y física. No hubo tantos cambios en ambas direcciones, por lo que esta vez todo está en una copia. Le recordaré brevemente por qué se necesita la parte descrita, pero para una comprensión completa es mejor repasar las dos primeras partes.
Parte fisica
Basado en los mismos principios descritos en el primer artículo:
- sandwich de Arduino Uno y Motor Shield.
- Dos motores conectados a la pantalla del motor.
Y aquí están los cambios:
- La parte de choque apareció, por extraño que parezca, responsable de golpear la pelota.
- El caso ahora es completamente mío, impreso en una impresora 3D.
Vivienda
Una forma es un círculo en el que caben tanto una tabla como dos ruedas. Extensión para la parte donde se mantendrá la fuerza de impacto.

Al diseñar esto, preste atención a:
- Lados altos. Los robots chocan durante el juego, los lados protegen no solo tus cables, sino también a tus rivales de tus cables.
- Centro de gravedad y estabilidad. El centro de gravedad es, por supuesto, donde está el tablero. Las ruedas están ubicadas cerca de él, para que no se deslicen. Además, se coloca una batería en la parte superior del tablero.
- Para evitar que el robot picotee la nariz o la espalda, colocamos bolas en el kit desde los amperios aquí y allá (si no están allí, puede reemplazarlo con cualquier otro diseño deslizante).
- Rigidez de un diseño. La plataforma no debe hundirse bajo el peso de las placas de circuitos y motores. No restrinja, use materiales duros (madera contrachapada) ni refuerce la estructura plástica con bastidores

Y ahora la tontería principal
Las bolas agregadas por falta de "picoteo" elevaron la plataforma para que las ruedas no llegaran al piso. Para evitar esto, usamos ruedas de mayor diámetro o acortamos las estructuras de soporte. En general, ¡calculamos esto por adelantado!
Parte de choque. Ella no golpea. Golpea, pero no lo suficientemente frío. En nuestro primer modelo había una máquina servo a la que se conectaba una parte similar a una cuchara quitanieves. Al cambiar la posición del servo (de 0 a 30 grados), puede simular un golpe. Pero los servos resultaron ser lentos, por lo que el golpe va al deuce.
Hay dos formas de salir: agregue un tirón al impacto o reemplace los servos con solenoides. La primera opción es aumentar el impulso suministrando velocidad a las ruedas durante un golpe. En la práctica, esto es lo siguiente: el usuario presiona el botón de golpe, el robot comienza desde el punto (ligeramente) y al mismo tiempo realiza un golpe.
La segunda opción: los solenoides empujan la parte del choque, y aquí todo depende de la potencia (velocidad) del choque, que a su vez depende de las características del solenoide.

Parte de software
Por una buena tradición, que ya es un artículo, dividiremos esta sección en dos partes. Primero una aplicación de Android, luego un boceto de Arduino.
Android
Permítame recordarle que la aplicación fue escrita por mí desde cero. En los últimos seis meses, entendí un poco más sobre este asunto, así que describiré lo que pensó
doper .
Primero, vayamos a la simplificación. Ahora el protocolo de comunicación es el siguiente: "carácter de apertura" + "valor" + "carácter de cierre" (Para comprender cómo obtengo estos valores y de qué se trata, consulte el análisis completo de la aplicación
aquí ). Esto funciona tanto para la velocidad como para el ángulo. Como solo hay un tipo de ataque, no necesita tanta sabiduría, por lo que el equipo consta de un personaje "/" (sobre el equipo golpeado en el párrafo).
private void sendCommand(String speed, String angle) { String speedCommand = "#" + speed + "#";
Un comando típico se vería así: # 125 # @ 180 @, donde 125 es velocidad y 180 es ángulo. Por supuesto, esto puede simplificarse aún, pero una de las tareas era mantener la ligereza y la legibilidad, para que luego se pudiera explicar fácilmente, incluso a los niños.
Ha aparecido un nuevo comando sendHit (), que se activa cuando se presiona el botón "Hit". Ella envía un solo "/". Dado que bluetooth 2.0+ ordinario no sufre los datos recibidos al mismo tiempo, es decir, sabe cómo ponerlos en la cola y no perderlos, no necesitamos controlar esto. Si va a trabajar con Bluetooth Low Energy 4.0+ (bueno, de repente), ya habrá que organizar la cola manualmente, de lo contrario los datos se perderán.
... bHit = findViewById(R.id.b_high_hit);
Arduino
Entonces, el protocolo para enviar comandos ha cambiado, el algoritmo de recepción también ha cambiado. El simplificó. Uno si también se agregó la patada de seguimiento. Un análisis completo del boceto está
aquí .
bt.read () lee un caracter. Si es "#", comienzan los símbolos de velocidad. Los leemos hasta que aparece el carácter de cierre "#". El bucle for no se puede usar aquí, porque la longitud de la velocidad no se conoce de antemano (puede ser un número de un solo dígito, dos dígitos o tres dígitos). El valor resultante se escribe en la variable.
Lo mismo sucede con un giro. Después de leer tanto la velocidad como el ángulo, pasamos todo al giro de la función (velocidad int, ángulo int).
void loop() { if(BTSerial.available() > 0) {
La función turn () determina en qué dirección moverse (hacia adelante, hacia atrás) y hacia dónde girar (derecha, izquierda, recta). La restricción if (speed> 0 && speed <70) es necesaria para que el robot no disminuya la velocidad si se pierden bytes. Enfrenté esto cuando aumenté la velocidad de transmisión (jugué con demoras de 100-300ms entre equipos), a veces el valor de la velocidad no alcanzó y se convirtió en 0, 40 (aunque, por ejemplo, 240 se envió realmente). Muleta, pero funciona.
Se le puede llamar "protección contra factores incontrolables".
void turn(int angle, int speed) { if(speed >= 0 && speed < 70) return; if(speed > 0) { digitalWrite(dirLeft, HIGH); digitalWrite(dirRight, HIGH); } else if (sp < 0) { digitalWrite(dirLeft, LOW); digitalWrite(dirRight, LOW); } if(angle > 149) { analogWrite(speedLeft, speed); analogWrite(speedRight, speed - 65);
Competiciones en MIPT en lugar de un total
Con nuestro robot, fuimos a la competencia de fútbol robótico, que se organizó y se celebró en el Instituto de Física y Tecnología de Moscú, Dolgoprudny, 14/04/2019. Logramos llegar a la final de 1 \ 4, pero no avanzamos más.

El proceso en sí fue interesante para nosotros, pero aquí describiré las conclusiones que logramos sacar al observar el robot en el campo:
- Necesito más poderoso. Cuatro ruedas o motores más potentes y otras ruedas son deseables. Aunque, por supuesto, eran los modelos de cuatro ruedas los que parecían más ventajosos
- La administración no es alta. Es necesario transferir el robot a un giro del tanque (girar en un punto debido a que las ruedas giran en direcciones opuestas), de lo contrario, el radio de giro es demasiado grande. Y en general, la opción con cuatro flechas, en lugar de un círculo con una velocidad proporcional, es preferible para el fútbol . La opción descrita es más adecuada para las carreras en las que conduces continuamente, y aquí necesitas claridad (giré 10 grados alrededor de mi eje, apunté a la pelota y presioné el botón hacia adelante. Pero luego, cuando agarré la pelota, me gustaría maniobrar con flexibilidad, pero aquí necesitas proporcionalmente velocidad ... necesitas combinar de alguna manera esta cosa).
Los comentarios y sugerencias serán muy felices. En artículos anteriores, los comentarios son a veces más interesantes que el artículo en sí. Gracias,
Sasha y
Dana por el trabajo .