Ahora que es sí mismo equilibrio supongo Añadir nuevamente las ruedas y toma para una vuelta.
Foto 1: muestra la Arduino Uno conectado a la pc y servo y potenciómetro 10 k que mide la inclinación del rotor del giroscopio. El programa intenta mantener el nivel de rotor que a su vez mantendrá el giro equilibrado en los dos palillos.
Nota: para que un giroscopio equilibrar en los palillos en el centro de masa (COM) debe ser sobre un centímetro por encima del rotor - un punto que me tomó un tiempo para descubrir.
Foto 2: muestra un primer plano del potenciómetro conectado al eje del cardán del giroscopio. Funciona muy bien y es un indicador preciso del ángulo del rotor.
Foto 3: es un primer plano del mecanismo de peso de contador del servo.
Foto 4: es un giróscopo de Universidad que me dio una idea de cómo hacer mía.
Aquí está el programa completo:
Señal de servo se conecta al pin 9 y el terminal medio pote está conectado al A2. También debe conectar alimentación servo y tierra y las dos clavijas del pote externo a 5 voltios y grnd en el Arduino.
El motor de giro es accionado separadamente para prevenir interferencias con el Arduino, aunque probablemente podría ser alimentado por el PWM de Arduino.
//******************************************************************************************************
#include
Servo1 servo;
int servangle = 0; variable de ángulo del servo
int potPin = 2; Seleccione la entrada de pin para el potenciómetro
int ledPin = 13; selecciona el pin para el LED
int val = 0; variable para almacenar el valor que viene desde el sensor
int valInc = 4;
int currAngle = 0;
int newAngle = 0;
int delayTime = 0;
{} void myServo (int curAngle, int newAngle, int angleInc, int incDelay)
Si (curAngle < newAngle) {}
para (ángulo int = curAngle; ángulo < newAngle; ángulo += angleInc) {}
servo1.Write(Angle);
Delay(incDelay); }
}
else if (curAngle > newAngle) {}
para (ángulo int = curAngle; ángulo > newAngle; ángulo = angleInc) {}
servo1.Write(Angle);
Delay(incDelay); }
}
}
void setup() {}
Serial.Begin(9600);
pinMode (ledPin, salida); declara el ledPin como salida
servo1.Attach(9);
servo1.Write(90);
}
void loop() {}
Val = analogRead(potPin); leer el valor del sensor de la olla
delayTime = 10;
Si (val > = 420 & & val < = 435) digitalWrite (ledPin, HIGH); Encienda el ledPin
Else digitalWrite (ledPin, LOW); Apague el ledPin
Si (val > = 420 & & val < = 435) {newAngle = 90; delayTime = 40;}
else if (val > = 300 & & val < 410) {newAngle = 50; delayTime = 1000;} fuerza de espalda hacia abajo
else if (val > 445 & & val < 500) {newAngle = 130; delayTime = 1000;} fuerza frente a
Serial.Print(Val); Serial.Print ("ang:"); Serial.println(newAngle);
Si (newAngle! = currAngle) {}
myServo(currAngle,newAngle,1,10);
Serial.Print(Val); Serial.Print ("ang:"); Serial.println(newAngle);
currAngle = newAngle;
Delay(delayTime);
}
}
//******************************************************************************************************