[PROGRAMMATION] Comment faire un chenillard ?

Bonjour tout le monde :slight_smile:

Voila, j'ai une petite question ^^

Bon, le titre du topic n'est pas exact, mais je ne savais pas quoi mettre ^^, j'arrive à faire un chenillard.

Par contre, voila ce que j'aimerais faire.

Les diodes sont connectées au Pin 2,3,4,5,6,7. (voir tuto ici : http://www.arduino.cc/en/Tutorial/Loop)

Le code n'est pas bien compliqué et fonctionne à merveille, mais j'aimerais l'améliorer, je m'explique :

J'aimerais, pour allumer ou éteindre mes LED, utiliser des lignes formatées comme celle-ci :

0,0,0,0,0,1 // allume la LED la plus à droite

Donc pour faire un chenillard, ça nous donnerais :
0,0,0,0,0,1
0,0,0,0,1,0
0,0,0,1,0,0
0,0,1,0,0,0
0,1,0,0,0,0
1,0,0,0,0,0
ETC...

Je trouve que ça simplifie le bouzin, et permet de faire des chenillard plus compliqué tel que :
1,0,0,0,0,1
0,1,0,0,1,0
0,0,1,1,0,0
0,1,0,0,1,0
1,0,0,0,0,1

J'ai cherché un peu, surtout avec la commande array, mais je ne m'en sors pas, a croire que ce n'est pas possible...

Sauriez vous me venir en aide, pas spécialement me donner le code tout fait, j'aime bien trouver par moi même ^^, mais plutôt dans qu'elle direction chercher, quelle commande pourrais me permettre de faire cela etc...

Merci :slight_smile:

  • l0l0 -

int i;
int tps = 100;

void setup(){
for(i=2;i<8;i++)
pinMode(i,OUTPUT);
}

void loop(){
for(i=3;i<8;i++){
giditalWrite(i,HIGH);
digitalWrite(i-1,LOW);
delay(tps);
}
for(i=6;i>1;i++){
giditalWrite(i,HIGH);
digitalWrite(i+1,LOW);
delay(tps);
}
}

Oui, avec ce code là, facile, d'ailleurs, il est donné dans le tuto, mais ce que j'aimerais c'est pouvoir définir quelle LED est allumé ou éteinte en utilisant des 1 et des 0, par exemple, pour allumer une diode sur 2, le code serais :
0,1,0,1,0,1

Donc pour faire défiler les diode une sur deux, ça serais un code dans ce genre :

void loop()
  {
    0,1,0,1,0,1;
    delay(tps);
    1,0,1,0,1,0;
    delay(tps);
  }

C'est possible en n'utilisant plus les appellations Arduino mais les ports AVR. Il faut retrouver dans la doc technique de l'Arduino quel est le mapping entre les "digital pins" et les ports (PORT B, C ou D de l'ATmegaxx8)

Cela peut donner ensuite :

DDRB = 0x3F; // les 6 premières pattes en sortie

void loop()
{
   PORTB = 0b010101;
   delay(tps);
   PORTB = 0b101010;
   delay(tps);
}

Par contre ça ne marche que si tu utilises des pattes consécutives (parmi les 13, il doit bien y en avoir 6 qui se suivent)

Yes, parfait, c'est exactement ça que je recherchais !

Mercii !!

  • l0l0 -

Pourquoi ne pas faire une fonction qui allume les sortie une par une ?

#define SHIFT = 2; //on définie une valeur de décalage, dans ton cas, on veux décalé de 2, car ta première les est branché sur le Digital 2


void displayLed( int ledState[]){
   int i;
   //On éteint toute les leds et allumes les [1]
   for(i=0; i< 6; i++){  
       digitalWrite(i + SHIFT ,LOW);
       if(ledState[i] == 1){
            digitalWrite(i + SHIFT,HIGH);
       }
   }

}


//dans la main loop on utilise la fonction comme suit :

displayLed([0,1,0,1,0,1]);
delay(1000);
displayLed([1,0,1,0,1,0]);
delay(1000);

j'ai pas testé le code (je suis au taf), mais avec quelque petite correction de syntaxe ici et là, ca devrait fonctionné !

parce qu'on est dans un microcontrôleur donc les ressources sont limitées : la boucle for + la gestion de la pile pour appeler une fonction + le tableau passé en paramètre + la variable i, ça fait beaucoup :slight_smile:

alors c'est vrai que ça va marcher, mais on risque de se laisser aller à la facilité et un jour on ne comprendra pas pourquoi son écran LCD clignote alors qu'on a juste un bouton en entrée.