Étape 6: Code
Ce code ne pourrait pas travailler, n’hésitez pas à le changer et de me faire savoir comment vous l’avez changé. Il s’agit du domaine du public./*
Ce scketch est basé sur l’accéléromètre Memsic 2125 lire le code de http://www.arduino.cc/en/Tutorial/Memsic2125
et le RCServoMotorsControlledWithAccelMeter2
basé sur le code échantillon de l’ITP
http://ITP.nyu.edu/physcomp/Labs/servo
Ces croquis ont été modifiés et retravaillés par Chris Barta.
therocketgeek.wordpress.com
Cet exemple de code est dans le domaine public.
*/
#include < Servo.h >
Servo myservo ;
const int XPSous = 11 ; X sortie de l’accéléromètre
const int yPin = 12 ; Sortie Y de l’accéléromètre
long lastPulse = 0 ; Temps en millisecondes de la dernière impulsion
int refreshTime = 10 ; Temps nécessaire entre impulsions
int minSensorValue [XPSous] = {-180, -180} ; la valeur moins l’accéléromètre peut lire
int maxSensorValue [yPin] = {180, 180} ; la plus grande valeur que l’accéléromètre peut lire
int pulseWidth [XPSous] [yPin] = {0, 0} ; Largeur d’impulsion pour les moteurs servo
int sensorRange [XPSous] [yPin] = {maxSensorValue [0] - minSensorValue [0],
maxSensorValue [1] - minSensorValue [1]} ;
int i = 0 ;
phase d’int = 0 ; variable pour sélectionner le moteur servo drive
void setup()
{
myservo.Attach (1, 45, 135) ; définir quelle broche les servos sont sur
myservo.Attach (2, 45, 135) ; l’angle minimal
myservo.Attach (3, 45, 135) ; qui peut être tourné
myservo.Attach (4, 45, 135) ; et l’angle maximal
myservo.Attach (5, 45, 135) ; qui peut être tourné
myservo.Attach (6, 45, 135) ;
myservo.Attach (7, 45, 135) ;
myservo.Attach (8, 45, 135) ;
myservo.Write(90) ; Set servo à mi-ouverture (90 degrés)
pinMode (xPin, entrée) ; Set x valeur de l’accéléromètre comme intrant
pinMode (yPin, entrée) ; la valeur y de l’accéléromètre comme intrant
}
void loop()
{
variables pour lire les largeurs d’impulsion :
int pulseX, pulseY ;
variables pour contenir les accélérations qui en résulte
int accelerationX, accelerationY ;
lu impulsion de x - axes et y :
pulseX = pulseIn(xPin,HIGH) ;
pulseY = pulseIn(yPin,HIGH) ;
convertir la largeur d’impulsion en accélération
accelerationX et accelerationY sont en milli-g ' s :
la gravité terrestre est 1000 milli-g ' s, soit 1 gramme.
accelerationX = ((pulseX / 10) - 500) * 8 ;
accelerationY = ((pulseY / 10) - 500) * 8 ;
le servo d’impulsion à nouveau si la mise à jour le temps (20ms) se sont écoulés :
Si (millis() - lastPulse > = refreshTime) {}
Si (accelerationX < 0) / / si la fusée quitte ensuite l’axe des abscisses
{
myservo.Attach(1) ; les deux servos 1,3 seront déplacera pour s’opposer à la circulation
myservo.Write(135) ; le sens de servo 1
myservo.Attach(3) ; les deux servos sont face à face
myservo.Write(45) ; donc ils doivent déplacer « opposées »
} else if (accelerationX > 0) ; Si la fusée va dans
(accelerationY > 0) ; le x, axe y
{
myservo.Attach(5) ; puis les servos dans l’uppersection
myservo.Write(135) ; seuil (5,7) contrecarrer le mouvement dans cette direction
myservo.Attach(7) ;
myservo.Write(45) ;
}
} else if (accelerationX = 0) ; s’il n’y a aucun mouvement puis
(accelerationY = 0) ; garder les servos alignées avec la fusée
{
myservo.Attach(5) ;
myservo.Write(90) ;
myservo.Attach(7) ;
myservo.Write(90) ;
}
{
Si (accelerationX > 0) / / la même chose que dans l’autre sens
{
myservo.Attach(1) ;
myservo.Write(45) ;
myservo.Attach(3) ;
myservo.Write(135) ;
} ElseIf (accelerationX < 0) ;
(accelerationY < 0) ;
{
myservo.Attach(5) ;
myservo.Write(45) ;
myservo.Attach(7) ;
myservo.Write(135) ;
Si (accelerationX = 0) ;
(accelerationY = 0) ;
{
myservo.Attach(5) ;
myservo.Write(90) ;
myservo.Attach(7) ;
myservo.Write(90) ;
}
}
Si (accelerationX = 0) ; s’il n’y a pas de mouvement
{
myservo.Attach(1) ; alors gardez les servos alignées avec la fusée
myservo.Write(90) ;
myservo.Attach(3) ;
myservo.Write(90) ;
}
}
Si (accelerationY < 0)
{
myservo.Attach(2) ;
myservo.Write(45) ;
myservo.Attach(4) ;
myservo.Write(135) ;
} else if (accelerationX > 0) ;
(accelerationY < 0) ;
{
myservo.Attach(6) ;
myservo.Write(135) ;
myservo.Attach(8) ;
myservo.Write(45) ;
}
{
Si (accelerationX = 0) ;
(accelerationY = 0) ;
{
myservo.Attach(6) ;
myservo.Write(90) ;
myservo.Attach(8) ;
myservo.Write(90) ;
}
}
{
Si (accelerationY > 0)
{
myservo.Attach(2) ;
myservo.Write(135) ;
myservo.Attach(4) ;
myservo.Write(45) ;
} ElseIf (accelerationX < 0) ;
(accelerationY > 0) ;
{
myservo.Attach(6) ;
myservo.Write(45) ;
myservo.Attach(135) ;
myservo.Write(135) ;
}
{
Si (accelerationX = 0) ;
(accelerationY = 0) ;
{
myservo.Attach(6) ;
myservo.Write(90) ;
myservo.Attach(8) ;
myservo.Write(90) ;
}
}
}
Si (accelerationY = 0) ;
{
myservo.Attach(2) ;
myservo.Write(90) ;
myservo.Attach(4) ;
myservo.Write(90) ;
}
{
Delay(100) ; Il s’agit de répéter de temps de retard pour les servos peuvent rattraper
}
}
En outre, vous pouvez aller à https://sites.google.com/site/arduinorocket/products-experiment . C’est quasiment la même chose, sauf qu’il y a des indentations.