je croyais avoir compris les interrupt mais j'ai l'impression que ça va dans tous les sens.
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, FALLING);
Serial.begin(9600);
}
void loop()
{
digitalWrite(pin, state);
delay(100);
}
void blink()
{
state = !state;
Serial.println("contact");
}
j'ai accroché un microrupteur entre le 5V et la pin2 de l'arduino
je pensais que l'interupt ne déclenchait que lorsque j'appuyais sur le µrupteur (il est câblé pour ouvrir le circuit quand on appuie dessus)
en utilisant le FALLING
ça déclenche en boucle...
je pensais que ça déclenchait qu'une fois, au changement d'état mais il semble que non.
j'ai raté un truc ou c'est normal et je suis un âne.
[vieille arduino (numérotée 485) upgradée avec un atmega168...]
ça déclenche moins mais ça déclenche 3 fois en fait.
une première fois quand on appuie sur le µrupteur, normal, c'est ce qui est attendu
puis 2 fois quand on relâche...
une idée ?
l'état de la led ne bascule pas puisque c'est un doublon mais deux serial.print sont emis !
étrange...
alors là, je dirais bien que c'est l'effet "rebond" qui est dû à la mécanique du microrupteur. Il faudra sans doute que tu le filtres en désactivant l'interruption dès qu'elle a lieu, pour la réactiver quelques ms plus tard.
d'aprés toi combient de temps mettu pour actionner le Bouton poussoir ?.
le rebond tu y a pensé ?
il te manque un petit condo sur l'entrée.
Pour moi il manque un petit condo sur l'entré ( explication la résitance sur la masse et le condo de 100nf sur le +5, biensur l'entreé du BP+5), aprés la tempo est un peut courte mes 500 a 300. http://www.olimex.com/dev/pdf/OTHER/MOD-IO-schematic.pdf regarde ici en bas il y a un BP avec le schéma qui vas bien.
Cordialement
int led = 13;
int dirPin = 5;
int stepPin= 4;
volatile int dir = LOW;
void setup()
{
pinMode(led, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
attachInterrupt(0, inverse, FALLING);
//attachInterrupt(1, inverse, FALLING);
Serial.begin(9600);
}
void loop()
{
digitalWrite(dirPin,dir);
digitalWrite(led, dir);
//
digitalWrite(stepPin, HIGH);
delayMicroseconds(100);
digitalWrite(stepPin, LOW);
delayMicroseconds(100);
}
void inverse()
{
dir = !dir;
Serial.println("contact");
}
100nf, ce sont les ptt condos maronnasses sans polarité c'est ça ?
J'ai pas de délai parce que c'est pour un moteur PàP.
les "digitalWrite(dirPin)" et "led" sont dans la boucle, je les avais mis initialement dans la fonction inverse() mais la luminosité de la led baissée lentement.
Pourquoi ? Une idée ?
Je suis désolé PowerPack, il y a bcp de fautes, je ne comprends pas le sens de tes phrases? trop de dysgraphie, trop d'ambiguïtés !
j'ai un moteur PàP avec une vis sans fin, j'ai mis des microrupteurs (DM3) à chaque bout de course. Quand le charriot pousse le contact, ça inverse le sens du moteur... c'est tout.
ça c'est la théorie.
Dans la pratique, si je comprends bien, il faut rajouter un condo à la masse + une résistance de 10k à la masse aussi... sur chaque µrupteur ?
comme dans le schéma
Les rebonds sont inévitables. Par contre tu as un moyen simple de les ignorer. C'est d'avoir 2 routines de traitements d'interruption. Une pour chacun des fins de course.
Au lieu d'avoir une fonction unique "inverse" qui fasse:
dir != dir;
ce qui fait changer la direction plusieurs fois de suite lors d'interruptions multiples
Tu fais une fonction "inter1" avec:
dir = 1;
et une fonction "inter2" avec:
dir = 0;
Comme ça même si tu appelles plusieurs fois l'interruption cela n'a pas d'incidence sur la direction.
Désole pour orthographe ces pas mont truc, je ne prend pas le temps de corriger mes faute.
Mes il y a bien des domaine dans le quel je me rattrape sans probléme.
Cordialement