Ajouté quelques arceaux faits de raquettes de badminton à mon robot qui tombe sur pas mal d’équilibrage d’individu simple. Maintenant, au moins il peut se relever la plupart du temps.
Je suis désolé que je ne suis pas création d’une véritable version instructable parce que c’est vraiment une mauvaise excuse pour un équilibrage robot - il s’agissait davantage d’une plate-forme de test pour quelques idées. J’utilise des servos continu 60 t/mn qui sont vraiment trop lent pour l’équilibrage automatique, la seule raison pour laquelle ils travaillent est en raison des inhabituellement grandes roues. Vous avez vraiment besoin de motoréducteurs avec quelques centaines tr/min. Le capteur que j’utilise est un VTI ASCA610 inclinomètre accelleromter. Sans doute inhabituelle aux Etats-Unis mais ici commun et bon marché en Chine.
L’autre morceau de matériel est un Arduino UNO. Le programme est supersimple ! Seulement deux instructions IF pour commander les servos, qui sont toujours dans un sens ou dans l’autre, aucun contrôle PID - c’est qu’on appelle contrôle de bang-bang.
Voici le programme: (Désolé pour la mise en forme)
#include < servo.h >
Servo myservo1 ; Créez l’objet servo pour contrôler un servo Servo myservo2 ; int potpin = 0 ; broche analogique utilisé pour connecter le potentiomètre int val ; variable pour lire la valeur de la broche analogique int gyroPin = 1 ; int gyroVal = 0 ; int gyroAvg = 0 ; void setup() {myservo1.attach(11); / / s’adapte sur le servo sur la broche 11 du servo objet myservo2.attach(9); / / autre roue myservo1.writeMicroseconds(1500) ; delay(15) ; myservo2.writeMicroseconds(1500) ; delay(15) ; Serial.Begin(9600) ; Serial.println ("programme commencer...");} void loop() {val = analogRead(potpin); / / lit la valeur du potentiomètre (valeur comprise entre 0 et 1023) val = carte (val, 0, 1023, 0, 1000); / / échelle à utiliser avec le servo (valeur comprise entre 0 et 100) gyroVal = analogRead(gyroPin) ; //gyroVal = carte (gyroVal, 0, 1023, 0, 179); / / échelle à utiliser avec le gyroAvg de servo (valeur comprise entre 0 et 180) = analogRead(gyroPin) + analogRead(gyroPin) + analogRead(gyroPin) ; gyroVal = gyroAvg / 3; //if (gyroVal > (val - 10) et gyroVal < (val + 10)) {myservo1.writeMicroseconds () 1500) ; myservo2.writeMicroseconds(1500) ; } //else si (gyroVal > (val -15) et gyroVal < = (val - 10)) {myservo1.write(110) ; myservo2.write(0);} si (gyroVal > (0) et gyroVal < (val)) {myservo1.write(180) ; myservo2.write(0);} //else si (gyroVal > (val + 10) et gyroVal < = (val + 15)) {myservo1.write(0) ; myservo2.write(110);} else if (gyroVal > (val) et (gyroVal < 800)) {myservo1.write(0) ; myservo2.write(180);} Serial.Print ("pot:") ; Serial.Print(Val) ; Serial.Print ("angle:") ; Serial.println(gyroVal) ; myservo.Write(Val) ; définit la position du servo selon l’échelle de valeur delay(10) ; // }