[Risolto] Pilotare 50 LED

Vorrei, con Arduino UNO, poter pilotare singolarmente una striscia di 50 LED in parallelo. Non sono molto pratico dell' elettronica quindi questa domanda sembrerà banale, ma come faccio a pilotarli tutti se sull' Arduino ci sono solo 13 pin? Dovrei usare qualche integrato? Grazie in anticipo per le risposte.

ciao...

strisce come questa???

http://www.sdmodel.it/images/prodotti/STRIP-LED-BLU.jpg

No, intendevo costruirmela da me, cioè prendere 50 LED con le dovute resistenze sistemarli ordinatamente su un listello di legno e collegare i catodi dei singoli LED ad Arduino mentre gli anodi a massa (come faccio normalmente per collegare pochi LED) solo che sull' Arduino non dispongo di 50 pin e quindi non so come fare. Sono totalmente ignorante quindi scusate ancora se faccio domande banali.

Per cui intendi pilotarli singolarmente, giusto ? … mi sa che la sola possibilita’ e’ usare degli shift register …

Non dimenticare le resistenze, se li colleghi diretti, i led si bruciano, e magari ti bruciano anche le uscite.

Io come shift register possiedo due SN74HC595N ma non ho idea di come collegarli non è che potreste postarmi uno schema di collegamento e magari anche il codice che poi modificherò per pilotare qualche LED con questi shift register?
Non ho idea di come si utilizzano, ripeto non sono molto pratico di elettronica.

Con 2 shift register puoi pilotare: 16 led senza multiplexing 64 led con multiplexing (così)

Grazie delle risposte. Per non aprire un altro topic continuo a scrivere in questo: vorrei modificare questo sketch che ho trovato sul forum in modo tale che a seconda dei comandi ricevuti dal serial monitor mi va da ad accendere i singoli LED, come potrei fare? Qualcuno ha qualche idea? Ecco il codice:

//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, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);   
  digitalWrite(latchPin, HIGH);
  delay(2000);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, B00011000);
  digitalWrite(latchPin, HIGH);
  delay(2000);
 }

Manipolando i singoli bit del byte che spedisci allo shift register. Tenendo conto che ogni bit accende/spenge 1 singolo led, puoi "accendere" o "spengere" un bit con bitSet e bitClear: http://arduino.cc/en/Reference/BitSet http://arduino.cc/en/Reference/BitClear

Quindi con questo codice:

//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, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);   
  digitalWrite(latchPin, HIGH);
  delay(2000);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, B00011000);
  digitalWrite(latchPin, HIGH);
  delay(2000);
 }

Dove dovrei inserire bitSet? E come è la sua sintassi? Se ad esempio voglio accendere solo il led in posizione 7? Scusate l' ignoranza XD

La sintassi te la studi dal link che ti ho passato :P Sul dove metterlo, ovviamente prima di ShiftOut. Prepari il byte contenente lo stato dei singoli led e poi lo spedisci al registro.

Grazie per le risposte! Secondo il link che mi hai mandato, ad esempio, per accendere il VII LED:

bitSet(1,6);

Giusto?

No.

E allora come? Lo so sono ignorante!

bitSet vuole 2 parametri: una variabile su cui operare e la posizione del bit da modificare. Quindi bitSet(var, 6) va bene ma bitSet(1, 6) no perché stai cercando di cambiare i bit ad una costante numerica.

Finalmente ci sono riuscito! Grazie delle risposte. Se a qualcuno dovesse interessare ecco il codice:

//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 numberLED = 8;

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

void loop() {
  static int v = 0;
  if (Serial.available()) {
    char ch =  Serial.read();
    switch(ch) {
      case '0'...'8':
      v= (ch -'0');
  byte shift1 = 0;
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin,MSBFIRST, shift1);
  digitalWrite(latchPin, HIGH);
//Set bit 3 in shift one
bitSet(shift1,v);
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin,MSBFIRST, shift1);
  digitalWrite(latchPin, 1);
  }
  }
  }

Non conoscevo questa estensione del gcc:

switch(ch) {
      case '0' ... '8':

http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html

Non è però C standard, mi sembra. E' ANSI C o solo gcc ?

Comunque su Arduino compila e funziona, anche se i puntini sono attaccati ai numeri (mentre sul doc dice di staccarli)

Forse è un'estensione del linguaggio, non credo neanch'io che sia C ANSI.