L’application que je travaille sur nécessite l’utilisation de 2 boutons poussoir, chacun se lier dans un Arduino (comme une interruption) et contrôler la position actuelle du moteur. J’ai 6 positions que je veux le moteur dans.
J’ai initialement mis en place mon circuit comme suit :
Le problème avec cette configuration a été lorsque le bouton est enfoncé, que l’interruption a été appelé plusieurs fois et même basculer les autres boutons. Pourquoi était-ce qui se passe ? Elle est due à partir d’un commutateur rebondir vos commentaires. Pour résoudre ce problème, vous devez modifier votre circuit autour de cette manière ci-dessous :
Ce que ce fait était lorsque le bouton est sur (= 1) le code pin est élevée et que haut. Il rebondit jamais comme auparavant.
-----
Le projet que je travaillais sur avait le schéma suivant (créé avec PSpice Student 9.1).
La configuration est la suivante :
- BROCHE 2 - bouton poussoir 1 (augmenter la position moteur)
- interruption 0
- BROCHE 3 - bouton poussoir 2 (diminuer la position moteur)
- Interrupt 1
- BROCHE 22 - LED 1 (position 1)
- GOUPILLE de 24 - LED 2 (position 2)
- BROCHE 26 - 3 LED (position 3)
- BROCHE 28 - 4 LED (poste 4)
- BROCHE 30 - LED 5 (poste 5)
- BROCHE 32 - 6 LED (position 6)
Ce que cette application va pour faire démarrer off en position 1, puis en tant que vous appuyez sur le bouton 1, la LED va changer basé sur la nouvelle position. J’appelle ces engins en postes. Voici le Arudino code... c’est vraiment simple.
const int led6 = 32 ;
const int DEL5 = 30 ;
const int led4 = 28 ;
const int DEL3 = 26 ;
const int led2 = 24 ;
const int led1 = 22 ;
volatile unsigned int current_gear = 1 ;
volatil timeout long = 3000 ; 3 secondes
volatils long last_change_time = 0 ;
void loop()
{
Switch(current_gear)
{
cas 1 :
digitalWrite(led1,HIGH) ;
digitalWrite(led2,LOW) ;
digitalWrite(led3,LOW) ;
digitalWrite(led4,LOW) ;
digitalWrite(led5,LOW) ;
digitalWrite(led6,LOW) ;
rupture ;
cas 2 :
digitalWrite(led1,LOW) ;
digitalWrite(led2,HIGH) ;
digitalWrite(led3,LOW) ;
digitalWrite(led4,LOW) ;
digitalWrite(led5,LOW) ;
digitalWrite(led6,LOW) ;
rupture ;
cas 3 :
digitalWrite(led1,LOW) ;
digitalWrite(led2,LOW) ;
digitalWrite(led3,HIGH) ;
digitalWrite(led4,LOW) ;
digitalWrite(led5,LOW) ;
digitalWrite(led6,LOW) ;
rupture ;
cas 4 :
digitalWrite(led1,LOW) ;
digitalWrite(led2,LOW) ;
digitalWrite(led3,LOW) ;
digitalWrite(led4,HIGH) ;
digitalWrite(led5,LOW) ;
digitalWrite(led6,LOW) ;
rupture ;
cas no 5 :
digitalWrite(led1,LOW) ;
digitalWrite(led2,LOW) ;
digitalWrite(led3,LOW) ;
digitalWrite(led4,LOW) ;
digitalWrite(led5,HIGH) ;
digitalWrite(led6,LOW) ;
rupture ;
cas 6 :
digitalWrite(led1,LOW) ;
digitalWrite(led2,LOW) ;
digitalWrite(led3,LOW) ;
digitalWrite(led4,LOW) ;
digitalWrite(led5,LOW) ;
digitalWrite(led6,HIGH) ;
rupture ;
}
}
void setup()
{
Serial.Begin(9600) ;
pinMode(led1,OUTPUT) ;
pinMode(led2,OUTPUT) ;
pinMode(led3,OUTPUT) ;
pinMode(led4,OUTPUT) ;
pinMode(led5,OUTPUT) ;
pinMode(led6,OUTPUT) ;
attachInterrupt(0,up,RISING) ; la broche numérique 2 / / up
attachInterrupt(1,down,RISING) ; la broche numérique 3 / / down
}
Sub up()
{
Serial.println ("---remontant---") ;
Serial.Print ("l’heure actuelle -") ;
Serial.println(Millis()) ;
Serial.Print ("dernier changement temps -") ;
Serial.println((long) last_change_time) ;
différence d’int = millis ()-last_change_time ;
Serial.Print ("différence -") ;
Serial.println((long) différence) ;
Serial.Print ("au seuil ? - ");
Si (différence > timeout || last_change_time == 0)
{
Serial.println("Yes") ;
}
d’autre
{
Serial.println("no") ;
}
Serial.Print ("Gear précédent =") ;
Serial.println(current_gear) ;
Si ((current_gear > 0 & & ((millis()-last_change_time)>timeout)) || last_change_time == 0)
{
Si (current_gear < = 5 & & current_gear! = 6)
{
current_gear ++ ;
last_change_time = millis() ;
}
}
Serial.Print ("nouveaux engins =") ;
Serial.println(current_gear) ;
Delay(150) ;
}
Sub down()
{
Serial.println ("---GOING DOWN---") ;
Serial.Print ("l’heure actuelle -") ;
Serial.println(Millis()) ;
Serial.Print ("dernier changement temps -") ;
Serial.println((long) last_change_time) ;
différence d’int = millis ()-last_change_time ;
Serial.Print ("différence -") ;
Serial.println((long) différence) ;
Serial.Print ("au seuil ? - ");
if(difference > timeout)
{
Serial.println("Yes") ;
}
d’autre
{
Serial.println("no") ;
}
Serial.Print ("Gear précédent =") ;
Serial.println(current_gear) ;
Si (current_gear > 0 & & ((millis()-last_change_time)>timeout))
{
int tempGear = current_gear - 1 ;
Si (tempGear! = 0)
{
current_gear--;
last_change_time = millis() ;
}
}
Serial.Print ("nouveaux engins =") ;
Serial.println(current_gear) ;
Delay(150) ;
}
Là vous l’avez, un commutateur debouncer qui fonctionne dans tous les cas. Ce tutoriel a été adapté spécifiquement pour l’Arduino ! Profitez!!