Far lampeggiare un LED è il primo programma che si affronta per conoscere meglio un computer interfacciato al mondo esterno
L'hardware
L'anodo del LED è collegato al pin fisico 11 del GPIO, mediante un resistore di limitazione R1 da 330 Ω ; il catodo è collegato alla massa del Raspberry (pin fisico 6). Il LED si accende quando si manda sul pin un bit 1 (corrispondente a circa 3,3V) e si spegne inviando un bit zero (circa 0V).
Per il calcolo della resistenza R1 di limitazione, si è assunta una tensione diretta del LED rosso pari a 1,8V. Per la corrente di uscita di un pin GPIO è bene mantenersi fra i 3mA e i 5mA; con 5mA il LED ha una luminosità sufficiente. Dunque, la resistenza di limitazione sarà facilmente calcolabile come:
Il software
Il programma in linguaggio C, usa le estensioni wiringPi, che consentono di facilitare le comuni operazioni di lettura, scrittura sul GPIO di Raspberry Pi
BLINK.C
#include <wiringPi.h>
#define LED_PIN 0 // LED rosso (0 WiringPI, GPIO17, pin 11)
int main (void)
{
// --- Init
wiringPiSetup()
pinMode (LED_PIN, OUTPUT); // configura LED_PIN come pin di uscita
// --- Loop
while (1)
{
digitalWrite (LED_PIN, HIGH) ; // Accendi LED
delay (500) ; // Tienilo acceso per 500ms
digitalWrite (LED_PIN, LOW) ; // Spegni LED
delay (500) ; // Tienilo spento per 500ms
}
return 0 ;
}
Analizziamo il programma.
#include <wiringPi.h>
Ogni programma che usi
wiringPi
ovviamente dovrà prevedere la direttiva di inclusione del file header.
#define LED_PIN 0
#define LED_PIN 0
è una direttiva al processore. Tutte le successive occorrenze di
LED_PIN
verranno sostituite con il numero
0
.
Per i pin si può seguire il seguente schema di commento:
// Descrizione del pin (numero_pin WiringPI, GPIOxx, numero_pin_fisico)
ossia
// Led rosso 1 (0 WiringPI, GPIO17, pin 11)
In questo modo, di ciascun pin si saprà sempre la numerazione secondo i tre modi: wiringPi, GPIO e pin fisico, agevolando così la fase di montaggio e di debug.
// --- Init
if (wiringPiSetup() == -1)
exit(1);
pinMode (LED_PIN, OUTPUT); // configura LED_PIN di uscita
Il primo gruppo di istruzioni che troviamo nella
main()
sono quelle raggruppate dal commento
Init
.
Esse vanno a inizializzare la libreria
WiringPi
e a configurare i pin utilizzati, se di ingresso o uscita mediante la funzione
pinMode()
.
L'istruzione
pinMode (LED_PIN, OUTPUT);
consente di configurare il nostro
LED_PIN
, come pin di uscita sul quale potremo dunque inviare bit 0 e 1.
La chiamata alla funzione
wiringPiSetup()
va fatta una sola volta, comunque prima che si inizino a invocare le estensioni wiringPi
, quindi è bene collocarla come prima istruzione in assoluto della
main()
.
// --- Loop
while (1)
{
digitalWrite (LED, HIGH) ; // Accendi LED
delay (500) ; // Tienilo acceso per 500ms
digitalWrite (LED, LOW) ; // Spegni LED
delay (500) ; // Tienilo spento per 500ms
}
Il ciclo
while(1){}
è il classico "loop senza fine" dei sistemi embedded: le istruzioni contenute nel corpo del
while
verranno eseguite ripetutamente, finché non si spegne/resetta il computer ovvero si interrompe in qualche modo l'esecuzione del programma (vedi pagina successiva). E' del tutto equivalente a
for(;;)
.
La funzione
digitalWrite()
manda sul pin desiderato (specificato nel primo parametro) un bit 0 (
LOW
) o un bit 1 (
HIGH
).
Per mantenere/acceso il LED si usa la funzione
delay()
che genera un ritardo pari al valore (espresso in
ms
) passato come argomento; quindi, nel nostro caso, il LED rimarrà acceso/spento per mezzo secondo.
La fase successiva sarà quella di generazione dell'eseguibile e della sua esecuzione ovviamente dopo aver installato la libreria WiringPi.
Risorse e strumenti utilizzati:
[0] Fritzing
[1] Editor online LaTeX
[2] Google Pretty Print
[3] FidoCadJ