ESP8266-12e NodeMcu – Prime impressioni

esp8266

 

E’ la mia prima scheda del tipo ESP8266, quindi appena mi è arrivata ho voluto cominciare a sperimentarci sopra per capire cosa ci sia di differente dalle schede di tipo Arduino. E’ completa di tutto ciò che serve per cominciare a programmarla, nel senso che una volta collegata tramite la presa micro-usb al computer e caricate le opportune estensioni della IDE di Arduino è praticamente pronta per l’uso.

Io ho utilizzato come IDE la versione ufficiale 1.6.5 scaricata dal sito arduino.cc, ovvero la penultima disponibile. L’ultima versione, la 1.6.6 mi risulta abbia ancora dei problemi (verificati di persona) e preferisco aspettare ancora prima di utilizzarla. Per quanto riguarda il caricamento delle estensioni per ESP8266 si può fare riferimento a questa ottima guida reperibile al link:

https://www.reboot.ms/forum/threads/programmare-esp8266-usando-arduino-ide.385/

La guida si riferisce alla versione di IDE per Windows, ma la procedura relativa al Mac è esattamente la stessa e altrettanto immagino per Linux. Nello specifico, usando io generalmente solo macchine Apple ho potuto verificare che non c’è alcun bisogno di installare driver aggiuntivi per il dialogo con la scheda, questa almeno. Negli altri casi ovviamente non posso esprimermi.

NOTA: Ho ispezionato la scheda e il chip più grande vicino alla micro-usb risulta essere un CH340 , quindi ho visto subito le porte seriali solo perché ho questo driver già installato grazie agli Arduino Nano di produzione cinese.

 

Ecco come è stata riconosciuta nel mio caso (OS X) la scheda:

Schermata 2015-12-26 alle 20.53.13

Alcune considerazioni di tipo generale: la scheda viene normalmente alimentata dalla presa micro-usb con una tensione di 5V ma internamente, tramite un regolatore di tensione, il voltaggio di riferimento viene portato a 3.3 V. Quindi i livelli digitali 0 e 1 faranno riferimento a quest’ultimo voltaggio. Il consumo di corrente, essendo la scheda dotata di un modulo Wi-Fi, è ovviamente maggiore rispetto ad un Arduino Nano o Micro, e questo ne limita un po’ l’utilizzo con batterie esterne. D’altronde è il prezzo da pagare per il collegamento Wi-Fi “vero”.

Di pin digitali per il collegamento di sensori nelle varie modalità I2C, SPI, PWM o semplice I/O su un singolo segnale ce ne sono in abbondanza direi. Per ora ho avuto modo di provare solo l’I2C, che risulta programmabile, nel senso che nella inizializzazione da codice della libreria Wire è possibile assegnare i pin GPIO dedicati alla funzione SDA e SCL.

In sostanza si tratta di dare un comando:

Wire.begin(4, 5); // Inizializza come SDA = GPIO4(D2) e SCL = GPIO5(D1)

all’interno della funzione Setup(). La prima cosa che salta all’occhio è che è sempre bene riferirsi ai pin digitali in termini di GPIO piuttosto che ai pin fisici. Nelle funzioni si passeranno i valori GPIO.

Ecco lo schema dei pin dell’ESP8266-12e NODE-MCU

Schermata 2015-12-25 alle 23.07.53

Un’altra cosa inquietante che si nota subito è che di ingressi analogici ce ne è uno soltanto, denominato appunto A0. Come se non bastasse ho scoperto che il voltaggio di riferimento per il pin A0 non è di 3.3 V come ci si potrebbe aspettare, ma spazia solamente tra 0 e 1 Volt. Questo significa che per poter utilizzare questo ingresso va implementato un partitore di tensione per non saturare l’entrata con valori maggiori di 1V e minori di 3.3V, che darebbero in ogni caso un valore convertito a 1023 falsando il comportamento del sensore.

Credo di aver letto da qualche parte che è possibile “multiplexare” questo unico ingresso analogico (chissà, forse con un meccanismo simile a quello dell’I2C, con gli address, non ho idea per il momento) ma mi pare comunque di capire che gli ESP8266 non “amano” molto i sensori analogici.

Un’altro problema che ho verificato personalmente dopo qualche giorno di utilizzo è che tutte le 3 schede che ho attive mostravano una certa instabilità: in modo del tutto casuale dopo qualche ora o minuto di funzionamento “sparivano” dalla rete non dando più segni di vita. In un primo momento ho pensato che il problema fosse dovuto a disconnessioni del modulo Wi-Fi dovute alla debolezza del segnale, e ho inserito negli sketch il codice per la riconnessione automatica in caso di sgancio. Il problema non si è risolto per cui ho deciso di lasciare almeno un ESP collegato al Pc in modo da rendermi conto sull’output della seriale cosa stesse succedendo.

A questo punto ho visto il dump tipico di un vero e proprio crash:

In poche parole il crash del codice causava un SOFT RESET, che nonostante il reboot spontaneo della scheda non riusciva a far ripartire la connessione Wi-Fi perché evidentemente lo stato della ESP era ancora instabile (qualche problema con il memory heap ad esempio, non risolvibile se non con un hard reset).

Ovviamente la pressione del tasto reset (HARD RESET) sulla scheda faceva ripartire lo sketch, che inevitabilmente crashava poco dopo.

Posso capire una scheda difettosa nell’hardware, ma 3 su 3 mi sembrano un po’ troppo. Quindi è partita la caccia sui Forum e infatti ho trovato alcuni thread illuminanti tipo questo:

https://github.com/esp8266/Arduino/issues/428

Consiglio agli interessati di leggerlo tutto, ci sono gli interventi di varie persone che hanno questo tipo di problematica, e si ipotizzano problemi legati forse al memory heap o a direttive date al compilatore non propriamente corrette. In poche parole l’instabilità risiederebbe nelle librerie di compilazione fornite attualmente per queste schede (non solo la 12e, si parla anche della 07 e via dicendo) che avrebbero ancora dei bug piuttosto rilevanti.

Problemi non ancora risolti naturalmente, anche nel mio caso dove nei moduli ESP è installato il recente SDK 1.3.0 e nella IDE di Arduino le estensioni 2.0.0.

Fatto sta che tra le varie prove consigliate nel thread si diceva di attivare la modalità di DEBUG per avere un output migliore nei crash dump e io così ho fatto. Ho inserito quindi negli sketch, oltre alle chiamate alle “solite librerie” questo codice:

Ebbene, da quel momento in poi i crash non si sono verificati più, o almeno posso dire che gli sketch girano da più di 48 ore e sono ancora lì perfettamente funzionanti. Ovviamente non si tratta di un caso. L’accensione in modalità debug avrà cambiato le direttive (errate) al compilatore? Avrà influito sulla gestione della memoria per cui non ci sono più corruzioni dell’heap? Probabile, posso solo ipotizzare…… e aspettare che comunque diano più stabilità al compilatore di queste schede, comunque molto interessanti.

Un’ultima cosa ancora. C’è ancora qualche problema con i path di alcuni file include (quelli con l’estensione .h per intenderci). Ad esempio la libreria per i sensori DHT scaricata dal forum arduino.cc non compila perché non trova il file avr/pgmspace.h

Questo infatti non si trova nel path “giusto” e va copiato a mano. La libreria Adafruit invece funziona subito. Non mi risulta poi che ci sia ancora una libreria diretta ESP – MySql, quindi l’uso del PHP piazzato su un Web Server è d’obbligo. Poco male, risulta anche più semplice e meno oneroso in termini di memoria.

 

 

Arduino Yun e/o ESP8266-12e. Che vuoi di più dalla vita?

arduino_yunesp8266-12e

Ora che mi sono arrivati entrambi potrò cominciare a studiarli per realizzare il mio progetto di domotica in chiave wi-fi. Lo Yun ovviamente non è adatto ad accogliere un singolo nodo principalmente per motivi di costo, ma può svolgere idealmente le funzioni di centrale di controllo, data collector, interfaccia verso BOT esterni e quant’altro grazie alla sua capacità di ospitare un controller e al tempo stesso una unità Linux al suo interno, mentre dagli ESP mi aspetto un ottimo lavoro come nodi di acquisizione sparsi per l’ambiente. Grazie ad Heron comunque per avermi messo la pulce nell’orecchio…. 🙂

 

Stazione Meteo 2.0 – Invio automatico di un rapporto via e-mail

Vediamo come fare in modo che la nostra Stazione Meteo possa inviare in automatico con cadenza periodica un messaggio di posta elettronica contenente i dati raccolti sul database MySql. Prima di descrivere la procedura devo premettere che ho aggiunto alla tabella dati_meteo un paio di campi (rispettivamente data e ora) solamente per la comodità di averli già divisi, sia per le query che per il prelievo di informazioni, che non comportano nessuna modifica nel codice già scritto in quanto popolati da un trigger associato a questa tabella.

Ecco qui quindi le modifiche da apportare alla tabella in questione:

In grassetto ciò che mancava in precedenza.

Sostanzialmente si tratta di un semplice script in Python che va messo nel data collector, ovvero nel Raspberry (o chi per lui) che contiene il database MySql. Richiede un account di posta GMAIL da dove spedire la posta tramite il suo server SMTP ma può essere facilmente adattato per l’utilizzo di altri gestori. Ovviamente la macchina dove installeremo lo script deve avere accesso ad Internet, e mi raccomando di controllare che qualora ci sia un firewall attivo non venga bloccato il traffico in uscita sulla porta TCP 587.

Controllare anche che sia installato il modulo python-MySql per l’accesso al database. In caso contrario, a seconda della distribuzione in uso, usare il gestore di pacchetti per installarlo. Lo script prevede di utilizzare una lista di destinatari, in caso di invio ad un singolo indirizzo è sufficiente inserire una voce soltanto nella lista. La variabile GMAIL_USERNAME deve contenere invece un account Gmail già esistente con relativa password. Dal momento che questo script conterrà la password in chiaro di questo utente consiglio di installare lo script in una directory dell’utente root e dare permessi di tipo 700 a questo codice. Personalmente non amo affatto le distribuzioni basate sul “sudo” e preferisco creare anche nelle distro Debian-like un utente root e togliere qualsiasi accesso elevato (“sudo”, appunto) agli utenti normali.

Ecco qui il codice Python:

Veramente semplice. Per fare sì che venga spedita periodicamente una mail è sufficiente inserire nella crontab di root la riga con la chiamata periodica di questo script. Con il comando < crontab -e > entriamo nell’editor di crontab e inseriamo una riga come questa che provocherà il lancio dello script ogni ora.

Questo comando suppone che lo script sia stato salvato nella directory /root/python_code ovviamente. Cercando su Internet le regole sintattiche relative al comando < crontab > non sarà difficile capire come impostare altri tipi di periodicità.

A breve parlerò anche di una cosa ben più interessante: ovvero come richiedere queste (ed altre informazioni) da remoto utilizzando un BOT, ovvero un utente automatico creato tramite alcune API opensource messe a disposizione dal programma di chat Telegram. In questo caso non ci limiteremo a richiedere passivamente informazioni ma potremo interagire in modo attivo (accendere o spegnere apparecchi) da remoto con la nostra infrastruttura domotica. 🙂

Banana Pi M3

Che delusione! Stavo seguendo con un certo interesse l’uscita sul mercato di questa nuova scheda (che non è comunque di fabbricazione Lemaker) che prometteva di essere interessante come miglioramento delle precedenti Banana Pi ma mi sono imbattuto in questo articolo che la ha stroncata un po’ da tutti i punti di vista. Vabbè che la porta SATA è in realtà un bridge USB-to-SATA ma i tempi di accesso sono a dir poco scandalosi.

Ecco il link:  http://forum.armbian.com/index.php/topic/474-quick-review-of-banana-pi-m3

 

 

LM35DZ, questo sconosciuto…..

Photo-2015-12-05-12-49-08_0157

Beh in realtà sto scherzando, questo sensore di temperatura è conosciutissimo ed anche apprezzato perché ad un costo bassissimo permette di ottenere una semplice (ed anche precisa) lettura di temperatura laddove serve solo quella, senza scomodare gli arcinoti DHT. Semmai il motivo delle varie chiacchierate con il mio amico Francesco (a proposito, chi vuole andare a trovare la sua WIKI su un progetto di domotica la trova QUI) era che è piuttosto instabile, talvolta stranamente impreciso e che se lo troviamo a prezzi stracciatissimi e in confezioni da 50 🙂  è meglio non comprarlo.

Anche io ho postato qualcosa a riguardo tempo fa sulle strategie per utilizzarlo al meglio e ora ho deciso di tagliare la testa al toro mettendone alla prova una “batteria” di 5 esemplari facendo il confronto con un termometro di precisione di quelli che si usano in fotografia. Tra le prove che ho effettuato la cosa migliore è risultata poi di utilizzare come voltaggio di riferimento non i 5V ma 1.1V degli ingressi analogici (si può approfondire QUI) e nello stesso tempo fare una media su 10 letture effettuate ogni 20ms.

Il termometro ad alcohol segnava 23.5 gradi ed ecco contemporaneamente cosa leggevano i sensori:

Schermata 2015-12-05 alle 12.50.43

Tra l’altro visto lo scarto troppo elevato che presenta mi sembra il caso di cestinare l’ultimo sensore (il primo a sinistra nella foto) perché evidentemente non deve essere riuscito molto bene. Ho provato anche a cambiargli l’ingresso analogico ma la sua imprecisione rimane.

Ecco quindi la routine “definitiva” di lettura che ho utilizzato:

RTC DS3231 – Scarto nell’orario dopo 1 mese

Sono passati circa 30 giorni da quando ho effettuato la prima regolazione da Internet dei 5 moduli DS3231 in mio possesso e ho provveduto di nuovo a far girare lo sketch di settaggio via NTP. Ho ottenuto rispettivamente errori pari a 3 / 4 / 2 / 3 / 1 secondi sulle 5 schede, quindi nel caso peggiore ho rilevato un errore di 4 secondi, con un errore medio di circa 2.5 secondi. Posso quindi confermare personalmente le stime che avevo trovato su altri siti che davano come errore massimo circa 1 secondo a settimana.

Un’altra annotazione: avevo installato l’ultima versione dell’ IDE ufficiale di Arduino (quella del sito arduino.cc), ovvero la 1.6.6 ma ho preferito regredire alla 1.6.5 perché il nuovo meccanismo di aggiornamento su richiesta delle librerie interne mi ha creato dei duplicati (sto parlando della versione per OS X) sia nella cartella dell’applicazione che in quella degli sketch che non mi faceva compilare più alcuni sketch. Avevo già letto sul forum ufficiale di svariati problemi di questa ultima versione, e questo in particolare mi ha convinto definitivamente a tornare alla 1.6.5 in attesa che li risolvano.