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 8, la LED1 sur la pin 9, lED2 sur la pin 10 et LED3 sur la pin 11. 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.
// Pin assignement const int btnPin = 8; const int led1Pin = 9; const int led2Pin = 10; const int led3Pin = 11; 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; /******************************************************************\ PRIVATE FUNCTION: setup PARAMETERS: ~ void RETURN: ~ void DESCRIPTIONS: Initiate inputs/outputs \******************************************************************/ void setup() { Serial.begin(9600); // initialize serial port pinMode(btnPin, INPUT_PULLUP); pinMode(led1Pin, OUTPUT); pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); } /******************************************************************\ PRIVATE FUNCTION: loop PARAMETERS: ~ void RETURN: ~ void DESCRIPTIONS: Main Function of the code \******************************************************************/ void loop() { buttonPressed(); setMode(); } /****************************************************************** SUBFUNCTIONS \******************************************************************/ 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() { // All Off 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 the LED is off turn it on and vice-versa: if (ledState1 == LOW) { ledState1 = HIGH; } else { ledState1 = LOW; } // set the LED with the ledState of the variable: digitalWrite(led1Pin, ledState1); } } void blinkLed2() { currentMillis2 = millis(); if (currentMillis2 - previousMillis2 >= interval2) { // save the last time you blinked the LED previousMillis2 = currentMillis2; // if the LED is off turn it on and vice-versa: if (ledState2 == LOW) { ledState2 = HIGH; } else { ledState2 = LOW; } // set the LED with the ledState of the variable: digitalWrite(led2Pin, ledState2); } } void blinkLed3() { currentMillis3 = millis(); if (currentMillis3 - previousMillis3 >= interval3) { // save the last time you blinked the LED previousMillis3 = currentMillis3; // if the LED is off turn it on and vice-versa: if (ledState3 == LOW) { ledState3 = HIGH; } else { ledState3 = LOW; } // set the LED with the ledState of the variable: 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