17/05/2020, 16:25
Come ho detto, ho utilizzato il C al posto di Python (che ho utilizzato solo all'inizio) solo perché l'idea di avere un programma nativo da lanciare senza bisogno di installare interpreti, mi piaceva molto, ma ovviamente fanno parte di gusti personali, quindi credo che ognuno scelga quello che più preferisce.
Il C tra l'altro va compilato, ma si fa abbastanza presto, usando il compilatore da riga di comando, oppure (ad esempio) GEANY che si trova nel menu “Programmazione”, se manca basta installarlo da menu:
“Preferenze” – “Add Software” – Programmazione.
Compila direttamente, ma assicurarsi che le librerie siano nel path della Build che trovi sotto, “Imposta comandi per la compilazione”:
· gcc -Wall -o "%e" "%f" -lwiringPi -lwiringPiDev -lm
dove l’ultimo è per la libreria math.h.
Veniamo al programma:
#include <stdio.h>
#include <math.h>
#include <wiringPi.h>
int main()
{
int e =0;
int acceso=0;
printf("Sequence!\n");
// Mappa i GPIO con numeri BMC in mod che sul vettore indicizzato abbiamo i valori corrispondenti
int p[] = {30,31,8,9,7,21,22,11,10,13,12,14,26,23,15,16,27,0,1,24,28,29,3,4,5,6,25,2};
unsigned int sq[]
= {0,24576,36864,67584,132096,262656,524544,1048704,2097216,4194336,8388624,16777224,
33554436,67108866,134217729,0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,
32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,
67108864,134217728,201326592,100663296,150994944,41943040,12582912,35651584,135266304,
34078720,8650752,2228224,589824,32768,147456,40960,12288,34816,132096,524800,2097408,
8388736,33554496,134217760,33554448,8388616,2097156,524290,131073,32768,8192,2048,512,
128,32,8,2,268435455};
i primi due vettori sono importanti.
Il primo p[] da la sequenza che mappa ad ogni GPI, il corrispondente numero di BCM corrispondente, in modo che facendo un ciclo for da zero a 27, posso settare in sequenza tutti i PIN della GPIO.
Il secondo vettore sq[] rappresenta la sequenza di numeri binari che determinano quale bit sta a uno per poter essere acceso il led corrispondente.
É una soluzione provvisoria, sarebbe il caso di inserirli in un file o in un piccola tabella di database, per poter cambiarla a piacimento senza dover cambiare il codice.
Poi abbiamo:
if(wiringPiSetup() == -1)
{
printf("Errore setup\n");
return 1;
}
// Setta tutte le porte e Spegne tutti i led
printf("Spegne tutti i LED \n");
for (int i=0; i<=27; i++)
{
pinMode(p[i],OUTPUT);
digitalWrite(p[i],0);
}
dove la pima istruzione serve solo a vedere se la libreria funziona, mentre il ciclo predispone tutti i 28 ppin per l'output e li spegne.
Successivamente abbiamo il loop infinito, che ripete l'accensione dei led in modo opportuno, con due for nidificati, il più interno si spazzola tutte le uscite settandole opportunamente a uno e zero e il più esterno si spazzola la sequenza dei numeri da passare.
printf("AVVIO \n");
do{
for (int j=0; j<=79; j++)
{
for (int i=0; i<=27; i++)
{
e = pow (2 ,i);
acceso = ((e & sq[j]) > 0); //Setta il bit a 1
digitalWrite(p[i],acceso);
}
delay(100);
}
}while(1==1);
printf("FINITO \n");
}
La cosa non immediata è solo la variabile "Acceso", che assume solo i valori 0 o 1, in questo modo:
l'operatore & (operatore binario) fra l'esponenziale di i e il numero di sequenza, fornisce un numero decimale che è pari a zero se i bit non corrispondono e maggiore di zero se corrispondono. Questo assieme al simbolo > (maggiore) torna un operatore booleano che se vero in C significa 1, altrimenti zero se falso, che direttamente posso usare per settare il corrispondente led a spento o acceso.
Nel caso si usi Python, avendo effettivamente il valore booleano, basterà usare un intero e settarlo ad uno o zero se corrispondente valore è rispettivamente vero o falso.
Se avete necessità di chiarimenti fatemi sapere.
saluti
Il C tra l'altro va compilato, ma si fa abbastanza presto, usando il compilatore da riga di comando, oppure (ad esempio) GEANY che si trova nel menu “Programmazione”, se manca basta installarlo da menu:
“Preferenze” – “Add Software” – Programmazione.
Compila direttamente, ma assicurarsi che le librerie siano nel path della Build che trovi sotto, “Imposta comandi per la compilazione”:
· gcc -Wall -o "%e" "%f" -lwiringPi -lwiringPiDev -lm
dove l’ultimo è per la libreria math.h.
Veniamo al programma:
#include <stdio.h>
#include <math.h>
#include <wiringPi.h>
int main()
{
int e =0;
int acceso=0;
printf("Sequence!\n");
// Mappa i GPIO con numeri BMC in mod che sul vettore indicizzato abbiamo i valori corrispondenti
int p[] = {30,31,8,9,7,21,22,11,10,13,12,14,26,23,15,16,27,0,1,24,28,29,3,4,5,6,25,2};
unsigned int sq[]
= {0,24576,36864,67584,132096,262656,524544,1048704,2097216,4194336,8388624,16777224,
33554436,67108866,134217729,0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,
32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,
67108864,134217728,201326592,100663296,150994944,41943040,12582912,35651584,135266304,
34078720,8650752,2228224,589824,32768,147456,40960,12288,34816,132096,524800,2097408,
8388736,33554496,134217760,33554448,8388616,2097156,524290,131073,32768,8192,2048,512,
128,32,8,2,268435455};
i primi due vettori sono importanti.
Il primo p[] da la sequenza che mappa ad ogni GPI, il corrispondente numero di BCM corrispondente, in modo che facendo un ciclo for da zero a 27, posso settare in sequenza tutti i PIN della GPIO.
Il secondo vettore sq[] rappresenta la sequenza di numeri binari che determinano quale bit sta a uno per poter essere acceso il led corrispondente.
É una soluzione provvisoria, sarebbe il caso di inserirli in un file o in un piccola tabella di database, per poter cambiarla a piacimento senza dover cambiare il codice.
Poi abbiamo:
if(wiringPiSetup() == -1)
{
printf("Errore setup\n");
return 1;
}
// Setta tutte le porte e Spegne tutti i led
printf("Spegne tutti i LED \n");
for (int i=0; i<=27; i++)
{
pinMode(p[i],OUTPUT);
digitalWrite(p[i],0);
}
dove la pima istruzione serve solo a vedere se la libreria funziona, mentre il ciclo predispone tutti i 28 ppin per l'output e li spegne.
Successivamente abbiamo il loop infinito, che ripete l'accensione dei led in modo opportuno, con due for nidificati, il più interno si spazzola tutte le uscite settandole opportunamente a uno e zero e il più esterno si spazzola la sequenza dei numeri da passare.
printf("AVVIO \n");
do{
for (int j=0; j<=79; j++)
{
for (int i=0; i<=27; i++)
{
e = pow (2 ,i);
acceso = ((e & sq[j]) > 0); //Setta il bit a 1
digitalWrite(p[i],acceso);
}
delay(100);
}
}while(1==1);
printf("FINITO \n");
}
La cosa non immediata è solo la variabile "Acceso", che assume solo i valori 0 o 1, in questo modo:
l'operatore & (operatore binario) fra l'esponenziale di i e il numero di sequenza, fornisce un numero decimale che è pari a zero se i bit non corrispondono e maggiore di zero se corrispondono. Questo assieme al simbolo > (maggiore) torna un operatore booleano che se vero in C significa 1, altrimenti zero se falso, che direttamente posso usare per settare il corrispondente led a spento o acceso.
Nel caso si usi Python, avendo effettivamente il valore booleano, basterà usare un intero e settarlo ad uno o zero se corrispondente valore è rispettivamente vero o falso.
Se avete necessità di chiarimenti fatemi sapere.
saluti