El receptor IR de ATTiny registra valores erráticos, pero funciona de manera consistente en Arduino Uno

1

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
}
    
pregunta bookcasey

2 respuestas

2

Es probable que su attiny funcione con el reloj interno predeterminado de 1MHz. Debido a que funciona perfectamente en su Arduino, puede comenzar cambiando la configuración de los fusibles de su pequeño AVR para que también funcione a 16MHz.

    
respondido por el Rom Ain
0

Tenía el mismo problema, pulseIn solo funciona en el pin 7 en attiny25 / 45/85.

De nitwit99 en AVRfreaks.net :

  

La solución correcta es usar el pin 7 (INT0, arduino pin 2) como entrada Rx

Porque:

  

El ATtiny85 tiene solo una interrupción externa (sin contar las interrupciones de cambio de pin). Echa un vistazo a la ficha técnica. La interrupción externa se llama INT0 (interrupción 0) y se encuentra en PORTB2, que es el pin físico 7 en el ATPTy85 de PDIP8, y el pin 2 en el IDE de Arduino.

    
respondido por el kotsklont

Lea otras preguntas en las etiquetas