Maakte een eenvoudige zelfbalancerende robot met behulp van de Arduino Uno, twee servo's en een tilt meter (VTI SCA610 chip). Dit is anders dan de meeste zelfbalancerende robots in dat het slechts een enkele sensor (geen gryo) gebruikt en het programma in wezen twee als-instructies is. Als de robot unidirectioneel leunt, toepassen op volle kracht vooruit, de wielen als leunend in de andere richting, omgekeerde de wielen. Ik gebruik een 10 k potentiometer SETPOINT of normale saldopunt in te stellen. Bang bang controle is eenvoudige volmacht in- of uitschakelen, geen PID of proportionele controle.
Over het algemeen wordt ervan uitgegaan dat u motoren van 200 rpm of meer moet, maar mijn twee servo's continu draaien en 60 rpm zijn. Dientengevolge, moest ik gebruik maken van abnormaal grote diameter wielen om genoeg snelheid om te stoppen met een val of een harde klap. De wielen zijn kunststof fruitmanden. Unidirectioneel om te bedriegen een beetje als uw motoren niet snel genoeg zijn of genoeg koppel hebben, zet sommige gewichten onder de regel van de as, zodat de motoren niet hoeft te werken zo hard.
Ik heb 3s lipo voeden van de Arduino en 4 AA batterijen voeden van twee standaard formaat servo's (niet micro servo's).
Ja, mijn bot saldi alleen huidige vorm, maar schaal die het omhoog en je een segway hebt-gewoon uitstappen wanneer u wilt gaan in een nieuwe richting.
Hier is de code:
#include servo.h
Servo myservo1; maken van servo-object om te bepalen van een servo
Servo myservo2;
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 = 5;
int gyroVal = 0;
int gyroAvg = 0;
void setup {myservo1.attach(11); / / de servo op pin 9 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 servo (waarde tussen 0 en 1000)
gyroVal = 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;
Als (gyroVal > (0) en gyroVal < (val)) {}
myservo1.write(180); myservo2.write(0); } //both wielen toekomen
anders als (gyroVal > (val) en (gyroVal < 800)) {}
myservo1.write(0); myservo2.write(180); } //both wielen achteruit
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); //
}