Projet électronique #17: Sèche-mains ultrason avec Arduino

Montage Sèche-mains ultrason avec Arduino

Objectifs du projet : répondre aux interrogations suivantes :

  • C’est quoi un capteur ultrasonique ?
  • Comment ça marche le capteur ultrason HC-S04 ?
  • Comment ça marche le sèche-mains à ultrason ?
  • Comment mesurer la distance avec le capteur ultrason ?
  • Comment contrôler la portée ou la distance de mise en marche du sèche-mains à ultrason ?
  • Comment utiliser le capteur HC-S04 avec Arduino ?
  • Et autres astuces pratiques

Rappels des cours

Projets connexes

Ordonnancement des tâches du programme

  1. Envoie d’une impulsion de 10µs au capteur ultrason via la sortie TRIG
  2. Récupération de la distance à partir du signal de retour ECHO
  3. Extraire la distance en fonction de la mesure du capteur en mm
  4. Affichage de la distance dans l’interface série
  5. Lecture de l’entrée analogique A0
  6. Calcul du seuil en fonction de la distance
  7. Contrôle du moteur par un signal PWM en fonction de l’état du seuil et la distance mesurée
  8. Attente d’un délai d’une seconde dédie à l’affichage afin de pouvoir visualiser la distance correctement avec l’œil dans l’interface série. L’absence du délai entraine un affichage rapide et illisible. La valeur du délai engendre aussi le temps de mise à jour du seuil, autrement dit si le délai est égal à 10 s et pendant les 10s on fait varier le potentiomètre, elle ne sera prise en compte qu’à la prochaine itération du programme. Il faut donc choisir un délai raisonnable et optimal pour l’affichage et pour la mise à jour du seuil de déclenchement (en pratique est de l’ordre de 500ms ou d’1s).

Rôle du potentiomètre : Le potentiomètre permet de régler le seuil de mise en marche du sèche-mains. D’une autre façon la distance minimale d’approche pour laquelle le moteur du sèche-mains se mis en marche. La figure ci-dessous illustre la fonction du transfert du système.

Fonction de transfert Sèche-mains ultrason avec Arduino

clear all; close all; clc;

% Calcul de la fonction de transfert
N=1e3;
Dist_min=0;
Dist_max=500;
Dist_mm=linspace(Dist_min,Dist_max,N);
Seuil_max=256;
Seuil_min=10;
Dist_seuil=zeros(1,N);
Etat_seche=zeros(1,N);

for i=1:N
    if (Dist_mm(i) < Seuil_max) && (Dist_mm(i) > Seuil_min)
        Dist_seuil(i)=Dist_mm(i);
    elseif (Dist_mm(i) >= Seuil_max)
        Dist_seuil(i)=Seuil_max;
    elseif (Dist_mm(i) <= Seuil_min)
        Dist_seuil(i)=0;
    else
        Dist_seuil(i)=0;
    end;
end;

% Affichage
plot(Dist_mm, Dist_seuil); grid on;
xlabel('Distance(mm) Avant le seuil');
ylabel('Distance(mm) Apres le seuil');

On distingue deux zones de fonctionnement

  • Distance > D_max : Lorsque la distance mesurée par le capteur dépasse une valeur maximale (distance entre le capteur et les mains), le seuil sera limitée à 256 et par conséquent l’arrêt du sèche-mains. D’une autre façon, les mains sont plus loin de l’équipement. La distance minimale est limitée à 10 mm.
  • Distance <= D_max : Durant cette phase, la valeur du seuil dépends du potentiomètre. En effet, le seuil du déclenchement est proportionnel à la valeur acquise par l’entrée analogique A0. Exemple : pour une tension à l’entrée A0 de 5V, la distance d’approche est maximale et égale à D_max. Pour un seuil de 0V, la distance de mise en marche doit être au voisinage de 0 (les mains doits être serrées du capteur 🙂 ). En résumé, grâce à la valeur du seuil on peut varier la distance d’approche entre D_max et 0 ou réglée la sensibilité du capteur.
  • + Distance <10 mm: Zone aveugle du capteur

A quoi sert l’interface série ?

On trouve souvent une interface série dans un programme Arduino, mais concrètement à quoi sert ? Ci-dessous une liste pratique des utilisations de l’interface série :

A. Affichage : C’est le cas pour nous, afin d’observer la valeur de la distance durant le déroulement du programme en particulier lorsque on fait varier le potentiomètre et voir comment la distance d’approche réagit

B. Débogage du programme : Un programmeur doit vérifier le bon fonctionnement de son programme, il est indispensable de vérifier si les variables reçoivent des bonnes valeurs ou le bon fonctionnement du programme.

C. Validation d’état d’un capteur/variable : Ca peut être utile pour vérifier si un capteur (tension, courant, température, etc.) marche correctement en observant son état via une interface série pour une entrée déterministe (réponse du capteur aussi connue). SI par exemple, durant la programmation on oublie un facteur 2 (ou le point) dans une fonction de calcul, on ne peut pas s’en rendre compte durant la compilation du programme, mais sera lisible on regardant directement l’état de la variable.

D. Transmission/Réception de données : C’est la fonction basique d’une liaison série 🙂

Schéma de câblage avec Arduino

Schéma électronique Sèche-mains ultrason avec Arduino

Programme Arduino

// A faire : implémentation potentiomètre

// Sortie PWM
int To_Moteur_PWM = 9;

// Entree potentiometre
const int Potent_pin = A0;
int val_Pot = 0;
float val_reel = 0.0;
float Seuil_HC=0.0;
int Etat_seche = 0;

// Variables pour HC-SR04
const int Echo_in_pin = 2;
const int Trig_out_pin = 3;
float Dist_mm=0.0;
long HC_val=0;

// Vitesse du son (mm/us)
const double Speed_sound = 340.0e-3;


void setup()
{
        // Seria port
        Serial.begin(9600);

        // Initialisation HC-SR04
        pinMode(Trig_out_pin, OUTPUT);
        pinMode(Echo_in_pin, INPUT);
        digitalWrite(Trig_out_pin, LOW);
}
void loop() {

        // Déclanchement mesure avec l'envoie d'une impulsion de 10µs
        digitalWrite(Trig_out_pin, HIGH);
        delayMicroseconds(10);
        digitalWrite(Trig_out_pin, LOW);

        // Lecture du temps aller/retour de l'onde
        HC_val = pulseIn(Echo_in_pin, HIGH, 30000);

        // Calcul de distance d(mm), V=d/t==> v*t
        // Le coefficnet 2 pour la distance aller
        Dist_mm = (HC_val/2.0) * Speed_sound;

        //Génération PWM & Contrôle de la sensibilité du capteur
        Seuil_HC=GetSeuil(Dist_mm);
        if ((Dist_mm < Seuil_HC) && (Dist_mm > 10.0))
        {
                analogWrite(To_Moteur_PWM, 255);
                Etat_seche=1;
        }
        else
        {
                analogWrite(To_Moteur_PWM, 0);
                Etat_seche=0;
        }

        // Affichage de la distance d(mm/m)
        Serial.print("\n Distance(mm):");
        Serial.print(Dist_mm);

        //Seuil
        Serial.print("\n Seuil(mm):");
        Serial.print(Seuil_HC);

        //Etat seche
        Serial.print("\n Etat seche:");
        Serial.print(Etat_seche);
        Serial.print("\n");

        // Délai
        delay(1000);
}
float GetSeuil(float dist_ultrason)
{
        float seuil=0;
        int val_Pot=0;

        if (dist_ultrason > 256.0)  // 256 mm
        {
                seuil=256.0;
        }
        else
        {
                //Lecture Poto
                val_Pot = analogRead(Potent_pin);
                seuil=float(val_Pot)/4.0;
        }
        return seuil;
}

Photos du projet

Arduino Sèche-mains ultrason avec Arduino (2) Arduino Sèche-mains ultrason avec Arduino (2)
Arduino Sèche-mains ultrason avec Arduino (3) Arduino Sèche-mains ultrason avec Arduino (3)
Arduino Sèche-mains ultrason avec Arduino (4) Arduino Sèche-mains ultrason avec Arduino (4)
Arduino Sèche-mains ultrason avec Arduino (5) Arduino Sèche-mains ultrason avec Arduino (5)
Arduino Sèche-mains ultrason avec Arduino (6) Arduino Sèche-mains ultrason avec Arduino (6)
Arduino Sèche-mains ultrason avec Arduino (7) Arduino Sèche-mains ultrason avec Arduino (7)
Arduino Sèche-mains ultrason avec Arduino (8) Arduino Sèche-mains ultrason avec Arduino (8)
Arduino Sèche-mains ultrason avec Arduino (10) Arduino Sèche-mains ultrason avec Arduino (10)
Arduino Sèche-mains ultrason avec Arduino (9) Arduino Sèche-mains ultrason avec Arduino (9)
Arduino Sèche-mains ultrason avec Arduino (11) Arduino Sèche-mains ultrason avec Arduino (11)
Arduino Sèche-mains ultrason avec Arduino (12) Arduino Sèche-mains ultrason avec Arduino (12)
Arduino Sèche-mains ultrason avec Arduino (13) Arduino Sèche-mains ultrason avec Arduino (13)
Arduino Sèche-mains ultrason avec Arduino (14) Arduino Sèche-mains ultrason avec Arduino (14)
Arduino Sèche-mains ultrason avec Arduino (15) Arduino Sèche-mains ultrason avec Arduino (15)
Arduino Sèche-mains ultrason avec Arduino (16) Arduino Sèche-mains ultrason avec Arduino (16)

Vidéo illustrative

************

Un petit commentaire de vous, un Grand encouragement pour nous 🙂

************

Téléchargement du projet 

************

Articles

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *