Pages: [1]   Go Down
Author Topic: [PROGRAMMATION] Comment faire un chenillard ?  (Read 2921 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour tout le monde smiley

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 smiley

- l0l0 -
Logged

lille
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}
}
« Last Edit: September 07, 2009, 06:20:02 am by alex57pupuce » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

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

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

Code:
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)
« Last Edit: September 07, 2009, 09:11:56 am by julien@pobot.org » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Mercii !!

- l0l0 -
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Code:

#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é !
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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.
Logged

Pages: [1]   Go Up
Jump to: