Pages: [1]   Go Down
Author Topic: mes débuts sur arduino  (Read 1253 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: February 21, 2011, 06:00:22 am by Le Pnume » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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

Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3566
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faudrait que tu cherches du coté de la fonction millis()
Code:
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.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Serge
Logged

Pages: [1]   Go Up
Jump to: