Scopri Ganimede.E12: La Scheda di Sviluppo Che Rivoluziona il DIY Elettronico

Versatile ed economica scheda di sviluppo basata su ESP12, dotata di USB, WiFi, slot mikroBus e Grove. Programmabile tramite IDE Arduino, Micropython o Javascript.

Negli ultimi anni abbiamo assistito ad una importante proliferazione di nuovi strumenti di sviluppo, che hanno sempre di più allargato il perimetro delle possibilità progettuali dei Maker.

Questi nuovi strumenti hanno consentito di migrare il range applicativo dai semplici progettini con LED e pulsanti, verso sistemi sempre più complessi e connessi.

Se Arduino è sicuramente definibile come il capostipite di questa famiglia di strumenti, sistemi di sviluppo come NodeMCU, ESP32 Thing e Raspberry Pi Pico ne costituiscono sicuramente la nuova generazione.

Le schede citate in precedenza sono tutti strumenti validi, ma spesso presentano il difetto di non supportare un ben definito standard di interfacciamento hardware, esponendo semplicemente quanti più pin possibili verso l’esterno tramite delle comuni strip a passo 2,54 mm.

Questa configurazione hardware richiede quindi che l’utente utilizzi collegamenti cablati tramite cavetti tipo dupont e breadboard per la realizzazione delle applicazioni finali basate su queste schede, portando spesso a realizzazioni hardware molto sommarie, ingombranti e scomode da gestire sul campo (Fig. 1).

Fig. 1 Tipica realizzazione hardware basata su NodeMCU.

 

Per ovviare a questo problema abbiamo pensato di realizzare una semplice scheda di sviluppo che utilizzasse standard di interfacciamento hardware comuni e per i quali esistono già svariate breakout board con i vari sensori ed attuatori necessari per i tipici progetti hobbistici.

Abbiamo inoltre voluto che questa scheda mantenesse le caratteristiche dei sistemi descritti in precedenza, e quindi che fosse economica, semplice da utilizzare, dotata di interfacciamento USB e WiFi ed in grado di supportare una vasta gamma di linguaggi di programmazione e frameworks.

 

Ganimede.E12

Il risultato dei nostri ragionamenti è una famiglia di schede con hardware totalmente open, basata sul modulo ESP12, prodotto da AI-Thinker (a sua volta basato sul SoC ESP8266, con l’aggiunta di memoria Flash QSPI, antenna WiFi integrata e tutta la circuiteria necessaria al funzionamento del SoC stesso); ciascuna scheda è dotata di interfacciamento hardware verso gli standard Mikroelektronika MikroBus (Click Boards) e SeedStudio Grove, in modo da poter utilizzare tutte le breakout board messe a disposizione da questi due standard.

Ogni board è dotata inoltre, di porta USB per programmazione, debug ed interfacciamento verso Host PC, di connettore per interfacciamento con standard NeoPixel e 1-Wire, nonché per display OLED da 0,96’’ I²C-Bus. Abbiamo deciso di chiamare questa famiglia Ganimede, ed il modello specifico Ganimede.E12, per evidenziare il fatto che sia stata sviluppata partendo dal modulo ESP12.

Ganimede è una piccola luna di Giove ed il nome è stato scelto per rappresentare il parallelismo tra il macrosistema costituito dagli strumenti di sviluppo per maker ed hobbisti (Giove) ed il piccolo ecosistema derivato che intendiamo costruire. Nella Fig. 2 è riportata la scheda Ganimede.E12, dalla quale si vede la dotazione hardware.

Fig. 2 La board Ganimede E.12.

 

Schema elettrico di Ganimede.E12

Dopo aver descritto a grandi linee il progetto, passiamo alla descrizione hardware di dettaglio della scheda, per la quale ci riferiamo allo schema elettrico visibile nella pagina qui accanto.

Come già anticipato, il cuore della nostra scheda è il modulo ESP12 (indicato nello schema elettrico come U1).

E’ stato scelto questo particolare modello in quanto risulta estremamente diffuso ed economico, oltre ad essere dotato di antenna WiFi integrata (e certificata), risolvendo di conseguenza la problematica dell’implementazione dell’antenna su PCB.

Sebbene la maggior parte della circuiteria necessaria per il funzionamento dell’ESP8266 sia effettivamente racchiusa all’interno del modulo, ci sono alcuni accorgimenti importanti da implementare dal punto di vista hardware affinchè il modulo funzioni correttamente.

Per prima cosa ci sono alcuni pin speciali che devono essere opportunamente gestiti. Il primo è il pin EN (o chip-enable), che permette di mettere il chip in basso consumo dall’esterno, portando il pin stesso ad un valore logico basso.

Non prevedendo di utilizzare questa funzionalità, abbiamo portato costantemente il pin ad un valore logico alto tramite la resistenza di pull-up da 10kohm R5.

L’altro pin speciale è il pin RST, che permette di resettare il modulo dall’esterno. Noi abbiamo deciso di fornire la possibilità all’utente di resettare tramite un pulsante, quindi abbiamo collegato il pin RST al pulsante SW2, e mantenuto per impostazione predefinita lo stesso pin ad un valore logico alto tramite la resistenza R13, sempre da 10 kohm.

In questo modo è possibile resettare la scheda premendo il pulsante SW2. I pin 9, 10, 11, 12, 13 e 14 sono da non collegare, perché sono utilizzati all’interno del modulo ESP12 per interfacciare la memoria programma QSPI interna da 4MB, nella quale viene salvato il codice da eseguire.

Ci sono poi una serie di GPIO standard dotati di doppia funzionalità, potendo funzionare come normali GPIO in running, ma che vengono letti dal SoC allo startup per determinare la modalità di boot.

Questi pin sono GPIO0, GPIO2 e GPIO15. In sostanza, allo startup, il SoC può eseguire il codice precedentemente flashato sulla Flash QSPI internal (Flash Boot) oppure, in alternativa, entrare in modalità bootloader UART (indicato come UART nella Tabella 1) e permettere l’aggiornamento della memoria Flash con un nuovo programma.

La sezione di codice che implementa il bootloader UART è memorizzata in una ROM interna al SoC, e quindi non modificabile accidentalmente, rendendo il sistema molto robusto. Per entrare nelle due modalità, i pin GPIO 0, 2 e 15 devono avere ben determinati valori, come indicato nella Tabella 1, estratta dal datasheet del modulo ESP12.

Come si può vedere, GPIO15 e GPIO2 devono stare sempre, rispettivamente, a GND e VCC, cosa che è stata ottenuta nel nostro schema tramite l’uso della resistenza di pull-down R6 e della resistenza di pull-up R15. Lo stato di GPIO0 determina effettivamente la modalità di startup, quindi abbiamo collegato questo pin al pulsante SW1 (Flash) e lo abbiamo portato a livello logico alto tramite R12.

In questo modo la scheda parte sempre in modalità Flash Boot (ossia esegue il programma contenuto nella memoria Flash esterna), a meno che all’avvio non sia premuto SW1, nel qual caso viene avviamo il bootloader UART, consentendo l’aggiornamento del programma (bootloading).

Infine un altro pin degno di attenzione è ADC_IN, che è l’unico pin analogico dell’ESP8266, ma ha una dinamica di tensione che va da 0 a 1V, mentre il SoC è alimentato a 3,3V. Di conseguenza abbiamo dovuto adattare la dinamica di tensione in ingresso a questo pin tramite il partitore di tensione costituito da R7 ed R8, rispettivamente da 220 kohm e 100kohm, ottenendo:

Un ultimo pin con funzione speciale è GPIO16, che è utilizzato come pin di wake-up. Noi abbiamo deciso di non implementare questa funzionalità, preferendo utilizzare GPIO16 per il controllo del LED LD2. Infine, tra Vcc e GND del modulo è stato collegato il condensatore di bypass C1, da 100nF.

Passiamo adesso alla descrizione della sezione USB: Ganimede.E12 dispone di un’interfaccia USB 2.0 che può essere utilizzata sia come porta di comunicazione seriale, che per la programmazione della scheda, in quanto è collegata alla porta UART che viene utilizzata come canale di comunicazione dal ROM bootloader.

Questa porta è costituita da due elementi: il connettore USB CN1 ed il convertitore USB-Seriale U3 (CH340G). Il connettore CN1 è un connettore USB-C, adattato allo standard USB2.0.

Questo vuol dire che può essere utilizzato per il collegamento, un cavetto USB-C, ma non tutte le funzionalità dello standard USB 3.0 sono supportate (ad esempio non è possibile utilizzare la piena banda di comunicazione o negoziare con l’host livelli di corrente USB 3.0).

Tuttavia sono mantenute le caratteristiche meccaniche, ossia la robustezza e la facilità di inserimento del connettore e la sua simmetria, ossia la possibilità di inserire il connettore in entrambi i versi. L’altro elemento dell’interfaccia è il convertitore USB-seriale CH340G.

Questo dispositivo è in grado di convertire una linea differenziale USB 2.0 in una porta UART standard, implementando di fatto una specifica classe di comunicazione USB, la classe CDC: Communication Device Class, pensata per soppiantare tramite lo standard USB, le vecchie porte seriali standard RS232.

Per funzionare il CH340G necessita solamente del circuito di oscillazione costituito dal cristallo Y1 da 12MHz e dai due condensatori C5 e C6 da 12pF, oltre che dai condensatori C7 e C8, rispettivamente da 10uF e 100nF e C9 da 100nF.

Il dispositivo è collegato tramite linea differenziale ai pin D+/D- del connettore USB e tramite una linea standard UART (TXD ed RXD, pin 2 e 3) ai pin GPIO1 e GPIO3 del modulo ESP-12. In questo modo il modulo vede una porta standard UART, mentre un qualsiasi dispositivo USB Host (ad esempio un Personal Computer) vede la scheda come un dispositivo USB 2.0.

Passiamo adesso alla descrizione della sezione di alimentazione. La porta USB appena descritta è anche la principale sorgente di alimentazione della scheda, ma i 5V forniti dal dispositivo USB host (o da un alimentatore USB standard), necessitano di essere adattati a 3,3V, in quanto quella è la tensione di lavoro del modulo ESP12 (il CH340G funziona invece a 5V).

Per adattare questa tensione è stato utilizzato il regolatore lineare SPX3819M5-L-3-3 (U2), in grado di erogare fino a 500mA, più che sufficienti per il funzionamento della Ganimede.

Per il suo funzionamento il regolatore necessita della circuiteria di condensatori costituita da C2 (1uF), C3 (470pF) e C4 (10uF). Il LED LD1, con la sua resistenza di limitazione R9, è stato posto a valle del regolatore per indicare la presenza della corretta tensione di funzionamento. La parte restante della scheda è costituita da una serie di connettori che permettono di interfacciare standard di espansione hardware.

In particolare la scheda è dotata di:

• un socket Mikroelektronica mikroBus (CN2), che permette di interfacciare le popolari Click board prodotte da Mikroelektronica, per il quale sono disponibili più di 1000 schede attualmente in commercio;
• un socket Seed Studio Grove (CN3), che permette di interfacciare i dispositivi dello standard Grove, per il quale esistono circa 200 breakout board in commercio;
• un header a 3 poli (CN4) con il quale è possibile interfacciare dispositivi NeoPixel, quindi LED Strip o Moduli LED Neopixel di vario tipo, ma anche dispositivi 1-wire, quindi sensori di temperatura tipo DS18B20 o dispositivi simili;
• due header a 4 poli (CN6 e CN7) pensato per l’interfacciamento di OLED da 0,96’’ tramite protocollo I²C o dispositivi similari.

Gli Standard MikroBUS e Grove

I due connettori di espansione della Ganimede.E12 che offrono maggiori possibilità sono CN2 e CN3, che permettono di interfacciare rispettivamente gli standard Mikrobus e Grove. Analizziamo più in dettaglio le caratteristiche di questi due standard. MikroBus è uno standard di connettività hardware per microcontrollori e dispositivi embedded, sviluppato dall’azienda Serba Mikroelektronica.

È stato progettato per fornire un modo semplice e conveniente per connettere sensori, attuatori e altri componenti a microcontrollori di vario tipo.

Lo standard è basato su un connettore (o socket), con pin-out standardizzata, riportato in Fig. 3.

Fig. 3 Piedinatura del connettore standard Mikrobus.

 

Il prodotto più noto che fa uso dello standard sono le schede della linea Click, prodotte sempre da Mikroelektronica, delle quali esistono più di 1.000 diverse varianti in commercio, ognuna con una specifica funzione e con un proprio hardware. La specifica dello standard è open source.

La specifica permette che anche altri produttori di schede possano adoperare la specifica nelle loro realizzazioni hardware o anche contribuire nella realizzazione di nuovi dispositivi.

L’utilizzo di uno standard di connettività come Mikrobus semplifica notevolmente lo sviluppo di progetti embedded.

Gli sviluppatori possono concentrarsi sulle loro attività di codifica, poiché il connettore Mikrobus fornisce una soluzione semplice e conveniente per la connessione di componenti. Inoltre, questo standard è molto comodo per la prototipazione rapida, poiché gli sviluppatori possono facilmente sostituire o aggiungere componenti al loro progetto senza dover preoccuparsi della connessione hardware.

In fig. 4 è rappresentata la scheda ganimede.e12 connessa ad una click board Relay.

Fig. 4 Ganimede.E12 con Click Relay montata sul suo socket Mikrobus.

 

Grove è un altro standard molto diffuso nel panorama hobbystico/maker creato da SeedStudio.

Si tratta di un altro standard di espansione hardware che però, a differenza di MikroBus, che utilizza un socket con 16 poli e breakout dotate di connettori equivalenti (è quindi possibile pluggare le schede su socket), usa un connettore standard a 4 poli e breakout connesse via cavo.

I 4 pin del connettore standard grove portano potenza e segnali e questi ultimi hanno delle connessioni che variano a seconda della tipologia di scheda connessa:

• pin 1 – Giallo – Segnale 1; può essere l’SCL del bus I²C, Digital I/O, Analog, UART RX a seconda della scheda connessa;
• pin 2 – Bianco – Segnale 2; può essere SDA dell’I²C, Digital I/O, Analog, UART TX a seconda della scheda connessa;
• pin 3 – Rosso – VC; comune a tutti i connettori;
• pin 4 – Nero – GND; ripetuto su tutti i connettori.

Anche in questo caso abbiamo una vasta gamma di dispositivi, circa 200-300 unità (Fig. 5) che possono essere connessi alla nostra scheda Ganimede.

 

Fig. 5 Sistema Grove.

Installazione dell’interprete Micropython

Come abbiamo già anticipato, la scheda Ganimede.E12 è programmabile con una varietà di linguaggi di programmazione, tutti molto validi.

Sicuramente una scelta ideale per chi comincia ad utilizzarla è MicroPython, che è un ambiente semplice da apprendere, ma sorprendentemente potente.

Una descrizione dettagliata degli step necessari all’installazione dell’ambiente MicroPython, con anche una serie di esempi, può essere trovata nella sezione Python del repository GitHub della scheda.

Per vostra comodità, riportiamo qui di seguito l’intera procedura.
Step 1: per prima cosa occorre scaricare il firmware Micropython.
Step 2: ora che abbiamo il firmware, occorre flasharlo sulla scheda. Per poterlo fare abbiamo bisogno di un tool fornito alla expressif, che si chiama ESPtool. Il tool è a sua volta basato su Python, quindi occorre averlo installato sulla macchina che verrà effettivamente utilizzata per flashare la scheda. Istruzioni utili all’installazione del tool stesso ed alla soluzione di eventuali problemi possono essere reperite al seguente link.
Step 3: a questo punto possiamo procedere alla programmazione, e per prima cosa va attivato il bootloader. Come abbiamo visto possiamo farlo tenendo premuto il tasto SW2 all’accensione o al riavvio della scheda. Una volta attivato il bootloader possiamo flashare, aprendo una finestra di comando nella directory nella quale abbiamo scaricato ed estratto ESPtool, scrivendo le seguenti righe:

esptool.py –port [VCP] erase_flash

per la cancellazione della memoria e:

esptool.py –port [VCP] –baud 460800 write_flash –flash_size=detect 0 esp8266.bin

per il flashing dell’inteprete MicroPython.

In entrambe le righe [VCP] sta ad indicare il numero della porta COM virtuale associata alla scheda (ad esempio COM3 o COM5).

Invece esp8266.bin rappresenta il file binario dell’interprete Micropython, che deve essere copiato nella stessa directory (cartella) dalla quale eseguirete la finestra di comando. A questo punto l’interprete è presente sulla scheda e possiamo utilizzare un editor Python per programmarla.

Come editor suggeriamo Thonny, perché è molto semplice da utilizzare, del quale la Fig. 6 propone una schermata.

Fig. 6 L’editor Python Thonny.

 

Una volta installato Thonny, potete aprirlo e configurare l’interprete per lavorare con Ganimede. Per farlo, cliccare con il tasto sinistro del mouse nell’angolo in basso a destra e selezionate l’opzione “Configure Interpreter”, come illustrato in Fig. 7.

Fig. 7 Selezione delle opzioni di configurazione dell’interprete micropython.

 

A questo punto navigate nel tab “Interpreter” selezionate (Fig. 8):
• nel primo combobox, MicroPyhon(Esp8266);
• nel secondo combobox, USB-SERIAL CH340 (VCP).

 

Fig. 8 Selezione delle opzioni dell’interprete.

 

Dove VCP è la porta COM virtuale associata alla vostra scheda Ganimede dal vostro Personal Computer.

Da questa stessa finestra, tramite l’opzione “Install or update Firmware”, è possibile installare una nuova versione di MicroPython, senza dover chiudere l’editor Thonny o dover ricorrere agli script batch presentati nella sezione precedente.

Selezionando l’opzione “Install or update Firmware”, si aprirà una finestra di dialogo come quella proposta in Fig. 9,

Fig. 9 Aggiornamento o installazione del FW MicrfoPython direttamente da Thonny.

 

dalla quale potrete selezionare il binario MicroPython da caricare  sulla scheda e la porta COM virtuale. Se tutto è andato a buon fine, una volta resettata o scollegata e poi ricollegata la scheda Ganimede.E12, nella Shell di Thonny dovreste vedere un prompt simile a quello di Fig. 10 (la versione di MicroPython potrebbe essere differente).

Fig. 10 REPL di MicroPython.

 

Il prompt che vedrete è i REPL, acronimo di Read Evaluate Print Loop, ed è il nome che è stato dato alla shell di MicroPython con la quale è possibile interagire.

Hello World in Micropython

Ora che abbiamo Micropython installato sulla nostra Ganimede.E12, possiamo implementare il nostro primo, semplice script. Come nel più classico dei casi, vogliamo far lampeggiare il LED utente alla frequenza di 1Hz. Apriamo Thonny e scriviamo lo script riportato qui di seguito:

from machine import Pin
import time
led = Pin(16, Pin.OUT)

while True: led.value(not led.value())
if (led.value()): print(“Il LED è acceso!!!”)
else: print(“Il LED è spento!!!”) time.sleep(1)

Lo script inizia importando le librerie “machine” e “time” che forniscono rispettivamente l’accesso alle funzionalità del microcontrollore e alle funzioni di timing. Quindi, si crea un oggetto “led” utilizzando la classe Pin.

L’oggetto “led” viene inizializzato con il numero di pin 16 (collegato allo user LED, come abbiamo visto in precedenza) e il modo “Pin.OUT”, il che significa che il pin viene configurato come uscita. La sezione di codice all’interno del ciclo “while” viene eseguita in continuazione. Il codice all’interno del ciclo cambia il valore del pin utilizzando la funzione “led.value(not led.value())”.

Questo codice inverte il valore corrente del pin 16 ad ogni ciclo del ciclo “while”, spegnendo o accendendo il LED ad ogni iterazione.

L’istruzione condizionale if…else serve a stampare sulla Shell lo stato del LED, tramite l’istruzione print. Infine, la funzione “time.sleep(1)” fa sì che il programma attenda un secondo prima di passare alla prossima iterazione del ciclo “while”.

Questo fa in modo che il LED lampeggi alla frequenza di 1Hz. In Fig. 11 è riportato l’output della shell con lo script in funzione.

Fig. 11 Script di esempio in funzione.

Conclusioni

Come avete potuto vedere in queste pagine, la Ganimede.E12 è una scheda estremamente versatile e semplice da utilizzare, specialmente utilizzando linguaggi di programmazione evoluti come Micropython.

Allo stesso tempo la scheda è molto economica ed è facilmente espandibile tramite gli standard MikroBus e Grove e gli altri connettori di cui dispone, e permette di realizzare applicazioni complete senza fare ricorso all’utilizzo di breadboard o cavetti volanti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Menu