Arduino Powered raket styrsystemet (6 / 6 steg)
Steg 6: kod
Denna kod kanske inte fungerar, Känn dig fri att ändra det och låt mig veta hur du ändrade den. Detta är den allmän egendom./*
Denna scketch bygger på Memsic 2125 accelerometern läsa koden från http://www.arduino.cc/en/Tutorial/Memsic2125
och RCServoMotorsControlledWithAccelMeter2
baserat på den ITP exempelkod
http://ITP.NYU.edu/physcomp/Labs/servo
Dessa skisser har modifierats och omarbetats av Chris Barta.
therocketgeek.wordpress.com
Denna exempelkod är offentlig.
*/
#include < Servo.h >
Servo myservo;
CONST int xPin = 11; X utgång av accelerometern
CONST int yPin = 12. Y produktionen av accelerometern
lång lastPulse = 0; Tid i millisekunder för den sista pulsen
int refreshTime = 10; Tid som behövs mellan pulser
int minSensorValue [xPin] = {-180,-180}; det minsta värdet av accelerometern kan läsa
int maxSensorValue [yPin] = {180, 180}; det största värdet accelerometern kan läsa
int pulseWidth [xPin] [yPin] = {0, 0}; Bredd för synkpuls för servo motorer
int sensorRange [xPin] [yPin] = {maxSensorValue [0] - minSensorValue [0],
maxSensorValue [1] - minSensorValue [1]};
int jag = 0;
int fas = 0; variabel att välja servomotor till enheten
void setup()
{
myservo.attach (1, 45, 135); definiera vilken pin servon är på
myservo.attach (2, 45, 135); den minsta vinkeln
myservo.attach (3, 45, 135); som kan roteras
myservo.attach (4, 45, 135); och maximal vinkel
myservo.attach (5, 45, 135); som kan roteras
myservo.attach (6, 45, 135);
myservo.attach (7, 45, 135);
myservo.attach (8, 45, 135);
myservo.write(90); ställa in servo till mittpunkten (90 grader)
pinMode (xPin, ingång); ange x värde från accelerometer som indata
pinMode (yPin, ingång); Ange y-värde från accelerometer som indata
}
void loop()
{
variabler att läsa puls bredder:
int pulseX, pulseY;
variabler som innehåller den resulterande accelerationen
int accelerationX, accelerationY;
Läs puls från x - och y - axeln:
pulseX = pulseIn(xPin,HIGH);
pulseY = pulseIn(yPin,HIGH);
konvertera pulse bredd i acceleration
accelerationX och accelerationY är i milli-Gustafssons:
jordens gravitation är 1000 milli-Gustafssons eller 1 g.
accelerationX = ((pulseX / 10) - 500) * 8;
accelerationY = ((pulseY / 10) - 500) * 8;
puls servo igen om uppdateringen tid (20ms) har gått:
om (millis() - lastPulse > = refreshTime) {
om (accelerationX < 0) / / om raketen flyttar av x-axeln då
{
myservo.attach(1); två servon 1,3 kommer att flytta till motsätta sig rörelsen
myservo.write(135); riktningen av servo 1
myservo.attach(3); två servon vända mot varandra
myservo.write(45); så de har att flytta "motsatta" riktningar
} else om (accelerationX > 0); om raketen går
(accelerationY > 0); x, y-LED
{
myservo.attach(5); sedan servon i uppersection
myservo.write(135); (5,7) sill motverka förslaget i den riktningen
myservo.attach(7);
myservo.write(45);
}
} else om (accelerationX = 0); om det finns ingen rörelse sedan
(accelerationY = 0); hålla servon i linje med raket
{
myservo.attach(5);
myservo.write(90);
myservo.attach(7);
myservo.write(90);
}
{
om (accelerationX > 0) / / samma sak bara i den andra riktningen
{
myservo.attach(1);
myservo.write(45);
myservo.attach(3);
myservo.write(135);
} else om (accelerationX < 0);
(accelerationY < 0);
{
myservo.attach(5);
myservo.write(45);
myservo.attach(7);
myservo.write(135);
om (accelerationX = 0);
(accelerationY = 0);
{
myservo.attach(5);
myservo.write(90);
myservo.attach(7);
myservo.write(90);
}
}
om (accelerationX = 0); om det finns ingen rörelse
{
myservo.attach(1); sedan hålla servon i linje med raket
myservo.write(90);
myservo.attach(3);
myservo.write(90);
}
}
om (accelerationY < 0)
{
myservo.attach(2);
myservo.write(45);
myservo.attach(4);
myservo.write(135);
} else om (accelerationX > 0);
(accelerationY < 0);
{
myservo.attach(6);
myservo.write(135);
myservo.attach(8);
myservo.write(45);
}
{
om (accelerationX = 0);
(accelerationY = 0);
{
myservo.attach(6);
myservo.write(90);
myservo.attach(8);
myservo.write(90);
}
}
{
om (accelerationY > 0)
{
myservo.attach(2);
myservo.write(135);
myservo.attach(4);
myservo.write(45);
} else om (accelerationX < 0);
(accelerationY > 0);
{
myservo.attach(6);
myservo.write(45);
myservo.attach(135);
myservo.write(135);
}
{
om (accelerationX = 0);
(accelerationY = 0);
{
myservo.attach(6);
myservo.write(90);
myservo.attach(8);
myservo.write(90);
}
}
}
om (accelerationY = 0);
{
myservo.attach(2);
myservo.write(90);
myservo.attach(4);
myservo.write(90);
}
{
Delay(100); Detta är att upprepa fördröjningstid så servon kan fånga
}
}
Dessutom kan du gå till https://sites.google.com/site/arduinorocket/products-experiment . Det är ungefär samma sak förutom att det finns mindre försänkningar.