ASi (Anansi): Robot Compañero con Arduino Nano y Pantalla LED
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Nano R3 | 1 | Controla la "mirada" (ojos LED) |
| Micro-servo SG90 | 1 | Movimiento cuello/cabeza |
| Módulo matriz LED MAX7219 (rojo) | 1 | 2 matrices 8x8 para los ojos |
| Portapilas 4xAA | 1 | También sirve Li-ion 3.7V 200mAh |
| Tornillos varios | 1 set | |
| Molde esfera acrílica transparente (baño) | 1 | Cabeza del robot |
| Adafruit Trinket 5V | 1 | Controla servo cuello |
Herramientas necesarias
- Impresora 3D (genérica) – Para piezas estructurales.
- Pistola de silicona caliente – Ensamblaje y fijación.
Historia y concepto
El proyecto nació como un Xpider (araña de Thingiverse), pero al ver a Archimedes de Alex Glow, quise crear mi propio compañero robótico. No buscaba un búho, sino algo único. Recordé la leyenda africana de Anansi, la araña tramposa y dios de las historias. Así nació ASi (en realidad ASi_v4; v1-v3 fueron prototipos).
Ensamblaje mecánico
El diseño original Xpider se modificó ampliamente. Estas son las principales piezas a imprimir:
El montaje es intuitivo; aquí algunas fotos de referencia:
Electrónica: dos microcontroladores
- Trinket: Controla el servo del cuello. Mueve la cabeza aleatoriamente en intervalos aleatorios.
- Arduino Nano: Controla la matriz LED (ojos). Genera movimientos oculares aleatorios, parpadeos, efectos (mirada cruzada, giro, "ojos locos", etc.). La gente suele pensar que te mira.
Ambos micros van en protoboards pequeñas alimentadas en cadena (daisy-chain) con 4 pilas AA. Nota: con una sola Li-ion 3.7V a veces fallaba el arranque; mejor usar dos Li-ion separadas con interruptor común.
Cabeza
Es una bola de Navidad (esfera transparente). La rocié ligeramente con pintura negra en spray. Luego, silicona caliente para pegarla a la pieza del cuello. ¡Cabeza lista!
Montaje portátil
Pasé alambre de armadura por los agujeros de la base y lo fijé a la correa del hombro de mi mochila. Así ASi me acompaña a todas partes.
Código
ASi Eye (Arduino Nano – matriz LED ojos)
#include <LedControl.h>
#define PIN_EYES_DIN 12
#define PIN_EYES_CS 11
#define PIN_EYES_CLK 10
LedControl lc = LedControl(PIN_EYES_DIN, PIN_EYES_CLK, PIN_EYES_CS, 2);
bool rotateMatrix0 = false;
bool rotateMatrix1 = false;
byte eyeBall[8] = {
B00111100, B01111110, B11111111, B11111111,
B11111111, B11111111, B01111110, B00111100
};
byte eyePupil = B11100111;
byte eyeCurrent[8];
int currentX, currentY;
int cntLoop = 0, cntEffect = 0;
#define MIN -2
#define MAX 2
#define DELAY_BLINK 40
#define EFFECT_ITERATION 4
void setup() {
lc.shutdown(0,false); lc.shutdown(1,false);
lc.setIntensity(0,1); lc.setIntensity(1,1);
lc.clearDisplay(0); lc.clearDisplay(1);
// Test LEDs
byte b = B10000000;
for (int c=0; c<=7; c++) {
for (int r=0; r<=7; r++) { setRow(0,r,b); setRow(1,r,b); }
b >>= 1; delay(50);
}
b = B11111111;
for (int r=0; r<=7; r++) { setRow(0,r,b); setRow(1,r,b); }
delay(500);
lc.clearDisplay(0); lc.clearDisplay(1); delay(500);
randomSeed(analogRead(0));
displayEyes(0,0); delay(2000);
blinkEyes(true,false); blinkEyes(false,true); delay(1000);
}
void loop() {
moveEyes(random(MIN,MAX+1), random(MIN,MAX+1), 50);
delay(random(5,7)*500);
if (random(0,5) == 0) { delay(500); blinkEyes(); delay(500); }
if (EFFECT_ITERATION > 0) {
if (++cntLoop == EFFECT_ITERATION) {
cntLoop = 0;
if (++cntEffect > 6) cntEffect = 0;
switch(cntEffect) {
case 0: crossEyes(); delay(1000); break;
case 1: roundSpin(2); delay(1000); break;
case 2: crazySpin(2); delay(1000); break;
case 3: methEyes(); delay(1000); break;
case 4: lazyEye(); delay(1000); break;
case 5: blinkEyes(true,false); blinkEyes(false,true); delay(1000); break;
case 6: glowEyes(3); delay(1000); break;
}
}
}
}
// ... (funciones auxiliares: blinkEyes, crossEyes, roundSpin, crazySpin, methEyes,
// lazyEye, glowEyes, moveEyes, displayEyes, getValidValue, setRow, bitswap)
// Código completo en el repositorio del proyecto.
ASi Neck with Trinket (servo cuello)
#define SERVO_PIN 4 // Pines 1 o 4 en Trinket
#define SERVO_MIN 4 // ~1 ms pulso
#define SERVO_MAX 26 // ~2 ms pulso
#include <Adafruit_TiCoServo.h>
Adafruit_TiCoServo servo;
void setup() {
#if (F_CPU == 16000000L)
clock_prescale_set(clock_div_1); // 16 MHz Trinket
#endif
servo.attach(SERVO_PIN);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
}
uint32_t lastLookTime = 0;
void loop() {
unsigned long t = millis();
if ((t - lastLookTime) > 500) {
if (random(10) == 0) {
servo.write(random(SERVO_MIN, SERVO_MAX));
lastLookTime = t;
}
}
if (random(10) == 0) {
digitalWrite(LED_PIN, LOW);
delay(random(50,250));
digitalWrite(LED_PIN, HIGH);
}
delay(100);
}
Piezas personalizadas (STL para impresión 3D)
- Pata final
- Engranaje servo (olvidado inicialmente; imprimir e insertar en servo)
- Cuerpo principal
- Base inferior
- Muslo
- Articulación pierna
- Tornillo unión patas
- Tuerca correspondiente
- Engranaje servo cuello (recomendado: pieza servo en el centro)
- Pieza central
- Soporte servo engranaje cuello
- Placa cuello (donde se pega la esfera acrílica)
Esquemáticos
Proceso de manufactura
- Construcción de un robot con Arduino y Raspberry Pi: Guía paso a paso
- Robot DIY inspirado en Wall‑E con Raspberry Pi y caja de CD
- PiCy: Construya su propio mini robot alimentado por Raspberry Pi
- Robot Despertador Rodante: Sistema Inteligente y Móvil de Despertar con Raspberry Pi y Google Calendar
- Construye un Robot Creeper de Minecraft Motorizado con Arduino
- Arquímedes: El Búho Robot Sensor de Emociones con IA
- Construye un Robot de Visión Artificial Controlado por Voz en Windows 10 IoT Core
- Robot ROS: Navegación Controlada por Terminal en Raspberry Pi
- Simple Pi Robot: Construye un Rover Autónomo 2‑WD con Raspberry Pi
- Comprender los Robots de Bebidas: Tecnología, Automatización y su Papel en la Industria de Bebidas
- Automatización robótica impulsa producción de baterías para el auge de vehículos eléctricos