IR con attiny

Salve, siccome qualche tempo fa avevo messo una striscia di led blu alla mia scrivania e l’accendo tramite interruttore. In questi giorni avevo pensato di accendere questi led con un telecomando tramite un attiny85 e un IR 1838T.

Ho seguito diverse guide come queste:

Alla fine sono riuscito solo a non far emettere l’errore “C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:279: error: ‘TCCR2B’ was not declared in this scope” e altri!

Infatti testando su breadboard, pigiando il tasto sul telecomando il led non si accende.

questo è lo sketch che ho trovato su un blog (era una guida, ma su arduino. L’ho modificato un po’!):

//accendere e spegnere un led con il telecomando.

#include <IRremote.h> // use the library
int receiver = 4; // pin 1 of IR receiver to Attiny85 digital pin 4
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
int led=3; //pin positive of LED to Attiny85 digital pin 3 

void setup()
{
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(led, OUTPUT); // Pin 3 output
}
void loop()
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
 
  if ( results.value == 0x406 ||  results.value == 0xE0E028D7 ){ //tasto verde sul mio telecomando
    digitalWrite(led, HIGH);   // set the LED on
  } 
 if ( results.value == 0x404 ||  results.value == 0xE0E036C9){ //tasto rosso sul mio telecomando
    digitalWrite(led, LOW);   // set the LED 0ff
  }  
}

Secondo voi è possibile farlo? Grazie.

La IRremote inclusa nell'IDE è una versione zoppa.
Cancellala dalla directory libraries e poi scarica la versione normale. (qui)
Non so se funzioni sui Tiny.

PaoloP:
La IRremote inclusa nell'IDE è una versione zoppa.
Cancellala dalla directory libraries e poi scarica la versione normale. (qui)
Non so se funzioni sui Tiny.

Intanto grazie per la risposta.
Purtroppo sostituendo questa libreria con quella presente nella cartella libraries, mi ritornano gli errori che avevo all'inizio.

Eppure ho visto dei video su youtube che si può fare con gli attiny85, ma purtroppo non ti danno nessuna spiegazione!

Hai visto QUI ? ... ed hai usato la IR remote fatta da Nick Gammon per gli ATtiny?

Guglielmo

gpb01:
Hai visto QUI ? ... ed hai usato la IR remote fatta da Nick Gammon per gli ATtiny?

Guglielmo

Intanto grazie. Ho seguito la guida da te segnalata (oltre che la libreria nel link). Ora il led rimane acceso, ma non riesco a spegnerlo. Forse c'è qualche cosa nello sketch che da problemi all'attiny85?

Sul serial monitor riesci a fare debug (... con gli ATtiny, avendo pin liberi, si può usare la SoftwareSerial) ? Che valore ti stampa per results.value ?

Guglielmo

Così a occhio sembra che ci siano troppe parentesi } rispetto alle {

Temo che il secondo IF venga saltato...

E poi nell'attiny quei serial begin e serial print...

gpb01:
Sul serial monitor riesci a fare debug (... con gli ATtiny, avendo pin liberi, si può usare la SoftwareSerial) ? Che valore ti stampa per results.value ?

Guglielmo

ma è un comando che devo inserire nel serial monitor?

I valori che legge per il tasto verde sono: "0x2BAFCEEC e "0xE0E028D7";
invece per il tasto rosso: "0xDAEA83EC" e "0xE0E036C9".

P.S. Il telecomando è di un TV LED Samsung.

Poi ho corretto lo sketch:

  if ( results.value == 0x2BAFCEEC ||  results.value == 0xE0E028D7 ){ //tasto verde sul telecomando
    digitalWrite(3, HIGH);   // set the LED on
  } 
 if ( results.value == 0xDAEA83EC ||  results.value == 0xE0E036C9 ){ //tasto rosso sul telecomando
    digitalWrite(3, LOW);   // set the LED 0ff
  }

paulus1969:
Così a occhio sembra che ci siano troppe parentesi } rispetto alle {

Temo che il secondo IF venga saltato…

E poi nell’attiny quei serial begin e serial print…

Quindi cosa dovrei eliminare? Grazie.

Eppure questo sketch funziona su arduino, ma come lo carico sull’attiny85, non va!

:o :o :o ... scusa è , ma già avevi le Serial.print() nel codice che hai postato ... solo che su ATtiny non hai la Serial quindi ... devi fare le stesse cose usando la SoftwareSerial.

Oltre tutto, dato che ti basta solo ricevere informazioni dall'ATtiny (... ai fini di debug), ti basta un solo pin per fare il TX.

Quello di RX lo assegni al pin 1 (... che è il reset) ... questo perché alla SoftwareSerial comunque due pin devi passare, ma se gli passi, come pin di RX, quello che è adibito al reset, praticamente gli passi un pin fasullo ... la SoftwareSerial è contenta e tutto funziona :smiley:

Guglielmo

gpb01:
:o :o :o ... scusa è , ma già avevi le Serial.print() nel codice che hai postato ... solo che su ATtiny non hai la Serial quindi ... devi fare le stesse cose usando la SoftwareSerial.

Oltre tutto, dato che ti basta solo ricevere informazioni dall'ATtiny (... ai fini di debug), ti basta un solo pin per fare il TX.

Quello di RX lo assegni al pin 1 (... che è il reset) ... questo perché alla SoftwareSerial comunque due pin devi passare, ma se gli passi, come pin di RX, quello che è adibito al reset, praticamente gli passi un pin fasullo ... la SoftwareSerial è contenta e tutto funziona :smiley:

Guglielmo

Perdonami la mia ignoranza, ma non ho capito alcuni passaggi. Per esempio non so cosa sia la SoftwareSerial, oppure se devo usare il pin 1 sull'ATtiny (io ho usato il pin 4 per l'IR). Grazie e scusami ancora, ma sto cercando di imparare il più possibile e questo lo posso fare anche grazie a voi esperti del settore.

La SoftwareSerial è una libreria, in inclusa in Arduino IDE, che ti permette di creare una "Seriale" da software, anche se non ne hai disponibili. Studia il reference e guarda gli esempi che sono nell'IDE, tra gli Esempi.

Il pin 1, sugli ATTiny è il pin "reset". Dato che hai pochi pin, e che comunque la SoftwareSerial ne VUOLE due (TX e RX) ... per risparmiare ti suggerivo di trovarne uno libero solo per il TX (... che è quello che ti serve per fare debug), ed assegnare a quello dedicato al RX il pin 1.

E' ovviamente un trucco, perché il pin 1 è il reset e non riceve nulla, ma la SoftwareSerial non lo sa e la inganni ... risparmiandoti un pin :wink:

Guglielmo

gpb01:
La SoftwareSerial è una libreria, in inclusa in Arduino IDE, che ti permette di creare una “Seriale” da software, anche se non ne hai disponibili. Studia il reference e guarda gli esempi che sono nell’IDE, tra gli Esempi.

Il pin 1, sugli ATTiny è il pin “reset”. Dato che hai pochi pin, e che comunque la SoftwareSerial ne VUOLE due (TX e RX) … per risparmiare ti suggerivo di trovarne uno libero solo per il TX (… che è quello che ti serve per fare debug), ed assegnare a quello dedicato al RX il pin 1.

E’ ovviamente un trucco, perché il pin 1 è il reset e non riceve nulla, ma la SoftwareSerial non lo sa e la inganni … risparmiandoti un pin :wink:

Guglielmo

Capisco. Quindi dove inserire, oltre a “#include <IRremote.h>”, anche la libreria “#include <SoftwareSerial.h>”.
Poi, se ho capito bene, devo scrivere "SoftwareSerial nomevariabile (1, 3); // RX, TX

Ora devo capire come dichiarare le variabili e altre istruzioni con questa libreria.

Ora mi leggo per bene il tutto e riprovo, sperando che questa volta una cosa che avevo in mente di fare mi riesca!! :slight_smile:

Grazie.

... vai con calma, studiati bene gli esempi, e vedrai che è molto semplice.

A tutti gli effetti tu la vedi come una seriale, solo che, invece di Serial, si chiama come vuoi tu, es. mySerial e puoi usarla anche sui chip che, come il ATtiny85, non hanno una vera seriale :wink:

Guglielmo

Salve; dunque dopo aver letto un po’ di cose su questa nuova funzione, ho rifatto lo sketch e l’ho caricato sull’attiny85; purtroppo non va ancora. Il led rimane acceso e quando premo i tasti verde o rosso non succede nulla, anzi il led si comporta come i led rossi presenti nelle tv quando si premono i tasti sul telecomando.

Questo è lo sketch:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(1, 0); // RX, TX

#include <IRremote.h> // use the library
int receiver = 4; // pin OUTPUT of IR receiver to Attiny85 digital pin 4
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

int led=3; // LED che si accende e spegne tramite telecomando

void setup()
{
  mySerial.begin(9600);
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(led, OUTPUT); // Pin 3 output
  pinMode(1, INPUT); //RX
  pinMode(0, OUTPUT); //TX
}
void loop()
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }
 
  if ( results.value == 0x2BAFCEEC ||  results.value == 0xE0E028D7 ){ //tasto verde sul telecomando
    digitalWrite(led, HIGH);   // set the LED on
  } 
 if ( results.value == 0xDAEA83EC ||  results.value == 0xE0E036C9 ){ //tasto rosso sul telecomando
    digitalWrite(led, LOW);   // set the LED 0ff
  }  
}

i collegamenti fatti sull’attiny sono:

il positivo del led al pin 3;
il pin output dell’IR 1838T sul pin 4;
oltre ovviamente ai positivi e negativi dei componenti collegati alle due 2 stilo (3V).

Non riesco a capire cos’è che non va! :frowning:

NO, non ci siamo proprio …
… forse avventurarti su un ATtiny85 senza esserti fatto un po’ bene le ossa su un Arduino è stato un po’ azzardato perché … vedo che ti manca proprio l’esperienza. :confused:

Ti è stato detto che su ATTiny85 NON esiste la porta seriale e allora … cosa diavolo ci fa quella Serial.begin(9600)? Ti ho detto di usare per il RX della SoftwareSerial il pin 1 del chip … ma è il pin fisico (il reset, te l’ho detto più volte) … TU devi sapere come sono poi mappati i pin fisici sui pin logici che sui nell’IDE …

Il pin fisico 1, nell’IDE si chiama PIN 5 o A0 … così come il pin fisico 2, nell’IDE si chiama PIN 3 o A3 e così via. Fai riferimento a QUESTO pdf.

Altra cosa… spero tu NON abbia collegato il LED direttamente al pin del ATtiny85, ma ci abbia messo una resistenza limitatrice di corrente …

Infine … vedo che non hai seguito le mie indicazioni di mettere delle print con la SoftwareSerial per fare debug …

Sicuro che non stai facendo il passo più lungo della gamba ? Non è il caso di fare un po’ più di esperienza su un Arduino classico prima di avventurarsi du MCU diverse che si comportano in modo diverso ? ::slight_smile:

Guglielmo

gpb01:
NO, non ci siamo proprio ...
... forse avventurarti su un ATtiny85 senza esserti fatto un po' bene le ossa su un Arduino è stato un po' azzardato perché ... vedo che ti manca proprio l'esperienza. :confused:

Ti è stato detto che su ATTiny85 NON esiste la porta seriale e allora ... cosa diavolo ci fa quella Serial.begin(9600)? Ti ho detto di usare per il RX della SoftwareSerial il pin 1 del chip ... ma è il pin fisico (il reset, te l'ho detto più volte) ... TU devi sapere come sono poi mappati i pin fisici sui pin logici che sui nell'IDE ...

Il pin fisico 1, nell'IDE si chiama PIN 5 o A0 ... così come il pin fisico 2, nell'IDE si chiama PIN 3 o A3 e così via. Fai riferimento a QUESTO pdf.

Altra cosa... spero tu NON abbia collegato il LED direttamente al pin del ATtiny85, ma ci abbia messo una resistenza limitatrice di corrente ...

Infine ... vedo che non hai seguito le mie indicazioni di mettere delle print con la SoftwareSerial per fare debug ...

Sicuro che non stai facendo il passo più lungo della gamba ? Non è il caso di fare un po' più di esperienza su un Arduino classico prima di avventurarsi du MCU diverse che si comportano in modo diverso ? ::slight_smile:

Guglielmo

Scusa ho confuso i pin (sapevo già la mappature dei pin dell'attiny)! Avevo anche dimenticato di rimuovere il serial.begin. E' che sono tornato da poco da lavoro e volevo mettermi subito su questo piccolo progetto!

Il led è di colore blu, ci vuole ugualmente un resistore?

Credevo sarebbe stato semplice questo progetto, ma non è così per me! Volevo solo accendere i led con un telecomando! :slight_smile:
Mi sa che devo ripartire da zero! :frowning:

Grazie per avermi dedicato il tuo tempo.

Indipendentemente dal colore del LED la resistenza ci vuole sempre per limitare la corrente che scorre nel pin di Arduino ...
... difatti, ogni pin della MCU può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore).
Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

Giocare con gli IR già non è affatto semplice, farlo poi su un ATTiny85 richiede una certa esperienza ...
... io proverei a far funzionare il tutto su un normale Arduino (... così è più semplice, hai la Serial, hai la libreria IRRemote standard, ecc.) e poi, quando tutto funziona bene ed hai capito come fare ... lo trasporti su ATTiny :wink:

Guglielmo

Capisco.
Avevo già immaginato che non sarebbe stato facile realizzarlo, ma non mi aspettavo che sarebbe stato così difficile. Poi vedendo alcuni video su youtube, mi sono detto: bene! E' realizzabile! Poi l'ennesima delusione nel non essere riuscito a portare a termine neanche questo! :frowning: Mi piaceva l'idea nell'accendere la striscia led col telecomando.
Mi vado sempre a impelagare in cose difficili da fare! :slight_smile:

Comunque ti ringrazio, perché ho imparato altre cose. :wink:

milvus:
Mi vado sempre a impelagare in cose difficili da fare! :slight_smile:

... beh ... con quelle facili non c'è divertimento no ? :smiley: :smiley: :smiley:

Dai retta, provaci a farlo con Arduino UNO ... dove tutto è più semplice, poi se ci riesci ...
... magari invece di dover cambiare tutto, fai semplicemente uno standalone con l'ATmega328P invece dell'ATtiny85 ... un po' più ingombrante, ma almeno sempre in formato DIP facile da mettere su uno zoccoletto :wink:

Guglielmo