Tanquino Pi
Autor
- Julián Sánchez Fernández
Idea
Para el proyecto final de la asignatura de Sistemas Empotrados y de Tiempo Real me he inspirado en el juego arcade «Tank Force», que publicó la empresa namco en 1991. De manera muy resumida, el juego consiste en controlar un tanque a través de una ciudad y eliminar los tanques enemigos mientras evitas que disparen a tu tanque o destruyan la base.
El objetivo es construir un vehículo terrestre que se parezca lo máximo posible a un tanque (al menos en la forma de moverse), tan pequeño como sea posible y que además de poder controlarse a través de WiFi, disponga de una cámara en primera persona que retransmita lo que «ve» el tanque y pueda interactuar con otras réplicas mediante «disparos» de luz infrarroja.
Materiales
Elemento | Precio |
Raspberry Pi Zero W | 10€ |
Tarjeta microSD 16Gb | 8€ |
NodeMCU (clon) | 3,5€ |
LED Infrarrojo | 0,33€ |
Receptor infrarrojos | 0,5€ |
Resistencias varias | 0,1€ |
1m de cable | 0,2€ |
Conectores USB (2 micro y 1 normal) | 2€ |
Motores (x4) | 7€ |
Modulo de cámara para Raspberry Pi | 12€ |
Tornillería varia (métrica 3) | 8€ |
Rollo de plástico ABS 1.75mm (1Kg) | 14€ |
Módulo L298N | 3€ |
Estaño | 6€ |
TOTAL | 74,63€ |
Herramientas
Herramienta | Precio |
Impresora 3D (Creality Ender 3 pro) | 250€ |
Soldador de estaño | 15€ |
Powerbank (salida > 1A) | 17€ |
Calibre digital (solo necesario para diseño) | 10€ |
Conversor UART <-> USB | 5€ |
TOTAL | 297€ |
Diseño 3D
He diseñado el chasis del tanque y las cadenas completamente en 3D para poder ajustarme mejor al objetivo de que el tamaño del vehículo sea el menor posible y no depender de piezas de terceros.
La herramienta que he usado para hacer el diseño es FreeCAD, el cual se puede usar de forma gratuita y gracias a la parametrización de las piezas, cualquier persona interesada podrá aprovechar, modificar o mejorar el modelo. Las piezas se pueden unir usando únicamente tornillería de métrica 3, aunque también es recomendable disponer de algún tipo de pegamento para plásticos (las pistolas de pegamento termofusible son ideales) para fijar las ruedas a los ejes de los motores y evitar que alguna otra pieza se mueva.
Cada pieza ha sido diseñada a prueba y error a través de múltiples prototipos hasta llegar al modelo final que se puede descargar a continuación. Durante ese proceso ha sido extremadamente útil tener a mano un calibre digital, una calculadora y conocimientos básicos de trigonometría (para el diseño de las ruedas).
Configuración Raspberry Pi Zero
Para usar la Raspberry Pi Zero W debemos seguir estos pasos:
1. Grabar la imagen de Raspberry Pi OS en la tarjeta microSD de 16Gb
Podemos seguir cualquiera de estos tutoriales:
https://www.raspberrypi.org/documentation/installation/installing-images/
https://www.youtube.com/watch?v=3VO4vGlQ1pg
2. Habilitar el acceso a la Shell de Linux a través del puerto serie
Podemos seguir cualquiera de estos tutoriales:
https://c2plabs.com/blog/2019/04/23/enable-serial-console-on-raspberry-pi-zero-w/
https://learn.adafruit.com/raspberry-pi-zero-creation/give-it-life
3. Instalar servicios dnsmasq y hostapd
Ejecutaremos en la Raspberry Pi Zero W este comando:
curl -L https://raw.githubusercontent.com/km4ack/pi-scripts/master/autohotspot-buster | bash
Lo primero que nos pedirá introducir será una contraseña, introducimos cualquier cosa que tenga más de 8 letras (la modificaremos en el punto 5) y después nos pedirá que introduzcamos el SSID de nuestro «shack» y su password, con ello se refiere al nombre del WiFi de nuestra casa y su contraseña.
NOTA: Este script nos configura la Raspberry para que si no está el WiFi de nuestra casa dentro del alcance, levante un punto de acceso, por lo que, si queremos que encienda el punto de acceso también cuando esté dentro del alcance de nuestro WiFi, deberemos cambiar su SSID a través del siguiente comando (con el objetivo de que no lo encuentre)
nano /etc/wpa_supplicant/wpa_supplicant.conf
4. Cambiar SSID del punto de acceso a «tanquino pi»
Ejecutamos el siguiente comando en la Raspberry Pi
sed s/ssid=.*$/'ssid=tanquino pi'/g /etc/hostapd/hostapd.conf
5. Cambiar la contraseña del punto de acceso a «seytr2021»
Ejecutamos este comando en la Raspberry Pi
sed s/wpa_passphrase=.*$/'wpa_passphrase=seytr2021'/g /etc/hostapd/hostapd.conf
6. Instalar servidor Samba
Primero ejecutamos el siguiente comando y cuando nos pregunte si queremos modificar smb.conf para usar la configuración WINS, respondemos que no.
sudo apt install samba
Después ejecutamos uno por uno los siguientes comandos para crear un recurso compartido
sudo sh -c 'echo [www] >> /etc/samba/smb.conf'
sudo sh -c 'echo path=/home/pi >> /etc/samba/smb.conf'
sudo sh -c 'echo browseable=yes >> /etc/samba/smb.conf'
sudo sh -c 'echo read only=no >> /etc/samba/smb.conf'
sudo sh -c 'echo writable=yes >> /etc/samba/smb.conf'
sudo sh -c 'echo force user=pi >> /etc/samba/smb.conf'
sudo sh -c 'echo public=yes >> /etc/samba/smb.conf'
7. Copiar archivos a la carpeta compartida «www»
Descargamos los archivos a continuación y nos conectamos a la red «tanquino pi» para copiarlos a la carpeta compartida en red en la dirección 10.10.10.10/www.
Configuración NodeMCU
Necesitaremos tener instalado el IDE de Arduino, las placas basadas ESP8266 y posiblemente, los drivers para el chip CH340G (dependerá de si nuestro NodeMCU lo tiene o no)
A continuación, instalamos las siguientes librerías:
- ESP8266WiFi (documentación)
- WebSocketsServer (documentación)
- CircularBuffer (documentación)
- IRremoteESP8266 (documentación)
Y copiamos en un proyecto arduino el código disponible en este enlace, para después configurar el puerto y placa que estemos utilizando y subirlo.
La interconexión de los componentes se puede ver en el esquema a continuación, los puntos de 5V y GND tienen que ser los mismos que los que usemos para alimentar las placas NodeMCU y Raspberry Pi Zero. La parte inferior del diagrama refleja las direcciones IP que se asignarán a los dispositivos dentro de la red «tanquino pi», la X refleja que la IP es dinámica y no se conocerá el valor de esa parte de la dirección hasta que el dispositivo se conecte.