Själv balansera Robot - Bang Bang kontroll
Gjorde en enkel självbalanserande robot med två servon, en tilt mätaren (VTI SCA610 chip) och Arduino Uno. Detta är annorlunda än de flesta självbalanserande robotar i att den använder bara en enda sensor (ingen gryo) och programmet är i huvudsak två om uttalanden. Om roboten lutar ett sätt, gäller full effekt på hjulen fram, om lutar åt andra hållet, omvänd hjulen. Jag använder en 10 k potentiometer SETPOINT eller normala balansen punkten. Bang bang kontroll är enkel full effekt på eller av, ingen PID eller proportionell kontroll.
Det antas allmänt att du behöver motorer på 200 rpm eller mer men mina två servon är kontinuerlig roterande och 60 rpm. Som ett resultat, hade jag gå använda onormalt stora diameter hjul för att få tillräckligt med fart för att stoppa ett fall eller hårt. Hjulen är plast fruktkorgar. Ett sätt att fuska lite om din motors är inte snabb nog eller har tillräckligt vridmoment, sätta vissa vikter under raden axel så att motorerna inte behöver arbeta så hårt.
Jag har 3s lipo driver Arduino och 4 AA batterier driver två standard storlek servon (inte mikro servon).
Ja, min bot bara saldon som det ser ut nu, men skala upp det och du har en segway - bara gå av när du vill gå i en ny riktning.
Här är koden:
#include servo.h
Servo myservo1; skapa objekt för att styra en servo servo
Servo myservo2;
int potpin = 0; analoga pin används för att ansluta potentiometern
int val; variabel att läsa värdet från det analoga stiftet
int gyroPin = 5;
int gyroVal = 0;
int gyroAvg = 0;
void setup() {myservo1.attach(11); / / tillmäter objektet servo servo på pin 9
myservo2.attach(9); andra rullar
myservo1.writeMicroseconds(1500); Delay(15); myservo2.writeMicroseconds(1500); Delay(15);
Serial.BEGIN(9600);
Serial.println ("programmet börja...");}
void loop() {
Val = analogRead(potpin); läser värdet i potentiometern (värde mellan 0 och 1023)
Val = karta (val, 0, 1023, 0, 1000); skala den att använda den med servo (värde mellan 0 och 1000)
gyroVal = analogRead(gyroPin);
gyroVal = karta (gyroVal, 0, 1023, 0, 179); skala den att använda den med servo (värde mellan 0 och 180)
gyroAvg = analogRead(gyroPin) + analogRead(gyroPin) + analogRead(gyroPin);
gyroVal = gyroAvg / 3;
om (gyroVal > (0) och gyroVal < (val)) {
myservo1.write(180); myservo2.write(0); } //both rullar framåt
annars om (gyroVal > (val) och (gyroVal < 800)) {
myservo1.write(0); myservo2.write(180); } //both rullar bakåt
Serial.Print ("pot:"); Serial.Print(val); Serial.Print ("vinkel:"); Serial.println(gyroVal);
myservo.write(val); anger servo skalad värde
Delay(10); //
}