Curiosity MSL
1. El rover Rosalind Franklin -anteriormente conocido como el rover ExoMars- es parte del programa internacional ExoMars (Exobiology on Mars), una misión espacial a Marte de astrobiología para la búsqueda de vida en ese planeta. Fuente: Wikipedia
ExoMars BTL (Bricolabs Technology Laboratory) es un proyecto para replicar a escala el rover Rosalind Franklin en un modelo imprimible y funcional. Toda la información necesaria para construirlo -mecánica y electrónica- y programarlo está en esta wiki y el respositorio de Github (enlaces abajo). Puedes verlo en movimiento en Youtube.
Si quieres hacer un modelo del Curiosity o su gemelo Perseverance, también están en esta wiki. Por orden de complejidad, el más sencillo es Perseverance, el más complicado Curiosity, y ExoMars estaría en medio.
La parte mecánica es un mecanismo sencillo con tres balancines independientes anclados a tres puntos del chasis -dos laterales y uno posterior-, que garantizan que las seis ruedas estén siempre en el suelo. Todas ellas son motrices y directrices. El diseño está a escala 1:5 y al ser el original más pequeño que el Curiosity, su modelo a la misma escala también lo será.
Las piezas para imprimir están en este repositorio en formato .scad y .stl. Además hacen falta:
La parte baja del chasis se ensambla como en la figura. Aquí puedes verla orbitando en 3D
La parte alta monta los soportes desplebables de los paneles solares. La idea es montar unos pequeños paneles de prueba. No servirán para alimentar los 12 motores, pero sí para aprender cosas nuevas sobre su conexionado y la gestión de la energía. Para las pruebas los hemos conectado todos en serie y la salida común a un convertidor DC-DC buck-boost (step up/step down).
Cada rueda utiliza un motor N20 y un servo MG90 con engranajes metálicos (los plásticos son demasiado endebles para este proyecto). En el repositorio de partes impresas hay dos versiones: una rígida con dientes (más parecida al original) y otra con llanta rígida y cubierta flexible (más versátil en suelos no marcianos).
Para la electrónica hemos utilizado
Las conexiones electrónicas son muy simples.
El radiocontrol es el mismo que utiliza Curiosity BTL y que explicamos aquí.
La programación va a serguir una serie de pasos paralelos al ensamblaje para hacer varias comprobaciones previas.
La librería servo de Arduino los mueve con valores entre 0 y 180, estando centrados en el valor 90 (si son servos de 180º coincidirá con grados de giro). El primer paso es girar todos los servos a la posición 90 y una vez allí colocar los brazos que soportan la ruedas de modo que estén alineados para avance recto.
Como el ensamblaje del servo con el brazo se hace con un acoplamiento dentado, lo más probable es que no coincida exactamente con la posición de avance recto. Por eso después por software tendremos que ajustar esa posición.
Una vez comprobadas las posiciones de centrado, habrá que buscar las necesarias para que el rover pivote sobre sí mismo.
Los números podrían parecerse a estos:
void recto() { servo1.write(85); // posición de avance recto. empezar con todos en 90 y corregir servo2.write(95); servo3.write(100); servo4.write(85); servo5.write(80); servo6.write(90); } void giro() { servo1.write(132); // posicion de giro pivotando. Modificar los valores 1-3-4-6 y dejar igual que arriba 2-5 servo2.write(95); servo3.write(45); servo4.write(140); servo5.write(80); servo6.write(40); }
El programa para hacer estas comprobaciones es servo_test.ino.
Los motores de las ruedas de cada lado del rover se conectarán en paralelo y cada grupo se conectará a una salida del driver L298N. Puedes utilizar otros, pero este se ajusta bien a las necesidades. Una vez hechas las conexiones es necesario comprobar que la función diseñada para su uso lo hace correctamente, es decir, identificar cada tren de ruedas (izquierdo/derecho) e identificar en ellos el sentido de giro (adelante/atrás). En caso de que no coincida con los esperado podemos recablear o cambiar la asignación de pines en el programa. Si las ruedas de un lado no giran todas al unísono la única opción es hardware: recablear.
El programa para probar los motores es driver_test.ino.
#define ENA 8 // pines de conexión del driver, intercambiar si no funciona como se espera #define IN1 9 #define IN2 10 #define IN3 11 #define IN4 12 #define ENB 13 void drive(int vel_L, int vel_R) { vel_L=constrain(vel_L,-255,255); vel_R=constrain(vel_R,-255,255); digitalWrite(IN1, (vel_L<=0)); digitalWrite(IN2, (vel_L>0)); analogWrite(ENA, abs(vel_L)); digitalWrite(IN3, (vel_R>0)); digitalWrite(IN4, (vel_R<=0)); analogWrite(ENB, abs(vel_R)); }
Para leer la señal de una emisora de radio control con protocolo PPM vamos a usar lo que ya explicamos aquí.
int readppm() { while(pulseIn(PPMpin, HIGH, 10000)<2000){} //espera al canal 0 for(int i=0; i<chnum; i++) { chval[i]=pulseIn(PPMpin, HIGH, 10000); //lee los canales secuencialmente } return chval[chnum]; // devuelve el resultado }
Una vez que cada una de las tres partes anteriores -servos, motores y emisora- funcionan correctamente podemos ensamblar el sistema. El programa completo es este. Una vez todo funcionando puedes dejar los cables bien ordenados usando bridas.
Naturalmente puedes utilizar sensores de obstáculos, comunicación bluetooth, o bien utilizar otro controlador (Raspberry, ESP32…) o lo que quieras. Y si lo haces no olvides publicar los resultados.