Étiquettes : , ,

L’un des moyens les plus efficaces pour commencer l’apprentissage de la programmation et de l’électronique avec Arduino est l’utilisation de LEDs. Nous allons voir dans ce tutoriel comment contrôler des LEDs et comment activer plusieurs fonctions à l’aide d’un bouton poussoir. Cela résume bien ce qui peut être trouvé dans un robot: le cerveau (carte Arduino), les capteurs (le bouton) et les sorties (LEDs) qui peuvent représenter des moteurs, par exemple.

Matériel

  • Ordinateur
  • Arduino UNO
  • câble USB pour connecter l’Arduino à l’ordinateur
  • LEDs x3
  • Breadboard
  • Câbles Dupont M/M
  • Bouton poussoir x1
  • Résistances x4

Objectif

Nous allons définir plusieurs fonctions qui feront s’allumer les LEDs de manière différentes en fonction des actions sur le bouton poussoir. C’est le principe même (simplifié) de la programmation en robotique: effectuer une action en fonction des informations provenant des capteurs.

Schéma de câblage

Le bouton est branché sur la pin 7, la LED1 sur la pin 8, lED2 sur la pin 9 et LED3 sur la pin 10. Notez bien la présence des résistances pour éviter d’endommager les composants. Selon les composants utilisés ces résistances ne sont pas toujours nécessaires. Vérifiez les spécifications techniques de vos composants.

Code

La fonction utilisée pour contrôler une diode est digitalWrite() avec comme paramètre HIGH pour l’allumer, LOW pour l’éteindre.

  digitalWrite(led1Pin,HIGH);
  delay(30);
  digitalWrite(led1Pin,LOW);
  delay(30);

Il est aussi possible de moduler la luminosité de la LED en utilisant la fonction analogWrite().

  int brightness = 0; 
  int fadeAmount = 5;   

 for (brightness=0;brightness<=255;brightness+=fadeAmount){
    analogWrite(led1Pin, brightness);
    delay(30);  
  }

Ces fonctions de base sont utilisées dans les exemples Blink et Fade de l’IDE Arduino. A l’aide de celles-ci, nous pouvons créer plusieurs fonctions pour piloter les LEDs différemment selon le mode sélectionné.

Pour lire l’état d’un bouton, la fonction utilisée est généralement digitalRead(). Ici, nous voulons que le bouton puisse activer plusieurs fonctions. Pour cela, nous allons compter le nombre de fois que le bouton est appuyé. Nous utilisons donc la fonction pulseIn() qui permet de mesurer la longueur d’une impulsion.

unsigned long buttonState = 0;
int funcState=0;

void buttonPressed() {
    buttonState = pulseIn(btnPin,HIGH,1000000);
    if (buttonState > 50){
      funcState += 1;
      Serial.print("Button state n: ");
      Serial.println(funcState);
    }
    funcState=funcState%NBSTATE;
  }

La variable funcState contiendra le mode sélectionné. Il nous suffit ensuite de définir ces modes et d’y associer les fonctions correspondantes. Nous utilisons pour cela les mot clé enum, qui permet de créer facilement une liste d’entier, et switch..case, qui permet de d’exécuter un code en fonction d’une variable.

enum fcnMode { 
  OFF, 
  LED1, 
  LED2, 
  LED3,
  FADE1, 
  ALL,
  BLINK,
  NBSTATE
  }; // OFF = 0 and NBSTATE=7

  switch(funcState){
    case OFF:
    break;
    case LED1:
      digitalWrite(led1Pin,HIGH);
    break;
    case LED2:
      digitalWrite(led2Pin,HIGH);
    break;
    case LED3:
       digitalWrite(led3Pin,HIGH);
    break;
    case FADE1:
      fade1();
      break;
    case ALL:
      digitalWrite(led1Pin,HIGH);
      digitalWrite(led2Pin,HIGH);
      digitalWrite(led3Pin,HIGH);
    break;
    case BLINK:
      blinkLed1();
      blinkLed2();
      blinkLed3();
    break;
  }

Code complet

Voici le code complet que vous pouvez adapter à votre projet.

#define btnPin 7
#define led1Pin 8
#define led2Pin 9
#define led3Pin 10
enum fcnMode { 
OFF, 
LED1, 
LED2, 
LED3,
FADE1, 
ALL,
BLINK,
NBSTATE
}; // OFF = 0 and NBSTATE=7
int ledState1 = LOW,ledState2 = LOW,ledState3 = LOW;             // ledState used to set the LED
unsigned long buttonState = 0;
int funcState=0;
unsigned long currentMillis1,currentMillis2,currentMillis3;        // will store current time
unsigned long previousMillis1,previousMillis2,previousMillis3;        // will store last time LED was updated
const long interval1 = 100;           // interval at which to blink (milliseconds)
const long interval2 = 300;
const long interval3 = 500;
void setup(){
Serial.begin(9600); // initialize serial port
pinMode(btnPin,INPUT_PULLUP);
pinMode(led1Pin,OUTPUT);
pinMode(led2Pin,OUTPUT);
pinMode(led3Pin,OUTPUT);
}
void loop(){
buttonPressed();
setMode();
}
void buttonPressed() {
buttonState = pulseIn(btnPin,HIGH,1000000);
if (buttonState > 50){
funcState += 1;
Serial.print("Button state n: ");
Serial.println(funcState);
}
funcState=funcState%NBSTATE;
}

void setMode() {
digitalWrite(led1Pin,LOW);
digitalWrite(led2Pin,LOW);
digitalWrite(led3Pin,LOW);

Serial.print("Function : ");
Serial.println(funcState); 
switch(funcState){
case OFF:
break;
case LED1:
digitalWrite(led1Pin,HIGH);
break;
case LED2:
digitalWrite(led2Pin,HIGH);
break;
case LED3:
digitalWrite(led3Pin,HIGH);
break;
case FADE1:
fade1();
break;
case ALL:
digitalWrite(led1Pin,HIGH);
digitalWrite(led2Pin,HIGH);
digitalWrite(led3Pin,HIGH);
break;
case BLINK:
blinkLed1();
blinkLed2();
blinkLed3();
break;
}
}
void fade1(){
int brightness = 0; 
int fadeAmount = 5;   
for (brightness=0;brightness<=255;brightness+=fadeAmount){
analogWrite(led1Pin, brightness);
delay(30);  
}
for (brightness=255;brightness>=0;brightness-=fadeAmount){
analogWrite(led1Pin, brightness);
delay(30); 
}
}
void blinkLed1(){
currentMillis1 = millis();
if (currentMillis1 - previousMillis1 >= interval1) {
// save the last time you blinked the LED
previousMillis1 = currentMillis1;
if (ledState1 == LOW) {
ledState1 = HIGH;
} else {
ledState1 = LOW;
}
digitalWrite(led1Pin, ledState1);
}
}
void blinkLed2(){
currentMillis2 = millis();
if (currentMillis2 - previousMillis2 >= interval2) {
previousMillis2 = currentMillis2;
if (ledState2 == LOW) {
ledState2 = HIGH;
} else {
ledState2 = LOW;
}
digitalWrite(led2Pin, ledState2);
}
}
void blinkLed3(){
currentMillis3 = millis();
if (currentMillis3 - previousMillis3 >= interval3) {
previousMillis3 = currentMillis3;
// if the LED is off turn it on and vice-versa:
if (ledState3 == LOW) {
ledState3 = HIGH;
} else {
ledState3 = LOW;
}
digitalWrite(led3Pin, ledState3);
}
}

N’hésitez pas à laisser un commentaire pour partager vos réalisations ou nous faire part de vos remarques. Vous pouvez aussi nous contacter pour toutes questions.

Application

  • Créer un feu tricolore miniature

Source

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie