Enviar códigos IR con ATtyny85

Buenas a todos.

Estoy intentando enviar un código por IR con un ATtiny85 con unos sencillos códigos de ejemplo. El problema es que si subo el código del emisor a un arduino Mega, recibo el código perfectamente. Mientras que desde el ATiny85 recibo códigos diferentes en cada transmisión. No sé si he de tener en consideración algunos aspectos al programar para el ATtiny…

Esto es lo que devuelve las emisiones del MEGA:

(32 bits)Decoded RC6: FFA857 (HEX) , 111111111010100001010111 (BIN)
(32 bits)Decoded RC6: FFA857 (HEX) , 111111111010100001010111 (BIN)
(32 bits)Decoded RC6: FFA857 (HEX) , 111111111010100001010111 (BIN)
(32 bits)Decoded RC6: FFA857 (HEX) , 111111111010100001010111 (BIN)

Y estos son los valores obtenidos enviados desde el ATtinny85:

(0 bits)FFFFFFFF (HEX) , 11111111111111111111111111111111 (BIN)
(32 bits)Unknown encoding: 165298BB (HEX) , 10110010100101001100010111011 (BIN)
(0 bits)FFFFFFFF (HEX) , 11111111111111111111111111111111 (BIN)
(32 bits)Unknown encoding: 71E54B44 (HEX) , 1110001111001010100101101000100 (BIN)
(32 bits)Unknown encoding: 51EBDD78 (HEX) , 1010001111010111101110101111000 (BIN)

A continuación dejo los códigos que uso tanto para el receptor, como para el emisor.

Código del emisor:

#include <IRremote.h>

IRsend irsend;
int pinButton = 3;

void setup() {
}

void loop() {
  irsend.sendRC5(0x00FFA857,32);
  delay(100);
}

Código del receptor:

#include <IRremote.h>
int RECV_PIN = 9; 

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Empezamos la recepción  por IR
}


void dump(decode_results *results) {
  // Dumps out the decode_results structure.
  // Call this after IRrecv::decode()
  
  Serial.print("(");
  Serial.print(results->bits, DEC);
  Serial.print(" bits)");
  
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");

  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->address, HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == LG) {
    Serial.print("Decoded LG ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC ");
  }
  else if (results->decode_type == AIWA_RC_T501) {
    Serial.print("Decoded AIWA RC T501 ");
  }
  else if (results->decode_type == WHYNTER) {
    Serial.print("Decoded Whynter ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (HEX) , ");
  Serial.print(results->value, BIN);
  Serial.println(" (BIN)");

}

void loop() {
  if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // empezamos una nueva recepción
    
  }
  delay(300);
}

He mirado mucho este tema pero no llego a encontrar una explicación. A ver si alguno puede iluminarme.

Muchísimas gracias de antemano.

Un saludo.

No se cuanto has mirado, pero en Google en el segundo resultado ya se habla de esto y se recomienda usar la libreria IRremote_Attiny

Ese post ya lo había leído, pero básicamente entiendo que lo que se quiere es sacar el Led ir por el pin0 en vez de por el 3. Por eso no lo había encontrado muy útil para mi problema.

Ahora releyendolo he pensado que cuando hablan de calibrar el oscilador sí que puede tener algo que ver con mi problema, ya que si el tiempo va mal, la duración de los pulsos ir no será la correcta y de ahí los fallos. Seguiré mi investigación por ese camino.

Saludos.

Es que te olvidas que las rutinas de TIMERs no estan hechas para ATtinys asi que enfócate en eso.

Con eso quieres decir que me olvide directamente de usar ATtinnys para trabajar con IR? porque supongo que las transmisiones IR son rutinas de TIMERs ...

No es lo que te sugiero, te sugiero que examines la rutina y si no contempla con instrucciones específicas del compilador para el ATtiny. Debes contemplar modificar la librería o usar la que te sugirió Jopapa. (Al final te doy dos soluciones).

Yo creo que en general en lugar de tantos cursos de esto y lo otro en Youtube hay que mirar como buscar cosas en Internet. Es mucho mas importante, pero lo mas simple que en el caso de Arduino solo debes poner Arduino LO_que_buscas como dice mi lema y por eso lo he puesto pero nadie lo lee.

Si pones en Google IRremote ATtiny aparecen cosas como la de jopapa y muchas mas opciones.
Es lo primero que yo hubiera hecho, en lugar de esta peleando con algo que esta pensado para el otro mundo de Arduino.

Hay tres o cuatro escenarios en Arduino y seguramente muchos mas que no uso como los SMT32 x ejemplo.

Los UNO/MEGA/NANO/PRO MINI/Leonardo mas o menos son el standard
El DUE lo cito porque es muy usado ya no lo es... los timers son diferentes por usar un ARM
Los ESP8266 usasn otros TIMERs y debes ver si la librería va o no.. ya te adelanto que no, pero si fue actualizada puede que si.
Los ATtiny no caen en las categorías anteriores. Se pueden programar como ARduino SI pero al son mas específicos a gente de electrónica.

Entonces siempre siempre, considera que tendras que darle una mirada particular a todo con ATtiny y su familia.

De la búsqueda que te sugerí te dejo esto How to build an IR decoder

O esto que justifica lo que te he escrito antes

How to Use the IR Library With an Attiny

Esto es una recopilación de los errores que seguramente has experimientado. Espero sepas leer inglés pero de lo contrario Google Tranlate.