Pages: [1]   Go Down
Author Topic: controllare più 74HC595 shift registers  (Read 1105 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
http://www.arduino.cc/en/Tutorial/ShiftOut
http://little-scale.blogspot.co.uk/2008/01/three-595-shift-registers.html
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?
Code:
//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);

}
« Last Edit: October 10, 2012, 01:58:31 pm by aelfraed89 » Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11993
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Offline Offline
Newbie
*****
Karma: 13
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ì:
Code:
//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?
Logged

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

devi modificare
Quote
int clockPin2 = 12;
int clockPin2 = 4;
Manca clockPin1 e devi fare pinMode di tutti i pin, ma senó funziona.
Ciao Uwe
Logged

Marche
Offline Offline
Edison Member
*
Karma: 32
Posts: 2263
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Bologna
Offline Offline
Full Member
***
Karma: 1
Posts: 126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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:
http://jacksonliam.blogspot.it/2012/03/led-cube-8x8x8-part-2-construction.html

risolto il problema hardware sorge quello software. Direi che per gestire gli 8 595 mi basta modificare lo skatch in questo modo:
Code:
//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?
« Last Edit: October 12, 2012, 04:48:14 pm by aelfraed89 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato a continuarlo...
Code:
//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?
« Last Edit: October 12, 2012, 04:47:46 pm by aelfraed89 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Pages: [1]   Go Up
Jump to: