Estoy haciendo un receptor IR ATTiny85 programado con un Arduino Uno.
Estoy usando una versión modificada de este código (porque las otras bibliotecas IR I encontrados no eran compatibles).
Está funcionando ... más o menos. Responderá a cualquier cosa desde mi control remoto universal, pero me gustaría que solo responda a un botón.
Tengo el sensor de IR conectado a 5V, tierra y el pin 1 de ATTiny (literalmente 6), y un LED con condensador a 4 (literalmente 3) y tierra. 99% por ciento seguro de que no es un problema con los componentes.
Si ejecuto el código con los mismos sensores en mi Arduino Uno, funciona de manera impecable y consistente. El key
impreso en serie cuando presiono el botón de encendido, por ejemplo, siempre es 2704
.
Con el ATTiny85, obtengo valores en todo el lugar. Del 0 a los miles. Presioné el botón de encendido dos docenas de veces y obtuve 2704
una vez.
Así que la variable aquí es el chip.
Tengo una corazonada que tiene que ver con que ATTiny no puede medir los tiempos entre los pulsos con precisión, pero realmente no sé cómo solucionarlo (¿calibración? ¿Un mejor cristal externo?) y me gustaría recibir información antes Ordeno y luego me siento a la espera de más componentes.
Parece posible, porque esta persona construyó un robot que se controla con el D-pad en un control remoto, pero no publicaron su código, esquema ni explicaron cómo lo hicieron con mucho detalle. Otras personas han preguntado.
Muchas gracias!
También, aquí está mi código:
int ir_pin = 1; //Sensor pin 1 wired through a 220 ohm resistor
int led_pin = 4; //"Ready to Receive" flag, not needed but nice
int start_bit = 2000; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)
int led_state = HIGH;
void setup() {
pinMode(led_pin, OUTPUT); //This shows when we're ready to receive
pinMode(ir_pin, INPUT);
digitalWrite(led_pin, led_state);
Serial.begin(9600);
}
void loop() {
int key = getIRKey(); //Fetch the key
if ( key != -1) {
Serial.println(key);
//if (key == 2704) {
led_state = !led_state;
digitalWrite(led_pin, led_state);
delay(1000);
//}
}
}
int getIRKey() {
int data[12];
while(pulseIn(ir_pin, LOW) < 2200) { //Wait for a start bit
}
data[0] = pulseIn(ir_pin, LOW); //Start measuring bits, I only want low pulses
data[1] = pulseIn(ir_pin, LOW);
data[2] = pulseIn(ir_pin, LOW);
data[3] = pulseIn(ir_pin, LOW);
data[4] = pulseIn(ir_pin, LOW);
data[5] = pulseIn(ir_pin, LOW);
data[6] = pulseIn(ir_pin, LOW);
data[7] = pulseIn(ir_pin, LOW);
data[8] = pulseIn(ir_pin, LOW);
data[9] = pulseIn(ir_pin, LOW);
data[10] = pulseIn(ir_pin, LOW);
data[11] = pulseIn(ir_pin, LOW);
for(int i=0;i<=11;i++) { //Parse them
if(data[i] > bin_1) { //is it a 1?
data[i] = 1;
} else {
if(data[i] > bin_0) { //is it a 0?
data[i] = 0;
} else {
data[i] = 2; //Flag the data as invalid; I don't know what it is!
}
}
}
for(int i=0;i<=11;i++) { //Pre-check data for errors
if(data[i] > 1) {
return -1; //Return -1 on invalid data
}
}
int result = 0;
int seed = 1;
for(int i=11;i>=0;i--) { //Convert bits to integer
if(data[i] == 1) {
result += seed;
}
seed = seed * 2;
}
return result; //Return key number
}