Añadido algunos arcos hacen de raquetas de bádminton para mi simple self balancing robot que cae muy poco. Ahora al menos puede volver la mayor parte del tiempo.
Siento que estoy no creando una real acumulación instructable porque esto realmente es una pobre excusa para un robot de equilibrio - era más de una plataforma de prueba para algunas ideas. Estoy utilizando servos continua 60 rpm, que en realidad son la única razón que trabajan demasiado lento para autoequilibrarse, es debido a las inusualmente grandes ruedas. Usted realmente necesita motorreductores con un par cientos rpm. El sensor que estoy usando es un VTI ASCA610 inclinómetro accelleromter. Probablemente inusual en Estados Unidos pero común y barato aquí en china.
La otra pieza de hardware es un Arduino UNO. El programa es supersimple! Sólo dos declaraciones de IF para controlar los servos, que están siempre en un sentido u otro, sin control de PID - esto se llama control bang-bang.
Este es el programa: (perdón por el formato)
#include < servo.h >
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 = 1; int gyroVal = 0; int gyroAvg = 0; void setup() {myservo1.attach(11); / / conecta el servo en el pin 11 al servo objeto myservo2.attach(9); / / otros de la 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); / / escala que utilice con el gyroVal servo (valor entre 0 y 100) = analogRead(gyroPin); //gyroVal = mapa (gyroVal, 0, 1023, 0, 179); / / escala que utilice con el gyroAvg servo (valor entre 0 y 180) = analogRead(gyroPin) + analogRead(gyroPin) + analogRead(gyroPin); gyroVal = gyroAvg / 3; //if (gyroVal > (val - 10) y gyroVal < (val + 10)) {myservo1.writeMicroseconds () 1500); myservo2.writeMicroseconds(1500); } //else si (gyroVal > (val -15) y gyroVal < = (val - 10)) {myservo1.write(110); myservo2.write(0);} si (gyroVal > (0) y gyroVal < (val)) {myservo1.write(180); myservo2.write(0);} //else si (gyroVal > (val + 10) y gyroVal < = (val + 15)) {myservo1.write(0); myservo2.write(110);} else if (gyroVal > (val) y (gyroVal < 800)) {myservo1.write(0); myservo2.write(180);} Serial.Print ("pote:"); Serial.Print(Val); Serial.Print ("ángulo:"); Serial.println(gyroVal); myservo.Write(Val); ajusta la posición del servo según la escala de valor delay(10); // }