Table des matières

Construction d'un robot humanoïde

Nous sommes en train de construire le robot inmoov grâce à notre imprimante 3D markerbot replicator 2X. Le site internet http://www.inmoov.fr/ est très bien documenté aussi nous ne préciserons dans ce wiki uniquement les difficultés rencontrés lors de la construction. En plus de construire le robot, nous voulons ajouter plusieurs fonctionnalités pour qu'il puisse interagir avec son environnement : reconnaissance faciale et vocale, connexions avec d'autres robots ou ordinateurs…

Participation

Porteur du projet Emmanuel Thiéry (contact : emmanuel.thiery@pmclab.fr) et Benjamin Lomuto (contact : benjamin.lomuto@gmail.com)

1er étape : construction de la main et l'avant bras droit :

Une fois la main et l'avant bras terminé, nous programmerons le membre pour qu'il soit imbattable au chifoumi

04/12/2013 Nous avons imprimé la plupart des pièces composant l'avant bras, nous sommes en attente des servos et du fil de pêche pour le finir.
08/01/2014 Nous avons reçu le fil de pêche et nous avons pu assembler la main :

22/09/2014 Pour terminer l'avant bras, nous avons suivis les instructions du site internet, exepter le fait que nous avons modifié la pièce “RobServoBedV5” afin de la fité avec les servos moteurs suivants : Corona DS-319HV, choisit pour leur rapidité 0.05 sec pour tourner de 60º

Pierre feuille ciseaux contre la main

var Leap = require('leapjs');
 
var controller = new Leap.Controller();
 
// 0 = No cheat (full random)
// 1 = Subtile cheat mode (2/3 draw, 1/3 win)
// 2 = Full cheat mode (always win)
var mode = 1;
 
var step = 0;
var underThreshold;
var threshold = 150;
var steps = ["1...", "2...", "3...", ""];
 
var countFingers = function(hand) {
	var nbFingers = 0;
	nbFingers += hand.thumb.extended;
	nbFingers += hand.indexFinger.extended;
	nbFingers += hand.middleFinger.extended;
	nbFingers += hand.ringFinger.extended;
	nbFingers += hand.pinky.extended;
	return nbFingers;
}
 
var detectGesture = function(hand) {
	var nbFingers = countFingers(hand);
	if (nbFingers==0) return "Pierre";
	if (nbFingers==5) return "Feuille";
	if (nbFingers==2 && hand.indexFinger.extended && hand.middleFinger.extended) return "Ciseaux";
	return "Mouvement invalide";
};
 
var getWiningGesture = function(gesture) {
	if (gesture=="Pierre") return "Feuille";
	if (gesture=="Feuille") return "Ciseaux";
	if (gesture=="Ciseaux") return "Pierre";
};
 
var getSubtleWiningGesture = function(gesture) {
	var i = Math.floor(Math.random()*3);
	if (i<=1) return gesture;
	if (gesture=="Pierre") return "Feuille";
	if (gesture=="Feuille") return "Ciseaux";
	if (gesture=="Ciseaux") return "Pierre";
};
 
var getRandomGesture = function() {
	var i = Math.floor(Math.random()*3);
	if (i==1) return "Feuille";
	if (i==2) return "Ciseaux";
	if (i==0) return "Pierre";
};
 
var whoWin = function(p1, p2) {
	if (p1==p2) return 0;
	if (p1=="Pierre") return (p2=="Feuille")?2:1;
	if (p1=="Feuille") return (p2=="Ciseaux")?2:1;
	if (p1=="Ciseaux") return (p2=="Pierre")?2:1;
};
 
controller.on("deviceFrame", function(frame) {
	if (frame.hands[0]) {
		var hand = frame.hands[0];
 
		if (underThreshold && hand.palmPosition[1]>=threshold) {
			underThreshold = false;
		} else if (!underThreshold && hand.palmPosition[1]<threshold) {
			underThreshold = true;
			step++;
			console.log(steps[step-1]);
		}
 
		if (step==4) {
			var userGesture = detectGesture(hand);
			if (userGesture != "Mouvement invalide") {
				var aiGesture;
				if (mode==0)
					aiGesture = getRandomGesture();
				else if (mode==1)
					aiGesture = getSubtleWiningGesture(userGesture);
				else
					aiGesture = getWiningGesture(userGesture);
				console.log("Le robot : "+aiGesture);
				console.log("Vous : "+userGesture);
				var result = whoWin(userGesture, aiGesture);
				if (result==1) {
					console.log(userGesture+" > "+aiGesture+", vous gagnez !");
				} else if (result==2) {
					console.log(userGesture+" < "+aiGesture+", le robot gagne !");
				} else {
					console.log(userGesture+" = "+aiGesture+", match nul !");
				}
 
			} else {
				console.log("Mouvement non reconu");
			}
			step = 0;
		}	
	}
});
 
controller.connect();

code pour actionner les deux servos moteurs corona des yeux :

#include <Servo.h>

Servo myservo;  // On créer un objet MyServo par lequel on envois les instruction au servo

int Min = 60; // position max optimales des servos d'après mon montage
int Max = 88;


int pos = 30;    // variable to store the servo position 
int vitesse=5;

void setup()
{
  pinMode(6,OUTPUT);
  myservo.attach(6);  // On associe notre objet à la Pin connecté au fil de données du servo
  
}

void loop() 
{  
  myservo.write(90);     //donne l'ordre de mettre le Servo à sont angle minimum        


for(pos = Min; pos < Max; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);    // tell servo to go to position in variable 'pos'
      delay(vitesse);                  // waits 15ms for the servo to reach the position 
  }

 for(pos = Max; pos>=Min; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos+20);    // tell servo to go to position in variable 'pos' 
    
    delay(vitesse);                       // waits 15ms for the servo to reach the position 
  } 


  
} 

27/06/2015 :J'ai un peu galéré à trouver comment démonter le servo hitec hs805bb afin de sortir le potentiomètre. J'ai trouvé cette vidéo sur internet qui explique étape par étape : https://www.youtube.com/watch?v=4ia6zoRKujI

D'après l'alimentation du PMClab, le servo Hitec besoin en moyenne de 0,5-0,6 Ampère pour tourner dans le même sens et au moment de changer de sens il y a des pics vers de 1,2-1,4 avec juste quelques composants mis (voir photo bientôt)

29/06/2015 : réglage des doigts de la main

 
#include <Servo.h> 
 
Servo pouce;  // create servo object to control a servo 
Servo index;               // a maximum of eight servo objects can be created 
Servo majeur;
Servo annulaire;
Servo auriculaire;

int pos = 30;    // variable to store the servo position 
int vitesse=15;

void setup() 
{ 
  pouce.attach(3);  // attaches the servo on pin 9 to the servo object 
  index.attach(5);
  majeur.attach(6);
  annulaire.attach(9);
  auriculaire.attach(10);
} 
//pouce 70,130
//doigt 15,110
//majeur 28,100
//annulaire 20, 130
//auriculaire 25,100
void loop() 
{
  //valeur(90); // met tout les servos à la position 90 degré
 fermer(50,140);

}



void fermer(int Min,int Max) {
    
  for(pos = Min; pos < Max; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    pouce.write(pos);    // tell servo to go to position in variable 'pos'
    index.write(pos);
    majeur.write(pos);
    annulaire.write(pos);
    auriculaire.write(pos);  
    delay(vitesse);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = Max; pos>=Min; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    pouce.write(pos+20);    // tell servo to go to position in variable 'pos' 
    index.write(pos);
    majeur.write(pos);
    annulaire.write(pos);
    auriculaire.write(pos); 
    delay(vitesse);                       // waits 15ms for the servo to reach the position 
  } 
}

03/07/2015 :
code pour le servo qui fait hocher la tête.

#include <Servo.h>

Servo myservo;  // On créer un objet MyServo par lequel on envois les instruction au servo

int Min = 20;
int Max = 180;


int pos = 0;    // variable to store the servo position 
int vitesse=15;

void setup()
{
  pinMode(6,OUTPUT);
  myservo.attach(6);  // On associe notre objet à la Pin connecté au fil de données du servo
  
}

void loop() 
{  
//myservo.write(90);     //donne l'ordre de mettre le Servo à sont angle minimum    
 


for(pos = Min; pos < Max; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);    // tell servo to go to position in variable 'pos'
      delay(vitesse);                  // waits 15ms for the servo to reach the position 
  }

 for(pos = Max; pos>=Min; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);    // tell servo to go to position in variable 'pos' 
    
    delay(vitesse);                       // waits 15ms for the servo to reach the position 
  } 

delay(1500);
  
  
} 

Tout les moteurs des bras sont asservis, voici le code qui permet de controler le robot avec leur extreneum :

#include <Servo.h>

//partie gauche
 Servo g_aisselle;
 Servo g_homoplate; 
 Servo g_rotbras;
 Servo g_contraction;
 
 //partie droite
 Servo d_aisselle;
 Servo d_homoplate;  
 Servo d_rotbras;
 Servo d_contraction;

int mini = 0; // variable to store the servo position
int maxi = 180 ;

void setup()
{
  g_aisselle.attach(2);
  g_homoplate.attach(3);
  g_rotbras.attach(4);
  g_contraction.attach(5);
  
  d_aisselle.attach(9);
  d_homoplate.attach(10);
  d_rotbras.attach(11);
  d_contraction.attach(12);
   
  // attaches the servo on pin 9 to the servo object
}
 
void loop()
{
  /*
  for(mini = 0; mini < 180; mini += 1)  // goes from 0 degrees to 180 degrees
  {                             // in steps of 1 degree
  myservo.write(mini);          // tell servo to go to position in variable 'pos'
  delay(15);                  // waits 15ms for the servo to reach the position
  }
  for(maxi = 180; maxi>=1; maxi-=1)   // goes from 180 degrees to 0 degrees
  {                            
  myservo.write(maxi);          // tell servo to go to position in variable 'pos'
  delay(15);                  // waits 15ms for the servo to reach the position
  }
 
  */
  // position initale

 g_aisselle.write(20); //  20-43 semble être le milieu    20 bas  : 43 haut
 g_homoplate.write(50); //10-100        10 bas : haut : 100
 g_rotbras.write(90); // 50-130  droite 100 : 180 gauche
  g_contraction.write(0); //0-25  bas 0 : 25 haut
  
  d_aisselle.write(50); //10-70
  d_homoplate.write(30); //  70-130
  d_rotbras.write(100); // 100-130  droite 100 : 130 gauche
  d_contraction.write(165); //110-170  haut 110 : 165 bas

//coucou
/*
  d_aisselle.write(50); //10-70
  d_homoplate.write(110); //  70-130 - 110 horizotal
 
  d_contraction.write(160); // dérontracté   110-160 contracté
  d_rotbras.write(150); // 100-130
  delay (3000);
  d_rotbras.write(100);
  delay (3000);

  */

// WTF

/*
 g_aisselle.write(20); //  20-43 semble être le milieu    20 bas  : 43 haut
 g_homoplate.write(100); //10-100        10 bas : haut : 100
 g_rotbras.write(180); // 50-130  droite 100 : 180 gauche
 
  d_aisselle.write(50); //10-70
  d_homoplate.write(100); //  70-130
  d_rotbras.write(180); // 100-130  gauche 100 : 130 droite
  d_contraction.write(165); //110-170  haut 110 : 165 bas
  */
 
}