Dopo il test Blink, esperimento LED SUPERCAR

Ciao a tutti,

era da tempo che non smanettavo con l'elettronica ma per sbaglio mi sono imbattuto in questa fantastica scheda di nome arduino. l'ho comprata anche non avendo mai programmato nulla in vita mia (tranne il linguafggio ladder per plc :relaxed:) e dopo il primo test Blink volevo realizzare quelle fantastiche luci sul cofano del fantastico k.i.t.t.
ho trovato uno screcth, ho montato la priastra e effetto bellissimo dei led a cascata.Non mi soddisfaceva appieno, perche i led andavao in una sola direzione senza tornare indietro e la mia sete d'invidia verso maichel knight cresceva sempre di più, così cho cercato di capire il codice, e per mia assoluta meraviglia sono riuscito a farlo andare avanti e indietro...propio come il telefilm.....grandissima soddisfazione.

scusate il prolisso incipit ma per me è stata una grande soddisfazione :smiley:

Dunque questo esperimento è ottimo per chi come me e a secco di programmazione e sgnoccola qualcosa con l'elettronica.

Uploaded with ImageShack.us

come vediamo dallo schema il GND della nostra Arduino collega tutti i lati negativi dei led (facilmente riconoscibili da un taglietto su un lato del led) mentre i lati positivi dei led sono collegati da una resistenza ed ognuno su una porta arduino, per questo esperimento useremo le porte che vanno dalla 13 alla 5.

di seguito il codice per fare il copia e incolla.


// dichiarazione delle variabili
int led_1 = 13;
int led_2 = 12;
int led_3 = 11;
int led_4 = 10;
int led_5 = 9;
int led_6 = 8;
int led_7 = 7;
int led_8 = 6;
int led_9 = 5;

// definizione di alcuni define per chiarire meglio la struttura
#define uscita OUTPUT
#define ingresso INPUT
#define s_1 HIGH
#define s_0 LOW
#define cycle 70

// impostazione delle porte come uscite
void setup (){
pinMode (led_1, uscita );
pinMode (led_2, uscita );
pinMode (led_3, uscita );
pinMode (led_4, uscita );
pinMode (led_5, uscita );
pinMode (led_6, uscita );
pinMode (led_7, uscita );
pinMode (led_8, uscita );
pinMode (led_9, uscita );
}
// programma che continua a ciclare
void loop (){

// Erase all output ( spegni tutte le uscite)
digitalWrite ( led_1, s_0 );
digitalWrite ( led_2, s_0 );
digitalWrite ( led_3, s_0 );
digitalWrite ( led_4, s_0 );
digitalWrite ( led_5, s_0 );
digitalWrite ( led_6, s_0 );
digitalWrite ( led_7, s_0 );
digitalWrite ( led_8, s_0 );
digitalWrite ( led_9, s_0 );

delay (1000); // waiting one second( Attendi 1 secondo)

restart : // dichiaro un punto a cui tornare finito l'esecuzione del programma
digitalWrite ( led_1, s_1 ); // la logica è :
// | | |__________ accendila( s_1 perchè è stata dichiarata come HIGH, in caso di LOW avremmo
// | | trovato s_0
// | |________________ LED 1
// |__________________________ scrivi sull'uscita

delay (cycle); // waiting 1/2 second
digitalWrite ( led_2, s_1 );
digitalWrite ( led_1, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_3, s_1 );
digitalWrite ( led_2, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_4, s_1 );
digitalWrite ( led_3, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_5, s_1 );
digitalWrite ( led_4, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_6, s_1 );
digitalWrite ( led_5, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_7, s_1 );
digitalWrite ( led_6, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_8, s_1 );
digitalWrite ( led_7, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_9, s_1 );
digitalWrite ( led_8, s_0 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_9, s_0 );
digitalWrite ( led_8, s_1 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_8, s_0 );
digitalWrite ( led_7, s_1 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_7, s_0 );
digitalWrite ( led_6, s_1 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_6, s_0 );
digitalWrite ( led_5, s_1 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_5, s_0 );
digitalWrite ( led_4, s_1 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_4, s_0 );
digitalWrite ( led_3, s_1 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_3, s_0 );
digitalWrite ( led_2, s_1 );

delay (cycle); // waiting 1/2 second
digitalWrite ( led_2, s_0 );

// jump to restart ( torna al punto dichiarato in alto denominato restart
goto restart;

}

_____________________________________________________________________________________________________-

se qualcosa non è chiaro postate, altrimenti....BUON DIVERTIMENTO :grin:

piccolo consiglio:
trasforma

int led_1 = 13;
int led_2 = 12;
int led_3 = 11;
int led_4 = 10;
int led_5 = 9;
int led_6 = 8;
int led_7 = 7;
int led_8 = 6;
int led_9 = 5;

in

int leds[]={12,11,10,9,8,7,6,5}

a questo punto magicamente puoi trasformare da:

pinMode (led_1, uscita );
pinMode (led_2, uscita );
pinMode (led_3, uscita );
pinMode (led_4, uscita );
pinMode (led_5, uscita );
pinMode (led_6, uscita );
pinMode (led_7, uscita );
pinMode (led_8, uscita );
pinMode (led_9, uscita );

a:

int i;
for (i=0; i<9; i++){
    pinMode (leds[i], uscita );
}

e stessa cosa per le digitalWrite.
kiss :slight_smile:

Se ti interessa io come primo progettino... ( modifica di uno Scooter ) ho fatto questo - YouTube

Altro consiglio. Invece di fare 9 linee di massa, metti una massa unica su una delle piste esterne della breadboard e poi collega tutti i piedini negativi dei LED a quella pista. In questo modo eviti 8 ponticelli.

grazie per i consigli.....mamma mia che codice brutto hai postato lesto :relaxed:

è sarcastico? bhè quando dovrei fare medie su 10 o più valori (facciamo 50) ne riparliamo :stuck_out_tongue:

il codice come averi fatto io sarebbe:

int leds[]={13,12,11,10,9,8,7,6,5}
int numeroPin=9;
void setup(){
    int i;
    for (i=0; i<numeroPin; i++){
        pinMode (leds[i], OUTPUT ); //setta come output digitale
        digitalWrite(leds[i], LOW); //spegne il led
    }
}

int contatoreLed=0;
void loop(){
    digitalWrite( leds[contatoreLed], HIGH); //accende il pin
    delay (500); // aspetta mezzo secondo (1 secondo = 1000 millisecondi)
    digitalWrite( leds[contatoreLed], LOW); //spegne il pin
   //le istruzioni seguenti sono così veloci ad eseguire (qualche microsecondo, 1/1.000.000 di secondo) che occhio umano non si accorge che ci sono led spenti
    contatoreLed++; //passa al prossimo pin
    if (contatoreLed >= numeroPin){ //se i pin sono finiti
      contatoreLed=0; //ricomincia dal primo pin
    }
}

certo che sono sarcastico XD, dico che è brutto perchè capirlo è davvero complicato per me che non ho programmato nulla prima d'ora. :slight_smile:

Attenzione di non surriscaldare l' arduino. Ogni uscita sopporta 40mA ma in somma solo 200mA.
Ciao Uwe

anche con le resistenze potrebbe avere problemi?

Le resistenze servono per un far bruciare i led, non riducono il carico.