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…
Porteur du projet Emmanuel Thiéry (contact : emmanuel.thiery@pmclab.fr) et Benjamin Lomuto (contact : benjamin.lomuto@gmail.com)
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º
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 */ }