Dancing Robot Head

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…