Setup ESP8266 SDK RTOS con Linux ubuntu 18.04

Avrete sicuramente sentito parlare dell’ESP8266, negli ultimi anni questo chip sta spopolando fra appassionati di elettronica e progettisti del settore.
Si tratta di un chip low-cost prodotto dalla cinese Espressif Systems, integra al suo interno un potente microcontrollore e funzionalità WiFi con lo stack TCP-IP completo.
In commercio possiamo trovare tante board, in diversi formati che montano questo chip, ma in sostanza il cuore non cambia.
Personalmente ho acquistato la board nodeMCU v2 come questa e sono rimasto sorpreso dalle sue potenzialità:
nodeMCU v2 board
Integra già il convertitore USB seriale e la potete comodamente alimentare da USB, a differenza di altre dove è necessario fare adattatori vari o, ancora peggio, dove non avete a disposizione tutte le uscite.

Caratteristiche tecniche

  • Processore: microprocessore RISC L106 a 32 bit, basato su Tensilica Xtensa Diamond a 80 o 160 MHz
  • 64 KiB di RAM per le istruzioni, 96 KiB di RAM dati
  • Flash SPI esterna: da 512 KiB a 16 MB (la nodeMCU v2 ha 4MB di FLASH )
  • IEEE 802.11 b/g/n Wi-Fi
  • 16 pin GPIO
  • 1 SPI
  • 1 I²C
  • 1 Interfacce I²S con DMA (pin condivisi con GPIO)
  • 2 UART (1 con TX e RX dedicati, l’altra solo TX condiviso con GPIO)
  • 1 10-bit ADC ad approssimazioni successive

Scelta dell’ambiente di sviluppo

Il modulo nodeMCU viene spedito con già il firmware di default caricato, vi consente di programmare l’ESP8266 scrivendo sostanzialmente degli script in linguaggio Lua.
Personalmente non utilizzo questo metodo in quanto preferisco scrivere il codice direttamente in C, è sicuramente un metodo più professionale e performante.
Per scrivere il nostro software in linguaggio C abbiamo 2 strade:

  • IDE di Arduino
  • SDK Espressif + IDE Eclipse

Ho provato entrambi, l’IDE di Arduino è molto semplice da installare e utilizzare, ci sono una miriade di librerie già pronte all’uso e tanti tutorial in rete. come contro non abbiamo a disposizione il correttore di sintassi e i collegamenti automatici alle funzioni.
Se vogliamo a disposizione un vero e proprio ambienti di sviluppo con tutte le comodità che ne derivano io consiglio di usare Eclipse.

Setup SDK e toolchain

Per scrivere il firmware di un modulo ESP8266 la casa madre ci mette a disposizione 2 alternative:

  • SDK basato su FreeRTOS
  • SDK senza RTOS

Come si può intuire, il primo SDK è basato sul sistema operativo FreeRTOS, utilizzando questa tipologia avremmo a disposizione le funzionalità di un sistema operativo embedded vero e proprio: Task, semafori, mutex etc…
La seconda tipologia non è basata su nessun sistema operativo, è più leggera da eseguire e genera solitamente codice più compatto.
Teoricamente potremmo scrivere lo stesso firmware sia con che senza sistema operativo, ma in modo diverso.
Io utilizzo SDK RTOS, come prima cosa creiamo una cartella dove scaricheremo il Software Development Kit, apriamo un terminale nella nostra home directory e digitiamo

mkdir ESP8266
cd ESP8266
mkdir SDK
cd SDK
git clone https://github.com/espressif/ESP8266_RTOS_SDK.git

Poi dobbiamo scaricare anche la toolchain necessaria alla compilazione:

wget https://dl.espressif.com/dl/xtensa-lx106-elf-linux64-1.22.0-88-gde0bdc1-4.8.5.tar.gz
tar -xzf xtensa-lx106-elf-linux64-1.22.0-88-gde0bdc1-4.8.5.tar.gz

Ora abbiamo a disposizione tutto quello che ci serve per procedere alla compilazione di un progetto di esempio.

Compilazione di esempio

Copiamo un progetto di esempio nella cartella ESP8266, che useremo come cartella base per i nostri progetti:

cd ..
cp -r SDK/ESP8266_RTOS_SDK/examples/get-started/project_template .

A questo punto dobbiamo esportare nelle variabili di ambiente la variabile IDF_PATH, che rappresenta la cartella dell’SDK e aggiungere alla variabile PATH il percorso della toolchain in modo da poter utilizzare il compilatore.

export IDF_PATH=/home/luca/ESP8266/SDK/ESP8266_RTOS_SDK/
export PATH=$PATH:/home/luca/ESP8266/SDK/xtensa-lx106-elf/bin/
make menuconfig

Dopo avere eseguito il comando make menuconfig se tutto è andato a buon fine ci troveremo una finestra come questa:
finestra menuconfig
In questo menu dobbiamo settare la porta seriale utilizzata per comunicare con il nostro ESP8266 entrando nel menu “Serial flasher config” alla prima voce.
Per il resto se non sapete cosa state facendo non toccate nulla.
Ora eseguiamo il comando make e attendiamo la fine della compilazione, ci vogliono pochi istanti; se tutto è andato a buon fine e non otteniamo errori siamo pronti a scrivere il firmware sull’ESP8266, per farlo utilizziamo il comando:

make flash

Questo firmware in particolare non fa nulla di che, serve come base di partenza, ma ora potete sbizzarrirvi e provare gli altri esempi o scrivere il vostro codice.

Creare chiavetta USB bootable avviabile

Quando dobbiamo installare un sistema operativo partendo da zero possiamo seguire diverse strade:

  • Creare un CD/DVD bootable
  • Creare una chiave usb bootable
  • Utilizzare il boot tramite PXE (metodo poco utilizzato)

La soluzione più comoda è sicuramente la creazione di una chiavetta usb bootable partendo dal file iso.
Possiamo trovare facilmente in rete immagini iso sia di Linux che di Windows.

  • Per linux basta andare sul sito della distribuzione che ci interessa, io consiglio Ubuntu (link)
  • Microsoft invece mette a disposizione per Windows 10, Media Creation Tool, un comodo software per il download dell’iso

Ovviamente per quanto riguarda Windows la copia che installeremo andrà attivata con una chiave di licenza acquistabile a parte.

Ora che abbiamo il file iso, non possiamo copiarlo semplicemente sulla pen-drive ma dobbiamo farlo tramite un software ad-hoc.
In rete se ne trovano tanti, ma io trovo molto comodo usare Rufus (download) è leggerissimo e non necessita di setup.

La dimensione minima della chiave usb deve essere almeno 4GB meglio se da 8GB

Dopo averlo avviato saremo di fronte a una finestra come questa
Schermata iniziale Rufus
In dispositivo/unità si vede già che ha rilevato una pen drive da 8GB.
Clicchiamo ora su seleziona e andiamo a prendere il file iso che ci interessa.
Come potete vedere il software capisce in automatico se deve creare una chiavetta bootable con partizione MBR o GPT.
In opzioni di formattazione consiglio di lasciare tutti i parametri invariati.
Ora clicchiamo su AVVIA e confermiamo la message box dove ci avverte che stiamo per cancellare tutti i dati dalla nostra pen drive.
La durata della procedura varia in base alla velocità della vostra chiavetta
e ai dati da scrivere ma ci possono volere anche 15 minuti.
Al termine avrete una chiave usb bootable a disposizione, pronta per il setup del vostro nuovo sistema operativo.

Ubuntu 18.04 spostare la Home su un nuovo hard disk

Può capitare di rimanere a corto di spazio e di volere aggiungere un hard disk, oppure di installare il sistema operativo su un nuovo SSD e di volere mantenere invece la cartella Home sul vecchio hard disk.

Questa operazione è permessa in fase di installazione di Ubuntu, in alternativa se avete già tutto installato dovete seguire questi semplici passaggi.

I vantaggi di avere la cartella home separata sono diversi:

  • Possibilità di reinstallare il sistema operativo senza perdere dati utente
  • Proteggere meglio i dati dell’utente
  • In caso si utilizzi un HDD a stato solido per il sistema operativo possiamo mettere tutto il resto su un HDD meccanico con capacità superiore
ATTENZIONE!!! Prima di ogni operazione raccomando un backup di tutti i dati.

Prima di iniziare a seguire la guida do per scontato che abbiate già un hard disk formattato con la partizione che preferite (ext4 o brtfs) su cui spostare la cartella home di dimensioni maggiori alla attuale cartella home.

Iniziamo montando il nuovo disco rigido con il comando

sudo mkdir /media/home
sudo mount /dev/sdxx /media/home

Dobbiamo sostituire a sdxx il nome della nostra partizione.

Copiamo l’attuale cartella home in quella appena creata in modo da averne una copia esatta sul nuovo disco (questa operazione potrebbe richiedere un po di tempo)

sudo cp -priv /home/[nome utente] /media/home

Mettete al posto di [nome utente] il vostro nome utente

A questo punto buona parte del lavoro è fatto. Dobbiamo dire a Ubuntu di utilizzare la nuova cartella home e per farlo dobbiamo andarlo a scrivere nel file /etc/fstab.
Il file fstab è molto importante per linux e una modifica errata ne impedirebbe l’avvio quindi per prima cosa facciamo una copia di backup.

sudo cp /etc/fstab /etc/fstab.backup

Cerchiamo l’UUID della nostra partizione

sudo blkid /dev/sdxx

Dobbiamo sostituire a sdxx il nome della nostra partizione che contiene la nuova home
Il codice che ci interessa è quello che appare dopo UUID=”xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”, copiamo questo valore.
Apriamo con i privilegi di amministratore il file /etc/fstab

sudo gedit /etc/fstab

il file che si aprirà sara molto simile a questo:

andiamo in fondo al file e aggiungiamo questa riga

UUID=[xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx] /home [tipo ile system] defaults 0 2

dove al posto di [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx] mettiamo l’UUID della nostra partizione che abbiamo recuperato prima e al posto di [tipo ile system] mettiamo il tipo di file system con cui la abbiamo formattata, di solito ext4 o brtfs.

Qui sotto uno screenshot del file fstab come deve venire

Cosi facendo diciamo a Ubuntu di montare la partizione con l’UUID indicato nel percorso /home e abbiamo raggiunto il nostro scopo.
Dobbiamo salvare e riavviare.

Nel caso in cui Ubuntu non riparta con conseguente messaggio di errore avremo la possibilità di ripristinare il file fstab precedentemente salvato digitando da shell il comando

cp -f /etc/fstab.backup /etc/fstab

D’ora in poi tutto ciò che farete nella directory home sara effettuato nella nuova partizione allocata nel disco rigido aggiunto, ma rimane una ultima cosa da fare: per essere precisi dobbiamo cancellare il contenuto della vecchia cartella home contenuta nel nostro primo disco rigido.
Questa operazione non è necessaria ma diventa importante nel caso in cui dovessimo recuperare un po di spazio per l’installazione di nuovi programmi.
Per potere cancellare la vecchia home è necessario fare partire il pc con un disco bootable di Ubuntu ed avviarlo in modalità live.