IR Blaster : un potente comando remoto WiFi per dispositivi con telecomando ad infrarossi

In questo articolo viene presentato un progetto molto semplice dal punto di vista circuitale, leggermente più complesso dal punto di vista software. Questo circuito nasce dall’esigenza di collegare i dispositivi controllabili con telecomandi infrarossi al nostro sistema di automazione domestico. Si tratta quindi di un bridge tra IR e protocollo MQTT o HTTP con un notevole raggio di copertura: sono presenti infatti 6 led infrarossi, che opportunamente posizionati all’interno del contenitore che andremo a realizzare con la stampa 3D, ci consentiranno di posizionare il dispositivo praticamente ovunque con la sicurezza che almeno un fascio di raggi infrarossi arrivi a destinazione: ecco perchè IR Blaster. Con un raggio di copertura molto ampio, non avendo la necessità di piazzare l’IR Blaster nei pressi del dispositivo da controllare,  è possibile utilizzare questo progetto per controllare più di un apparecchio anche se hanno telecomandi diversi! Come già detto l’utilizzo principale di questo telecomando è via MQTT perchè consente di interfacciarlo ai sistemi domotici che fanno uso di Node-RED, OpenHAB e simili, ma nulla vieta di utilizzarlo via HTTP fornendo dei parametri nell’url da richiamare, magari realizzando un’app o una pagina HTML.

Sponsor

I PCB di questo progetto sono stati gentilmente offerti da PCB Way – il servizio di realizzazione PCB più completo che c’è: realizzano PCB fino a 30 layers! (in tutti i colori, compreso il viola!), PCB flessibili, stencil SMD, PCB con base in alluminio o rame (e altri materiali). Hanno un prezzo molto vantaggioso che parte da $5 per 10 PCB standard (1 o 2 layers fino a 100x100mm). PCBWay ha un sistema che premia con punti (beans) e la possibilità di inviare inviti che permettono di avere sconti e regali. Assistenza istantanea anche tramite chat, lavorazione velocissima, precisione e qualità ai massimi livelli.

ESP-01S

Il cuore del circuito è un modulo ESP-01S. Questo modulo monta a bordo un SOC ESP8266 e una memoria flash da 1MB (8Mbit). Fino a qualche anno fa c’erano i modelli ESP-01 (senza la S finale) che hanno una memoria flash da 512kB (4Mbit): non vanno bene per questo progetto! Fate riferimento alle descrizioni sui vari siti per poter acquistare il modello più nuovo che monta una memoria flash da 1Mb (anche se, in realtà, i modelli da 512kB non dovrebbero essere più in circolazione da un pezzo). Con un quantitativo di memoria pari a 512kB, infatti, il codice nella sua interezza (tutte le opzioni attive) non viene compilato.

Come distinguere i modelli ESP-01S (1MB) dagli ESP-01 (512kB)?

  • I modelli ESP-01S riportano chiaramente la dicitura ESP-01S sul PCB (vedi foto in basso)
  • I modelli ESP-01S hanno un unico led blu disposto in orizzontale (tenendo l’antenna verso l’alto) collegato al GPIO2, mentre gli ESP-01 montano due led un po’ più piccoli (uno rosso per l’alimentazione e uno blu collegato su GPIO1) disposti in verticale.

Le suddette informazioni, però, vanno prese con le pinze: dato che esistono numerosi cloni non è detto che tutti i produttori seguano le specifiche. Fate sempre affidamento a ciò che vi dice il venditore, almeno, mal che vada, potete reclamare.

Il modulo ESP-01(S) ha 8 pin disposti su due file, per cui è chiaro che non utilizza tutti gli I/O messi a disposizione dall’ESP8266 ma solo alcuni (4):

Modulo ESP-01(S) visto da sopra (antenna visibile, in alto). La numerazione qui utilizzata per i pin è quella standard: numeri dispari sopra e numeri pari sotto, alcuni però utilizzano una numerazione continua: cioè 1-2-3-4 sopra e 5-6-7-8 sotto. Qui faremo riferimento al pinout come indicato nella nostra immagine. Ad ogni modo i moduli ESP-01(S) riportano la descrizione del pinout sulla serigrafia lato inferiore.

I 4 pin utilizzabili come I/O sono i GPIO 0 (pin 5 del modulo – normalmente tenuto a livello alto da una resistenza di pull-up on board e usato anche per mettere l’ESP8266 in modalità programmazione), GPIO 1 (pin 2 del modulo, utilizzato dalla UART come canale TX),  GPIO 2 (pin 3 del modulo, su ESP-01S a tale pin è collegato il led blu) e GPIO 3 (pin 7 del modulo, utilizzato dalla UART come canale RX). La numerazione dei GPIO è la stessa utilizzata da Arduino, per cui se in Arduino IDE fate riferimento al pin digitale 2 questo corrisponde col GPIO 2 (ho specificato perchè sul NodeMCU questa cosa non è vera: l’indicazione dei pin digitali Dx sulla serigrafia non combacia con quella di Arduino IDE).

La maggior parte delle applicazioni che fanno uso del modulo ESP-01 si riducono ad utilizzare soltanto i GPIO 0 e 2 lasciando liberi gli altri due che vengono utilizzati in fase di programmazione o per comunicare con altri dispositivi: non è raro vedere, ad esempio, progetti in cui il modulo ESP-01 viene utilizzato accoppiato ad Arduino lasciando l’ESP8266 a fare solo da ponte tra la seriale UART e la rete Wi-Fi.

Schema elettrico

In questo progetto viene utilizzato il GPIO 3 (pin 7 del modulo) per pilotare un array di 6 led infrarossi che, se di buona qualità e opportunamente disposti inclinati lungo una superficie curva, permettono di coprire un’area molto vasta consentendoci di controllare i nostri dispositivi anche senza mettere il nostro circuito in linea retta con il ricevitore.

I led IR sono controllati a coppie mediante un comune transistor BJT NPN 2N2222 in formato TO-92 collegato alla linea dei 5V piuttosto che a quella da 3.3V. Il 2N2222 è in grado di far scorrere una corrente nel collettore pari a 600mA (con picchi di 800-1000mA a seconda dei produttori), per cui se decidete di usarne uno compatibile, tenete conto del pinout e dei parametri di funzionamento. Ogni LED IR assorbe fino a 100mA per cui in teoria sarebbe bastato un unico transistor per pilotarli tutti e 6. La resistenza R1 serve a limitare la corrente: per 600mA a 5V sarebbe necessaria una resistenza da 8.3Ω ma il valore commerciale più prossimo è 10Ω che limita a 500mA. Il ¼W in teoria non è chiaramente sufficiente a sopportare 600mA (sarebbero necessari 3W) ma a parte che il segnale dura poche frazioni di secondo, è anche di tipo impulsivo (38kHz). Ad ogni modo alcuni non utilizzano la resistenza di limitazione dal momento che i led IR tollerano quantitativi di corrente molto più alti dei normali led e dovrebbe essere possibile eliminarla e sostituirla con un ponticello, ma non ci assumiamo responsabilità se qualcosa va in fumo.

L’alimentazione viene fornita al circuito con un comune alimentatore da parete a 5V (va bene un alimentatore USB da almeno 700mA) e viene scalata ai 3.3V necessari per il funzionamento dell’ESP8266, mediante un regolatore di tensione LM1117-3.3 in formato SOT-223: questo è l’unico componente in formato SMD ma nonostante questo è molto facile da saldare.

E’ presente un header  a 6 pin utilizzabile per espandere eventualmente la board collegandola ad altri dispositivi, dato che riporta i 4 GPIO più l’alimentazione. Su questo header non è il pin di reset del modulo ma ad ogni modo è comunque possibile utilizzarlo per la programmazione, vedremo tra un po’ come.

Elenco componenti

La maggior parte dei componenti possono essere acquistati da Futura Elettronica, per cui troverete il link diretto alla pagina del prodotto: acquistando questi prodotti dal link contribuite a mantenere attivo questo sito; la spedizione è dall’Italia, viene usato il corriere espresso e i costi di spedizione sono molto contenuti (si paga €4,90 iva inclusa con Bartolini -consegna 1 o 2 giorni- fino a 30Kg e fino a €90 di spesa, dopo i €90 la spedizione è gratuita!).

I condensatori elettrolitici, quelli multistrato e le resistenze possono essere acquistati su Futura Elettronica in comodi kit che vi permettono di avere anche una certa scorta di componenti utili per progetti futuri, vi lascio qui i link:

Altro accessorio che può essere molto comodo è la board per programmare direttamente il modulo ESP-01S.

Setup Arduino IDE

Il dispositivo verrà programmato mediante Arduino IDE. E’ necessario quindi avere installato l’ESP8266 Core for Arduino IDE, rileggete questo nostro vecchio articolo per sapere come fare. Bisogna poi installare alcune librerie che verranno utilizzate dal programma. Le librerie si installano dal menù Strumenti > Gestione librerie dopo averle cercate nella barra in alto a destra. Bisogna cercare e installare:

  • IRRemoteESP8266 (by David Conran, Sebastien Warin, Mark Szabo, Ken Shirriff)
  • PubSubClient (by Nick O’Leary)
  • ArduinoJson (by Benoit Blanchon)
  • WiFiManager (by tzapu, tablatronix)

Fate attenzione perchè possono esserci molte librerie con nomi simili: i nomi li ho riportati scritti in grassetto apposta, riportando tra parentesi anche gli autori per essere sicuri di scaricare quelle giuste. L’esempio è stato testato utilizzando tutte le ultime versioni disponibili dei tool, in particolare:

  • Arduino IDE versione 1.8.12 (IDE)
  • ESP8266 versione 2.7.1 (core for ESP8266)
  • IRRemoteESP8266 2.7.7 (libreria)
  • PubSubClient 2.7.0 (libreria)
  • ArduinoJson 6.15.2 (libreria)
  • WiFiManager 2.0.3-alpha (libreria)

Il programma che andremo a caricare sull’ESP8266 (scaricabile più in basso al paragrafo Download) è lo stesso, identico, dell’esempio della libreria IRRemoteESP8266 che si trova in File > Esempi > IRRemoteESP8266 > IRMQTTServer con giusto un paio di modifiche per adattarlo al nostro PCB.

Come specificato nelle note del programma di esempio IRMQTTServer, prima di procedere è necessario fare una piccola modifica alla libreria PubSubClient. Facendo riferimento al sistema operativo Windows è necessario andare in C:\Users\[nome utente]\Documents\Arduino\libraries\PubSubCLient\src aprire con un editor di testo il file PubSubClient.h e cercare la riga:

26
#define MQTT_MAX_PACKET_SIZE 128

cambiare quindi il valore 128 con 768. Salvare e chiudere. Questa modifica serve ad aumentare il quantitativo di dati inviabile via MQTT che, nel caso di telecomandi che inviano comandi corposi, come quelli dei condizionatori, è assolutamente necessario.

Rispetto all’esempio standard, dicevamo, sono state fatte delle modifiche minori: è stato cambiato il pin a cui sono collegati i led infrarossi per poter utilizzare il modulo ESP-01(S). Tale pin è definito dalla costante kDefaultIrLed nel file IRMQTTServer.h: l’esempio utilizza il GPIO 4, noi utilizzeremo il GPIO 3. E’ stato cambiato anche il pin a cui eventualmente collegare un ricevitore IR (da 14 a 2) che può tornare utile in fase di acquisizione dei codici dei telecomandi.

I GPIO 4 e 14 non sono difatti disponibili sul pinout dell’ESP-01(S). Il GPIO 0 l’abbiamo lasciato libero perchè serve per mettere il modulo in modalità programmazione, il GPIO 1 viene utilizzato come TX del modulo UART e torna utile per il debug.

Un’altra modifica fatta è stata quella di attivare il debug: sempre nel file IRMQTTServer.h scorrere verso il basso fino a trovare #DEFINE DEBUG. Nell’esempio è impostato a false. Mettendo su true è possibile visualizzare messaggi di debug sulla porta seriale, di default impostata a 115200 baud. L’esempio scaricabile in fondo all’articolo ha già queste modifiche.

Programmazione ESP-01

Quando si esegue la programmazione è necessario selezionare in Strumenti > Scheda il valore Generic ESP8266 Module e lasciare tutte le opzioni invariate tranne la selezione del quantitativo di memoria a disposizione: qui selezioneremo 1M (FS:64KB OTA:~470KB):

Con quantitativi di memoria inferiori il codice non viene compilato e viene restituito l’errore Sketch troppo grande, ecco perchè è necessario il modulo ESP-01S.

Quello che prima veniva indicato come SPIFFS ora è indicato semplicemente come FS: il senso è sempre quello, ovvero parte della memoria flash da riservare ai dati, utilizzabile con un Filesystem.

E’ anche necessario, altresì, riservare un quantitativo minimo di memoria programma al File System/SPIFFS che verrà utilizzato per salvare i settaggi ecco perchè non dobbiamo selezionare il quantitativo di memoria di 1M che però non riserva nulla all’FS/SPIFFS.

Dal momento che il modulo ESP-01(S) fa della compattezza il suo punto forte, questo non possiede un bridge USB/UART a bordo (a differenza del NodeMCU) e le operazioni di programmazione devono procedere in manuale utilizzando un adattatore USB/UART funzionante a 3.3V (va benissimo anche il nostro bridge UART basato su MCP2221A).

Esistono comunque anche delle board di programmazione a pochi spiccioli fatte apposta per il modulo ESP-01 che possono avere a bordo 2 pulsanti per facilitare le operazioni di reset/flash: se i pulsanti non ci sono vuol dire che il reset/flash viene gestito in automatico dal chip che fa da bridge seriale. L’importante, sia che usiate un semplice adattatore UART che una board fatta apposta del tipo coi pulsanti, è eseguire in sequenza le operazioni descritte di seguito:

  1. Fornire alimentazione al modulo ESP-01
  2. Portare il pin di reset (pin 6 del modulo) a livello basso (collegarlo a GND)
  3. Tenendo il pin di reset a livello basso, portare il GPIO 0 (pin 5 del modulo) anch’esso a livello basso
  4. Togliere il pin di reset dal livello basso, attendere un secondo
  5. Togliere il livello basso anche dal pin GPIO 0 (non è assolutamente necessario tenerlo a GND durante la programmazione ma nulla vieta di lasciarlo a GND)
  6. Avviare la programmazione sull’IDE (per questo esempio c’è un po’ da aspettare)
  7. A fine programmazione togliere e ridare alimentazione o dare il reset (ricordarsi di togliere da GND il GPIO 0)

Le prime 4 operazioni possono essere in realtà eseguite in un passaggio solo: con il modulo ESP-01 non alimentato si tiene il GPIO 0 a GND e si da tensione per poi passare al punto 5, eliminando quindi la necessità di utilizzare il reset.

L’importante è capire la questione che lo stato del GPIO zero all’avvio dell’ESP8266 ne determina il suo funzionamento: se al reset/avvio (SOLO al reset o all’avvio) esso si trova a livello alto (3.3V) l’ESP8266 esegue il programma presente nella memoria flash a bordo, se invece al reset/avvio si trova a livello basso, l’ESP8266 si mette in modalità programmazione  e aspetta i relativi segnali sul pin Rx. Per tale motivo dopo averlo portato a GND dopo un avvio o un reset, non è assolutamente necessario, come purtroppo consigliano in molti, tenerlo a GND perchè la modalità di programmazione è stata già avviata, ma comunque nulla vi vieta di farlo, basta che poi vi ricordate che il programma non viene eseguito se il GPIO 0 continua a stare a GND.

Questa operazione, ancora, è fattibilissima su una breadboard: basta collegare l’alimentazione (3.3V e GND) e i pin RX-TX ai pin TX-RX di un adattatore USB/Seriale (funzionante a 3.3V) e collegare anche RESET e GPIO0 a GND magari usando dei cavetti jumper. Dopo aver dato alimentazione, staccare il cavetto jumper del reset, attendere un secondo e staccare anche il cavetto del GPIO0, avviare quindi la programmazione: E’ così che abbiamo fatto noi:

Funzionamento del codice

Qui verranno fornite soltanto le nozioni di base: l’esempio in questione, come specificato nelle note del sorgente, è per utenti avanzati dal momento che il codice è molto articolato e complesso e permette di controllare i dispositivi via IR mediante MQTT (è necessario disporre di un broker MQTT – potete leggere la guida di Giovanni su HTML.it per capire cosa è/come si implementa). E’ anche possibile accedere alla pagina creata dall’ESP8266 via HTTP: in questo caso si presenta un menù con la possibilità di inviare codici IR selezionando protocollo e dati ma in questo caso è chiaramente utilizzabile solo per fare dei test dato che non c’è la possibilità di salvare i codici. E’ possibile, però, se non volete usare l’MQTT, realizzare un’app (magari mediante MIT App Inventor se non siete esperti ma comunque avete una mentalità da programmatore) o una pagina HTML fissa da tenere sul cellulare, che richiama, via http, la pagina del dispositivo passandogli i codici. Fate riferimento alle note e alla documentazione ufficiale per altri settaggi e scoprire altre funzionalità.

Primo setup

Una volta caricato il programma sull’ESP-01S, dopo il reset, il modulo, sfruttando la libreria WiFiManager, si mette in modalità AP (Access Point) per cui dal cellulare, scansionando le reti Wi-Fi, troverete un’altra rete Wi-Fi generata dall’ESP8266, il cui nome è ESP_ seguito da una serie di numeri. Una volta collegati a questa rete Wi-Fi, il sistema Android dovrebbe presentare un Pop-Up del genere:

Cliccare sul Pop-Up: verrà aperta nel browser la pagina di configurazione.

Questo è quello che, in gergo tecnico, si chiama Captive Portal: avrete visto questo sistema in uso, ad esempio, per gli enti pubblici, negli hotel, nei villaggi turistici ecc: quando vi collegate alla loro rete non avete subito l’accesso ad internet ma qualsiasi url digitiate vi compare la pagina dell’ente che vi invita a inserire un nome utente e una password prima di fornirvi l’accesso. In questo caso chiaramente l’ESP8266 non vi fornisce l’accesso ad internet ma sfrutta la tecnica del Captive Portal per presentarvi una pagina html.

Se il pop-up non si presenta  (su Android capita sempre dopo la prima volta) aprite il browser e digitate l’indirizzo IP 192.168.4.1

Dopo alcuni secondi compare anche questo fastidioso messaggio, dovuto al fatto che vi siete collegati ad una rete WiFi che non fornisce l’accesso a Internet:

Chiaramente cliccate su NO altrimenti venite disconnessi. Una volta aperta la pagina del captive portal  si presenta  questa schermata:

Premere il pulsante Configure WiFi. Si apre una pagina in cui vengono mostrate le reti Wi-Fi rilevate dall’ESP8266: selezionare quella a cui intendete collegare il dispositivo e immettete la password. Più in basso ci sono anche i parametri da settare per connettersi ad un broker MQTT: volendo usare solo il sistema di richiamare l’url tramite http potete anche lasciare vuoti questi campi. Dopo aver settato tutto premere il pulsante save. Compare questo:

L’ESP8266 prova quindi a collegarsi alla rete WiFi impostata. Se il collegamento va a buon fine il modulo si resetta ed entra in modalità AP (Access Point) + STA (Station) ovvero diventa sempre un access point WiFi ma contemporaneamente è anche collegato (STA) alla rete Wi-Fi scelta per cui nell’elenco delle reti Wi-Fi sul cellulare non avrete più la rete ESP_[numero] ma compare AI_THINKER_[numero]. Attendere qualche secondo per vedere se nell’elenco reti scompare ESP_[numero]. Se il collegamento non va a buon fine (avete sbagliato a immettere la password), si presenta sempre quella rete e dobbiamo rifare la configurazione.

Dopo che il collegamento va a buon fine, possiamo collegarci alla nuova rete Wi-Fi (AI_THINKER_[numero]): si presenta sempre il messaggio del captive portal oppure possiamo digitare 192.168.4.1 nel browser ma non c’è più la pagina di configurazione. Deve comparire una schermata in cui è possibile creare dei codici da inviare via Infrarossi:

Ci sono 5 sistemi per poter costruire un codice per fare i test. Ma tralasciamo per ora questa funzionalità. Cliccando sul pulsante System Info, viene presentata una schermata simile a questa:

La parte che ci interessa è IP Address: qui viene mostrato l’indirizzo IP del dispositivo con il quale è possibile accedere ad esso dalla nostra rete domestica, può tornarci utile anche il MAC address come vedremo tra un po’. Se dal cellulare ci scolleghiamo dalla rete Wi-Fi creata dall’ESP8266 e ci colleghiamo alla rete Wi-Fi di casa, possiamo digitare quell’indirizzo per ritrovarci la stessa identica pagina.

Trovare il dispositivo nella rete

Per trovare facilmente il dispositivo nella nostra rete domestica (anche perchè se va via la corrente e il dispositivo si ricollega, potrebbe non riavere più lo stesso indirizzo IP) ci sono vari modi:

Impostare un indirizzo IP fisso da codice

Nel file IRMQTTServer.h alla riga 65 (o giù di li) c’è #define USE_STATIC_IP false, mettete a true e più in basso impostate l’indirizzo IP statico che volete assegnare al dispositivo (kIPAddress) e l’indirizzo del router (kGateway). Questo sistema, a volte, pare che comporti problemi in alcune librerie che richiedono di specificare anche gli indizzi IP del DNS, che in questo codice non è contemplato.

Fissare l’indirizzo IP dalla pagina di configurazione del router

Lasciando il codice così com’è, senza cioè fare le operazioni descritte sopra, i router offrono la funzionalità di poter assegnare sempre lo stesso indirizzo IP ad un dispositivo che si collega, riconoscendolo dal MAC Address. Nella pagina di configurazione del router cercate l’impostazione che permette di eseguire questa funzione. Nel router della TIM, ad esempio, questo settaggio si trova nel menù Il mio MediaAccess GatewayDHCPv4. Cliccando su Mostra controlli avanzati compare una lista, vuota di default, con tutti gli indirizzi IP pre-assegnati ai dispositivi di cui si conosce il MAC address. Cliccate sulla voce Aggiungere indirizzo statico e compilate i campi richiesti.

Utilizzare l’mDNS

L’mDNS funziona come il DNS (associare nome ad indirizzo IP) ma a livello locale e senza un server centrale: la richiesta del nome viene inviata a tutti i dispositivi e risponde solo quello che si riconosce. C’è un’opzione nel codice già abilitata di default: a riga 81 c’è #define MDNS_ENABLE true che consente di attivare questa funzione e il dispositivo dovrebbe rispondere al nome definito nel modulo principale del codice a riga 413: char Hostname[kHostnameLength + 1] = “ir_server”; // Default hostname. Ovvero dovrebbe bastare digitare ir_server/ oppure ir_server.local/ nel browser: a me non funziona in nessun modo, da nessun dispositivo, anche dopo aver installato la nuova versione del servizio Bonjour, mentre altri servizi (come il NAS) che sfruttano questo sistema funzionano correttamente senza aver impostato nulla da nessuna parte… Provate anche voi se vi funziona.

Se abbiamo sbagliato qualcosa?

Se abbiamo sbagliato ad impostare qualcosa o vogliamo modificare password/impostazioni, è sempre possibile accedere alla pagina generata dall’ESP8266 sia tramite la rete Wi-Fi di casa sia accedendo alla rete Wi-Fi generata dall’ESP8266 (ma digitando l’indirizzo 192.168.4.1). Dal menù in alto possiamo cliccare il pulsante Admin e poi premere Wipe Settings

Come inviare comandi

Da questo programma di esempio è possibile eseguire le chiamate HTTP mediante i metodi illustrati nelle note :

http://<your_esp8266's_ip_address>/ir?type=7&code=E0E09966
http://<your_esp8266's_ip_address>/ir?type=4&code=0xf50&bits=12
http://<your_esp8266's_ip_address>/ir?code=C1A2E21D&repeats=8&type=19
http://<your_esp8266's_ip_address>/ir?type=31&code=40000,1,1,96,24,24,24,48,24,24,24,24,24,48,24,24,24,24,24,48,24,24,24,24,24,24,24,24,1058
http://<your_esp8266's_ip_address>/ir?type=18&code=190B8050000000E0190B8070000010f0
http://<your_esp8266's_ip_address>/ir?repeats=1&type=25&code=0000,006E,0022,0002,0155,00AA,0015,0040,0015,0040,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0040,0015,0040,0015,0015,0015,0040,0015,0015,0015,0015,0015,0015,0015,0040,0015,0015,0015,0015,0015,0040,0015,0040,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0040,0015,0015,0015,0015,0015,0040,0015,0040,0015,0040,0015,0040,0015,0040,0015,0640,0155,0055,0015,0E40

Oppure via MQTT sul topic ir_server/send utilizzando uno dei seguenti formati:

protocol_num,hexcode  esempio: 7,E0E09966 => Samsung(7), Power On code, default bit size, default nr. of repeats.
protocol_num,hexcode,bits  esempio: 4,f50,12 => Sony(4), Power Off code, 12 bits & default nr. of repeats.
protocol_num,hexcode,bits,repeats  esempio: 19,C1A2E21D,0,8 => Sherwood(19), Vol Up, default bit size & repeated 8 times.
30,frequency,raw_string  esempio: 30,38000,9000,4500,500,1500,500,750,500,750 => Raw (30) @ 38kHz with a raw code of "9000,4500,500,1500,500,750,500,750"
31,code_string  esempio: 31,40000,1,1,96,24,24,24,48,24,24,24,24,24,48,24,24,24,24,24,48,24,24,24,24,24,24,24,24,1058 => GlobalCache (31) & "40000,1,1,96,..." (Sony Vol Up)
25,Rrepeats,hex_code_string  esempio: 25,R1,0000,006E,0022,0002,0155,00AA,0015,0040,0015,0040,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0040,0015,0040,0015,0015,0015,0040,0015,0015,0015,0015,0015,0015,0015,0040,0015,0015,0015,0015,0015,0040,0015,0040,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0040,0015,0015,0015,0015,0015,0040,0015,0040,0015,0040,0015,0040,0015,0040,0015,0640,0155,0055,0015,0E40 => Pronto (25), 1 repeat, & "0000 006E 0022 0002 ..." (Sherwood Amp Tape Input)
ac_protocol_num,really_long_hexcode  esempio: 18,190B8050000000E0190B8070000010F0 => Kelvinator (18) Air Con on, Low Fan, 25 deg etc.

Se, ad esempio, dal browser su un PC a casa o da quello del cellulare (sempre stando collegati alla stessa rete domestica a cui è collegato anche l’ESP8266) digitiamo (sostituite 192.168.1.77 con l’indirizzo IP che viene restituito a voi):

http://192.168.1.77/ir?type=7&code=E0E09966

Il sistema capisce che deve inviare, via IR, il codice esadecimale E0E09966 utilizzando il protocollo numero 7 (Samsung) e si presenta, sul browser, una schermata che recita IR Command sent – you will be redirected to main page in 2 seconds. Mentre dai messaggi di debug su seriale si legge:

 

Recuperare i codici dei telecomandi

Per clonare i comandi di un nostro telecomando IR la cosa più semplice da fare è collegare un ricevitore IR qualsiasi sul GPIO2:

Anche se di ricevitori IR ne esistono una montagna e i pinout sono quasi tutti compatibili tra loro, dovete fare una considerazione: la maggior parte dei telecomandi infrarossi opera sulla frequenza di 38kHz, ma molti condizionatori usano 36kHz: anche se molti ricevitori riescono a ricevere entrambe le frequenze, in alcuni casi mi è capitato di non riuscire a ricevere i segnali di un telecomando con alcuni tipi di ricevitori o peggio di riceverli sbagliati, dovete quindi capire il vostro telecomando a che frequenza opera per poter scegliere il ricevitore giusto.

I telecomandi IR possono sfruttare tutta la banda da 33kHz a 56kHz

Il TSOP38438, ad esempio, viene indicato maggiormente per i condizionatori a 38kHz che hanno dei codici molto lunghi e complessi e non tutti i ricevitori, anche operanti sulla stessa frequenza, riescono a riceverli correttamente. I telecomandi dei condizionatori sono la cosa più ostica da emulare e ricevere per cui se dovete sfruttare questo esempio per un condizionatore è bene sapere che dovete armarvi di pazienza infinita.

Prima di procedere nella ricezione dei segnali del telecomando, dobbiamo essere sicuri che la configurazione sia andata a buon fine e che il sistema si aspetti di ricevere segnali IR sul GPIO 2. Dall’indirizzo IP dell’ESP8266 clicchiamo su Admin e quindi sul pulsante GPIOs, o in alternativa digitiamo nella barra degli indirizzi l’indirizzo IP dell’ESP8266 seguito da /gpio:

Questi sono i GPIO che abbiamo modificato nel codice, se non compaiono questi è necessario eseguire il wipe della configurazione e riprogrammare con il sorgente di esempio: da qui difatti non è possibile cambiarli se non viene impostata una password per l’accesso HTTP, ma questo doveva essere fatto dal codice prima della programmazione.

La riprogrammazione del dispositivo normalmente non cancella i settaggi, che vengono invece memorizzati nella zona riservata allo SPIFFS/File System, la funzione Wipe config serve appunto a cancellare i parametri scritti nello SPIFFS. Oppure da Arduino IDE nelle impostazioni della scheda scegliete Erase Flash: “All Flash Contents”.

Premendo un pulsante dal telecomando che vogliamo emulare (es.: il pulsante di spegnimento della TV) e puntando il telecomando verso il ricevitore, vediamo che nel debug appare una cosa simile:

Se non vogliamo usare il debug possiamo anche andare nella pagina (indirizzo IP) del dispositivo e cliccare su System Info, vediamo che nel primo paragrafo (general) si evince che il sistema ultimamente ha ricevuto un codice IR:

In questo esempio il codice è 7,0xE0E040BF,32 : 7 è il numero di protocollo, che corrisponde a Samsung (ma non ci interessa), 0xE0E040BF è il codice ricevuto e 32 è il numero di bit di cui è formato il codice (nemmeno questo ci interessa). Per cui, richiamando la pagina con: 

http://192.168.1.77/ir?type=7&code=E0E040BF

viene replicato quel codice sui LED IR. Altro sistema per recuperare i codici, utilizzando lo stesso modulo ESP-01(S) o anche un Arduino, è quello di caricare lo sketch IRReceive.

PCB e realizzazione circuito

Come già detto, il PCB è stato offerto da PCBWay, se ne volete uno (solo pcb, senza componenti e senza assistenza), contattatemi. Nel montaggio bisogna seguire alcuni accorgimenti:

  • E’ meglio montare il modulo ESP-01S su uno zoccolo in maniera da poterlo facilmente estrarre in caso di problemi: il case è disegnato per poter alloggiare il circuito con il modulo montato su uno zoccolo. Anche se esistono dei pin-strip femmina da 4×2 è più facile recuperare un pin strip femmina a fila singola e tagliarlo in due pezzi da 4.
  • Dal momento che il PCB ha il piano di massa che riempie tutto lo spazio, nonostante siano stati utilizzati dei thermal-pad, è necessario aumentare un po’ piu del normale la temperatura dello stilo.
  • Alcune piazzole sono molto ravvicinate (easy-eda le genera così…), specie nella saldatura dei transistor bisogna prestare molta attenzione perchè anche un esperto può facilmente mettere in corto i pins, quindi usate una punta molto fine, se avete il flussante passatelo sui pads, usate stagno a sezione sottile (0.5mm) e temperatura un po’ più alta.
  • I due condensatori elettrolitici devono avere un’altezza massima di 10mm (tenendo in considerazione che il modulo ESP-01S verrà montato su uno zoccolo): in questo modo riescono a stare sotto al modulo senza toccare.

Qui ci sono alcune immagini della realizzazione:

Il cavo USB che compare nelle immagini è soltanto per l’alimentazione: ho utilizzato un vecchio cavo togliendo un’estremità e rimuovendo i due fili dei dati (bianco e verde) lasciando solo il nero e il rosso. Il cavo va poi innestato in un caricatore USB. Se volete utilizzare il case stampato in 3D, chiaramente i led non li dovete montare sul PCB ma come nelle immagini, tagliando i pin e saldando degli spezzoni di filo: dovete isolare bene i pin (vedete nelle immagini sono stati utilizzati dei termorestringenti) perchè chiudendo sicuramente toccano tra loro e sul modulo ESP-01S. Sono necessari degli spezzoni di filo tra 40 e 60mm. Per la stampa vedete che ho messo una foto con le impostazioni che ho utilizzato io e ci sono volute circa 2 ore. Il guscio superiore viene meglio se utilizzate il supporto, se poi avete una stampante di un certo livello, come una Prusa, dovreste riuscire a far venire bene la parte interna anche senza supporto (il ponte è di 42mm). Per il cavo di alimentazione non ne utilizzate uno troppo spesso altrimenti il case non chiude bene. Per chiudere i due gusci utilizzate delle viti parker sottili da 18-20mm di lunghezza.

Downloads

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)