Self Balancing gyroskop V3 med hjälp av Arduino och potten för Tilt Sensor
Nu när det balansera sig själv antar jag att jag kommer att lägga tillbaka hjulen och ta den för en snurrande.
Foto 1: visar Arduino Uno anslutning till pc och till servo och en 10 k potentiometer som mäter lutningen på gyroskop rotorn. Programmet försöker hålla rotorn nivå som i sin tur kommer att hålla gyro balansera på de två ätpinnar.
Obs: för ett gyroskop att balansera på ätpinnar av masscentrum (COM) måste vara om en centimeter ovanför rotorn - en punkt som tog mig ett tag att upptäcka.
Foto 2: visar en närbild av potentiometer ansluten till gimbal axeln av gyroskopet. Det fungerar mycket bra och är en exakt indikator av vinkeln på rotorn.
Foto 3: är en närbild av servo counter vikt mekanismen.
Foto 4: är ett universitet gyro som gav mig en idé om hur man gör mig.
Här är hela programmet:
Servo signalen förbinds till pin 9 och potten mellersta terminalen ansluts till A2. Också måste du ansluta servo makt och marken och två yttre potten stiften till 5 volt och grnd på Arduino.
Gyro motorn drivs separat för att förhindra störningar med Arduino även om det förmodligen kunde drivas av PWM av Arduino.
//******************************************************************************************************
#include
Servo servo1;
int servangle = 0; servo vinkel variabel
int potPin = 2; Välj input PIN-koden för potentiometer
int ledPin = 13. Välj den PIN-kod för LED
int val = 0; variabel för att lagra värdet kommer från sensorn
int valInc = 4;
int currAngle = 0;
int newAngle = 0;
int fördröjningstid = 0;
void myServo (int curAngle int newAngle, int angleInc, int incDelay) {
om (curAngle < newAngle) {
för (int vinkel = curAngle; vinkel < newAngle; vinkel += angleInc) {
servo1.write(Angle);
Delay(incDelay); }
}
annars om (curAngle > newAngle) {
för (int vinkel = curAngle; vinkel > newAngle; vinkel-= angleInc) {
servo1.write(Angle);
Delay(incDelay); }
}
}
void setup() {
Serial.BEGIN(9600);
pinMode (ledPin, produktionen); förklara ledPin som en utgång
servo1.attach(9);
servo1.write(90);
}
void loop() {
Val = analogRead(potPin); läsa värdet från potten sensor
Fördröjningstid = 10;
om (val > = 420 & & val < = 435) digitalWrite (ledPin, hög); Aktivera ledPin
annat digitalWrite (ledPin, låg); Inaktivera ledPin
om (val > = 420 & & val < = 435) {newAngle = 90; fördröjningstid = 40;}
annars om (val > = 300 & & val < 410) {newAngle = 50; fördröjningstid = 1000;} tvinga tillbaka ned
annars om (val > 445 & & val < 500) {newAngle = 130; fördröjningstid = 1000;} tvinga fram upp
Serial.Print(val); Serial.Print ("ang:"); Serial.println(newAngle);
om (newAngle! = currAngle) {
myServo(currAngle,newAngle,1,10);
Serial.Print(val); Serial.Print ("ang:"); Serial.println(newAngle);
currAngle = newAngle;
Delay(delayTime);
}
}
//******************************************************************************************************