Proyecto educativo de un robot 🤖 de autobalanceo de ultra bajo costo, capaz de correr una red neuronal para mantener el equilibrio y de ser controlado de manera inalámbrica 🖲️.
Desarrollado con fines didácticos para enseñar conceptos de RL, ML, AI y control.
Estabilidad | Facilidad de Armado | Requiere I3D | Tiempo de I3D | Plano de Impresión 3D | Foto de la versión | |
---|---|---|---|---|---|---|
V 0.7 (Recomendado) | ⭐ ⭐ ⭐ | ⭐ ⭐ ⭐ | SI |
|
Versión 0.7 I3D | ![]() |
V 0.6 AKA:Wall-e | ⭐ ⭐ ⭐ | ⭐ | SI |
|
Versión 0.6 I3D | ![]() |
V 0.5 | ⭐ | ⭐ ⭐ ⭐ | SI |
|
Versión 0.5 I3D | ![]() |
- Espesor de boquilla: 0.4 mm
- Altura de Capa: 0.3 mm
- Perimetros: 3
- Capas Solidas Top y Bottom: 3
- Infill: 20%
- Imprimir en 3D alguna de las versiones.
- Encastrar piezas en su posición final.
- Sostener los motores con precintos y/o pegamento.
- Conectar los componentes siguiendo el plano electrico.
En primer lugar, se debe clonar el repositorio. Esto se puede realizar tanto descargando el mismo
como un .ZIP, o ejecutando git clone https://github.com/UDESA-AI/balancio-kit.git
en consola.
La instalación consta de 3 módulos principales: Microcontrolador, simulación y aplicación. Éstos son fundamentales para el funcionamiento completo del proyecto, pero la instalación de cada uno de ellos se puede realizar en distinto orden.
Instalación de la IDE
Para programar y compilar el NodeMCU ESP32 usaremos la IDE 2 de Arduino. Para esto se debe instalar la misma siguiendo los pasos que se especifican en el siguiente [link](https://www.arduino.cc/en/software) .Configuración del Microcrontolador
Una vez instalada la IDE, se debe habilitar el microcontrolador que vamos a usar. Para esto se deben seguir los siguientes pasos:-
En la IDE, ir a 'File' (Archivos) → 'Preferences' (Preferencias)
-
En el campo "Additional Boards Manager URLs", agregar lo siguiente: https://dl.espressif.com/dl/package_esp32_index.json. (Luego clickear 'OK').
-
Ir a 'Tools' → 'Board: ' → 'Boards Manager…'
-
Buscar "esp32", e instalar "esp32 by Espressif Systems" (version 2.x) presionando el botón 'Install'.
-
Indicarle a la IDE que vamos a utilizar un esp32. Ir a 'Tools' → 'Board:' → 'ESP32 Arduino' → 'NodeMCU-32S'
-
En 'Tools' → 'Port', seleccionar el puerto correspondiente a donde está conectado el microcontrolador.
Librerias de Arduino
Luego procederemos a instalar las librerías de arduino que vamos a utilizar:-
Para eso ir a 'Sketch' → 'Include Library' → 'Manage Libraries…'
-
Buscar e instalar las siguientes librerias, especificando la versión correspondiente:
- MPU6050 by Electronic Cats (version 1.0.0)
- PS3 Controller Host by Jeffrey van Pernis (version 1.1.0)
- EloquentTinyML by Simone Salerno (version 0.0.7)
Ejecución inicial
Para comprobar la instalación, ejecutaremos un ejemplo de prueba: - ir a 'File' → 'Examples' → 'WiFi' → 'WiFiScan' - En el sketch generado, presionar el botón de carga ('Upload') 📲 - Si todo funcionó correctamente, debe aparecer un mensaje 'Done uploading' en la consola.Posibles errores:
- Si no se puede cargar el programa al microcontrolador, intentar mantener presionado el botón "boot" presente en la placa, mientras se realiza la carga. Esto se debería realizar solo la primera vez.
La simulación es opcional, no es necesaria para el funcionamiento y armado del robot. Se puede pasar directamente a la parte de calibración.
La simulación corre en Python 🐍, y utiliza diversos paquetes. Para facilitar la instalación de los mismos, utilizaremos Conda.
Se debe seguir con los siguientes pasos:
- Para el uso e instalación de conda, descargaremos miniconda (también se puede instalar Anaconda), siguiendo con los pasos que se especifican en el siguiente link.
- Crearemos un 'Environment' de conda, donde alojaremos nuestros paquetes.
Esto se puede realizar tanto desde la consola (en el caso de haber descargado Miniconda) o desde una GUI (en caso de haber descargado Anaconda). Respectivamente:
- Miniconda: Ejecutar el siguiente comando en la consola:
conda env create -f requirements.yml
. Donderequierments.yml
es el archivo que se encuentra dentro del repositorio y ya fue descargado. - Anaconda: En la GUI de Anaconda: En la pestaña environments, hacer clik en import y especificar archivo en file
- Miniconda: Ejecutar el siguiente comando en la consola:
- Activar el environment creado, llamado balancio:
- Miniconda: Ejecutar en terminal
conda activate balancio
- Anaconda: En la pestaña environments, hacer clik en el ambiente que se quiere activar
- Miniconda: Ejecutar en terminal
- Dentro del environment activado, ejecutar el archivo setup.py:
python setup.py
- Probar la instalación, corriendo el siguiente script:
python pid.py
Masa sin ruedas: 0.244 kg
Posición del centro de masa con respecto al eje de los motores y el centro simétrico del cuerpo:
- x = 1.55
- y ~= 0 mm
- z = 31 mm
Inercia sin ruedas desde el centro de masa (kg.m2):
- Ixx = 0.0006945
- Ixy ~= 0
- Iyy = 0.0006536
- Ixz = -0.000013447
- Iyz ~= 0
- Izz = 0.0001937
Masa de una rueda: 0.029 kg
Posición del centro de masa con respecto al eje de los motores y el borde del agarre:
- x = 0 mm
- y = 15.6 mm
- z = 0 mm
Inercia de la rueda desde el centro de masa (kg.m2):
- Ixx = 0.000011729
- Ixy ~= 0
- Iyy = 0.000021531
- Ixz ~= 0
- Iyz ~= 0
- Izz = 0.000011729
La aplicación está creada en MIT App Inventor .
Simplemente entrar al website e importar el .aia en App Balancio . Luego de esto, se puede usar la aplicación mediante bluethooth desde un celular.
Estas instrucciones asumen conocimiento del uso de la IDE arduino
Calibración del IMU
1. Abrir `Balancio-kit/Mcu/Src/imu_calibration/imu_calibration.ino` con el IDE Arduino-
Colocar el robot con la IMU paralela al piso y mantenerlo firme
-
Subir el programa a la placa y usar el monitor serial para obtener las compensaciones de la IMU
-
Modificar las compensaciones de giróscopo en el archivo
balancio-kit/mcu/src/main/config.h
en:
// IMU calibration parameters
#define X_ACCEL_OFFSET -1775
#define Y_ACCEL_OFFSET 756
#define Z_ACCEL_OFFSET 2706
#define X_GYRO_OFFSET 181
#define Y_GYRO_OFFSET 77
#define Z_GYRO_OFFSET 60
- Para las compensaciones de Acelerómetro debe ser tenido en cuenta la gravedad, solo midiendo las compensaciones con la gravedad perpendicualar a esa direcci
Calibración del angulo de equilibrio
1. Abrir `balancio-kit/mcu/src/main/main.ino`-
Sostener el robot en la posición de equilibrio
-
Subir el programa a la placa y usar el monitor serial para obtener las compensaciones de angulo
-
Modificar en angulo de equilibrio en el archivo
balancio-kit/mcu/src/main/config.h
en la línea:
// Angle of (approximate) static equilibrium
#define STATIC_ANGLE -0.04 // Calibrated point
Calibración de las constantes PID
-
Sacar el jumper de 12v en el driver
-
Elegir parámetros PID
-
modificar las constantes del PID en el archivo
balancio-kit/mcu/src/main/config.h
en las líneas:
// PID Constants for pitch control
#define KP 2000
#define KI 22000
#define KD 20.0
- Probar las constantes, si se sacó el jumper se puede probar incluso con el cable conectado. Cuidado al hacer esto!
Una vez configurado correctamente el robot, se pueden seleccionar distintos parametros de configuracion en el archivo correspondiente (config.h
).
Entre ellos, se puede seleccionar el tipo de controlador deseado para estabilizar el Balancio.
Por ejemplo, en caso de querer utilizar un controlador PID:
// Control algorithm type
#define CONTROL_ALGO "PID"
En caso de querer utilzar un agente de aprendizaje por refuerzo:
// Control algorithm type
#define CONTROL_ALGO "RL"
- initial commit
- Desarrollar aplicación bluetooth
- Crear agente RL
- Diseño mecánico
- Publicar STL del diseño mecánico
- Publicar STEP del diseño mecánico
- Crear diagrama electrónico
- Aclarar que datos levantar del imu calibration.
- Wheel spins on startup
Las pull requests son bienvenidas, para cambios mayores, por favor abrir un issue para discutir los cambios deseados