Je sais de faire fonctionner une porte automatique type supermarché. J'utilise un moteur DC pour l'ouverture et fermeture de mes portes.
Jusque là aucun problème mon code et mon moteur tourne mais j'ai mis une tempo pour contrôler la fermeture et l'ouverture des portes.
J'aimerai maintenant contrôler la position de mes portes avec un codeur. Le codeur est déjà implanté sur le moteur. Mon nombre de pulse est de 500/tr.
Sur mon encoder j'aimerai juste récupéré une voie avec mes pulses donc pour calculer la vitesse de mon moteur. J'ai testé dans un premier temps le codeur sur un oscilloscope, les résultats étaient conformes à mes attentes.
Mais lorsque que je run mon code il ne détecte pas mes pulses. Mon code comporte juste un compteur qui s'incrémente à chaque HIGH et après un certains nombre de pulse devrait s’arrêter.
Je cherche des idées car j'ai regardé les différentes documentations sur les encodeurs mais les codes sont bien plus complexe que celui dont j'ai besoin.
Mais lorsque que je run mon code il ne détecte pas mes pulses. Mon code comporte juste un compteur qui s'incrémente à chaque HIGH et après un certains nombre de pulse devrait s’arrêter.
Pour comprendre pourquoi les pulses ne sont pas prises en compte le schéma de la liaison capteur-Arduino et le code seraient utiles.
C'est un codeur incrémentale avec 2 sorties en quadrature. J'alimente mon codeur avec un +5V pris sur l'arduino mais ca n'a aucune importance. Et je récupère une voie que je branche directement en entrée de mon arduino PIN PWM. Mon oscilloscope me montre parfaitement les pulses.
Au niveau du code :
#define PIR 6 #define encoder 10
int pulse = 0;
int detection = 0;
int pinI1=8;//define I1 port
int pinI2=9;//define I2 port
int speedpin=11;//define EA(PWM speed regulation)port
int count=0;
void setup()
{
pinMode(PIR, INPUT);
pinMode(pinI1,OUTPUT);//define this port as output
pinMode(pinI2,OUTPUT);
pinMode(speedpin,OUTPUT);
}
void loop()
{
detection=digitalRead(PIR);
pulse=digitalRead(encoder);
do
{
if(pulse==HIGH)
{
count++;
}
}
while (count>10);
{
analogWrite(speedpin,100);//input a value to set the speed
delay(100);
digitalWrite(pinI1,LOW);// DC motor rotates clockwise
digitalWrite(pinI2,HIGH);
detection=digitalRead(PIR);
}
}
Lorsque je change ma condition while avec count=0 mon moteur ne tourne pas. Ce qui est plutot logique.
Bonjour
Une solution éprouvée pour le comptage d'impulsion se trouve içi :
'Interruptions' fortement conseillées voire indispensables pour compter des évènements externes survenant n'importe quand par rapport à boucle loop() ....