ESP-01 I/O expander via Serial port

Update 20 Giu 2022: All parts together and translated into English
https://hackaday.io/project/185944-serial-io-expander

Il modulino WiFi ESP-01 è stato il primo che ho utilizzato, molti, molti anni fa. Arrivava con una versione di firmware che consentiva di iniziare subito a lavorare usando dei comandi AT. Non esisteva ancora una versione Arduino, così i primi esperimenti erano tutti basati sull’uso di un micro esterno, che utilizzava le preziose capacità di connessione WiFi rese disponibili così a basso costo.
Ora le cose sono cambiate. Tanto! Con l’ambiente di sviluppo Arduino si è generata la possibilità di creare tante applicazioni usando solo il modulino ESP-01, opportunamente programmato (non più con protocollo AT). Il bello di Arduino è che gira magnificamente sia su Windows che su Linux e questo rende possibile lo sviluppo davvero a tutti gli appassionati. L’unica pecca del modulino ESP-01 è la scarsissima presenza di linee di I/O. Così ho pensato di fare un mio personale I/O expander collegato sui due pin della porta seriale TX e RX. Ecco qui cosa è venuto fuori:

Nella foto si vedono il prototipo e l’interfaccia USB-Serial rimovibile che viene usata sia per programmare l’ESP-01, sia come monitor seriale di debug. Il circuito è alimentato a 5V e dispone di un regolatore a 3.3V per il microcontrollore e l’ESP-01. Qui c’è lo schema completo (notate che il led RGB visibile sul prototipo non è presente sullo schema, ma fa parte della “demo” che troverete sull’applicazione ESP-01 per Arduino):

Se si vuole un dettaglio maggiore, si può scaricare il pdf da questo link.

Una breve nota sull’interfaccia USB-Serial usata in questo progettino. Si basa sul PL2303 e ha solo 4 pin. Ho fatto una piccola modifica come si vede nella foto:

C’è il taglio di una pista (cerchio rosso, in alto) e un ponticello di filo, più un piccolo cond. 100nF (in basso). Questo serve per fare in modo che sul pin VCC sia presente il 5V proveniente dall’USB e invece i segnali TXD e RXD siano a 3.3V. Con altre interfacce è possibile fare la stessa cosa senza tagli o saldature. Si noti che il circuito è montato “a mano”, perché avevo dei chip e dei CS disponibili da un vecchio acquisto online.

Come si vede immediatamente, c’è un microcontrollore tipo ATtiny2313 che è il nostro chip di I/O. Alla domanda: “perché quello?” rispondo: “perché ne ho una stecca intera avanzata da un vecchio progetto”. Ovviamente, per svolgere questo compito, il micro deve essere opportunamente programmato. Ho sviluppato il programma in C che svolge tutto il lavoro  con il KickStarter per AVR della IAR, che è scaricabile gratuitamente (previa registrazione gratuita) dal sito del produttore. La versione a tempo illimitato permette di sviluppare progetti fino al limite di 4K, che non è assolutamente un problema, dato che il micro ha solo 2K di flash!
In allegato si troverà la cartella completa del progetto, con il file sorgente in C e anche con il file hex per chi volesse programmare direttamente la flash senza fare modifiche.
Aggiungere comandi a quelli attuali è semplicissimo, basta fare copia-incolla di uno di quelli presenti ed espanderlo opportunamente, quindi ricompilare e riprogrammare il micro con la nuova versione. I comandi attualmente sono ridotti all’osso, ma sufficienti per fare di tutto. Poco lavoro sul micro significa che se ne dovrà fare di più dal lato ESP-01, ma questo ha risorse enormemente maggiori, quindi la logica ci dice: prendi le risorse lì dove ci sono!

Ecco il contenuto della cartella di lavoro:

Il file serioexp.eww è quello che, con doppio click, avvia l’ambiente di sviluppo IAR (se è stato installato!). Il file main.c è il sorgente in C, in versione minimalista, che potrete ampliare a vostro piacimento. Nella cartella Release/Exe è contenuto il file serioexp.hex che potrà essere usato per programmare la memoria flash del micro ATtiny2313. Se non volete fare modifiche, vi basta questo. Oltre alla flash, bisogna programmare i “fuses”. Questa è la mappa:

Per chi non vuole scaricare il file, ma vuole solo dare un’occhiata, ecco un estratto del parser dei comandi:

Tutto è stato scritto tenendo presente che dovrà essere facilmente espandibile, anche se già questa versione “base” contiene tutto ciò che è necessario per usare il micro come I/O espander controllato da porta seriale. Questo è un elenco dei comandi attualmente implementati:

Come si vede, è possibile settare la direzione della PortB e della PortD (vedere schema) e scrivere o leggere un byte su/da una delle due porte. Le operazioni a livello bit potranno facilmente essere gestite dall’applicazione su ESP-01, tenendo in memoria un’immagine del contenuto della porta e operando con OR e AND su tale immagine, prima di dare il comando via seriale.

Vediamo ora una semplice demo per ESP-01. Troverete l’applicazione nel file zippato seriodemo1.ino.zip.

Questa semplice dimostrazione accende tre led (Red, Green, Blue) in sequenza, poi fa una breve pausa e ricomincia. I led (il famoso led RGB dell’immagine del prototipo) sono collegati ai pin PB7, PB6 e PB5 che, guarda caso, sono anche i pin utilizzati sul connettore ICSP per la programmazione del micro. Ho quindi fatto un piccolo cavo piatto che mi permette di collegare i led o il connettore di programmazione, secondo le esigenze. I led sono naturalmente collegati tramite resistenze. Il rosso con 220R, il verde con 1K5 e il blu con 1K. Questi valori sono sperimentali, si adattano al led che ho usato, ma potrebbero non essere idonei per altri. Purtroppo non ho le caratteristiche del led usato. L’ho comprato online dai soliti venditori “poco affidabili” che ti dicono che è un anodo comune e poi scopri che è un catodo comune e il PDF è impossibile da trovare, non conoscendo il reale tipo di led. Cose che capitano…

Le prime righe del file .ino contengono alcuni commenti utili per capire il collegamento tra hardware e firmware. Eccole di seguito, per chi volesse farsi un’idea prima di scaricarlo:

Ecco invece l’output del programma in funzione. Grazie al particolare hardware in grado di mixare il serial output principale (TXD) quello secondario (GPIO2) possiamo vedere davvero tutto ciò che succede (a sinistra la finestra di edit, a destra il monitor seriale):

In molti dei miei progetti c’è un “service pin” il cui utilizzo è come monitor di corretto funzionamento e attivazione delle procedure di servizio. In questo caso, la procedura di servizio non esiste (c’è solo il punto di avvio) e l’uso è solo quello di avere un led lampeggiante che indica che il programma sta girando regolarmente. Questo è un uso perfetto per il pin GPIO0, che serve anche a mandare in programmazione il modulo ESP-01. Ricordo che, una volta collegata l’interfaccia seriale, per mandare in modo programmazione flash il modulino bisogna premere e tenere premuto il pulsante su GPIO0, poi premere il pulsante sul pin /Rst , quindi rilasciare /Rst e rilasciare GPIO0. In questo modo l’ESP-01 si resetta ed entra in modo programmazione. Con il circuito presentato, il led “service”, in questa condizione sarà debolmente acceso fisso, mentre in uso normale sarà lampeggiante.

Nota: tutti i files zippati disponibili per il download sono cifrati con la password eficara.

Questo è tutto, per il momento… Se ci saranno altre piccole applicazioni demo, le pubblicherò in articoli successivi, con riferimento a questo.