Hecho un simple robot uno mismo-equilibrio con dos servos, un medidor de inclinación (VTI SCA610 chip) y Arduino Uno. Esto es diferente de la mayoría uno mismo-equilibrio robots que utiliza solamente un solo sensor (no gryo) y el programa es esencialmente dos instrucciones IF. Si el robot se inclina una forma, caso de plena potencia a las ruedas, que se inclinan en la dirección contraria, inversa las ruedas. Yo uso potenciómetro 10 k para establecer el valor deseado o punto de equilibrio normal. Bang bang control es simple completo encendido o apagado, no PID o control proporcional.
Generalmente se asume que necesita motores de 200 rpm o más, pero mis dos servos son torneado continuo y 60 rpm. Como resultado, tuve que usar ruedas de diámetro anormalmente grande para tener suficiente velocidad para detener una caída o un golpe duro. Las ruedas son cestas de plástico de la fruta. Una forma de engañar un poco si sus motores no son lo suficientemente rápidos o tienen suficiente esfuerzo de torsión, poner unos pesos debajo de la línea de eje para que los motores no tienen que trabajar tan duro.
Tengo 3s lipo alimentar el Arduino y 4 pilas AA encender dos servos de tamaño estándar (no micro servos).
Sí, mi bot sólo equilibra la forma actual, pero la escala para arriba y usted tiene un segway - a bajar cuando quieres ir en una nueva dirección.
Aquí está el código:
servo.h #include
Servo myservo1; crear objeto servo para controlar un servo
Servo myservo2;
int potpin = 0; pin analógico utilizado para conectar el potenciómetro
int val; variable para leer el valor del pin analógico
int gyroPin = 5;
int gyroVal = 0;
int gyroAvg = 0;
void setup() {myservo1.attach(11); / / conecta el servo en el pin 9 al objeto servo
myservo2.Attach(9); otra rueda
myservo1.writeMicroseconds(1500); Delay(15); myservo2.writeMicroseconds(1500); Delay(15);
Serial.Begin(9600);
Serial.println ("programa comenzar...");}
void loop() {}
Val = analogRead(potpin); Lee el valor del potenciómetro (valor entre 0 y 1023)
Val = mapa (val, 0, 1023, 0, 1000); la escala a utilizar con el servo (valor entre 0 y 1000)
gyroVal = analogRead(gyroPin);
gyroVal = mapa (gyroVal, 0, 1023, 0, 179); la escala a utilizar con el servo (valor entre 0 y 180)
gyroAvg = analogRead(gyroPin) + analogRead(gyroPin) + analogRead(gyroPin);
gyroVal = gyroAvg / 3;
Si (gyroVal > (0) y gyroVal < (val)) {}
myservo1.Write(180); myservo2.Write(0); } //both ruedas adelante
else if (gyroVal > (val) y (gyroVal < 800)) {}
myservo1.Write(0); myservo2.Write(180); } //both de las ruedas hacia atrás
Serial.Print ("pote:"); Serial.Print(Val); Serial.Print ("ángulo:"); Serial.println(gyroVal);
myservo.Write(Val); ajusta la posición del servo según el valor de escala
Delay(10); //
}