Et si au lieu de faire le ménage, la cuisine, l’amour ou la guerre, les robots pouvaient danser ?
La danse est un sport exigent techniquement, nécessitant de la précision et de la coordination dans les mouvements. Mais c’est aussi, un art, un moyen d’exprimer et partager des émotions.
Réaliser un robot capable de synchroniser ses mouvements en fonction d’une musique et de faire ressentir des émotions à un humain est donc un défis incroyablement intéressant !
Croquis
Je cherche a fabriquer un robot avec un look sympa et dynamique, mais aussi quelque chose de simple a modéliser / imprimer en 3D. Après quelques essais je m’arrête sur ce design :
Modélisation 3D
Je passe ensuite à la modélisation en 3D. Pour cela, j’utilise blender. C’est un outil open source, gratuit, disponible sous windows/linux/osX. C’est d’ailleurs pour cela que je l’ai choisit. On trouve de nombreuses ressources sur le net, des tutos aux modèles.
Conception / Mécanisation
Ensuite, la mécanisation de la tête. Pour les premiers mouvements, je défini 2 degrés de liberté. Elle sera animé par 2 servomoteurs.
Je me suis inspiré de pièces vues sur internet pour concevoir une structure.
Mais il faudra un test grandeur nature pour valider la conception…
Préparation à l’impression 3D
Il faut ensuite préparer le modèle pour l’impression. Pour cela j’ai suivi ce tuto sur le site d’impression sculpteo :
https://www.sculpteo.com/fr/tutoriel/preparer-votre-fichier-pour-limpression-3d-avec-blender/
Avant de passer commande pour les pièces, vérifier les dimensions calculées par le site (quel qu’il soit). J’ai du m’y reprendre à plusieurs fois pour obtenir la bonne échelle.
Il est très important d’être précis, au millimètre, car il faut que la structure soit aux dimensions des servomoteurs… J’aurais d’ailleurs du prendre un peu plus de marges…
Réception et préparation des pièces
Après quelques jours, je reçoit mes pièces commandées en ligne. Il faut les préparer en évidant, méticuleusement les parties creuses avec un cuter ou un scalpel.
Montage
Pour monter la tête du robot, j’ai des trous à creuser pour pouvoir fixer les servomoteurs. Je n’ai qu’une grosse perceuse, pas idéale car trop grosse, mais cela fait l’affaire.
Une fois les pièces assemblées, il ne reste plus qu’à brancher les servos sur ma carte Arduino Uno, et la partie mécanique est terminée.
Programmation
Pour cette première étape, je me fixe comme objectif de secouer la tête du robot à un tempo défini (en BPM) pour pouvoir le caller sur une musique.
La difficulté est donc de caller la vitesse du mouvement de descente et remonté de la tête selon le nombre de mouvements à réaliser par minute. Après quelques calculs et essais, j’obtient finalement le résultat attendu.
J’en fais alors une petite variante dans lequel le robot fait des mouvements d’amplitudes différentes, c’est plus sympa.
#include <Servo.h> const int TOP = 1; const int DOWN = 2; const int MIN = 45; const int MAX = 80; float stepTime = 50; //ms float variation = MAX - MIN; //degree Servo servoX; Servo servoY; int rX = 110; float rY = MAX; int bpm = 80; //beat per seconde float ratio = 5; int upTime; int cycleTime; int downTime; void setup() { Serial.begin(9600); //pinMode(13, OUTPUT); cycleTime = 60000/bpm; //TotalMoveDuration in ms upTime = cycleTime * 1 / ratio; downTime = cycleTime - upTime; Serial.println("bpm"); Serial.println(bpm); Serial.println("upTime"); Serial.println(upTime); Serial.println("cycleTime"); Serial.println(cycleTime); Serial.println("downTime"); Serial.println(downTime); servoY.attach(2); servoY.write((int)rY); servoX.attach(4); servoX.write((int)rX); } void loop() { //Complete step moveHead(TOP,1); moveHead(DOWN,1); //Semi step moveHead(TOP,2); moveHead(DOWN,2); } void moveHead(int dir, int amplitudeRatio){ int nbStep; if(dir == TOP){ nbStep = upTime / stepTime; }else if(dir == DOWN){ nbStep = downTime / stepTime; } float angle = variation / amplitudeRatio / (float)nbStep; for(int i = 0; i < nbStep; i++){ if(dir == DOWN){ rY = rY + angle; }else if(dir == TOP){ rY = rY - angle; } writeHead(); } } void writeHead(){ if(rY > MAX){ rY = MAX; } if(rY < MIN){ rY = MIN; } servoY.write((int)rY); delay(stepTime); }
Voici le résultat après quelques essais.
Conclusion
La première phase du projet est donc réussie. Mais il reste beaucoup de travail avant d’avoir un robot qui danse.
J’ai identifié trois axes sur lesquels travailler :
- continuer de construire le corps du robot pour lui permettre de réaliser plus de mouvement
- travailler sur le look en améliorant la finition de l’impression 3D, un peu de peinture, et quelques LED
- réfléchir à une solution pour trouver automatiquement le BPM du morceau en cours pour caller le robot sur le tempo
A suivre…