Offline
Newbie
Karma: 0
Posts: 10
|
 |
« on: October 10, 2012, 12:03:46 pm » |
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/ShiftOuthttp://little-scale.blogspot.co.uk/2008/01/three-595-shift-registers.htmlho 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);
}
|
|
|
|
« Last Edit: October 10, 2012, 01:58:31 pm by aelfraed89 »
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 389
Posts: 10560
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #1 on: October 10, 2012, 01:24:19 pm » |
Ciao, racchiudi il codice tra i tag così diventa molto più leggibile.
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
Offline
Newbie
Karma: 12
Posts: 0
|
 |
« Reply #2 on: October 10, 2012, 04:32:48 pm » |
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
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #3 on: October 11, 2012, 06:43:36 am » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16136
+39 349 2158303
|
 |
« Reply #4 on: October 11, 2012, 03:21:12 pm » |
devi modificare int clockPin2 = 12; int clockPin2 = 4; Manca clockPin1 e devi fare pinMode di tutti i pin, ma senó funziona. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Marche
Offline
Edison Member
Karma: 25
Posts: 2085
|
 |
« Reply #5 on: October 11, 2012, 04:51:28 pm » |
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
Full Member
Karma: 0
Posts: 118
|
 |
« Reply #6 on: October 12, 2012, 08:46:16 am » |
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
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #7 on: October 12, 2012, 12:59:40 pm » |
@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.htmlrisolto 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?
|
|
|
|
« Last Edit: October 12, 2012, 04:48:14 pm by aelfraed89 »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #8 on: October 12, 2012, 03:40:00 pm » |
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?
|
|
|
|
« Last Edit: October 12, 2012, 04:47:46 pm by aelfraed89 »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #9 on: October 12, 2012, 04:50:50 pm » |
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
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #10 on: October 13, 2012, 08:50:59 am » |
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
|
|
|
|
|
|