Hinzugefügt einige Rollbars aus Badmintonschläger gefertigt, um mich einfach selbst balancieren Roboter, die schon ein bisschen umfällt. Jetzt mindestens es wieder die meiste Zeit aufstehen kann.
Tut mir leid, dass ich keinen echte Build instructable schaffe, weil das ist wirklich eine schlechte Ausrede für einen ausgleichenden Roboter - es eher eine Testplattform für einige Ideen war. Ich verwende 60 u/min kontinuierliche Servos, die wirklich zu langsam für Self balancing, der einzige Grund, sie arbeiten, ist wegen der ungewöhnlich großen Räder. Man braucht wirklich Getriebemotoren mit ein paar hundert Umdrehungen pro Minute. Der Sensor, die, den ich benutze, ist ein VTI ASCA610 Neigungsmesser Accelleromter. Wahrscheinlich ungewöhnlich in den USA aber verbreitet und billig hier in China.
Das einzige Stück Hardware ist ein Arduino UNO. Das Programm ist supersimple! Nur zwei IF-Anweisungen, die Servos zu steuern, die immer auf eine oder die andere Richtung sind, keine PID-Regelung - das nennt man Knall-Knall-Kontrolle.
Hier ist das Programm: (sorry über Formatierung)
#include < servo.h >
Servo myservo1; Erstellen Sie Servo-Objekt um ein Servo Servo myservo2 Steuern; Int Potpin = 0; analogen Stift zur Verbindung der Potentiometer Int Val; Variable den Wert aus der analogen Pin Int GyroPin zu lesen = 1; Int GyroVal = 0; Int GyroAvg = 0; void setup() {myservo1.attach(11); / / legt das Servo auf Pin 11 auf die Servo-Objekt myservo2.attach(9); / / andere Rad-myservo1.writeMicroseconds(1500); delay(15); myservo2.writeMicroseconds(1500); delay(15); Serial.Begin(9600); Serial.println ("Programm beginnen...");} void loop() {Val = analogRead(potpin); / / liest den Wert des Potentiometers (Wert zwischen 0 und 1023) Val = Karte (Val, 0, 1023, 0, 1000); / / skalieren mit der Servo (Wert zwischen 0 und 100) GyroVal verwenden = analogRead(gyroPin); //gyroVal = Karte (GyroVal, 0, 1023, 0, 179); / / skalieren mit der Servo (Wert zwischen 0 und 180) GyroAvg verwenden = analogRead(gyroPin) + analogRead(gyroPin) + analogRead(gyroPin); GyroVal = GyroAvg / 3; //if (GyroVal > (Val - 10) und GyroVal < (Val + 10)) {myservo1.writeMicroseconds () (1500); myservo2.writeMicroseconds(1500); } //else wenn (GyroVal > (Val -15) und GyroVal < = (Val - 10)) {myservo1.write(110); myservo2.write(0);} wenn (GyroVal > (0) und GyroVal < (Val)) {myservo1.write(180); myservo2.write(0);} //else wenn (GyroVal > (Val + 10) und GyroVal < = (Val + 15)) {myservo1.write(0); myservo2.write(110);} else If (GyroVal > (Val) und (GyroVal < 800)) {myservo1.write(0); myservo2.write(180);} Serial.Print ("Pot:"); Serial.Print(Val); Serial.Print ("Winkel:"); Serial.println(gyroVal); myservo.Write(Val); die Servoposition entsprechend skalierten Wert delay(10) festgelegt; // }