A cura di Paolo Sirtoli e Danilo Rossi
Il volume di cui parliamo in questo articolo è stato pubblicato nel maggio 2013 e infatti mostra in copertina un esemplare del Raspberry Pi 1, con una enorme presa RCA gialla per l’uscita video ed un GPIO corto, con soli 26 piedini.
Oggi, dicembre 2019, sono cambiate molte cose e il celebre microcomputer è arrivato alla quarta revisione. Il problema è che parecchi passi descritti in questo volume sono obsoleti e costringerebbero l’utente a faticosi e frustranti tentativi, se non ad abbandonare del tutto l’impresa.
Sarebbe un vero peccato, perché il libro illustra molti aspetti sia di Linux che della programmazione embedded, con l’obiettivo di realizzare un sistema di controllo remoto. L’idea è ottima e – sopratutto per i più giovani – diventa un modo accattivante di conoscere a fondo il mondo della programmazione.
Con queste note, quindi, vogliamo dare una mano a chi si accosta al mondo del Raspberry Pi con la dotazione hardware e software dei giorni nostri e – per quanto possibile – estendere le esperienze realizzabili con quel kit poiché avvertiamo una certa fretta nel chiudere il volume, dettata probabilmente da vincoli imposti all’autore.
I primi dieci capitoli del libro sono una valida ed accattivante introduzione al mondo Raspberry Pi – linux – open source. I capitoli successivi, invece, mostrano i segni del tempo. Proviamo a renderli ancora attuali.
Le istruzioni di seguito descritte sono state testate con successo su Raspberry Pi 3 con sistema operativo Raspbian Buster nel dicembre 2019.
Capitolo 11 “montiamo il campo base”
Il DBMS Mysql è stato rimpiazzato – per tutti gli usi previsti dalla licenza GPL – dal suo fork che ha preso il nome di Mariadb. Ecco le istruzioni aggiornate per l’installazione di Apache, MariaDB, PHP (giunto ormai alla versione 7.3) e relativi pacchetti di interconnessione. Lasciamo del tutto perdere la faccenda del ModRewrite.
apt-get install apache2 apt-get install php7.3 apt-get install mariadb-server mariadb-client php7.3-mysql python-mysqldb apt-get install phpmyadmin
Per collegare Apache2 al PhpMyAdmin dobbiamo modificare il file /etc/apache2/apache2.conf e aggiungere in fondo al file la riga
Include /etc/phpmyadmin/apache.conf
Riavviamo apache col comando
sudo service apache2 restart
Infine, è fondamentale modificare la root del sito web come segue, editando il file /etc/apache2/sites-available/000-default.conf e impostare
DocumentRoot = /var/www
A questo punto sarà possibile verificare il tutto aprendo il browser Chromium e digitando l’indirizzo http://127.0.0.1/ che corrisponde al localhost: apparirà una pagina di benvenuto che dimostrerà il funzionamento di Apache.
Per verificare il funzionamento di phpmyadmin basterà digitare l’indirizzo http://127.0.0.1/phpmyadmin
A questo punto, ogni tentativo di entrare fallirebbe, perché non è stato ancora creato alcun utente in Mariadb. Per farlo, dovremo interagire col mysql a riga di comando. Apriamo una finestra terminale e digitiamo quanto segue:
sudo mysql -u root -p
alla richiesta della password lasceremo vuoto e premeremo invio
CREATE DATABASE RaspiBase; CREATE USER 'RaspiUser'@'localhost' IDENTIFIED BY 'RaspiPwd'; GRANT ALL PRIVILEGES ON RaspiBase.* TO 'RaspiUser'@'localhost'; FLUSH PRIVILEGES;
Come avrete capito dalle istruzioni, già che c’eravamo, abbiamo creato anche il database RaspiBase e abbiamo assegnato tutti i suoi privilegi all’utente RaspiUser appena creato.
Faremo ripartire il DB server lanciando
sudo service mysql restart
Capitolo 12 “un giro di allenamento”
Qui è l’installazione del pacchetto espeak a dover essere aggiornata: alle istruzioni descritte in fondo alla pagina 97 dovremo aggiungere
apt-get install python-espeak speech-dispatcher-espeak
A questo punto il comando di pagina 100 farà effettivamente parlare il raspberry.
Capitolo 13 “rilassiamoci con un po’ di elettronica”
Piccoli refusi: a pagina 103 descrivendo il modulo flip/flop si parla del GPIO22, ma i listati proposti in seguito fanno riferimento al GPIO27, descritto invece nel modulo successivo dedicato al messaggio. Semplicemente vanno intesi scambiati:
– il flip/flop è comandato dal pulsante P2 collegato a GPIO27
– la lettura del messaggio è comandata dal pulsante P1 collegato al GPIO22
Questo capitolo va emendato con due note: una nota riguarda l’abilitazione del protocollo I2C. Non bastano le operazioni descritte nelle pagine 104-109, bisogna anche abilitare il modulo kernel I2C dal raspi-config mediante le opzioni
5 - interfacing options P5 - I2C enable/disable
L’altra nota riguarda i piedini 5 6 e 7 dell’integrato PCF8591. Essi definiscono il suo indirizzo logico con un codice a 3 bit, quindi al dispositivo master potrebbero essere collegati 8 dispositivi slave. Ciascuno va identificato da un indirizzo univoco, espresso con il dip-switch a tre vie che collega a massa oppure al positivo di alimentazione i relativi piedini. Il problema è che se provate a mettere in posizione di OFF uno o più piedini, magari per sperimentare un indirizzo diverso, vi accorgerete che il comportamento diventerà impredicibile. Se eseguirete l’esercizio a pagina 109, infatti, vi accorgerete che il sistema rileverà il convertitore ADC a volte all’indirizzo 48, altre volte 4F, altre volte ancora FF…
La spiegazione sta nel fatto che nell’integrato per i piedini 5 6 e 7 non ci sono resistenze interne di pull-up che portano al valore logico 1 il piedino quando non è collegato a massa. Se questi tre piedini non vengono collegati a massa, il loro valore rimane flottante! E voi direte “ma allora a che serve il dip-switch?” … effettivamente, a nulla.
Capitolo 14 “spingiamoci oltre”
Questo capitolo contiene il primo vero e proprio listato Python con cui il lettore si cimenterà. Trascrivere a mano il listato potrebbe sembrare frustrante, in realtà è un utile esercizio per impadronirsi della sintassi di Python. Resistete alla tentazione di scaricare il listato già pronto!
Caratteristica di Python è il fatto che i blocchi di codice non vengono marcati – come in altri linguaggi – dalle parole chiave begin e end o delle parentesi: i blocchi vengono espressi dal livello di indentazione.
In questo specifico listato, tutto filerà liscio, perché il massimo livello di intestazione del codice è tre (verso la fine del listato).
Tuttavia, già nelle ultime righe si vede bene che per esigenze tipografiche le due righe “cur2.execute ….” sono talmente lunghe che il loro livello di indentazione non è chiarissimo. Purtroppo questo problema si ripeterà nei listati successivi, a volte in maniera talmente fuorviante da indurre il lettore a sbagliare.
In questo caso sarà meglio confrontare i propri listati con quelli pubblicati online dall’autore.
Una modifica importante riguarda l’emissione delle stringhe JSON verso emonCMS, che mostrerà i dati in formato grafico. In tutte le istruzioni
requests.post(URL_EMONCMS+"/api/post?apikey=" ...
alla stringa /api/ dovremo sostituire /input/ .
Infine: un refuso nel codice GPIOInt_FF.py di pagina 124 non farebbe funzionare correttamente la segnalazione dei messaggi. Nell’ultima query dovremo assicurarci di scrivere:
cur2.execute("""UPDATE pinStatus SET pinStatus=%s, pinMod=%s, pinMess=%s WHERE pinNumber=%s""", (state_LED, 1, 1, 18))
Capitolo 15 “troviamo un posto per ogni cosa”
Dato che abbiamo già creato il database RaspiBase via terminale, Il listato fornito alle pagine 126 e 127, va modificato come segue:
CREATE DATABASE IF NOT EXISTS 'RaspiBase' DEFAULT .....
In ogni caso, il listato SQL proposto nel libro non è completo: mancano infatti le tabelle pinDescription (tabella inutile, peraltro), xBus e xTemp. Nel materiale pubblicato online viene parzialmente rimediato all’errore, ma mancano le tabelle xDac e xBus. Andranno aggiunte a mano.
Inoltre nel file SQL reperibile online c’è un errore nei dati contenuti nella tabella pinStatus: il pin number 18 è relativo al pinCMS FF_1 e poi va aggiunta la riga relativa al in number 4, con pinCMS = AUX_1.
Altra faccenda fastidiosa: purtroppo il phpmyadmin continuerà a segnalare un errore, che va risolto intervenendo sui file php dello stesso phpmyadmin!!
Alla riga 613 di /usr/share/phpmyadmin/libraries/sql.lib.php le parentesi non sono chiuse correttamente. Ecco la versione opportunamente modificata.
Capitolo 16 “un altro passo avanti”
In questo capitolo il listato LEDServer.py andrà modificato in due punti (righe 51 e 82) perché l’esecuzione dell’istruzione SQL mediante cur.execute sostituisce ai segnaposto %s i valori di una tupla che viene fornita come secondo argomento. Il problema è che se nella stringa SQL compare solamente un parametro, allora il secondo argomento della chiamata cur.execute (X_pinNumber) va trasformato in tupla aggiungendo semplicemente una virgola: dovrà diventare (X_pinNumber,)
Inoltre, senza ulteriori modifiche, con ogni probabilità il sistema andrebbe in errore premendo il tasto P2 di lettura dei messaggi, restituendo “… object has no attribute ‘__getitem__’ perché il blocco di codice che riguarda l’emissione audio dello stato del flip-flop verrebbe letto anche alla pressione di P2.
Per rimediare, dunque, la riga 80 di LEDServer.py diventerà
if (X_pinMess == "1" and X_pinNumber == 18):
Capitolo 17 “un po’ di grafica”
Il framework EmonCMS ha avuto un profondo cambiamento: anche oggi viene utilizzato, sopratutto per realizzare dashboards di impianti fotovoltaici.
L’installazione sul Raspberry Pi è ancora possibile, ma richiede un profondo cambiamento delle istruzioni descritte in questo capitolo.
Quando si crea il database emoncms via riga di comando mysql, occorre anche legargli l’utente RaspiUser che è stato creato in precedenza quando abbiamo installato il phpmyadmin.
GRANT ALL PRIVILEGES ON emoncms.* TO 'RaspiUser'@'localhost'; FLUSH PRIVILEGES;
Quando si va a configurare il sistema copiando e rinominando il file default-settings.php, apparentemente i quattro parametri di connessione e autenticazione vanno al loro posto. Peccato però che l’array $_settings definito all’inizio vada rinominato in $settings, pena l’impossibilità di accedere al DB!
Quanto al mod_rewrite, a differenza di quanto dice il libro a pagina 157, al file 000-default.conf, sarà sufficiente aggiungergli le seguenti righe:
<Directory /var/www> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Altro problema: EmonCMS di default NON installa il componente Dashboards, necessario per i nostri scopi. Occorre importarlo usando Git.
cd /var/www/emoncms/Modules sudo git clone https://github.com/emoncms/dashboard sudo apt-get update sudo apt-get install php7.3-mbstring cd /var/www/emoncms/dashboard sudo git pull origin master
Al termine di questa operazione di installazione, entrare in EmonCMS dal browser, entrare nell’area Admin, cliccare sulla freccina in basso accanto alla scritta Full Update e scegliere l’opzione “Update Database”. Ricordatevi che le API key sono cambiate e potete trovarle nel pannello “input” e cliccando sul link in alto a destra “input API help”.
Solo così sarà possibile creare la dashboard per il nostro sistema di controllo remoto.
Importante: quando vengono creati gli input, occorre definire per ciascuno di essi un processo che inoltri i valori ai rispettivi feed. Per fare questo, cliccare sul simbolo della chiave inglese a destra degli input e procedere come illustrato nell’immagine seguente.
Capitolo 18 “sempre più in alto”
In questi capitoli finali le correzioni saranno numerose.
Iniziamo dal codice contenuto nella pagina 170. Meglio scrivere l’IP del localhost e ricordare che l’API key nel frattempo è cambiata
<iframe src="http://127.0.0.1/emoncms/dashboard/view?id=1&apikey=469afc429237d13d1f4e937df7362284" width="90%" ...
In questi anni la libreria PHP di connessione a mysql è cambiata radicalmente e oggi si usa mysqli = mysql improved extension. Vanno quindi adattate tutte le istruzioni di connessione e di query. Riportiamo solo un esempio, lasciando al lettore il compito di adattare il codice presentato nel libro (sia per index.php che per i quattro files php ausiliari).
Vecchio codice | Mysqli |
$dbConnection = mysql_connect($host, $user, $password); mysql_select_db($mysqldb, $dbConnection); | $dbConnection = mysqli_connect($host, $user, $pass, $mysqldb); |
mysql_query(stringaSQL); | mysqli_query($dbConnection, stringaSQL); |
mysql_real_escape_string(stringa); | mysqli_real_escape_string($dbConnection, stringa); |
mysql_fetch_assoc($query); | mysqli_fetch_assoc($query); |
mysql_fetch_array(stringa, MYSQL_ASSOC) | mysqli_fetch_array(stringa , MYSQLI_ASSOC ) |
mysql_close(); | mysqli_close(); |
Capitolo 19 “accendiamo tutto”
Lo script di shell che lancia tutti i sottoprogrammi deve essere lanciato in modalità root, dunque il comando all’inizio di pagina 183 dovrà essere:
sudo ./GPIO_start.sh
Il sistema di controllo descritto nel libro è didatticamente molto utile e copre anche gli aspetti avanzati (programmazione concorrente). Tuttavia vogliamo sottolineare una nota a proposito del Dimmer. I valori ammissibili vanno da 0 a 255 (8 bit). Il funzionamente può trarre in inganno il lettore, poiché la caratteristica di luminosità del LED rosso in funzione della tensione non è affatto lineare. Infatti esso comincerà ad accendersi a valori prossimi a 130, per saturare a valori prossimi a 200. Sarebbe stato interessante aggiungere al circuito una uscita PWM, per mostrare come controllare in modo lineare la luminosità dei LED o addirittura per controllare un servomotore.