Risorse per il Lab. Elettronica
Home Page


CAD/CAE

LTspice

PSpice


Sistemi

Arduino

AVR

Raspberry Pi

National Instruments


Risorse

Datasheet

Link

Hardware e Software

Misc




Programmare il GPIO di Raspberry Pi in C (beta)







Licenza Creative Commons
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Italia. E' dunque escluso l'utilizzo per scopi di lucro . Autore: Francesco Parisi, fparisi AT gmail DOT com



Ultima modifica: 09/08/2021

Il primo programma: far lampeggiare un LED


L'hello world di ogni sistema embedded è un LED che lampeggia. Vogliamo far lampeggiare un LED collegato a un pin del GPIO: per 0.5s acceso, per 0,5s spento.

• 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).


Schema elettrico (fonte: http://telpar.altervista.org/)



Per il calcolo della resistenza R1 di limitazione, si è assunta una tensione diretta del LED rosso (VD) pari a 1,8V. La corrente di uscita (di default) di un pin GPIO, che garantisce un livello logico alto, è al più di 8mA. Con una corrente (ILED) di 5mA il LED ha una luminosità sufficiente. Dunque, la resistenza di limitazione sarà facilmente calcolabile come:




Nota: in laboratorio, con questo valore di resistenza, si è misurata una tensione di uscita VOH = 3,15V, e una corrente ILED di circa 4mA. Quindi è ragionevole pensare che anche resistori di limitazione da 270Ω o 220Ω garantiscano ancora un livello logico alto.



Schema di montaggio (fonte: http://telpar.altervista.org/)



• 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. Bisogna tenere presente che il pin fisico 11 corrisponde al pin 0 secondo la convenzione WiringPi (vedi Panoramica del GPIO)

LEDBLINK.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 alcune parti del 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 preprocessore. 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
  wiringPiSetup()  
  pinMode (LED_PIN, OUTPUT); // configura LED_PIN come 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 funzioni wiringPi , quindi è bene collocarla come prima istruzione in assoluto della main().



  // --- 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
  }
Il ciclo while(1){} è il classico "loop senza fine" dei sistemi embedded: le istruzioni contenute nel corpo del while verranno eseguite ripetutamente, finché non avviene un reset oppure una richiesta di interrupt. L'esecuzione dell'intero programma può essere terminata in diversi modi (vedi Compilare ed eseguire un programma).

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) passatogli 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 (vedi Compilare ed eseguire un programma).






Informativa estesa sui Cookie | Web Statistics

Clicky

| Realizzazione a cura di Francesco Parisi (2002 ÷ 2024) | Contatti