// Sketch "Animation modélisme naval" pour Arduino UNO ou Nano avec radio rc et moteur pas à pas 28BYJ-48 + driver ULN2003 // Alimentation du drver moteur: 5v dcc // Ce sketch fonctionne à la façon d'un GRAFCET avec des etapes x0 a x4 // manche au milieu, le moteur est à l'arret //manche en haut, le moteur fait 1 tour dans un sens // manche en bas, le moteur fait 1 tour en sens inverse // mettre le manche au milieu au démarrage #include <Stepper.h> #define STEPS 100 int signal= 2; // signal radio sur pin D2 int val1; // variable pour stocker la valeur signal int mini = 1000; // int maxi = 2000; // int E1; //étape 1 initiale int E2; //étape 2 int E3; //étape3 Stepper Mon_moteur(STEPS,8, 10, 9, 11); void setup() { Serial.begin(9600); // le Serial.begin sert pour l'affichage dans le moniteur série et pourra etre supprimé après débuggage pinMode(signal, INPUT); // Signal entrée pinMode(8, OUTPUT); // vers driver ULN2003 IN1 pinMode(9, OUTPUT); // vers driver ULN2003 IN2 pinMode(10, OUTPUT); // vers driver ULN2003 IN3 pinMode(11, OUTPUT); // vers driver ULN2003 IN4 E1= HIGH; //étape 1 ACTIVE E2= LOW; E3= LOW; } void sens0() // sous programme (fonction) moteur a l'arret si manche au milieu { digitalWrite(8,LOW); //pour eviter que le moteur chauffe à l'arret, attention plus de maintien du couple digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay (1000); // Ce delay doit etre gardé, mais peu etre ajusté. } void sens1() // sous programme (fonction) moteur sens arriere pour 1 tour si manche en bas { Mon_moteur.setSpeed(100); // réglage de la vitesse (max: 300) Mon_moteur.step(-8192); // 2048 pour 1 tour (Une rotation complète avec 2048 pas), à ajuster selon déplacement souhaité delay (1000); // Ce delay doit etre gardé pour que le moteur ai le temps d'ffectuer sa rotation mais peu etre ajusté. } void loop() { val1 = pulseIn(signal, HIGH); // stock la valeur du signal dans val1 val1 = map(val1, mini, maxi, 1000, 2000); val1 = constrain(val1, 1000, 2000); // pour contraindre la valeur du signal entre 1000 et 2000 // ce delay peu etre augmenté pour un affichage plus lent dans le moniteur série et supprimé après débuggage programme if ((E1 == HIGH) && (val1 > 1400) && (val1 < 1600)) // radio en route, manche au milieu { E2=HIGH; //On active l'etape 2 sens0(); // appel au sous programme (fonction) : sens0() E1=LOW; //On desactive l'etape 1 } if ((E2== HIGH) && (E1 == LOW) && (val1 > 900) && (val1 < 1100) ) { E3=HIGH; //On active l'etape 3 sens1(); // appel au sous programme (fonction) : sens2() E2=LOW; //On desactive l'etape 2 } if ((E3 == HIGH) && (E2 == LOW) && (val1 > 1400) && (val1 < 1600)) { E1=HIGH; //On active l'etape 1 sens0(); // appel au sous programme (fonction) : sens0() E3=LOW; //On desactive l'etape 3 } } |