Programmare Raspberry Pi con i principali linguaggi di programmazione non è una cosa complicata ma al contrario semplice e alla portata di tutti. L'articolo presenta degli esempi pratici per accendere un Led tramite un pulsante. Tutto il codice è ben commentato, descritto e testato su una Raspberry B+ anche se non c'è alcun limite per il suo funzionamento su tutti gli altri modelli attualmente in commercio.
Poter utilizzare sempre il proprio linguaggio di programmazione preferito anche su nuovi ambienti è forse il desiderio di tutti gli sviluppatori. Anche se Raspberry Pi nasce per essere utilizzata con Python questo non esclude di poterla programmare ed interagire con il suo sistema di I/O anche con altri linguaggi.
Python è un linguaggio maturo e potente (l’unico difetto che gli possa attribuire è che non sia nativamente compilabile ma solo usando moduli e procedure esterne). Programmare in Python è spesso un piacere e non gli manca nulla, sia per lo sviluppo client/server sia per il web.
Se però Python non è il vostro linguaggio preferito oppure non volete investire tempo nel suo apprendimento allora sono certo che troverete utile quanto descritto di seguito. Affronteremo una serie di esempi in Python (come punto di paragone), C, Java, Shell, Bash e PHP per accendere e spegnere un LED gestendo un pulsante, le due operazioni alla base di ogni prototipo.
L’articolo è scritto partendo dal presupposto che il lettore conosca almeno uno dei linguaggi presi in esame nel resto del testo e abbia ovviamente una base di conoscenze elettroniche. La descrizione del codice si limita infatti a spiegarne il funzionamento base, non se sia la tecnica di programmazione migliore, lavoro che viene lasciato a chi legge.
IMPORTANTE: per ogni operazione descritta dovete avere i privilegi da amministratore pertanto suggerisco di eseguire per prima cosa il comando “sudo su” e digitare la vostra password, questo vi permetterà di non dover sempre anteporre SUDO ad ogni comando.
Note sulla scrittura del codice
Tutti i programmi qui descritti sono stati scritti con NANO, l’editor base presente in Raspbian. Non ci sono particolari accorgimenti per riscrivere i programmi, io per organizzazione ho creato una cartella “esempi” e delle sotto cartelle col nome del linguaggio, ma ovviamente voi potete strutturare come più vi piace.
home/pi/esempi/c
home/pi/esempi/bash
home/pi/esempi/java
home/pi/esempi/python
Unica eccezione sarà il codice PHP che deve essere posizionato in localhost, ma questo lo vedremo dopo.
Tutti i file hanno nome identico (PulsanteLed) ma con relativa estensione. Ecco quindi che avremo PulsanteLed.c, PulsanteLed.java, PulsanteLed.py, PulsanteLed.php e PulsanteLed.sh. Potete comunque chiamare i file come volete, adattate di conseguenza eventuali mie descrizioni o sintassi dei comandi che troverete nel testo.
Il progetto elettrico
Ovviamente la prima cosa è mettere insieme la componentistica e realizzare il circuito, guardiamo lo schema elettrico:
I componenti sono estremamente elementari:
- un led di qualsiasi colore con la relativa resistenza da 330Ohm.
- un pulsante a 4 o 5 piedini normalmente aperto e relativa resistenza da 1K.
Volendo dare una rapida descrizione al circuito diremo che quando si preme il pulsante porteremo a massa il pin 11. La resistenza da 1K è detta pull-up poiché mantiene alto lo stesso pin. Ad essere sinceri non sarebbe necessaria alcuna resistenza poiché già la RPi ha una resistenza interna che può essere usata sia come pull-up che come pull-down. Questo però è possibile se usassimo la tensione di riferimento da 3,3V, la stessa usata dai pin della GPIO. Nel nostro progetto utilizziamo i 5V pertanto è altamente consigliabile usare una resistenza per non rischiare di danneggiare il circuito.
Esempio base, Python
Non partire con Python sarebbe un grave affronto alla natura del RPi che come sappiamo ha nel proprio nome il post-fisso Pi che sta proprio per Python. Questo codice inoltre verrà usato come punto di paragone con i linguaggi che presenterò. Ma vediamo subito il codice: [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2739 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Molto interessante, un riassunto veramente ben fatto! Io sto lavorando con la wiringPi 😀 magari ti chiederò qualche consiglio in futuro..
Ti ringrazio. Per qualsiasi domanda, se sarò in grado di rispondere, volentieri.
Grazie, a presto allora!
Ciao Gabriele, dopo un po’ di tempo sono riuscito a realizzare un video sulle basi della programmazione con wiringPi e uno sguardo un po’ hardware alla GPIO. Se ti può interessare darmi un parere o solo per curiosità dimmelo che ti riporto il link al video su Youtube! 😀
Bhe, certamente.
Eccolo qui, grazie per l’interesse!
https://www.youtube.com/watch?v=4A4LpGvw0w0
ATTENZIONE: per una svista (mannaggia all’autorouting di Fritzing :D) il pin 6 è in corto col pin 4, ovviamente è sbagliato, il pin 4 non deve essere usato. Mi scuso per l’involontario errore!
Se non ho visto male anche il lato 2 della resistenza da 1 Kohm si collega all’altra resistenza e a massa invece che al pin 2 (+5V). Bell’articolo. Complimenti.
Immagine aggiornata, ora ok 🙂
Ciao Gabriele, piacere rivederti!
Finalmente riesco a leggere un tuo articolo 🙂
Grazie mille Stefano.
Da buon conoscitore di Arduino e scarso di RB devo dire che trovo il tuo articolo molto interessante. Tempo fa avevo cercato informazioni a riguardo ma alla fineil mio RB è diventato un mediacenter collegato al NAS di casa. Quasi tutti utilizzano il Python che volevo evitare per il semplice motivo che non ho nessuna voglia di studiarmi un nuovo linguaggio visto che conosco molto bene il C. Non sapevo dell’esistenza della wiringPI cosa che rende la programmazione di RP sovrapponibile a quella di Arduino e che permette di trasportare in modo molto più semplice i progetti da un mondo all’altro senza doversi “sbattere” con la gestione diretta dei registri se non nei casi in cui diventa realmente necessario. Molto interessante anche la parte su PHP, quanto ci racconti è davvero utile per semplificare la scrittura di interfacce WEB. Grazie, mi hai dato degli spunti davvero interessanti.
Ti ringrazio.
Questo mi serviva, soprattutto perché so meglio il C e non il python.
Un cosa che non capisco è perché hai usato int main (void) al posto di void setup () e void loop () come su arduino?
Grazie per l’aiuto 😉
Ciao Francesco, ho usato “main” perché è la principale funzione del C, questo non è il C like usato per Arduino, è C standard, forse ti confondi con Processor (il mio prossimo articolo). Nel C non puoi usare Setup e Loop come funzioni primarie ma solo Main. Per qualsiasi domanda scrivimi pure.
Quindi funziona come il loop del C like.
Ti chiedo questo perché vorrei realizzare un paio di progetti con il raspberry pi (quello che arriverà grazie all’abbonamento) e, essendo un mondo nuovo, devo capire come programmare, soprattutto per realizzare un vero e proprio software per la gestione dei GPIO e la comunicazione con I2C
Si diciamo che Main è simile a Setup. Se ti piace il C hai due possibilità, la prima è usare il C standard (è consigliabile) oppure dare un’occhiata a Processing (processing.org). Processing è un C like quasi identico a quello di Arduino con in più una libreria specifica per Raspberry.
Si diciamo che Main è simile a Setup. Se ti piace il C hai due possibilità, la prima è usare il C standard (è consigliabile) oppure dare un’occhiata a Processing (processing.org). Processing è un C like quasi identico a quello di Arduino con in più una libreria specifica per Raspberry.
Gabriele, complimenti per la panoramica. Veramente utile per conoscere e comprendere i vari approcci. Personalmente ho maggior esperienza con il Perl e mi chiedevo come mai questo linguaggio sembra un po’ snobbato. O almeno, le uniche librerie che ho trovato (http://goo.gl/TRglmO) non supportano l’evoluzione del bus GPIO a 40 pin. E’ solo una questione di disponibilità dell’autore? Può essere, ma potrei non aver cercato a sufficienza. Sai se esistono librerie Perl per le più recenti versioni di Raspberry?
Purtroppo il Perl non è più un linguaggio favorito dalle comunità, sul web è stato quasi del tutto rimpiazzato da altri linguaggi. Questo a mio avviso il motivo principale del poco lavoro portato avanti sul Perl e del fatto che non si trovino librerie aggiornate. Non ho molte informazioni da darti e se qualcuno ha creato una libreria per RPi immagino non abbia avuto molti riscontri. Io personalmente non ho mai usato Perl. Nonostante questo non è che poi sia così indispensabile, neppure il PHP ha una libreria. A questo punto puoi crearti una tua libreria o funzione richiamando i file e le cartelle come si fa da linea di comando (lo fanno anche le librerie di altri linguaggi) oppure realizzare tanti piccoli script in Python, C o Bash e richiamarli da Perl. Potresti addirittura rilanciare questo linguaggio per la RPi.
Vedi se trovi qualcosa qua: http://raspberrypi.znix.com/hipidocs/contents.htm . Personalmente, ti consiglierei di usare Python o C.
HiPi è un Perl wrapper del ben noto WiringPi. Grazie per l’aiuto.
Salve, mi sto divertendo a pilotare i pin di raspberry attraverso i comandi BASH. Funziona tutto bene tranne quando sul pin 18 BCM voglio la PWM. I comandi che utilizzo sono:
gpio -g mode 18 pwm
gpio pwm 18 512 (oppure anche gpio -g 18 512)
Il primo comando lo metto sempre per settare il pin 18 in modalità BCM e in PWM. Per i comandi di input e output digitali funziona benissimo, con la PWM no, solo in python o in C. Spero che qualcuno mi possa aiutare. Grazie
Salve, purtroppo Bash non è il modo migliore per pilotare in modo efficiente la RPi, però può provare qualche libreria esterna richiamabile come per es. questa: http://abyz.me.uk/rpi/pigpio/pigpiod.html e la relativa Pigs utility. Un’altra può essere questa: https://github.com/richardghirst/PiBits/tree/master/ServoBlaster.
Consiglio ad ogni modo di realizzare piccoli programmi in Python o C e richiamarli.
Grazie Gabriele, gentilissimo! Anche io penso che la cosa migliore sia utilizzare Python o C visto che funzionano alla grande. In ogni caso, mi collegherò ai link che mi ha consigliato, può darsi che trascuro qualcosa. Nel caso le farò sapere. A presto