Principe de fonctionnement

L'objectif est de comprendre comment commander l’Arduino à partir de l'ordinateur en utilisant la liaison série (câble USB).

Le schéma suivant illustre les différents éléments nécessaires :

ArduinoPrincipeCdeSerie

Le programme est ouvert dans l'IDE Arduino et est téléversé dans l’Arduino.

La console de l'IDE Arduino est activée.

Il suffit d'écrire une commande et de l'envoyer à l’Arduino via la liaison série.

Le programme qui est dans l’Arduino décode la commande et exécute les instructions correspondantes :

- éventuellement lire l'état des capteurs

- éventuellement envoyer des ordres pour produire les effets demandés sur les actionneurs.

- éventuellement l'Arduino renverra une réponse à l'ordinateur via la liaison série qui s'affichera dans la console de l'IDE Arduino.

Comment commander une LED

Vous allez découvrir comment commander une LED : l'allumer et l'éteindre.

Vous comprendrez alors comment commander (marche-arrêt) d'autres actionneurs (moteur, ventilateur, électrovanne...).

Installation des bibliothèques 

Pour installer les bibliothèques via l'IDE Arduino :

Menu Outils / Gérer les bibliothèques et taper dans le champ recherche le nom de la bibliothèque :

- OneWire

- DallasTemperature

Cliquer alors sur Installer

Paramétrer la console

Ouvrir la console (Menu Outil / Moniteur série

Modifier la vitesse de transfert des données à 115200 baud

Découvrir

a- Que signifie baud ? (utiliser les mots clefs de uart baud)

b- En lisant le programme, que faut-il utiliser comme mot pour allumer et éteindre ?

c- Vous écrivez alors ces mots dans la console et vérifier que la LED s'allume et s’éteint correctement.

//=======appel des bibliothèques requises
#include <OneWire.h>
#include <DallasTemperature.h>

//=======Configuration utilisation bibliothèques pour capteur température
//branchement de la sortie du capteur DS18B20 sur broche digitale n°8
#define ONE_WIRE_BUS 4
//configuration liason série
OneWire oneWire(ONE_WIRE_BUS);
//
DallasTemperature sensors(&oneWire);

//=======Déclaration des variables
//la led est branchées sur la broche digitale n°10
const int led = 10;
//le potar est branchées sur la broche analogique n°A1         
const int potar = A1;
//les variables reception et potarLevel sont de type integer    
int reception, potarLevel;
//déclaration variable nombre décimal (type float)
float tempC;
//déclaration des variables de type string
String message, commande = "";

//=======Fonction d'initialisation - exécutée 1 seule fois
void setup() {
  //définit le type d'entrée/sortie des broches utilisées
  pinMode(led, OUTPUT);
  pinMode(potar, INPUT);
  //définit les paramètres de la liaison série (cable USB)
  Serial.begin(115200);
  Serial.flush();
  //Active la librairie du capteur de température
  sensors.begin();
}

//=======Boucle principale
void loop() {
  //++++++++++++++Traitement des ordres
  //-------Boucle de réception de données en provenance de la console
  while (Serial.available() > 0) {
    //lecture du code ASCII d'un caractère
    reception = Serial.read();
    //vérifie si c'est le dernier caractère Line Feed "\ln"
    if (reception !=10) {
      commande += char(reception);
    }
    //delais de 5/1000s
    delay(5);
  }
  //------Traitement de la commande on
  if (commande == "on") {
    //Met à l'état haut la sortie led
    digitalWrite(led, HIGH);
    //Affiche dans la console le message "ledOn"
    Serial.println("ledOn");
  }
  //------Traitement de la commande off
  if (commande == "off") {
    //Met à l'état bas la sortie led
    digitalWrite(led, LOW);
    //Affiche dans la console le message "ledOff"
    Serial.println("ledOff");
  }
  //------Traitement de la commande potar
  if (commande == "potar") {
    //Lecture du niveau du potar
    potarLevel = analogRead(potar);
    message = String("valeur =")+potarLevel;
    Serial.println(message);
  }
  //------Traitement de la commande temp
  if (commande == "temp") {
    //Lecture de la température
    sensors.requestTemperatures();
    tempC = sensors.getTempCByIndex(0);
    message = String("valeur =")+tempC;
    Serial.println(message);
  }
  //efface la variable commande
  commande = "";  
}

Lire la valeur d'un potentiomètre

Explications

Un potentiomètre est en réalité une résistance ajustable grâce à un bouton rotatif.

En tournant le bouton, la valeur de la résistance change et donc la tension V0 aussi :

principePotar

Une tension n'est pas une valeur numérique (codage binaire), mais une grandeur continue. On parle de grandeur analogique.

L'Arduino est doté d'un Convertisseur Analogique Numérique (CAN) qui permet de convertir la tension V0 en un nombre codé sur plusieurs bits.

principeCAN

Par exemple, si le codage se fait sur 8 bits, il y aura 256 valeurs différentes.

Ce n'est pas très précis puisque la tension de 5V sera découpée en 256, soit environ 0,02V.

Pour obtenir une précision plus importante, les convertisseurs peuvent coder sur davantage de bits.

A noter que pour notre projet, le capteur d'humidité fonctionne sur le meme principe : il fournit une valeur analogique qui est convertit grace au CAN.

Faire

a- En lisant le programme, que faut-il utiliser comme mot pour lire la valeur du potentiomètre ?

b- Vous écrivez alors ce mot dans la console et relever la valeur qui s'affiche à l'écran.

Vous faites de même en mettant le potentiomètre complètement à gauche puis complètement à droite.

c- Quelle est la valeur maximale du nombre ?

d- En déduire le nombre de bits utilisé pour la conversion.

Lire la valeur du capteur de température DS18B20

Explications

Ce capteur numérique est muni de 3 broches (2 pour l'alimentation et 1 comme sortie).

La valeur fournie par le capteur est directement numérique et est exprimée en degrés celsius.

Deux bibliothèques sont nécessaires pour que le programme fonctionne.

Découvrir

a- En lisant le programme, que faut-il utiliser comme mot pour lire la valeur du capteur de température ?

b- Quel est le type de variable de la température ?

c- Vous écrivez alors ce mot dans la console et relever la valeur qui s'affiche à l'écran.

Afin de vérifier l'évolution de la température, il suffit de pincer (sans forcer) le capteur et d'envoyer de nouveau la commande de lecture du capteur.

Modifier le programme

a- Modifier l'affichage pour que le programme afficher comme message "Température = 24,5°C" si la température est de 24,5°C.

b- Modifier le branchement du capteur sur l'arduino en le mettant sur l'entrée 8. Attention de ne pas tout débrancher : il n'y a qu'un fil à déplacer !

Modifier alors le programme en conséquence et téléverser de nouveau le programme pour le tester.

c- Modifier le programme pour lire plus souvent la valeur du capteur :

La température n'est lue que si la commande temp est envoyée. Déplacer l'instruction au bon endroit afin qu'elle soit lue plus souvent.

d- Modifier le programme pour allumer la led si la température est au-dessus de 24°C et qu'elle soit éteinte si c'est en dessous.

montageUnoBase1

 

 Utilisation d'un afficheur LCD

Vous aurez besoin d'installer la bibliothèque LiquidCrystal I2C.

Voici le code à mettre dans l'IDE Arduino :

//=======appel des bibliothèques requises
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//=======Configuration utilisation bibliothèques pour capteur température
//branchement de la sortie du capteur DS18B20 sur broche digitale n°8
#define ONE_WIRE_BUS 4
//configuration liason série
OneWire oneWire(ONE_WIRE_BUS);
//
DallasTemperature sensors(&oneWire);

//========Configuration de l'adressage de l'afficheur numérique
// En cas de non fonctionnement, mettez la ligne 8 en 
// commentaire et retirez le commentaire à la ligne 9.
LiquidCrystal_I2C lcd(0x27, 20, 4);
//LiquidCrystal_I2C lcd(0x3F,20,4);

//=======Déclaration des variables
//la led est branchées sur la broche digitale n°10
const int led = 10;
//le potar est branchées sur la broche analogique n°A1         
const int potar = A1;
//les variables reception et potarLevel sont de type integer    
int reception, potarLevel;
//déclaration variable nombre décimal (type float)
float tempC;
//déclaration des variables de type string
String message, commande = "";

//=======Fonction d'initialisation - exécutée 1 seule fois
void setup() {
  // initialisation de l'afficheur
  lcd.init(); 
  //définit le type d'entrée/sortie des broches utilisées
  pinMode(led, OUTPUT);
  pinMode(potar, INPUT);
  //définit les paramètres de la liaison série (cable USB)
  Serial.begin(115200);
  Serial.flush();
  //Active la librairie du capteur de température
  sensors.begin();
  
}

//=======Boucle principale
void loop() {
  lcd.backlight();
  //++++++++++++++lecture des capteurs
  //état du potentiomètre
  potarLevel = analogRead(potar);
  //Lecture de la température
  sensors.requestTemperatures();
  tempC = sensors.getTempCByIndex(0);  
  //++++++++++++++Traitement des ordres
  //-------Boucle de réception de données en provenance de la console
  while (Serial.available() > 0) {
    //lecture du code ASCII d'un caractère
    reception = Serial.read();
    //vérifie si c'est le dernier caractère Line Feed "\ln"
    if (reception !=10) {
      commande += char(reception);
    }
    //delais de 5/1000s
    delay(5);
  }
  //------Traitement de la commande on
  if (commande == "on") {
    //Met à l'état haut la sortie led
    digitalWrite(led, HIGH);
    //Affiche dans la console le message "ledOn"
    Serial.println("ledOn");
    lcd.clear(); 
    lcd.setCursor(0, 0);
    lcd.print("Led ON");
  }
  //------Traitement de la commande off
  if (commande == "off") {
    //Met à l'état bas la sortie led
    digitalWrite(led, LOW);
    //Affiche dans la console le message "ledOff"
    Serial.println("ledOff");
  }
  //------Traitement de la commande potar
  if (commande == "potar") {
    message = String("potar =")+potarLevel;
    Serial.println(message);
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("potar="+String(potarLevel));
  }
  //------Traitement de la commande temp
  if (commande == "temp") {
    message = String("valeur =")+tempC;
    Serial.println(message);
  }
  //efface la variable commande
  commande = "";  
}

a- Tester le code avec les commandes on et potar.

b- Modifier le code afin d'afficher le message Led OFF sur la 1ère ligne de l'afficheur lorsque la commande off est demandée.

c- Modifier le code afin d'afficher la température (juste la variable tempC) sur la 2ème ligne à partir de la position 10. Inspirez-vous du code pour le potentiomètre.

d- Quand est-ce que la température et le potentiomètre sont lus : 

- lorsque la commande potar ou temp est demandée ?

- en continue dans la boucle while ?

e- Modifier le code afin d'afficher, sur la 2ème ligne de l'afficheur, la valeur du potar dès que l'on tourne le potentiomètre.