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 secondo programma: variare il periodo di lampeggio con un pulsante


Con il secondo programma aggiungiamo un pulsante. Quando il pulsante non è premuto, il LED lampeggia con un periodo di 2s (1s spento, 1s acceso); premendo il pulsante il periodo deve cambiare in 0,5s (0,25s spento, 0,25s acceso)

• L'hardware



Come nel primo programma, 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). Il pulsante è invece collegato sul pin fisico 15, mediante un resistore di pull-down da 10kΩ, all'alimentazione 3.3V. Quando non è premuto, il livello logico applicato è 0. Premendolo si applica un livello logico 1 (3,3V).


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




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



• Il software



Passando al codice, bisogna come sempre prestare attenzione alle convenzioni dei pin. Il pin fisico 11 corrisponde al pin virtuale 0 di WiringPi, così come il pin fisico 15 corrisponde al pin virtuale 3 (vedi Panoramica del GPIO)

LEDBLINKVAR.C
#include <wiringPi.h>

#define LED_PIN 0       // LED rosso (0 WiringPi, GPIO17, pin 11)
#define BTN_PIN 3       // Pulsante  (3 WiringPi, GPIO22, pin 15)

unsigned int ritardo;

int main (void)
{
  // --- Init
  wiringPiSetup();
  pinMode (LED_PIN, OUTPUT);    // configura LED_PIN come pin di uscita
  pinMode (BTN_PIN, INPUT);     // configura BTN_PIN come pin di ingreso

  // --- Loop
  while (1)
  {
    if (digitalRead (BTN_PIN) == HIGH)  // pulsante premuto
       ritardo = 250;
    else                                // pulsante NON premuto
       ritardo = 1000;
			 
    digitalWrite(LED_PIN, HIGH);
    delay (ritardo);

    digitalWrite(LED_PIN, LOW);
    delay (ritardo);
  }

  return 0 ;
}



In questo secondo programma, rispetto al primo, c'è di nuovo il pulsante.

 // --- Init 
 pinMode (PBT_PIN, INPUT);
Con la funzione pinMode() si configura il pin al quale è collegato il pulsante (PBT_PIN), come di ingresso.


 unsigned int ritardo;
La seconda novità è l'uso di una variabile ritardo. La durata di accensione/spegnimento non essendo più fissa deve quindi essere definita in una variabile.


  if (digitalRead (PBT_PIN) == HIGH) // pulsante premuto
      ritardo = 250;
  else
      ritardo = 1000;
Lo stato del pulsante è riconducibile alla lettura del livello logico del pin al quale questo è collegato: se il livello è 1 il pulsante è premuto, se invece è 0 il pulsante non è premuto La funzione digitalRead(pin) legge il livello logico del pin PBT_PIN e lo restituisce come un intero: 1 (HIGH) oppure 0 (LOW). La struttura if...else assegna dunque il valore alla variabile ritardo


  digitalWrite(LED_PIN, HIGH);  // accende LED
  delay (ritardo);
	
  digitalWrite(LED_PIN, LOW);   // spegne LED
  delay (ritardo);
La restante parte del programma è riutilizzata dal primo programma. Ovviamente, a differenza di LEDBLINK.C alla funzione delay() non viene più passato un valore costante, ma la variabile ritardo.

Premendo il pulsante, si nota che bisogna mantenerlo premuto e attendere il termine del ciclo completo di accensione/spegnimento di 1s, prima di vedere lampeggiare il LED a un periodo inferiore. Questo perché l'istruzione di lettura dello stato del pulsante, dopo il primo ciclo di lampeggio, viene eseguita successivamente a quelle di ritardo. Finquando le istruzioni vengono eseguite in tempi massimi di poche decine di micro/millisecondi si ha, generalmente, la percezione che vengano eseguite tutte contemporaneamente. Diverso, invece, il caso in cui ci siano istruzioni che comportano tempi di attesa lunghi (come il caso dell'esempio) oppure indeterminati (come le istruzioni di attesa di un evento che non si sa quando si verifica).






Informativa estesa sui Cookie | Web Statistics

Clicky

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