Go Down

Topic: mes débuts sur arduino (Read 1 time) previous topic - next topic

zerr0s

Bonjour,

Ça y est, j'ai enfin reçu mon arduino uno, et j'ai monté mon premier petit programme: un "Hello leds" avec 2 leds.

Mais si je ne connais pas bien la partie électronique (et je me forme avec internet pour ça), mes cours de C/C++ remontent à 10 ans. Alors voilà. J'ai un petit problème que vous pourrez sans aucun doute m'aider à résoudre.

Je voudrai allumer les 2 leds différemment, mais en même temps. En gros l'allumage commence dès que le câble usb est branché, et je voudrai faire clignoter une led tandis que l'autre s'allume et s'éteint en fade IN/OUT.

Je sais déjà faire clignoter et "fader". J'ai une led sur la pinoche digital 9 et l'autre sur la 3 (pris au hasard). Comment arriver à faire fonctionner les 2 leds en même temps, car d'après ce que j'ai lu dans la doc, de base, les instructions de la fonction loop sont exécutés de manière linéaire.

Je voudrai d'abord apprendre à faire ce genre de chose avec leds avant de faire un petit robot. Car si je n'arrive pas faire tourner les servo indépendamment, ça ne va pas me servir à grand chose.

J'espère que vous pourrez m'apporter des éléments de réponses.

Le Pnume

#1
Feb 21, 2011, 09:56 am Last Edit: Feb 21, 2011, 12:00 pm by Le Pnume Reason: 1
bonjour,

ton problème est plus un problème d'algorithme que d'Arduino proprement dit. je vois 2 solutions pour le résoudre :

  • les interruptions et là je passe la main car je suis moi même débutant et je n'ai pas encore regardé comment ça se s'utilisait.

  • des compteurs- Tu inclus dans la loop la gestion de compteurs qui modifient le comportement des tes leds à chaque boucle


par exemple un compteur LED1_clignote qui si il est inférieur à x laisse la led1 allumé et supérieur à x éteint la led, le compteur est remis à 0 qd il vaut 2*x.
un flag led2fade qui s'il vaut 1 provoque l'augmentation de la tension sur ta led2 et la diminution s'il vaut 0. Ce flag étant lié à un compteur pour basculer de l'état 1 à 0

Serge

zerr0s

hummmmm. merci pour cette réponse. Le compteur, oui pourquoi pas, mais ça reste une bidouille non ?
Pour faire les choses propres et optimiser le code, ne vaudrait-il pas mieux chercher du côté des interruptions ?

Si je comprends bien les interruptions sont l'équivalent de thread non ?

Enfin bon. je vais quand même regarder du côté du compteur pour apprendre.

Si vous avez des exemples de codes (documentés si possible), ça m'intéresse au plus haut point.

Le Pnume

Par exemple qq chose comme ça (ça compile mais non testé):

Code: [Select]
int brightness1 = 255;    // brillance Led1
int brightness2 = 0;    // brillance Led2
int fadeAmount = 5;    // niveau de fade pour la led2
int LedPin1=13;   //sortie pour la Led1
int LedPin2=9;     //sortie pour la led2
int duree_clignote=10;
int cpt_clignote=0;
int delai=30; //delai pour la boucle principale

void setup()  {
  // declare pin LedPin1 et LedPin2 comme une sortie :
  pinMode(LedPin1, OUTPUT);
  pinMode(LedPin2, OUTPUT);
}

void loop()  {
  // set the brightness of LedPin1 et LedPin2:
  analogWrite(LedPin1, brightness1);
  analogWrite(LedPin2, brightness2);
 

  // change the brightness for next time through the loop:
  brightness2 +=  fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness2 == 0 || brightness2 == 255) {
    fadeAmount = -fadeAmount ;
  } 
  //gestion le clignotement
  if (cpt_clignote > duree_clignote) {
    brightness1 = 0 ;
    if (cpt_clignote > 2*duree_clignote)
    {
      cpt_clignote=0;
    }
  } 
  else
  {
    brightness1 = 255 ;
  } 
  // délai de boucle loop et incrémentation du compteur pour le clignotement
  cpt_clignote++; 
  delay(delai);                           
}


avec ce code tu auras un clignotement sur 2*delai*duree_clignotement=600 ms (300 ms allumé et 300 ms éteint) et la boucle de fade va durée 2*(255/fadeAmount)*delai=3060ms

Serge


fdufnews

Il faudrait que tu cherches du coté de la fonction millis()
Code: [Select]

void loop(void){
    unsigned long last_ fade=0;
    unsigned long last_blink=0;

    if (millis() - last_fade >= FADESTEP{
       last_ fade = millis;
       Appel_fonction_fade()
    }
    if (millis() -last_blink >= BLINKSTEP{
       last_ blink= millis;
       Appel_fonction_blink();
    }

code non testé

Les constantes FADESTEP et BLINKSTEP te permettent de changer le rythme du clignotement et la vitesse du fading. A définir globalement ou même à remplacer par des variables.

Le Pnume

c'est effectivement bien plus élégant que mon code. Je le garde sous le coude

Serge

Go Up