De toepassing die ik ben bezig met het gebruik van 2 drukknoppen vereist, zal elk te koppelen aan een Arduino (als een interrupt) en controle van de huidige positie van de motor. Ik heb 6 posities dat ik wil de motor in.
Ik oorspronkelijk het opzetten van mijn circuit als volgt:
Het probleem met deze setup was toen de knop werd ingedrukt dat de interrupt was wordt genoemd meerdere keren en zelfs knevel voorzien van andere knoppen. Waarom is dit gebeurd? Het wordt veroorzaakt uit een switch stuiteren van feedback. Om dit te verhelpen, moet u het wijzigen van uw circuit rondom deze manier hieronder:
Wat dit deed was toen de drukknop op (= 1) de pin was hoog en alleen hoge. Het stuitert nooit rond als vroeger.
-----
Het project dat ik bezig was had het volgende schema (gemaakt met PSpice Student 9.1).
De pin-configuratie is als volgt:
- PIN 2 - drukknop 1 (toename motor positie)
- Interrupt 0
- PIN 3 - drukknop 2 (verkleinen motor positie)
- Interrupt 1
- PIN 22 - LED 1 (positie 1)
- PIN 24 - LED 2 (positie 2)
- PIN 26 - LED 3 (standpunt 3)
- PIN 28 - LED 4 (standpunt 4)
- PIN 30 - LED 5 (positie 5)
- PIN 32 - LED 6 (positie 6)
Wat deze toepassing gaat hiervoor uitstaat start in positie 1 vervolgens als u drukknop 1, de LED zal veranderen gebaseerd op de nieuwe positie. Ik roep deze posities tandwielen. Hier is de Arudino code... het is werkelijk ongecompliceerd.
Const int led6 = 32;
Const int led5 = 30;
Const int led4 = 28;
Const int led3 = 26;
Const int led2 = 24;
Const int led1 = 22;
volatile unsigned int current_gear = 1;
vluchtige lange timeout = 3000; 3 seconden
vluchtige lange last_change_time = 0;
void loop
{
switch(current_gear)
{
Case 1:
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
breken;
Case 2:
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
breken;
Case 3:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
breken;
Case 4:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,HIGH);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
breken;
Case 5:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,HIGH);
digitalWrite(led6,LOW);
breken;
Case 6:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,HIGH);
breken;
}
}
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); digitale pin 2 / / omhoog
attachInterrupt(1,down,RISING); digitale pen 3 / / omlaag
}
VOID up()
{
Serial.println ("---omhoog---");
Serial.Print ("huidige tijd -");
Serial.println(Millis());
Serial.Print ("laatste wijziging tijd -");
Serial.println((Long) last_change_time);
int verschil = millis ()-last_change_time;
Serial.Print ("Difference -");
Serial.println((Long) verschil);
Serial.Print ("binnen drempel? - ");
Als (verschil > timeout || last_change_time == 0)
{
Serial.println("Yes");
}
anders
{
Serial.println("no");
}
Serial.Print ("vorige versnelling =");
Serial.println(current_gear);
Als ((current_gear > 0 & & ((millis()-last_change_time)>timeout)) || last_change_time == 0)
{
Als (current_gear < = 5 & & current_gear! = 6)
{
current_gear ++;
last_change_time = millis();
}
}
Serial.Print ("nieuwe Gear =");
Serial.println(current_gear);
delay(150);
}
VOID down()
{
Serial.println ("---naar beneden---");
Serial.Print ("huidige tijd -");
Serial.println(Millis());
Serial.Print ("laatste wijziging tijd -");
Serial.println((Long) last_change_time);
int verschil = millis ()-last_change_time;
Serial.Print ("Difference -");
Serial.println((Long) verschil);
Serial.Print ("binnen drempel? - ");
if(difference > timeout)
{
Serial.println("Yes");
}
anders
{
Serial.println("no");
}
Serial.Print ("vorige versnelling =");
Serial.println(current_gear);
Als (current_gear > 0 & & ((millis()-last_change_time)>timeout))
{
int tempGear = current_gear - 1;
Als (tempGear! = 0)
{
current_gear--;
last_change_time = millis();
}
}
Serial.Print ("nieuwe Gear =");
Serial.println(current_gear);
delay(150);
}
Daar heb je het, een schakelaar debouncer dat in ieder geval zal werken. Deze tutorial was aangepast speciaal voor de Arduino! Geniet van!