Pages: [1] 2 3 4   Go Down
Author Topic: Programmare cubo led 4x4x4 con due 74HC595  (Read 3208 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho creato un cubo led 4x4x4, pilotato da arduino tramite due 74hc595.
Ogni colonna ha gli anodi in comune, ciascuna connessa ad un uscita del 74hc595
mentre i catodi sono comuni su i 4a livelli e ogni livello è connesso ad un transistor npn per essere attivato/diasstivato.
Lo sketch che ho scritto è questo
Code:
/* Sketch cubo LED 4x4x4 per l'esame
creato da: Salvatore Marcellini */

//Definisco le variabili
int latch= 8; //pin del latch degli 74HC595
int clock= 12; //pin del clock degli 74HC595
int data= 11; //pin dove gli 74HC595 ricevono l'input
int npn[4]= {4, 5, 6, 7}; // array con i pin dei transistor
int i; //contatore

// Setto tutti i  pin su OUTPUT
void setup ()
{
    pinMode(latch, OUTPUT);
    pinMode(clock, OUTPUT);
    pinMode(data, OUTPUT);
    for(i=0;i<4;i++)
    {
        pinMode(npn[i], OUTPUT);
    }
}

//inizio del programma
void loop ()
{
  for(i=0;i<4;i++)
 {
  digitalWrite(npn[i], HIGH); //attivo il livello corrispondente al contatore
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b10000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(400); //pausa

  digitalWrite(npn[i], LOW); //disattivo il livello corrispondente al contatore
 }
             
}

Dovrebbe accendermi il primo led di ogni livello, ma invece mi accende vari led e non mi accende il primo livello.
sapete dirmi qual'è l'errore?
grazie
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21183
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non so se é questo il problema ma un numero binari si scrive cosí B00110010 e non 0b00110010.

Ciao Uwe
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

in realtà io lo inviavo con 0b quando facevo le prove su bredboard e andava con 8 bit :\
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 111
Posts: 5881
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non so se é questo il problema ma un numero binari si scrive cosí B00110010 e non 0b00110010.

Mmm ... dovrebbe andare bene anche la forma 0bxxxxxxxx come puoi verificare qui : http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html (... documentazione gcc gnu) smiley-wink

Quindi, probabilmente, l'errore è altrove ...

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Uwe:
La forma Bxxxxxxxx è propria di Arduino, nel core c'è il file "binary.h" che altro non è se non una lunga sfilza di #define tipo questo:
Code:
#define B00000100 4
La forma "C-puro" è invece proprio 0bxxxxxxxx.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Toti:
in realtà io lo inviavo con 0b quando facevo le prove su bredboard e andava con 8 bit :\

Quindi su breadboard ti funzionava ed ora che hai saldato no?
Non è che allora hai fatto qualche errore?
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Usando uno sketch che mi illumina tutti i led uno alla volta, va tutto bene
Code:
/* Sketch cubo LED 4x4x4 per l'esame
creato da: Salvatore Marcellini */

//Definisco le variabili
int latch= 8; //pin del latch degli 74HC595
int clock= 12; //pin del clock degli 74HC595
int data= 11; //pin dove gli 74HC595 ricevono l'input
int npn[4]= {5, 6, 7, 9}; // array con i pin dei transistor
int i; //contatore
int pausa= 100;

// Setto tutti i  pin su OUTPUT
void setup ()
{
    pinMode(latch, OUTPUT);
    pinMode(clock, OUTPUT);
    pinMode(data, OUTPUT);
    for(i=0;i<4;i++)
    {
        pinMode(npn[i], OUTPUT);
    }
}

//inizio del programma
void loop ()
{
  for(i=0;i<4;i++)
 {
  digitalWrite(npn[i], HIGH); //attivo il livello corrispondente al contatore
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b10000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b01000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00100000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00010000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00001000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000100); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000010); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000001); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b10000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b01000000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00100000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00010000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00001000); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000100); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000010); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b00000000); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b00000001); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 
     
      digitalWrite(npn[i], LOW);
 
 }
             
}

Quindi credo che i collegamenti vadano bene no?

Però se voglio accendere una colonna si e una no, come qui
Code:
/* Sketch cubo LED 4x4x4 per l'esame
creato da: Salvatore Marcellini */

//Definisco le variabili
int latch= 8; //pin del latch degli 74HC595
int clock= 12; //pin del clock degli 74HC595
int data= 11; //pin dove gli 74HC595 ricevono l'input
int npn[4]= {5, 6, 7, 9}; // array con i pin dei transistor
int i; //contatore
int pausa= 1000;

// Setto tutti i  pin su OUTPUT
void setup ()
{
    pinMode(latch, OUTPUT);
    pinMode(clock, OUTPUT);
    pinMode(data, OUTPUT);
    for(i=0;i<4;i++)
    {
        pinMode(npn[i], OUTPUT);
    }
}

//inizio del programma
void loop ()
{
  for(i=0;i<4;i++)
 {
  digitalWrite(npn[i], HIGH); //attivo il livello corrispondente al contatore
 
  digitalWrite(latch, LOW); //latch basso per passare la serie di bit
  shiftOut(data, clock, MSBFIRST, 0b10101010); //prima serie di bit dello 74HC595 n°1
  shiftOut(data, clock, MSBFIRST, 0b10101010); //seconda serie di bit dello 74HC595 n°2
  digitalWrite(latch, HIGH); //riattivo il latch per attivare le uscite
  delay(pausa); //pausa
 digitalWrite(npn[i], LOW);
 }
             
}

Non mi accende una colonna si e una no, ma me le accende quasi tutte tranne 3.
Quindi direi che sono io a non aver capito come programmare in modo giusto mi sa xD
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma come li hai collegati?
Hai considerato un intero piano come una semplice fila di 16 led, ognuno agganciato ad un pin di uno dei 2 shift register?

Perché da come descrivevi il cubo all'inizio potevi usare 1 solo shift register: 4 pin per le righe del cubo e gli altri 4 pin per le colonne. Cioè ogni piano 4x4.
Tu però pare che abbia fatto un piano come 16x1.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si le 16 uscite degli shift register sono collegate alle 16 colonne di led
quindi tenendo conto di un solo piano, ogni led è collegato ad un'uscita degli shift register
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mi chiedevo inoltre se c'è un modo per accendere un singolo led senza scrivere la combinazione di bit.
Mi spiego
se ad esempio volessi accendere solo un led non c'è un modo per accendere direttamente il led 34 senza scrivere la serie di bit?
non si posso creare delle variabili? xD
sarebbe utile anche in un ciclo, dove a seconda del contatore decido se accendere o meno quel led, in questo caso la combinazione di bit deve cambiare ogni volta e non posso usare il ciclo
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa ma accendendo 1 piano e mandando 2 byte composti da 0b11111111 si accendono tutti i led di quel piano oppure no?
Perché se non si accendono tutti i led, c'è qualcosa di sbagliato nei collegamenti.

Per la seconda domanda, lavorare con i bit è il modo migliore per snellire il codice. Per accendere il 4° led basta fare bitSet(byte, 4). Guarda le funzioni sui bit nel Reference del sito.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sisi ho provato con tutti e 4 i piani e si accendono tutti i led
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il reference per quanot riguarda bitset(x, n) l'ho visto ma non è che c'ho capito molto smiley-neutral
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sisi ho provato con tutti e 4 i piani e si accendono tutti i led
Beh, allora c'è qualcosa che non funziona...
Se li accendi tutti funziona, se li accendi alternati no. Ed accendendoli in sequenza 1 ad uno?
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il reference per quanot riguarda bitset(x, n) l'ho visto ma non è che c'ho capito molto smiley-neutral
Lavora su singoli bit, imposti il bit in posizione "n" del byte x.
I bit vanno di posizione da 0 a 7, da destra verso sinistra (il bit meno significativo a sta destra):
7.6.5.4.3.2.1.0
Logged


Pages: [1] 2 3 4   Go Up
Jump to: