Detectar la dirección de movimiento de mano y velocidad.
Puede utilizarse para controlar cualquier dispositivo... Te dejo la imaginación mágica
Se necesita:
-1 * Arduino (ONU)
-3 o 5 o... Interruptor IR (yo usé E18D80NK) (6€)
-los cables.
-3 * 1 k resistencias
-3 * LEDs.
El código:
---------------------------------------
#define sIRA 10
#define sIRB 8
#define sIRC 9
#define LED1 3
#define LED2 4
#define LED3 5
char las órdenes [3] = {'0' '0', '0'};
int indexOrder = 0;
velocidad de detección Ms
int Captspeed = 1;
largo tA;
largo tB;
tC largo;
void setup() {}
Serial.Begin (9600);
para (int i = 8; i < = 10; i ++)
pinMode (, entrada);
para (int i = 3; i < = 5; i ++)
pinMode (i, salida);
}
void loop() {}
Comando de reset después de 800 Msecond
Si (millis () % 1000 > 800)
ResetCommand();
Si tenemos 3 señales, el comando calcular
Si (tA > 0 & & tB > 0 & & tC > 0)
{
comando de int = CalculateCommand();
Si (comando < = 0)
DoCommand(command);
}
verificación de sensores
if(indexOrder > 2)
indexOrder = 0;
int vA = digitalRead(sIRA);
Si (tA == 0 & & vA == 0) tA = millis();
int vB = digitalRead(sIRB);
Si (tB == 0 & & vB == 0) tB = millis();
int vC = digitalRead(sIRC);
Si (tC == 0 & & vC == 0) tC = millis();
Comando de parada
Si (vA == 0 & & vB == 0 & & vC == 0)
{
DoCommand(0);
}
Delay(Captspeed);
}
int CalculateCommand(void)
{
Serial.Print ("tA =");
Serial.println(TA);
Serial.Print ("tB =");
Serial.println(TB);
Serial.Print ("tC =");
Serial.println(TC);
Delay(1);
Si ((tA < = tB) & & tA < = tC)
volver -3 ;// FORWRD
Si ((tB < = tC) & & tB < = tA)
volver -2 ;// izquierda
Si ((tC < = tB) & & tC < = tA)
Return -1; //RIGHT
Etc.
retorno 1;
}
void DoCommand(int command)
{
interruptor (comando)
{
caso 0: Serial.println ("parado"); delay (500); break;
caso -1: Serial.println ("Turn RIGHT"); digitalWrite(LED1,HIGH); Delay (1000); break;
caso -2: Serial.println ("gire a la izquierda"); digitalWrite(LED2,HIGH); Delay (1000); break;
caso -3: Serial.println ("ir hacia delante"); digitalWrite(LED3,HIGH); Delay (1000); break;
caso -4: Serial.println ("regresar"); Delay (1000); break;
por defecto: Serial.println ("NO comando detectado"); break;
}
ResetCommand();
}
void ResetCommand()
{
para (int i = 3; i < = 5; i ++)
{
digitalWrite (i, LOW); //ALL LEDs
}
tA = 0; //Reset tiempo A
tB = 0; //Reset tiempo B
tC = 0; //Reset tiempo C
}