Requiere de la aplicación que estoy trabajando en el uso de 2 botones, cada uno vinculará en un Arduino (como una interrupción) y control de la posición actual del motor. Tengo 6 posiciones que quiero que el motor de.
Originalmente configurar mi circuito así:
El problema con esta configuración fue cuando presionó el botón de que la interrupción era llamado varias veces e incluso alternar otros botones. ¿Por qué estaba ocurriendo? Es causada de un interruptor que despide retroalimentación. Para solucionar este problema, debe modificar su circuito alrededor de esta manera a continuación:
Lo que esto hizo fue cuando el botón estaba en (= 1) el pasador era alta y sólo a la altura. Nunca rebota alrededor como antes.
-----
El proyecto que estaba trabajando tenía el siguiente esquema (creado con PSpice 9.1 de estudiante).
La configuración de pines es la siguiente:
- PIN 2 - botón 1 (aumentar la posición de motor)
- interrupción 0
- PIN 3 - pulsador 2 (disminuye la posición de motor)
- interrupción 1
- PIN 22 - LED 1 (posición 1)
- PIN 24 - LED 2 (posición 2)
- PIN 26 - LED 3 (posición 3)
- PIN 28 - 4 LED (posición 4)
- PIN 30 - 5 LED (posición 5)
- PIN 32 - LED 6 (posición 6)
Lo que esta aplicación va hacer es inicio apagado en la posición 1 entonces como le botón 1, el LED cambiará basado en la nueva posición. Llamo a estos engranajes de posiciones. Aquí está el Arudino código... es realmente sencillo.
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;
espera larga volátil = 3000; 3 segundos
volátil last_change_time largo largo = 0;
void loop()
{
Switch(current_gear)
{
caso 1:
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 2:
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 3:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 4:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,HIGH);
digitalWrite(led5,LOW);
digitalWrite(led6,LOW);
rotura;
caso 5:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,HIGH);
digitalWrite(led6,LOW);
rotura;
caso 6:
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
digitalWrite(led6,HIGH);
rotura;
}
}
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); pin digital 2 / / hasta
attachInterrupt(1,down,RISING); pin digital 3 / / abajo
}
up() vacío
{
Serial.println ("---ir---");
Serial.Print ("hora actual -");
Serial.println(Millis());
Serial.Print ("último cambiar el tiempo -");
Serial.println((Long) last_change_time);
int diferencia = millis ()-last_change_time;
Serial.Print ("diferencia -");
Diferencia de serial.println((Long));
¿Serial.Print ("en el umbral? - ");
Si (diferencia > tiempo de espera de || last_change_time == 0)
{
Serial.println("Yes");
}
otra cosa
{
Serial.println("no");
}
Serial.Print ("engranaje anterior =");
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 ("engranaje nuevo =");
Serial.println(current_gear);
Delay(150);
}
void down()
{
Serial.println ("---ir---");
Serial.Print ("hora actual -");
Serial.println(Millis());
Serial.Print ("último cambiar el tiempo -");
Serial.println((Long) last_change_time);
int diferencia = millis ()-last_change_time;
Serial.Print ("diferencia -");
Diferencia de serial.println((Long));
¿Serial.Print ("en el umbral? - ");
if(Difference > timeout)
{
Serial.println("Yes");
}
otra cosa
{
Serial.println("no");
}
Serial.Print ("engranaje anterior =");
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 ("engranaje nuevo =");
Serial.println(current_gear);
Delay(150);
}
Ahí lo tienen, un interruptor debouncer que funcionará en cualquier caso. Este tutorial fue modificado para requisitos particulares específicamente para el Arduino! ¡ Disfrute!