Rollbars för själv balansera Robot och trappan
Lagt till några rollbars gjorda av badmintonracketar till min enkla självbalanserande robot som faller över ganska lite. Nu åtminstone kan det komma tillbaka upp för det mesta.
Jag är ledsen att jag inte skapar en verklig bygga instructable eftersom detta är verkligen en dålig ursäkt för en balanserande robot - det var mer av en testplattform för några idéer. Jag använder 60 rpm kontinuerlig servon som egentligen för långsam för att balansera själv, den enda anledningen att de fungerar är på grund av de ovanligt stora hjul. Du behöver verkligen inriktade motorer med ett par hundra rpm. Sensorn som jag använder är en VTI ASCA610 vinkelgivare accelleromter. Ovanligt nog i USA men gemensamma och billigt här i Kina.
Den enda andra delen av maskinvaran är en Arduino UNO. Programmet är supersimple! Endast två om uttalanden att kontrollera servon, som alltid på i ena eller andra, ingen PID control - detta kallas bang-bang kontroll.
Här är programmet: (sorry om formatering)
#include < servo.h >
Servo myservo1; skapa servo objekt för att styra en servo Servo myservo2; int potpin = 0; analoga pin används för att ansluta potentiometer int val; variabel att läsa värdet från den analoga pin int gyroPin = 1; int gyroVal = 0; int gyroAvg = 0; void setup() {myservo1.attach(11); / / fäster servo på stift 11 servo objekt myservo2.attach(9); / / andra hjul 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 100) 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; //if (gyroVal > (val - 10) och gyroVal < (val + 10)) {myservo1.writeMicroseconds () 1500); myservo2.writeMicroseconds(1500); } //else om (gyroVal > (val -15) och gyroVal < = (val - 10)) {myservo1.write(110); myservo2.write(0);} om (gyroVal > (0) och gyroVal < (val)) {myservo1.write(180); myservo2.write(0);} //else om (gyroVal > (val + 10) och gyroVal < = (val + 15)) {myservo1.write(0); myservo2.write(110);} else om (gyroVal > (val) och (gyroVal < 800)) {myservo1.write(0); myservo2.write(180);} Serial.Print ("pot:"); Serial.Print(val); Serial.Print ("vinkel:"); Serial.println(gyroVal); myservo.write(val); anger servo enligt skalad värde delay(10); // }