Pantographe Robotisé

De Wikidebrouillard.

(Page créée avec « {{avertissement}} {{vidéo|numérovidéo = <videoflash type="mediaspip" num ="1">http://mediaspip.ptitdeb.infini.fr/IMG/mp4/montage_petits_debs.mp4|400|300</videoflash>}} =… »)
 
(7 versions intermédiaires masquées)
Ligne 1 : Ligne 1 :
-
{{avertissement}}
+
{{vidéo|numérovidéo = <videoflash type="mediaspip" num = 1>http://mediaspip.ptitdeb.infini.fr/IMG/flv/travail-encoded.flv|400|300</videoflash>}}
-
{{vidéo|numérovidéo = <videoflash type="mediaspip" num ="1">http://mediaspip.ptitdeb.infini.fr/IMG/mp4/montage_petits_debs.mp4|400|300</videoflash>}}
+
=='''Présentation de l'expérience'''==
=='''Présentation de l'expérience'''==
-
 
+
Reproduction de mouvements
-
Si vous aussi vous avez toujours eu envie de partir à la conquête du monde à la tête de votre propre armée de robots, il faut commencer par les bases. Voici comment fabriquer un bras robotisé simple à l'aide d'un Arduino !
+
== '''Matériel''' ==
== '''Matériel''' ==
* [[Image:Arduino_Diecimila.jpg|50px]] Un [[Arduino]] avec son câble USB
* [[Image:Arduino_Diecimila.jpg|50px]] Un [[Arduino]] avec son câble USB
-
* [[Image:Pile.jpg|50px]] Une [[pile]] 9V
 
* [[Image:Computer.jpg|50px]] Un [[ordinateur]]
* [[Image:Computer.jpg|50px]] Un [[ordinateur]]
* [[Image:Plaquecablage bb.jpg|50px]] Une [[plaque Labdec]]
* [[Image:Plaquecablage bb.jpg|50px]] Une [[plaque Labdec]]
-
* [[Image:Potentiomètre.jpg‎|50px]] 3 [[potentiomètre]]s
+
* [[Image:Servo-moteur.jpg|50px]] 2 [[servomoteur]]s de modélisme
-
* [[Image:Servo-moteur.jpg|50px]] 3 [[servomoteur]]s de modélisme
+
* [[Image:Deux fils.jpg|50px]] Du [[fil électrique]]
* [[Image:Deux fils.jpg|50px]] Du [[fil électrique]]
* [[Image:Ciseau.jpg|50px]] Une [[paire de ciseaux]]
* [[Image:Ciseau.jpg|50px]] Une [[paire de ciseaux]]
* [[Image:Pic a brochette.jpg|50px]] Des [[pic à brochette|pics à brochette]]
* [[Image:Pic a brochette.jpg|50px]] Des [[pic à brochette|pics à brochette]]
-
* [[Image:Paille plastique.jpg|50px]] Des [[paille]]s
 
* [[Image:Colle.jpg|50px]] De la [[colle]]
* [[Image:Colle.jpg|50px]] De la [[colle]]
Ligne 28 : Ligne 23 :
Mettre le code suivant dans l'Arduino :
Mettre le code suivant dans l'Arduino :
-
(pour plus de détail : [[Arduino]])
+
<pre>// code pour pentographe robotise a deux servo-moteur
-
<pre>// Contrôler la position de servomoteurs avec des potentiomètres (résistance variable)
+
-
#include <Servo.h>  
+
 
 +
#include <Servo.h>
 +
#include <EEPROM.h>
 +
 
 +
#define CALIB_MAX 512
 +
#define CALIB_MIN 100
 +
#define SAMPLE_DELAY 25 // fréquence d'échantillonage
 +
 
 +
uint8_t recordButtonPin = 12;
 +
uint8_t playButtonPin = 7;
 +
uint8_t servoPin1 = 9;
 +
uint8_t servoPin2 = 10;
 +
uint8_t feedbackPin1 = A0;
 +
uint8_t feedbackPin2 = A1;
 +
uint8_t ledPin = 13;
 +
 
 +
Servo myServo1;
 +
Servo myServo2;
 +
 
 +
void setup() {
 +
  Serial.begin(9600);
 +
  pinMode(recordButtonPin, INPUT);
 +
  digitalWrite(recordButtonPin, HIGH);
 +
  pinMode(playButtonPin, INPUT);
 +
  digitalWrite(playButtonPin, HIGH);
 +
  pinMode(ledPin, OUTPUT);
 +
 
 +
  Serial.println("Servo RecordPlay");
 +
}
 +
 
 +
void loop() {
 +
if (! digitalRead(recordButtonPin)) {
 +
  delay(10);
 +
  // on attend que le bouton soit relaché
 +
  while (! digitalRead(recordButtonPin));
 +
  delay(20);
 +
  // le bouton est relaché
 +
  recordServo(servoPin1, servoPin2, feedbackPin1, feedbackPin2, recordButtonPin);
 +
}
   
   
-
Servo myservo1;   // créer un objet servo 1 pour le contrôler
+
   if (! digitalRead(playButtonPin)) {
-
Servo myservo2;  // créer un objet servo 2 pour le contrôler
+
  delay(10);
-
Servo myservo3;  // créer un objet servo 3 pour le contrôler
+
  // on attend que le bouton soit relaché
-
+
  while (! digitalRead(playButtonPin));
-
int potpin1 = 0;  // borne analogique pour connecter le potentiomètre 1
+
  delay(20);
-
int potpin2 = 1;  // borne analogique pour connecter le potentiomètre 2
+
  // le bouton est relaché
-
int potpin3 = 2;  // borne analogique pour connecter le potentiomètre 3
+
  playServo(servoPin1, servoPin2, playButtonPin);
-
int val1;        // variable pour stocker la valeur du potentiomètre 1
+
  }
-
int val2;        // variable pour stocker la valeur du potentiomètre 2
+
}
-
int val3;        // variable pour stocker la valeur du potentiomètre 3
+
-
+
-
void setup()  
+
-
{  
+
-
  myservo1.attach(9);  // brancher le servomoteur 1 sur l'entrée 9
+
-
  myservo2.attach(10); // brancher le servomoteur 2 sur l'entrée 10
+
-
  myservo3.attach(11);  // brancher le servomoteur 3 sur l'entrée 11
+
-
}
+
-
+
-
void loop()  
+
-
{
+
-
  val1 = analogRead(potpin1);         // lire la valeur du potentiomètre 1
+
-
  val1 = map(val1, 0, 1023, 0, 179); // la discrétiser pour l'utiliser avec un servomoteur
+
-
  val2 = analogRead(potpin2);        // lire la valeur du potentiomètre 2
+
-
  val2 = map(val2, 0, 1023, 0, 179); // la discrétiser pour l'utiliser avec un servomoteur
+
-
  val3 = analogRead(potpin3);        // lire la valeur du potentiomètre 3
+
-
  val3 = map(val3, 0, 1023, 0, 179); // la discrétiser pour l'utiliser avec un servomoteur
+
-
  myservo1.write(val1);              // mettre le servomoteur 1 dans la bonne position
+
-
  myservo2.write(val2);              // mettre le servomoteur 2 dans la bonne position
+
-
  myservo3.write(val3);              // mettre le servomoteur 3 dans la bonne position
+
-
  delay(5);                          // attendre que les servomoteurs aillent dans leur position
+
-
} </pre>
+
-
* Partie électrique
+
void playServo(uint8_t servoPin1, uint8_t servoPin2, uint8_t buttonPin) {
 +
  uint16_t addr = 0;
 +
  Serial.println("Playing");
-
Schéma général :
 
-
Attention une erreur s'est glissée dans le schéma : les potentiomètre ne sont pas alimentés, hors il doivent être connectés (une patte en rouge, une noir et l'autre, pour la valeur de la résistance).
+
  myServo1.attach(servoPin1);
-
[[Fichier:Schema bras robotisé.jpg|400px]]
+
  myServo2.attach(servoPin2);
 +
  while (digitalRead(buttonPin)) {   
 +
    uint8_t x1 = EEPROM.read(addr);
 +
    addr++;
 +
    uint8_t x2 = EEPROM.read(addr);
 +
    addr++;
 +
    Serial.print("Read EE: servo1 = "); Serial.print(x1);
 +
    Serial.print("Read EE: servo2 = "); Serial.print(x2);
 +
    if (x1 == 255) break;
 +
    if (x2 == 255) break;
 +
    // map to 0-180 degrees
 +
    x1 = map(x1, 0, 254, 0, 180);
 +
    x2 = map(x2, 0, 254, 0, 180);
 +
    Serial.print(" -> "); Serial.println(x1);
 +
    Serial.print(" -> "); Serial.println(x2);
 +
    myServo1.write(x1);
 +
    myServo2.write(x2);
 +
    delay(SAMPLE_DELAY);
 +
    if (addr == 512) break;
 +
  }
 +
  Serial.println("Done");
 +
  myServo1.detach();
 +
  myServo2.detach();
 +
  delay(250); 
 +
}
-
- Câblage des potentiomètres :
+
void recordServo(uint8_t servoPin1, uint8_t servoPin2, uint8_t analogPin1, uint8_t analogPin2, uint8_t buttonPin) {
 +
  uint16_t addr = 0;
 +
 
 +
  Serial.println("Recording");
 +
  digitalWrite(ledPin, HIGH);
 +
  pinMode(analogPin1, INPUT);
 +
  pinMode(analogPin2, INPUT); 
 +
  while (digitalRead(buttonPin)) {
 +
    uint16_t a1 = analogRead(analogPin1);
 +
    uint16_t a2 = analogRead(analogPin2);
 +
    Serial.print("Read analog servo 1 : "); Serial.print(a1);
 +
    Serial.print("Read analog servo 2 : "); Serial.print(a2);
 +
    if (a1 < CALIB_MIN) a1 = CALIB_MIN;
 +
    if (a1 > CALIB_MAX) a1 = CALIB_MAX;
 +
    if (a2 < CALIB_MIN) a2 = CALIB_MIN;
 +
    if (a2 > CALIB_MAX) a2 = CALIB_MAX;
 +
    a1 = map(a1, CALIB_MIN, CALIB_MAX, 0, 254);
 +
    a2 = map(a2, CALIB_MIN, CALIB_MAX, 0, 254);
 +
    Serial.print(" -> "); Serial.println(a1);
 +
    Serial.print(" -> "); Serial.println(a2);
 +
    EEPROM.write(addr, a1);
 +
    addr++;
 +
    EEPROM.write(addr, a2);
 +
    addr++;
 +
    if (addr == 512) break;
 +
    delay(SAMPLE_DELAY);
 +
  }
 +
  if (addr != 512) EEPROM.write(addr, 255);
-
1) Aligner les potentiomètres sur la plaque Labdec.
+
  digitalWrite(ledPin, LOW);
-
2) Câbler les potentiomètres. On utilisera les entrées 0, 1 et 2 de l'arduino. La broche du milieu du potentiomètre est la commande qui sera branchée sur l'arduino, pour les deux autres, une sera connectée au + et une au -.
+
  Serial.println("Done");
 +
  delay(250);
 +
}
 +
</pre>
 +
(pour plus de détail : [[Arduino]])
-
<i>Astuce : utiliser une source + et – sur la plaque Labdec</i>
+
 
 +
* Partie électrique
 +
 
 +
Schéma général :
 +
 
 +
[[Fichier:pentographe_draft.jpg|400px]]
- Câblage des servomoteurs :
- Câblage des servomoteurs :
Ligne 104 : Ligne 175 :
/!\ Utiliser une alimentation extérieure pour l'arduino, l'alimentation par la prise USB de l'ordinateur n'étant pas suffisante.
/!\ Utiliser une alimentation extérieure pour l'arduino, l'alimentation par la prise USB de l'ordinateur n'étant pas suffisante.
-
1) Tourner un des potentiomètres dans un sens, le servomoteur correspondant fait bouger le bras !
 
-
 
-
2) Tourner le même potentiomètre dans l'autre sens, le servomoteur correspondant fait bouger le bras dans l'autre sens !
 
-
 
-
==='''Pour aller plus loin'''===
 
-
 
-
Il est possible d'ajouter autant de servomoteurs que l'on veut en ajustant le code à mettre dans l'arduino.
 
-
 
-
Il est également possible de piloter autre chose que des servomoteurs, comme un moteur continu par exemple.
 
==='''Que voit-on ?'''===
==='''Que voit-on ?'''===
-
On obtient un petit bras robotisé où chaque articulation est pilotée par un potentiomètre.
+
On obtient un bras robotisé qui enregistre d'abord les mouvements de l'utilisateur. Pour ensuite, les reproduirent automatiquement.  
== '''Explications''' ==
== '''Explications''' ==
==='''De manière simple'''===
==='''De manière simple'''===
-
 
-
Quand on tourne un potentiomètre, on envoie une information à l'Arduino. Ce dernier utilise le code que l'on lui a transmis via le câble USB pour traduire cette information en commande pour le servo-moteur.
 
-
Le signal envoyé par le potentiomètre est un signal analogique (continu, c'est-à-dire constitué d'une infinité de valeurs). Le signal envoyé au servo-moteur est un signal numérique (discret, c'est-à-dire constitué d'un nombre limité de valeurs).
 
-
 
-
=== '''Allons plus loin dans l'explication''' ===
 
-
 
-
Développons les concepts scientifiques associés.
 
-
Ne pas hésiter à faire des liens avec Wikipédia.
 
== '''Applications : liens avec le quotidien''' ==
== '''Applications : liens avec le quotidien''' ==
-
Robotique industrielle, exploration spatiale.
+
Robotique industrielle, exploration spatiale, opérations médicales.
=='''Catégories'''==
=='''Catégories'''==

Version actuelle en date du 28 janvier 2014 à 15:38

La vidéo "Pantographe Robotisé"


Sommaire

Présentation de l'expérience

Reproduction de mouvements

Matériel

L'expérience

La réalisation

  • Partie programmation

Mettre le code suivant dans l'Arduino :

// code pour pentographe robotise a deux servo-moteur


#include <Servo.h>
#include <EEPROM.h>

#define CALIB_MAX 512
#define CALIB_MIN 100
#define SAMPLE_DELAY 25 // fréquence d'échantillonage

uint8_t recordButtonPin = 12;
uint8_t playButtonPin = 7;
uint8_t servoPin1 = 9;
uint8_t servoPin2 = 10;
uint8_t feedbackPin1 = A0;
uint8_t feedbackPin2 = A1;
uint8_t ledPin = 13;

Servo myServo1;
Servo myServo2;
  
void setup() {
  Serial.begin(9600);
  pinMode(recordButtonPin, INPUT);
  digitalWrite(recordButtonPin, HIGH);
  pinMode(playButtonPin, INPUT);
  digitalWrite(playButtonPin, HIGH);
  pinMode(ledPin, OUTPUT);
  
  Serial.println("Servo RecordPlay");
}

void loop() {
 if (! digitalRead(recordButtonPin)) {
   delay(10);
   // on attend que le bouton soit relaché
   while (! digitalRead(recordButtonPin));
   delay(20);
   // le bouton est relaché
   recordServo(servoPin1, servoPin2, feedbackPin1, feedbackPin2, recordButtonPin);
 }
 
  if (! digitalRead(playButtonPin)) {
   delay(10);
   // on attend que le bouton soit relaché
   while (! digitalRead(playButtonPin));
   delay(20);
   // le bouton est relaché
   playServo(servoPin1, servoPin2, playButtonPin);
 }
}

void playServo(uint8_t servoPin1, uint8_t servoPin2, uint8_t buttonPin) {
  uint16_t addr = 0;
  Serial.println("Playing");


  myServo1.attach(servoPin1);
  myServo2.attach(servoPin2);
  while (digitalRead(buttonPin)) {    
    uint8_t x1 = EEPROM.read(addr);
    addr++;
    uint8_t x2 = EEPROM.read(addr);
    addr++;
    Serial.print("Read EE: servo1 = "); Serial.print(x1);
    Serial.print("Read EE: servo2 = "); Serial.print(x2);
    if (x1 == 255) break;
    if (x2 == 255) break;
    // map to 0-180 degrees
    x1 = map(x1, 0, 254, 0, 180);
    x2 = map(x2, 0, 254, 0, 180);
    Serial.print(" -> "); Serial.println(x1);
    Serial.print(" -> "); Serial.println(x2);
    myServo1.write(x1);
    myServo2.write(x2);
    delay(SAMPLE_DELAY);
    if (addr == 512) break;
  }
  Serial.println("Done");
  myServo1.detach();
  myServo2.detach();
  delay(250);  
}

void recordServo(uint8_t servoPin1, uint8_t servoPin2, uint8_t analogPin1, uint8_t analogPin2, uint8_t buttonPin) {
  uint16_t addr = 0;
  
  Serial.println("Recording");
  digitalWrite(ledPin, HIGH);
  pinMode(analogPin1, INPUT);
  pinMode(analogPin2, INPUT);  
  while (digitalRead(buttonPin)) {
     uint16_t a1 = analogRead(analogPin1);
     uint16_t a2 = analogRead(analogPin2);
     Serial.print("Read analog servo 1 : "); Serial.print(a1);
     Serial.print("Read analog servo 2 : "); Serial.print(a2);
     if (a1 < CALIB_MIN) a1 = CALIB_MIN;
     if (a1 > CALIB_MAX) a1 = CALIB_MAX;
     if (a2 < CALIB_MIN) a2 = CALIB_MIN;
     if (a2 > CALIB_MAX) a2 = CALIB_MAX;
     a1 = map(a1, CALIB_MIN, CALIB_MAX, 0, 254);
     a2 = map(a2, CALIB_MIN, CALIB_MAX, 0, 254);
     Serial.print(" -> "); Serial.println(a1);
     Serial.print(" -> "); Serial.println(a2);
     EEPROM.write(addr, a1);
     addr++;
     EEPROM.write(addr, a2);
     addr++;
     if (addr == 512) break;
     delay(SAMPLE_DELAY);
  }
  if (addr != 512) EEPROM.write(addr, 255);

  digitalWrite(ledPin, LOW);

  Serial.println("Done");
  delay(250);
}

(pour plus de détail : Arduino)


  • Partie électrique

Schéma général :

- Câblage des servomoteurs :

On utilisera les sorties 9, 10 et 11 de l'arduino. Brancher la borne orange ou blanche du servomoteur sur la sortie correspondante de l'arduino, la borne rouge du servomoteur sur le + et la noire ou marron sur le -.

  • Partie fabrication

- Fabriquer un socle pour le servomoteur qui fera tourner le bras sur lui-même.

On peut utiliser du carton et de la colle.

- Fixer le deuxième servomoteur sur la platine du premier.

- Fabriquer un bras qui sera fixé sur la platine du deuxième servomoteur.

On peut utiliser du carton rigide ou des pics à brochette, comme sur la vidéo.

- Fixer le troisième servomoteur sur ce bras.

- Fabriquer le dernier bras à fixer sur le dernier servomoteur.

La manipulation

/!\ Utiliser une alimentation extérieure pour l'arduino, l'alimentation par la prise USB de l'ordinateur n'étant pas suffisante.


Que voit-on ?

On obtient un bras robotisé qui enregistre d'abord les mouvements de l'utilisateur. Pour ensuite, les reproduirent automatiquement.

Explications

De manière simple

Applications : liens avec le quotidien

Robotique industrielle, exploration spatiale, opérations médicales.

Catégories

Portail des ExplorateursWikidébrouillardLéon DitFLOGPhoto mystèreJ'ai FaitPortraits
AR
CO

Pantographe Robotisé

Rechercher

Page Discussion Historique
Powered by MediaWiki
Creative Commons - Paternite Partage a l

© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique