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) 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).
• 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
|
|
Realizzazione a cura di Francesco Parisi (2002 ÷ 2024) | Contatti