Le robot Youpi
À l’occasion de l’atelier robotique du 24/05/2015, Richard, Cyrille, Clément, Gilles et Alain ont tenté de redonner vie à ce grand père des années 80.
Comment sommes nous arrivés à « contrôler » ce robot ?
- En nous documentant en particulier sur ce site incontournable : http://youpi.forler.ch/
- Nous avons vérifié le câble de liaison parallèle à l’aide d’un multimètre et d’un trombone pour réaliser le contact coté fiche femelle.
- Premier test avec un PC sous GNU\Linux en envoyant les codes à l’aide d’une console de terminal. (genre : echo « code » > /dev/lpt0) . Sans succès :-(
- Deuxième test avec un PC sous un vieil OS privateur et plusieurs logiciels glanés sur la toile. Sans succès :-(
- Troisièmes essai avec un Arduino, un câble fait maison et un p’tit programme de base. Sans succès :-(
Le désespoir commençait à nous gagner (nous n’avions plus d’idée de test…) lorsque Richard dit «ton câble commence sur la broche 1 ?» «oui» «bah c’est pas bon…»
Une soudure plus tard, nous refaisions le test avec succès ! :-) Le «grand père» venait de frémir :-) , sans suivent une multitude de tests pour vérifier le bon fonctionnement de tous les axes du robot à l’aide du code Arduino ci-dessous.
/*
Programme de base pour tester un robot Youpi.
Le 24/04/2015
AlGau
http://calvix.org
Voir aussi : http://youpi.forler.ch/
*/
// déclaration des n° de sorties utilisées
int bit_01 = 0;
int bit_02 = 1;
int bit_03 = 2;
int bit_04 = 3;
int bit_05 = 4;
int bit_06 = 5;
int bit_07 = 6;
int bit_08 = 7;
// délai entre l'envoi de deux octets
int delai = 1;
// fonction d'initialisation
void setup() {
// initialisation des sorties
pinMode(bit_01, OUTPUT);
pinMode(bit_02, OUTPUT);
pinMode(bit_03, OUTPUT);
pinMode(bit_04, OUTPUT);
pinMode(bit_05, OUTPUT);
pinMode(bit_06, OUTPUT);
pinMode(bit_07, OUTPUT);
pinMode(bit_08, OUTPUT);
delay(delai);
// initialisation du robot
// 47h
digitalWrite(bit_01, HIGH);
digitalWrite(bit_02, HIGH);
digitalWrite(bit_03, HIGH);
digitalWrite(bit_04, LOW);
digitalWrite(bit_05, LOW);
digitalWrite(bit_06, LOW);
digitalWrite(bit_07, HIGH);
digitalWrite(bit_08, LOW);
delay(delai);
// 00h
digitalWrite(bit_01, LOW);
digitalWrite(bit_02, LOW);
digitalWrite(bit_03, LOW);
digitalWrite(bit_04, LOW);
digitalWrite(bit_05, LOW);
digitalWrite(bit_06, LOW);
digitalWrite(bit_07, LOW);
digitalWrite(bit_08, LOW);
delay(delai);
// commande sens de rotation
digitalWrite(bit_01, LOW); // base
digitalWrite(bit_02, HIGH); // Epaule
digitalWrite(bit_03, HIGH); // Coude
digitalWrite(bit_04, HIGH); // Poignet
digitalWrite(bit_05, HIGH); // Poignet (rotation)
digitalWrite(bit_06, HIGH); // Pince
digitalWrite(bit_07, LOW);
digitalWrite(bit_08, HIGH);
delay(delai);
digitalWrite(bit_01, LOW); // base
digitalWrite(bit_02, HIGH); // Epaule
digitalWrite(bit_03, HIGH); // Coude
digitalWrite(bit_04, HIGH); // Poignet
digitalWrite(bit_05, HIGH); // Poignet (rotation)
digitalWrite(bit_06, HIGH); // Pince
digitalWrite(bit_07, LOW);
digitalWrite(bit_08, LOW);
delay(delai);
}
// Nombre de bits pour 'bit_01' 'bit_02' 'bit_03'
// remplacer xxx par les bits ci dessous pour actionner l'axe choisi
// 1 BASE 000
// 2 EPAULE 001
// 3 COUDE 010
// 4 POIGNET 011
// 5 POIGNET (ROTATION) 100
// 6 PINCE 101
// Boucle qui envoi les deux octets nécessaires pour progresser d'un demi pas (un pas pour la fermeture de la pince)
void loop() {
digitalWrite(bit_01, HIGH); // xxx
digitalWrite(bit_02, LOW); // xxx
digitalWrite(bit_03, HIGH); // xxx
digitalWrite(bit_04, LOW); // ???
digitalWrite(bit_05, LOW); // ???
digitalWrite(bit_06, LOW); // ???
digitalWrite(bit_07, HIGH);
digitalWrite(bit_08, LOW);
delay(delai);
digitalWrite(bit_01, HIGH); // xxx
digitalWrite(bit_02, LOW); // xxx
digitalWrite(bit_03, HIGH); // xxx
digitalWrite(bit_04, LOW); // ???
digitalWrite(bit_05, LOW); // ???
digitalWrite(bit_06, LOW); // ???
digitalWrite(bit_07, LOW);
digitalWrite(bit_08, LOW);
delay(delai);
}