Transformer une tête humaine en tête de robot : Projet DIY piloté par Arduino
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Servomoteur | 3 |
| Appareil Android | 1 |
| Carte d'alimentation régulée (12V, 5V, 3.3V) | 1 |
Outils nécessaires
- Fer à souder (générique)
Applications et services en ligne
- SensoDuino (application Android gratuite)
À propos du projet
L'idée : faire quelque chose de nouveau sans se ruiner. J'aime la robotique, mais le coût des servos et autres pièces me freinait. J'ai maintenant 4 servomoteurs pour seulement 13 $. J'ai déjà une carte LinkIt ONE et un Arduino.
Projet : une tête de robot qui bouge comme une vraie tête sur les 3 axes, à moindre coût. J'ai étudié divers capteurs et méthodes, et trouvé une solution avec ce que j'avais sous la main. Beaucoup d'apprentissages. Je marque en gras ce que j'ai appris.
Utiliser le capteur d'inclinaison du smartphone pour contrôler la tête
Étape 1 : Matériel requis







Matériel utilisé :
- Arduino Uno
- Carte LinkIt ONE
- 3 servomoteurs
- Application Android gratuite SensoDuino (télécharger ici)
- Carte d'alimentation régulée (12V, 5V, 3.3V)
- CI simple face (plain PCB)
- Connecteurs mâles PCB
- Chute de profilé aluminium (pièce d'alimentation)
- Pistolet à colle chaude
- Adaptateurs 12V et 5V
- Divers éléments de décoration
Pourquoi LinkIt ONE et Arduino Uno ?
Si vous avez LinkIt ONE et servos 3V, pas besoin d'Arduino Uno car mes servos 5V ne fonctionnent pas bien sur LinkIt ONE.
Si vous avez Arduino Uno + module Bluetooth, pas besoin de LinkIt ONE.
Je n'avais pas de shield Bluetooth, donc j'ai utilisé LinkIt ONE + Arduino Uno.
Étape 2 : Shield servos maison



- Fabriquer un shield servomoteurs pour Arduino. (Attention : même avec servos 3V, LinkIt ONE n'a que 2 broches PWM)
- Réalisé un PCB type shield pour servos.
- Permet de contrôler 6 servos depuis les broches Arduino (3, 5, 6, 9, 10, 11).
- Servos 3 fils utilisés, alimentation via carte régulée 5V externe.
- Important : alimenter l'Arduino via adaptateur secteur. L'USB du PC cause des vibrations → surchauffe et destruction du servo (j'en ai grillé un).
Étape 3 : Connexion LinkIt ONE

- LinkIt ONE doit communiquer avec Arduino pour commander les servos.
- Relier Tx LinkIt ONE → Rx Arduino + masses communes.
- Toute donnée reçue est transmise à l'Arduino.
- Note : avec shield Bluetooth Arduino, une seule carte suffit.
Étape 4 : Positionnement des servos


- Régler tous les servos à 90°. Téléverser le programme
Servoposition.ino. - Alimenter servos et Arduino via carte régulée (broches 5V et 12V).
- Connecter connecteurs femelles servos sur broches mâles du PCB (broches numériques 3, 5, 6).
- Brancher adaptateur 12V sur carte régulée.
- Mettre sous tension → tous les moteurs tournent à 90°.
- Débrancher les servos pour les assembler sans déranger le rotor.
Code position servos : Servoposition.ino
Étape 5 : Planification mécanique



- Tête rotate sur 3 axes X, Y, Z.
- Rotations :
- Yaw (lacets) – regarder gauche/droite
- Pitch (tangage) – regarder haut/bas
- Roll (roulis) – inclinaison latérale
- Utiliser du ruban double-face pour positionner les servos.
- Découper pièce aluminium en L pour fixer servo supérieur au second.
- Connecter les bras de servo selon le plan ou photos.
- Tous les centres servos doivent être alignés à 90°.
- Fixer servos et pièce L au ruban double-face, vérifier que mouvements ne se gênent pas.
Étape 6 : Construction définitive





- Fixation définitive : retirer ruban double-face un par un, coller à la colle chaude.
- Attention à ne pas abîmer les servos.
- Rebrancher connecteurs servos sur Arduino, mettre sous tension.
- Vérifier que tout est droit comme sur la dernière image.
Étape 7 : Détails application Android






- Ouvrir SensoDuino sur téléphone. Affiche toutes les lectures capteurs et les envoie via Bluetooth.
- Tous les capteurs disponibles listés ; on sélectionne ceux présents sur le téléphone.
- Menu → « Connect Bluetooth ».
- Liste des périphériques Bluetooth disponibles.
- Sélectionner Bluetooth LinkIt ONE.
- Pour notre projet : capteur Orientation. Cocher 1re case (activer) et 2e case (envoyer via Bluetooth).
- Réglage performance par capteur via menu « Performance ». Changer intervalle de lecture.
Étape 8 : Programmation
Deux codes : un pour LinkIt ONE, un pour Arduino.
LinkIt ONE : Via Bluetooth, récupère données mobile et les envoie à Arduino par port série.
Arduino : À la réception sur port série, concatène les caractères en chaîne. Utilise indexOf et substring pour découper un ensemble complet de résultats. Dans cet ensemble, réutilise indexOf/substring pour extraire chaque position. Puis map Arduino pour commander le servo 0-180°. Si shield Bluetooth, adapter le code.
Fonctionnement du programme
- Capteur Orientation → tête robot tourne comme la nôtre.
- a) Yaw : rotation 0-360° selon position magnétique. On utilise 90-270° où 180° = 90° servo. Il faut faire face à 180° (capteur) en portant la casquette.
- b) Pitch : avant haut/bas. Lecture capteur -180 à +180. On utilise -90 à +90.
- c) Roll : secousse latérale. Lecture 0-90-0--90-0. On utilise -90 à 90.
Code LinkIt ONE : Linkitonehead.ino
Code Arduino : Arduinohead.ino
Étape 9 : Empilement des cartes



- Connecter les deux shields sur le dessus des microcontrôleurs.
- Coller le tout avec ruban double-face, l'un sur l'autre.
- Attention à ne court-circuiter aucune borne.
Étape 10 : Test à main levée
Mettre sous tension, tenir le téléphone en main. S'asseoir face à 180° en Yaw, utiliser le mobile pour piloter les 3 servos.
Étape 11 : Fixer un visage


- Période de Noël : beaucoup de poupées Père Noël en magasin.
- Acheter une poupée et fixer sa tête sur le bras du servo supérieur avec ruban double-face.
Étape 12 : Préparer une casquette de contrôle






- Prendre une casquette normale.
- Coller ruban double-face sur le devant comme sur les photos.
- Coller le téléphone portable dessus.
Étape 13 : Vidéo de test
Test performance faible = taux de rafraîchissement capteur toutes les 250 ms.
Étape 14 : Vidéo finale
Action à taux de lecture 1 mesure / 100 ms
Code
Servoposition.inoLinkitonehead.inoArduinohead.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 / LinkIt ONE)
#include <LBT.h>
#include <LBTServer.h>
int readval;
String inputString = "", 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);
}
}
}
Processus de fabrication
- Robot DIY inspiré de Wall‑E : Raspberry Pi dans une boîte de CD recyclée
- Robot réveil roulant : Système mobile intelligent piloté par Raspberry Pi et Google Calendar
- RasPiRobot Board V2 : Transformez votre Raspberry Pi en contrôleur robot puissant
- Construire un robot Creeper motorisé Minecraft avec Arduino
- Archimède : Le hibou robotique IA à détection d'émotions
- Construire un robot vision par ordinateur piloté par la parole sur Windows 10 IoT Core
- Robot ROS : Navigation pilotée par terminal sur Raspberry Pi
- Intégration Microsoft Kinect avec Raspberry Pi pour détection humaine temps réel sur robot Sonbi
- Simple Pi Robot – Construire un rover autonome 2 roues motrices avec Raspberry Pi