controllare più 74HC595 shift registers

Ciao, premetto che sono nuovo nel mondo di Arduino e ho un po' di problemi a comprendere gli sketch. Vi spiego il problema (ho cerato nel forum ma non ho trovato quello che mi serviva): vorrei utilizzare diversi 74HC595 per per controllare più LEDs possibili e poi usare maxmsp per gestire il tutto. ho cercato in rete e ho trovato queste utilissime guide per l'utilizzo e la connessione di due o tre 595:

ho anche trovato una guida per maxuino, quindi ora come ora riesco tranquillamente a controllare 3 595 usando 3 uscite digitali di Arduino. Mi chiedo: ho usato solo 3 pin di arduino per controllare 3 595, potrei usare i pin rimanenti per controllare altri 595..in teoria potrei quindi controllare altri 9 595 in quanto ho i 9 pin disponibili per farlo, giusto? se si, qualcuno potrebbe aiutarmi a modificare lo skecth che usa solo 3 pin e adattarlo all'utilizzo di più pin e quindi più 595?

//Pin connected to ST_CP of 74HC595

int latchPin = 8;

//Pin connected to SH_CP of 74HC595

int clockPin = 12;

////Pin connected to DS of 74HC595

int dataPin = 11;
byte data1;

byte data2;

byte data3;


void setup() {

Serial.begin(57600);

pinMode(latchPin, OUTPUT);


}


void loop() {

if(Serial.available() > 2) {

data1 = Serial.read();

data2 = Serial.read();

data3 = Serial.read();

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, data1);

shiftOut(dataPin, clockPin, data2);

shiftOut(dataPin, clockPin, data3);

digitalWrite(latchPin, 1);

}

}


void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);

pinMode(myDataPin, OUTPUT);


 digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);


 for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

if ( myDataOut & (1<<i) ) {

pinState= 1;

}

else {

pinState= 0;

}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);

}

digitalWrite(myClockPin, 0);

}

Ciao, racchiudi il codice tra i tag così diventa molto più leggibile.

Senza driver che amplificano i segnali di usita dovresti poter mettere 5-6 HC595 in serie.
Puoi senza problemi usare altri 3 pin per un altra serie di 595.
Ciao Uwe

ciao Uwe e grazie! quindi ciò che voglio fare è possibile...di questo ne ero quasi certo, ora il problema principale è modificare lo skecth per usare altri 3 pin. Mettiamo il caso che voglio continuare ad usare 3 595 sui 3 pin di arduino e altri 3 595 su altrettanti pin (ad esempio uso 2,3 e 4), in tal caso come dovrei modificare lo skecth? in primis dovrei introdurre le variabili quindi la prima parte dovrebbe diventare così:

//Pin connected to ST_CP of 74HC595
int latchPin1 = 8;
int latchPin2 = 2 ;
//Pin connected to SH_CP of 74HC595
int clockPin2 = 12;
int clockPin2 = 4;
////Pin connected to DS of 74HC595
int dataPin1 = 11;
int dataPin2 = 3;

byte data1;
byte data2;
byte data3;

byte data4;
byte data5;
byte data6;

void setup() {

Serial.begin(57600);

pinMode(latchPin1, OUTPUT);
pinMode(latchPin2, OUTPUT);

}

void loop() {

if(Serial.available() > 2) {

data1 = Serial.read();
data2 = Serial.read();
data3 = Serial.read();

data4 = Serial.read();
data5 = Serial.read();
data6 = Serial.read();

digitalWrite(latchPin1, 0);
digitalWrite(latchPin2, 0);

shiftOut(dataPin1, clockPin1, data1);
shiftOut(dataPin1, clockPin1, data2);
shiftOut(dataPin1, clockPin1, data3);

shiftOut(dataPin2, clockPin2, data4);
shiftOut(dataPin2, clockPin2, data5);
shiftOut(dataPin2, clockPin2, data6);

digitalWrite(latchPin1, 1);
digitalWrite(latchPin2, 1);

}

}

sbaglio?

devi modificare

int clockPin2 = 12;
int clockPin2 = 4;

Manca clockPin1 e devi fare pinMode di tutti i pin, ma senó funziona.
Ciao Uwe

Non ti conviene mettere in sequenza i pin di arduino che vanno agli shift register?
Almeno ti resta più facile lo sbroglio del circuito

Non avevo visto il tuo post e ne ho aperto uno simile:

http://arduino.cc/forum/index.php/topic,126875.0.html

qui ho rifatto gli schemi originali trovati nel tutorial, per curiosita tu come hai collegato i register?

@vic_20 : grazie per la segnalazione..comunque nel mio primo commento c'è un il link dove ho visto come collegare 3 595..è molto semplice: come colleghi il 2 così colleghi il 3.
@uwe: cavolo ho sbagliato e ho scritto int clockPin2 = 12; anzichè int clockPin1 = 12; eheh! comunque non ho messo il pinMode di tutti gli out perchè se vedi lo sketch intero li mette dopo nel void shiftOut:
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
...non ho capito bene perchè cambia il nome da clockPin a myClockPin, idem per data...
comunque ho fatto un po di ricerche e ho abbandonato l'idea di utilizzare più pin di arduino...in pratica il mio fine è quello di avere il solito cubo led 8x8x8 ma controllabile con maxmsp. cerca cerca e ho capito che per quanto riguarda la parte hardware posso fare in questo modo: uso 8 595 e 8 transistor npn usati come switch che mi vanno a gestire gli 8 livelli.. qui spiega come fare:

risolto il problema hardware sorge quello software. Direi che per gestire gli 8 595 mi basta modificare lo skatch in questo modo:

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

byte data1;
byte data2;
byte data3;
byte data4;
byte data5;
byte data6;
byte data7;
byte data8;

void setup() {

Serial.begin(57600);

pinMode(latchPin, OUTPUT);

}

void loop() {

if(Serial.available() > 7) {

data1 = Serial.read();
data2 = Serial.read();
data3 = Serial.read();
data4 = Serial.read();
data5 = Serial.read();
data6 = Serial.read();
data7 = Serial.read();
data8 = Serial.read();

digitalWrite(latchPin, 0);

shiftOut(dataPin, clockPin, data1);
shiftOut(dataPin, clockPin, data2);
shiftOut(dataPin, clockPin, data3);
shiftOut(dataPin, clockPin, data4);
shiftOut(dataPin, clockPin, data5);
shiftOut(dataPin, clockPin, data6);
shiftOut(dataPin, clockPin, data7);
shiftOut(dataPin, clockPin, data8);

digitalWrite(latchPin, 1);

}

}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

 digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);


 for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

if ( myDataOut & (1<<i) ) {

pinState= 1;

}

else {

pinState= 0;

}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);

}

digitalWrite(myClockPin, 0);

}

fatto questo (sempre se è corretto!) il problema è come gestire gli NPN tramite maxmsp..poichè fungono da switch dovrei attivarli/disattivarli tramite la porta seriale, cosa dovrei aggiungere nello sketch per fare questo?

ho provato a continuarlo...

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

int npnPin1 = 2;
int npnPin2 = 3;
int npnPin3 = 4;
int npnPin4 = 5;
int npnPin5 = 6;
int npnPin6 = 7;
int npnPin7 = 8;
int npnPin8 = 9;

byte data1;
byte data2;
byte data3;
byte data4;
byte data5;
byte data6;
byte data7;
byte data8;

int data9;
int data10;
int data11;
int data12;
int data13;
int data14;
int data15;
int data16;

void setup() {

Serial.begin(57600);

pinMode(latchPin, OUTPUT);

pinMode(npnPin1, OUTPUT);
pinMode(npnPin2, OUTPUT);
pinMode(npnPin3, OUTPUT);
pinMode(npnPin4, OUTPUT);
pinMode(npnPin5, OUTPUT);
pinMode(npnPin6, OUTPUT);
pinMode(npnPin7, OUTPUT);
pinMode(npnPin8, OUTPUT);
}

void loop() {

if(Serial.available() > 15) {

data1 = Serial.read();
data2 = Serial.read();
data3 = Serial.read();
data4 = Serial.read();
data5 = Serial.read();
data6 = Serial.read();
data7 = Serial.read();
data8 = Serial.read();

data9 = Serial.read();
data10 = Serial.read();
data11 = Serial.read();
data12 = Serial.read();
data13 = Serial.read();
data14 = Serial.read();
data15 = Serial.read();
data16 = Serial.read();

digitalWrite(latchPin, 0);

digitalWrite(npnPin1, data9);
digitalWrite(npnPin2, data10);
digitalWrite(npnPin3, data11);
digitalWrite(npnPin4, data12);
digitalWrite(npnPin5, data13);
digitalWrite(npnPin6, data14);
digitalWrite(npnPin7, data15);
digitalWrite(npnPin8, data16);

shiftOut(dataPin, clockPin, data1);
shiftOut(dataPin, clockPin, data2);
shiftOut(dataPin, clockPin, data3);
shiftOut(dataPin, clockPin, data4);
shiftOut(dataPin, clockPin, data5);
shiftOut(dataPin, clockPin, data6);
shiftOut(dataPin, clockPin, data7);
shiftOut(dataPin, clockPin, data8);

digitalWrite(latchPin, 1);

}

}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

int i=0;

int pinState;

pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

 digitalWrite(myDataPin, 0);

digitalWrite(myClockPin, 0);


 for (i=7; i>=0; i--) {

digitalWrite(myClockPin, 0);

if ( myDataOut & (1<<i) ) {

pinState= 1;

}

else {

pinState= 0;

}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);

}

digitalWrite(myClockPin, 0);

}

da maxmsp semplicemente invio numeri da 0-255 che vengono interpretati come byte per gestire i 595, invece per attivare gli NPN invia semplicemente 0 o 1 ... cosa ne dite?

aggiornamento: ho fatto un paio di prove e lo sketch con 8 595 funziona (ho provato fino al terzo 595 per mancanza di spazio sulla breadboard,ma penso che funzionino anche gli altri).. quello con il controllo dei NPN no invece

ragazzi siccome inizio a sentirmi ignorante ho deciso di iniziare a studiare il C in modo da capire le basi... per ora metto da parte il progetto, in ogni caso se qualcuno ha tempo e volontà per controllare il codice e trova l'errore mi sarà comunque comodo..grazie a tutti per la pazienza!