• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
led striscia rgb

Striscia led rgb
#11
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
Risposta
#12
Sono un appassionato del C fin dal 1990 ed oggi accanto al mouse vi è sempre il libro "Linguaggio C"
di Brian W. Kernighan & Dennis M. Ritchie.
Il codice è comprensibile, ma non vedo alcuna attinenza con Excel. Personalmente, poi, avrei utilizzato per la matrice sq[] valori in esadecimale, che forse sono più immediati dal punto di vista 0 - 1.
Come il file Excel entra nel contesto?
Risposta
#13
(17/05/2020, 17:00)ippogrifo Ha scritto: Il codice è comprensibile, ma non vedo alcuna attinenza con Excel. Personalmente, poi, avrei utilizzato per la matrice sq[] valori in esadecimale,  che forse sono più immediati dal punto di vista 0 - 1.
Come il file Excel entra nel contesto?

Il file Excel serve per calcolare i numeri di sequenza da mettere nel programma.
Se si scarica l'allegato Excel si vede bene.
Uno su Excel mette gli uno sul foglio sul corrispondente led che vuole accendere ed Excel calcola il numero decimale corrispondente, come somma dei singoli bit della riga.

Ovviamente possono essere usate altre soluzioni  Sleepy
Risposta
#14
Dalla disribuzione sul foglio Excel degli "1" avevo intuito, ma non avendo Excel stesso non ho aperto il file.
Risposta
  


Vai al forum:


Navigazione: 4 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect