aiuto: comandare 8 LED con sr 74HC595

ciao a tutti. sto cercando di utilizzare uno shift register 74HC595 per accendere e/o spegnere contemporaneamente 8 led. Ho seguito passo passo questo tutorial http://www.arduino.cc/en/Tutorial/ShiftOut. lo shift register è http://docs-europe.electrocomponents.com/webdocs/0422/0900766b80422c0d.pdf, mentre i led sono http://docs-europe.electrocomponents.com/webdocs/0d4f/0900766b80d4f8f9.pdf, per cui ho messo 8 resistori da 100 Ohm. Ho anche messo un trasduttore da 1 micro F sul latchPin (ma da quello che ho capito non credo mi serva a molto). Avviando lo sketch che posto più sotto dovrei poter ottenere accensione e spegnimento degli 8 led contemporanemanete ogni 4 secondi. Eppure: i led, quando si accendono, si accendono o a coppie di due (e restano accesi), o 4 (e restano accesi). Raramente si accendono tutti e 8 (ma anche in questo caso poi non si spengono). I comportamenti, peraltro, avvengono quando inserisco la usb del pc all'Arduino e non quando faccio l'upload dello sketch. e non cambia nulla se tolgo il trasduttore. Che fare? qualcuno mi aiuta a capire dove sbaglio? ...io ho pensato che ci sia qualcosa che non va nel dato binario dello shiftOut (non capisco molto in materia). Grazie in anticipo a tutti

//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;

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  
    digitalWrite(latchPin, HIGH);
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111);   
    delay(4000);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
    delay(4000);
 }

Secondo me stai sbagliando a gestire il 74595. In genere bisogna:

1) mettere a LOW il latch pin 2) inviare i dati 3) mettere su HIGH il latch pin per far "uscire" i valori caricati nei registri interni sui pin del chip

Quindi prova con

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B11111111);   
digitalWrite(latchPin, HIGH);
delay(4000);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
digitalWrite(latchPin, HIGH);
delay(4000);

Ciao,

Forse potrebbe essere un problema di assorbimento di corrente. con una resitenza da 100 Ohm hai una corrente da 50 mA, 8 x 50 mA = 400 mA.

Le porte USB sono limitate, in genere, a 500 mA.

Prova con resistenze maggiori.

Ciao, Marco.

grazie ad entrambi. ho fatto un po' di prove: @leo : non sono molto ferrato sui codici, ma credo di aver capito cosa intendi. ho provato ma purtroppo la sostanza non cambia =( @marco : ho tolto le resistenze da 100 ohm sostituendole con res da 220 ohm, cambia solamente che all'inserimento della usb i led si accendono per una fraz di secondo, mentre con le 100 ohm si accendono e restano accese =(

non so proprio dove sbattere la testa...

Ciao,

i led che hai indicato non possono essere alimentati con piu’ di 30 mA per uso continuo (DC Forward Current), 100 mA di picco (con pulse width <=0.1msec duty <=1/10).
Per cui devi utilizzare resistenze > di 167 Ohm se utilizzi i 5 V.

Controlla che i led funzionino.

Hai fatto tutti i collegamenti bene?
Nella funzione shiftOut il quarto valore, ossia il value deve essere un byte, prova a inserire il numero come decimale.

Ciao,
Marco.

ok: lasciato resistenze da 220 Ohm, cambiato shift register con altro (sempre stesso 74HC595) e rifatto tutto il cablaggio. Purtroppo mi ritrovo sempre con un nulla di fatto

prova a inserire il numero come decimale

... qui mi trovi davvero impreparato :~ lo shiftOut accetta il binario (credo di default). come cambio in decimale i valori prima del void setup? dovrei per caso inserire: int decimal = (e qui mi perdo...) grazie in anticipo siro

Accensione di 1,2,5 e 6

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST,102);
digitalWrite(latchpin, HIGH);

Marco ti ringrazio, ma continuo a rimanere impantanato... inoltre ho provato con altri sketch precompilati presi sempre dal tutorial, ma proprio non ne vuole sapere. riprovo a cablare il tutto per la terza volta...

Ciao,

prova a scollegare, se collegati, altri sensori, dispositivi che stai provando.
Verifica che non siano bruciati i led.

Prova ad accenderne prima uno, poi due, tre, … alla volta.

Se hai un notebook tieni conto che alcuni modelli (tipo qualche Mac) hanno un output limitato a 100 mA (invede dello standard 500 mA).
Puoi provare con un alimentatore esterno (va bene anche un caricatore per telefonini).

Questa e’ un’altra guida all’utilizzo del 74HC595:

http://tronixstuff.wordpress.com/2010/04/30/getting-started-with-arduino-–-chapter-four/

La stessa funzione shiftOut non e’ complessa, per cui il problema dovrebbe essere altro.
Il codice e’ quello che si trova nel file wiring_shift.c del codice sorgente dell’arduino IDE.

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
uint8_t i;

for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));

digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}

Ciao,
Marco.

ottimo!! finalmente risolto il problema con il 74HC595! in sostanza:
@marco: avevi ovviamente ragione sulle resistenze, ho lasciato il binario e studiacchiando un po’ qua e un po’ la’ ce l’ho fatta.
@leo72: il cambiamento proposto del codice funziona perfettamente.

Per il resto avevo sicuramente sbagliato qualcosa nel cablaggio …ancora non ho capito bene cosa… :~
grazie a tutti e due per avermi aiutato a ragionare e a risolvere il problema. Presto cercherò di fare interagire i led con un sensore LDR… tornerò a chiedere aiuto
grazie
ciao
Siro