Toegevoegd sommige rollbars maakte van badminton rackets naar mijn eenvoudige self balancing robot die vrij een beetje omvalt. Nu kunt ten minste het terughalen omhoog het grootste deel van de tijd.
Het spijt me dat ik ben niet het creëren van een echte bouwen instructable want dit echt een zwak excuus voor een balancing robot is-het was meer een test platform voor een aantal ideeën. Ik ben met behulp van de continue servos 60 omw / m, die echt zijn te traag voor het balanceren van zelf, de enige reden dat ze werken is vanwege de ongewoon grote wielen. Je moet echt reductiemotoren met een paar honderd t/min. De sensor die ik gebruik is een VTI ASCA610 inclinometer accelleromter. Waarschijnlijk ongewoon in de USA maar gemeenschappelijke en goedkoop hier in china.
De alleen andere stuk van hardware is een Arduino UNO. Het programma is supersimple! Slechts twee als-instructies om te controleren de servo's, die altijd op in één richting of andere, geen controle van de PID - dit heet bang-bang controle.
Hier is het programma: (sorry voor opmaak)
#include < servo.h >
Servo myservo1; servo-object om te bepalen van een servo Servo myservo2; maken int potpin = 0; analoge pin gebruikt voor het aansluiten van de potentiometer int val; variabele te lezen van de waarde van de analoge pin int gyroPin = 1; int gyroVal = 0; int gyroAvg = 0; void setup {myservo1.attach(11); / / de servo op pin 11 hecht aan de servo-object myservo2.attach(9); / / andere wiel myservo1.writeMicroseconds(1500); delay(15); myservo2.writeMicroseconds(1500); delay(15); Serial.begin(9600); Serial.println ("programma beginnen...");} void loop {val = analogRead(potpin); / / leest de waarde van de potentiometer (waarde tussen 0 en 1023) val = kaart (val, 0, 1023, 0, 1000); / / schaal om het te gebruiken met de gyroVal van de servo (waarde tussen 0 en 100) = analogRead(gyroPin); //gyroVal = kaart (gyroVal, 0, 1023, 0, 179); / / schaal om het te gebruiken met de servo (waarde tussen 0 en 180) gyroAvg = analogRead(gyroPin) + analogRead(gyroPin) + analogRead(gyroPin); gyroVal = gyroAvg / 3; //if (gyroVal > (val - 10) en gyroVal < (val + 10)) {myservo1.writeMicroseconds () 1500); myservo2.writeMicroseconds(1500); } //else als (gyroVal > (val -15) en gyroVal < = (val - 10)) {myservo1.write(110); myservo2.write(0);} als (gyroVal > (0) en gyroVal < (val)) {myservo1.write(180); myservo2.write(0);} //else als (gyroVal > (val + 10) en gyroVal < = (val + 15)) {myservo1.write(0); myservo2.write(110);} else if (gyroVal > (val) en (gyroVal < 800)) {myservo1.write(0); myservo2.write(180);} Serial.Print ("pot:"); Serial.Print(val); Serial.Print ("hoek:"); Serial.println(gyroVal); myservo.write(val); stelt u de positie van de servo volgens de geschaalde waarde delay(10); // }