Faites un simple robot autonome à l’aide de deux servos, un compteur de tilt (VTI SCA610 puce) et Arduino Uno. Ceci est différent de la plupart des robots Self-balancing car il utilise uniquement un seul capteur (sans x) et le programme est essentiellement deux instructions IF. Si le robot se penche une façon, s’applique toute la puissance aux roues avant, si se pencher dans l’autre sens, inverser les roues. J’utilise un potentiomètre k 10 pour définir la valeur de consigne ou point d’équilibre normal. Bang bang contrôle est simple pleine puissance allumé ou éteint, aucun PID ou la commande proportionnelle.
On suppose généralement que vous devez moteurs de 200 tr/min ou plus, mais mes deux servos sont virage continu et 60 t/mn. En conséquence, j’ai dû utiliser les roues de diamètre anormalement grand pour obtenir assez de vitesse pour arrêter une chute ou un coup dur. Les roues sont des paniers de fruits en plastique. Une façon de tricher un peu si vos moteurs ne sont pas assez vite ou assez couple, mettre des poids au-dessous de la ligne d’essieux donc les moteurs ne doivent travailler si dur.
J’ai 3 s lipo alimenter l’Arduino et 4 piles AA, alimentant les deux servos de taille standard (pas de micro servos).
Oui, mon bot soldes uniquement dans sa version actuelle, mais l’échelle vers le haut et vous avez un segway - juste descendre quand vous voulez aller dans une direction nouvelle.
Voici le code :
#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 l’axe de l’analogique
int gyroPin = 5 ;
int gyroVal = 0 ;
int gyroAvg = 0 ;
void setup() {myservo1.attach(11); / / attache le servo sur la broche 9 à l’objet de servo
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) ; redimensionnez-la pour l’utiliser avec le servo (valeur comprise entre 0 et 1000)
gyroVal = analogRead(gyroPin) ;
gyroVal = carte (gyroVal, 0, 1023, 0, 179) ; redimensionnez-la pour l’utiliser avec le servo (valeur comprise entre 0 et 180)
gyroAvg = analogRead(gyroPin) + analogRead(gyroPin) + analogRead(gyroPin) ;
gyroVal = gyroAvg / 3 ;
Si (gyroVal > (0) et gyroVal < (val)) {}
myservo1.Write(180) ; myservo2.Write(0) ; } //both roues avant
ElseIf (gyroVal > (val) et (gyroVal < 800)) {}
myservo1.Write(0) ; myservo2.Write(180) ; } //both roues vers l’arrière
Serial.Print ("pot:") ; Serial.Print(Val) ; Serial.Print ("angle:") ; Serial.println(gyroVal) ;
myservo.Write(Val) ; définit la position du servo selon la valeur à l’échelle
Delay(10) ; //
}