Menschenkopf zum Roboter-Kopf: Arduino-gesteuertes DIY-Projekt
Komponenten und Zubehör
| Komponente | Menge | Hinweis |
|---|---|---|
| Arduino UNO | 1 | Servo-Steuerung |
| Servomotor | 3 | 3 Achsen (Yaw, Pitch, Roll) |
| Android-Gerät | 1 | Sensorquelle (Neigungssensor) |
| Geregelte Stromversorgungsplatine (12V, 5V, 3,3V) | 1 | Stabile Versorgung für Servos & Arduino |
Benötigte Werkzeuge
- Lötkolben
Apps und Online-Dienste
- SensoDuino (kostenlose Android-App, sendet Sensordaten per Bluetooth)
Projektbeschreibung
Neues, günstiges Robotik-Projekt geplant. Servos & Teile waren früher zu teuer – jetzt 4 Servos für nur 13 $. LinkIt ONE Board und Arduino UNO bereits vorhanden.
Ziel: Roboterkopf, der wie ein menschlicher Kopf in allen 3 Achsen bewegt wird – günstig. Verschiedene Sensoren/Methoden evaluiert, letztlich Lösung mit vorhandenen Teilen gefunden. Kursiv markierte Begriffe = Lerneffekte während des Projekts.
Smartphone-Neigungssensor (Tilt-Sensor) steuert den Kopf.
Schritt 1: Benötigte Materialien
Verwendete Materialien:
- Arduino UNO
- LinkIt ONE Board
- 3 Servomotoren
- SensoDuino (kostenlose Android-App, Download verfügbar)
- Geregelte Stromversorgungsplatine (12V, 5V, 3,3V)
- Lochrasterplatine
- PCB-Steckerleisten (Male)
- Aluminium-Profilreststück
- Heißklebepistole
- 12V & 5V Netzteil
- Dekomaterial
Warum LinkIt ONE UND Arduino UNO?
- Hat man LinkIt ONE + 3V-Servos → Arduino UNO nicht nötig (meine 5V-Servos liefen nicht stabil am LinkIt ONE).
- Hat man Arduino UNO + Bluetooth-Shield → LinkIt ONE nicht nötig.
- Ich hatte kein Bluetooth-Shield → LinkIt ONE + Arduino UNO.
Schritt 2: Eigenes Servo-Shield
- Servo-Shield für Arduino bauen (Achtung: LinkIt ONE hat nur 2 PWM-Pins bei 3V-Servos).
- Lochrasterplatine als Shield ausgeführt.
- Steuerung von 6 Servos über Arduino-Pins 3, 5, 6, 9, 10, 11 möglich.
- 3-Leiter-Servos, Stromversorgung extern über 5V-Reglerplatine.
- Wichtig: Arduino über Netzteil versorgen, nicht USB! USB-Strom verursacht Vibrationen → Servo-Überhitzung & Schaden (ein Servo zerstört).
Schritt 3: LinkIt ONE Verbindung
- LinkIt ONE muss mit Arduino kommunizieren (Servos steuern).
- TX (LinkIt ONE) → RX (Arduino) + gemeinsame GND.
- Empfangene Daten werden an Arduino weitergeleitet.
Hinweis: Mit Arduino Bluetooth-Shield entfällt LinkIt ONE.
Schritt 4: Servo-Nullposition
- Alle Servos auf 90° stellen. Code
Servoposition.inoauf Arduino laden. - Servo-Strom & Arduino-Strom an Reglerplatine (5V/12V).
- Servos an PCB-Stecker (Pins 3, 5, 6) anschließen.
- 12V-Netzteil an Reglerplatine → einschalten.
- Alle Motoren fahren auf 90°.
- Servos abziehen, mechanisch verbinden (ohne Rotor zu verdrehen).
Code: Servoposition.ino (siehe Code-Sektion).
Schritt 5: Mechanik planen
- Kopf dreht in 3 Achsen: X, Y, Z.
- Rotationen: Yaw (Links/Rechts), Pitch (Hoch/Runter), Roll (Seitenneigung).
- Doppelseitiges Klebeband für provisorische Servo-Positionierung.
- Aluminium-Profil zu L-Winkel biegen (oberer Servo → zweiter Servo).
- Servo-Hörner nach Plan montieren.
- Alle Servo-Mitten bei 90° gerade ausgerichtet.
- Alles mit Klebeband fixieren, Bewegungsfreiheit prüfen (keine Kollisionen).
Schritt 6: Endmontage
- Klebeband einzeln entfernen, endgültig mit Heißkleber fixieren.
- Servos nicht beschädigen.
- Servo-Stecker an Arduino, Versorgung einschalten.
- Prüfen: Alle stehen gerade (wie letztes Bild).
Schritt 7: Android-App (SensoDuino) einrichten
- SensoDuino öffnen – listet alle Smartphone-Sensoren, kann Daten per Bluetooth senden.
- Nur verfügbare Sensoren wählbar.
- Menü → Connect Bluetooth.
- LinkIt ONE Bluetooth auswählen.
- Für Projekt: Orientierungssensor → erste Box an (aktiv), zweite Box an (Daten per BT senden).
- Menü → Performance → Messintervall einstellen (z. B. 100 ms).
Schritt 8: Programmierung
Zwei Codes: LinkIt ONE (Bluetooth → Serial an Arduino) & Arduino (Serial → Servos).
Funktionsweise:
- Orientierungssensor steuert Roboterkopf wie menschlichen Kopf.
- Yaw: 0–360° (magnetisch). Nutzung: 90–270°, wobei 180° = Servo-Mitte (90°). Handy bei 180° tragen (z. B. an Kappe).
- Pitch: -180° bis +180° (vorne hoch/runter). Nutzung: -90° bis +90°.
- Roll: 0→90→0→-90→0 (Seitenneigung). Nutzung: -90° bis +90°.
Codes: Linkitonehead.ino (LinkIt ONE), Arduinohead.ino (Arduino). Bei Bluetooth-Shield: Arduino-Code anpassen.
Schritt 9: Boards stapeln
- Beide Shields auf Mikrocontroller stecken.
- Mit Doppelseitigem Klebeband übereinander kleben.
- Keine Kurzschlüsse!
Schritt 10: Hand-Test
Alle Versorgungen an, Handy in Hand. Sich in Yaw-Richtung 180° drehen, Handy bewegt → alle 3 Servos folgen.
Schritt 11: Gesicht befestigen
- Weihnachtszeit → viele Weihnachtsmann-Puppen. Eine kaufen.
- Puppenkopf mit Doppelseitigem Klebeband auf oberen Servo-Hebel kleben.
Schritt 12: Steuer-Hut bauen
- Normale Mütze nehmen.
- Doppelseitiges Klebeband auf Vorderseite.
- Smartphone darauf kleben.
Schritt 13: Test-Video (Low Performance)
Sensorkrate: 250 ms (4 Hz).
Schritt 14: Finales Video (High Performance)
Sensorkrate: 100 ms (10 Hz).
Code
Servoposition.ino(Servos auf 90°)Linkitonehead.ino(LinkIt ONE: BT → Serial)Arduinohead.ino(Arduino: Serial → Servos)
Servoposition.ino
#include <Servo.h>
Servo leftright; // Yaw
Servo updown; // Pitch
Servo shake; // Roll
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
#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); // Hardware Serial an Arduino
}
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); // An Arduino senden
}
delay(100);
} else {
LBTServer.accept(5); // Auf Verbindung warten
}
}
Arduinohead.ino
#include <Servo.h>
Servo leftright; // Yaw (Pin 3)
Servo updown; // Pitch (Pin 5)
Servo shake; // Roll (Pin 6)
String inputString = "";
boolean stringComplete = false;
String teststr2, sensorid, sensorrecid, sensorval1, sensorval2, sensorval3;
int S1, S2, S3, rot1, rot2, rot3;
int startchr=0, endchr=0;
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);
// Parsing: >sensorid,recid,val1,val2,val3>
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(); // Yaw 90-270
S2 = sensorval2.toInt(); // Pitch -90 bis +90
S3 = sensorval3.toInt(); // Roll 90 bis -90
// Mapping auf Servo 0-180
rot1 = map(S1, 90, 270, 180, 0); // Yaw umgekehrt
rot1 = constrain(rot1, 0, 180);
rot2 = map(S2, -90, 90, 0, 180); // Pitch
rot2 = constrain(rot2, 0, 180);
rot3 = map(S3, 90, -90, 0, 180); // Roll umgekehrt
rot3 = constrain(rot3, 0, 180);
// Servos ansteuern (nur bei gültigen Werten)
if (rot1 != 0 && rot1 != 180) leftright.write(rot1);
if (rot2 != 0 && rot2 != 180) updown.write(rot2);
if (rot3 != 0 && rot3 != 180) shake.write(rot3);
delay(15); // Servo-Settling
}
}
}
Herstellungsprozess
- DIY Wall-E-inspirierter Raspberry Pi CD-Box-Roboter
- Rolling Alarm Robot: Intelligentes, mobiles Wecksystem mit Raspberry Pi und Google Kalender
- RasPiRobot Board V2: Raspberry Pi zum leistungsstarken Roboter-Controller erweitern
- Einen motorisierten Minecraft-Creeper-Roboter mit Arduino bauen
- Archimedes: Der emotionserkennende KI-Roboter-Eule
- Sprachgesteuerter Computer-Vision-Roboter auf Windows 10 IoT Core bauen
- ROS Roboter: Terminal-gesteuerte Navigation auf Raspberry Pi
- Microsoft Kinect mit Raspberry Pi integrieren für Echtzeit-Menschenerkennung am Sonbi Roboter
- Simple Pi Robot: 2-WD Autonomer Rover mit Raspberry Pi bauen
- Der wahre Wert: Humankapital im Fertigungsbetrieb