// 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
}
}
|