Sommaire |
Reproduction de mouvements
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)
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 -.
- 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.
/!\ Utiliser une alimentation extérieure pour l'arduino, l'alimentation par la prise USB de l'ordinateur n'étant pas suffisante.
On obtient un bras robotisé qui enregistre d'abord les mouvements de l'utilisateur. Pour ensuite, les reproduirent automatiquement.
Robotique industrielle, exploration spatiale, opérations médicales.
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique