Nu dat het is balanceren zelf denk ik dat ik zal toevoegen terug de wielen en neem het voor een rotatie.
Foto 1: toont de Arduino Uno verbonden aan pc en servo en een 10 k potentiometer die meet de schuine stand van de gyroscoop rotor. Het programma probeert te houden van de rotor-niveau die op hun beurt houden de gyro balanceren op de twee stokjes.
Opmerking: voor een gyroscoop om het evenwicht op de stokjes van het massamiddelpunt (COM) moet over een centimeter boven de rotor - een punt dat kostte me een tijdje om te ontdekken.
Foto 2: toont een close-up van de potentiometer met de as van de gimbal van de gyroscoop verbonden. Het werkt erg goed en is een nauwkeurige indicator van de hoek van de rotor.
Foto 3: is een close-up van het mechanisme voor het gewicht van de servo teller.
Foto 4: is een universiteit gyro die gaf me een idee van hoe maak je mij.
Hier is het volledige programma:
Servo-signaal is aangesloten op pin 9 en de middelste pot-terminal is aangesloten op de A2. Ook moet u servo macht en grond en de twee buitenste pot pinnen verbinden met 5 volt en grnd op de Arduino.
De gyro is gemotoriseerde afzonderlijk om te voorkomen dat interferentie met de Arduino, hoewel het waarschijnlijk zou worden aangedreven door de PWM van de Arduino.
//******************************************************************************************************
#include
Servo servo1;
int servangle = 0; Servo hoek variabele
int potPin = 2; Selecteer de invoer pin voor de potmeter
int ledPin = 13; Selecteer de pin voor de LED
int val = 0; variabele de waarde afkomstig van de sensor opslaan
int valInc = 4;
int currAngle = 0;
int newAngle = 0;
int delayTime = 0;
VOID myServo (int curAngle, int newAngle, int angleInc, int incDelay) {}
Als (curAngle < newAngle) {}
voor (int hoek = curAngle; hoek < newAngle; hoek += angleInc) {}
servo1.write(Angle);
delay(incDelay); }
}
anders als (curAngle > newAngle) {}
voor (int hoek = curAngle; hoek > newAngle; hoek-= angleInc) {}
servo1.write(Angle);
delay(incDelay); }
}
}
VOID Setup {}
Serial.begin(9600);
pinMode (ledPin, OUTPUT); de ledPin verklaren als uitgang
servo1.attach(9);
servo1.write(90);
}
void loop {}
Val = analogRead(potPin); luiden naar de waarde van de pot-sensor
delayTime = 10;
Als (val > = 420 & & val < = 435) digitalWrite (ledPin, hoge); de ledPin inschakelen
anders digitalWrite (ledPin, laag); de ledPin uitschakelen
Als (val > = 420 & & val < = 435) {newAngle = 90; delayTime = 40;}
anders als (val > = 300 & & val < 410) {newAngle = 50; delayTime = 1000;} terug naar beneden te dwingen
anders als (val > 445 & & val < 500) {newAngle = 130; delayTime = 1000;} dwingen voorzijde omhoog
Serial.Print(val); Serial.Print ("ang:"); Serial.println(newAngle);
Als (newAngle! = currAngle) {}
myServo(currAngle,newAngle,1,10);
Serial.Print(val); Serial.Print ("ang:"); Serial.println(newAngle);
currAngle = newAngle;
delay(delayTime);
}
}
//******************************************************************************************************