Transformar una Cabeza Humana en Cabeza Robot: Proyecto DIY con Arduino
Componentes y suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO | 1 | |
| Servomotor | 3 | |
| Dispositivo Android | 1 | |
| Placa fuente regulada (12V,5V,3.3V) | 1 |
Herramientas y máquinas necesarias
- Soldador (genérico)
Aplicaciones y servicios en línea
- SensoDuino
Sobre el proyecto
Planeo hacer algo nuevo pero barato. Me gusta mucho la robótica, pero por la necesidad de servos y otras piezas no me animaba. Ahora tengo 4 servomotores que solo costaron 13$. Ya tengo placa LinkIt ONE y Arduino.
Así que planeo hacer una cabeza robot que se mueva como la nuestra en todos los ejes pero barata. Estudié diferentes sensores y métodos, pero al final encontré una forma con todo lo que tenía a mano. Aprendí muchas cosas durante este proyecto. Marco en negrita lo que aprendí.
Usar sensor de inclinación del móvil inteligente para controlar la cabeza
Paso 1: Materiales necesarios







Materiales usados
- Arduino UNO.
- Placa LinkIt ONE.
- 3 Servomotores.
- App gratuita SensoDuino para Android (descargar aquí).
- Placa fuente regulada (12V, 5V, 3.3V).
- PCB virgen.
- Conectores macho PCB.
- Trozo de aluminio de desecho (de bandeja de alimentación).
- Pistola de silicona caliente.
- Adaptadores 12V y 5V.
- Más elementos para decorar.
¿Por qué LinkIt ONE y Arduino UNO?
Si tienes LinkIt ONE y servos de 3V, no necesitas Arduino UNO porque mis servos de 5V no funcionan bien en LinkIt ONE.
Si tienes Arduino UNO y módulo Bluetooth, no necesitas LinkIt ONE.
No tenía shield Bluetooth, así que usé LinkIt ONE y Arduino UNO.
Paso 2: Shield de servos propio



- Hacer un shield de servos para Arduino. (Cuidado: si usas servos de 3V, LinkIt ONE solo tiene 2 pines PWM).
- Hice una placa PCB para servos.
- Con esta placa podemos controlar 6 servos desde pines Arduino (3,5,6,9,10,11).
- Servos de 3 hilos; la alimentación viene de la fuente regulada externa a 5V.
- Al controlar servos usa alimentación del adaptador para Arduino. La alimentación USB del PC causa vibraciones, sobrecalienta y daña el servo. (Uno de mis servos se rompió).
Paso 3: Conexión LinkIt ONE

- LinkIt ONE debe hablar con Arduino para controlar los servos.
- Conecta Tx de LinkIt ONE a Rx de Arduino y ambos GND.
- Cuando recibe datos, los envía a Arduino.
- Nota: Si tienes shield Bluetooth para Arduino, controlas todo con una sola placa.
Paso 4: Posición de servos


- Pon todos los servos a 90°. Sube el programa
Servoposition.inoa Arduino. - Conecta alimentación servos y Arduino a la fuente regulada en pines 5V y 12V.
- Conecta conectores hembra de servos a los macho del PCB en pines digitales 3,5,6 de Arduino.
- Conecta adaptador 12V a la fuente regulada.
- Enciende adaptador. Todos los motores giran a 90° según programa.
- Desconecta los motores para unirlos sin mover el rotor.
- Código Arduino IDE para posición:
Servoposition.ino
Paso 5: Planificación



- Cabeza gira en 3 ejes X, Y, Z.
- Rotaciones:
- Yaw – Mirar izquierda/derecha.
- Pitch – Mirar arriba/abajo.
- Roll – Inclinación lateral.
- Primero usa cinta doble cara para planear posición de servos.
- Corta pieza de aluminio en L para fijar servo superior al segundo.
- Conecta los cuernos de servo según tu plan o como en la foto.
- Todos los centros de servo deben estar rectos a 90°.
- Pega servos y pieza L con cinta doble cara y comprueba que el movimiento no interfiere con otros servos.
Paso 6: Construcción





- Fijar permanentemente.
- Quita cinta doble cara uno a uno y fija con pistola de silicona caliente.
- Cuidado de no dañar servos.
- Vuelve a conectar conectores de servos a Arduino y enciende alimentación.
- Verifica que todos están rectos como en la última imagen.
Paso 7: Detalles app Android






- Abre SensoDuino en tu Android. Tiene opciones para ver lecturas de todos los sensores y enviarlas por Bluetooth.
- Todos los sensores disponibles se listan; solo puedes seleccionar los que tenga tu teléfono.
- Menú → Conectar Bluetooth.
- Lista de dispositivos Bluetooth disponibles.
- Selecciona Bluetooth de LinkIt ONE.
- Para nuestro proyecto usamos sensor de Orientación. Marca primera casilla para activar y segunda para enviar datos por Bluetooth.
- También ajustamos el rendimiento de cada sensor en opción Rendimiento del menú. Cambia intervalo de tiempo para cada lectura.
Paso 8: Programación
- Dos códigos: uno para LinkIt ONE. Por Bluetooth recibe datos del móvil y los envía a Arduino por puerto serie.
- Programa Arduino: al recibir datos en puerto serie, concatena chars como string. Usa indexOf y substring para dividir un conjunto completo de resultados. En ese conjunto, de nuevo indexOf y substring para obtener cada posición. Luego usa
mapen Arduino para controlar servo de 0 a 180°. Si usas shield Bluetooth, adapta el programa.
Cómo funciona el programa
- Usando sensor de Orientación, el robot gira la cabeza como nosotros.
- Yaw: rotación 0-360° según posición magnética. Usamos 90-270° donde 180° es 90° para servo. Debes enfrentar 180° al ponerte la gorra.
- Pitch: adelante arriba/abajo. Lectura -180 a +180. Usamos -90 a +90.
- Roll: inclinación lateral 0-90-0--90-0. Usamos -90 a 90.
Código LinkIt ONE: Linkitonehead.ino
Código Arduino: Arduinohead.ino
Paso 9: Montar las placas



- Conecta ambos shields encima de ambos microcontroladores.
- Pégalos todos con cinta doble cara uno sobre otro.
- Cuidado de no cortocircuitar ningún terminal.
Paso 10: Prueba con la mano
Enciende todo y usa el móvil en la mano. Siéntate enfrentando 180° en yaw y usa el móvil para controlar los tres servos.
Paso 11: Poner una cara


- Era Navidad, había muchos muñecos de Papá Noel en tiendas.
- Compré uno y fijé la cabeza con cinta doble cara al brazo del servo superior.
Paso 12: Preparar gorra de control






- Toma una gorra normal.
- Pega cinta doble cara en la parte frontal como en la figura.
- Pega tu móvil sobre la cinta.
Paso 13: Vídeo de prueba
Prueba con bajo rendimiento (tasa de refresco del sensor cada 250 ms).
Paso 14: Vídeo final
Ver la acción a tasa de lectura de 1 lectura por 100 ms.
Código
- Servoposition.ino
- Linkitonehead.ino
- Arduinohead.ino
Servoposition.ino (Arduino)
#include <Servo.h>
Servo leftright;
Servo updown;
Servo shake;
void setup() {
Serial.begin(9600);
leftright.attach(3);
updown.attach(5);
shake.attach(6);
leftright.write(90);
updown.write(90);
shake.write(90);
}
void loop() { }
Linkitonehead.ino (Arduino)
#include <LBT.h>
#include <LBTServer.h>
int readval;
String inputString = "";
String outputString = "";
int firstpoint=0, secondpoint=0;
void setup() {
if(!LBTServer.begin((uint8_t*)"Sivam_LIO")) return;
Serial1.begin(9600);
}
void loop() {
uint8_t buf[64];
int bytesRead;
if(LBTServer.connected()) {
while(true) {
bytesRead = LBTServer.readBytes(buf, 32);
if(!bytesRead) break;
inputString="";
for(int j=0;j<32;j++) {
char inChar = char(buf[j]);
inputString += inChar;
}
Serial1.println(inputString);
}
delay(100);
} else {
LBTServer.accept(5);
}
}
Arduinohead.ino (Arduino)
#include <Servo.h>
Servo leftright;
Servo updown;
Servo shake;
String inputString = "";
boolean stringComplete = false;
String teststr2, sensorid, sensorrecid, sensorval1, sensorval2, sensorval3;
int S1, S2, S3, startchr=0, endchr=0, rot1, rot2, rot3;
void setup() {
Serial.begin(9600);
leftright.attach(3);
updown.attach(5);
shake.attach(6);
}
void loop() { }
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar != '\n') inputString += inChar;
}
startchr = inputString.indexOf('>');
if (startchr>=0) {
endchr = inputString.indexOf('>', startchr+1);
if (endchr>0) {
teststr2 = inputString.substring(startchr, endchr);
inputString = inputString.substring(endchr);
startchr = teststr2.indexOf(',');
sensorid = teststr2.substring(1, startchr);
endchr = teststr2.indexOf(',', startchr+1);
sensorrecid = teststr2.substring(startchr+1, endchr);
startchr = endchr;
endchr = teststr2.indexOf(',', startchr+1);
sensorval1 = teststr2.substring(startchr+1, endchr);
startchr = endchr;
endchr = teststr2.indexOf(',', startchr+1);
sensorval2 = teststr2.substring(startchr+1, endchr);
startchr = endchr;
sensorval3 = teststr2.substring(startchr+1);
S1 = sensorval1.toInt();
S2 = sensorval2.toInt();
S3 = sensorval3.toInt();
rot1 = map(S1, 90, 270, 180, 0);
if (rot1<0) rot1=0; else if (rot1>180) rot1=180;
rot2 = map(S2, -90, 90, 0, 180);
if (rot2<0) rot2=0; else if (rot2>180) rot2=180;
rot3 = map(S3, 90, -90, 0, 180);
if (rot3<0) rot3=0; else if (rot3>180) rot3=180;
if (rot1!=0 && rot1!=180) leftright.write(rot1);
if (rot1!=0 && rot1!=180) updown.write(rot2);
if (rot1!=0 && rot1!=180) shake.write(rot3);
delay(15);
}
}
}
Proceso de manufactura
- Robot DIY inspirado en Wall‑E con Raspberry Pi y caja de CD
- Robot Despertador Rodante: Sistema Inteligente y Móvil de Despertar con Raspberry Pi y Google Calendar
- Placa RasPiRobot Board V2: Convierte tu Raspberry Pi en un Controlador de Robot Potente
- 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
- Integración de Microsoft Kinect con Raspberry Pi para Detección Humana en Tiempo Real en Robot Sonbi
- Simple Pi Robot: Construye un Rover Autónomo 2‑WD con Raspberry Pi
- El verdadero activo: El capital humano en operaciones de manufactura
- Robots blandos detectan tacto humano mediante cámara y sombras: solución táctil de bajo costo