.. note::
Bonjour et bienvenue dans la communauté des passionnés de SunFounder Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez dans l'univers de Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.
**Pourquoi nous rejoindre ?**
- **Support d'experts** : Résolvez les problèmes après-vente et relevez vos défis techniques grâce à l'aide de notre communauté et de notre équipe.
- **Apprenez & Partagez** : Échangez des astuces et des tutoriels pour perfectionner vos compétences.
- **Aperçus exclusifs** : Bénéficiez d'un accès anticipé aux nouvelles annonces de produits et aux avant-premières.
- **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits.
- **Promotions festives et concours** : Participez à des concours et des promotions à l'occasion des fêtes.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
2.2.5 Module de Capteur Ultrasonique
=======================================
Introduction
---------------
Le capteur ultrasonique utilise des ultrasons pour détecter avec précision des objets et mesurer les distances. Il émet des ondes ultrasonores et les convertit en signaux électroniques.
Composants
-------------
.. image:: img/list_2.2.5.png
Principe
-----------
**Ultrason**
Le module de télémétrie ultrasonique permet une mesure sans contact de
2 cm à 400 cm, avec une précision pouvant atteindre 3 mm. Il assure une
stabilité du signal jusqu'à 5 m, puis celui-ci s'affaiblit progressivement
au-delà de cette distance, jusqu'à disparaître au niveau des 7 m.
Le module comprend des émetteurs ultrasoniques, un récepteur et un circuit de
contrôle. Les principes de base sont les suivants :
1. Utiliser une bascule IO pour générer un signal de niveau haut pendant au
moins 10 µs.
2. Le module envoie automatiquement huit impulsions à 40 kHz et détecte s'il y
a un retour de signal.
3. Si le signal est de retour, la durée du niveau haut de la sortie IO correspond
au temps écoulé entre l'émission de l'onde ultrasonique et sa réception. La distance
est calculée selon la formule suivante : distance = (durée du niveau haut x vitesse
du son (340 m/s)) / 2.
.. image:: img/image217.png
:width: 200
.. image:: img/image328.png
:width: 500
Le schéma de synchronisation est illustré ci-dessous. Il vous suffit de fournir une
impulsion de 10 µs pour l'entrée du déclencheur afin de démarrer la télémétrie.
Ensuite, le module émettra une rafale d'ultrasons de 8 cycles à 40 kHz et augmentera
son écho. Vous pouvez calculer la distance en mesurant l'intervalle de temps entre
l'envoi du signal de déclenchement et la réception de l'écho.
Formule : us / 58 = centimètres ou us / 148 = pouces ; ou : distance = temps du niveau
haut \* vitesse (340 m/s) / 2. Il est conseillé d'utiliser un cycle de mesure supérieur
à 60 ms pour éviter les collisions entre le signal de déclenchement et le signal de retour.
.. image:: img/image218.png
:width: 800
Schéma de câblage
--------------------
.. image:: img/image329.png
Procédures expérimentales
---------------------------
**Étape 1 :** Construisez le circuit.
.. image:: img/image220.png
:width: 800
**Étape 2 :** Accédez au dossier du code.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/2.2.5/
**Étape 3 :** Compilez le code.
.. raw:: html
.. code-block::
gcc 2.2.5_Ultrasonic.c -lwiringPi
**Étape 4 :** Exécutez le fichier exécutable.
.. raw:: html
.. code-block::
sudo ./a.out
Une fois le code exécuté, le module de capteur ultrasonique détecte la distance
entre l'obstacle situé en face de lui et le module lui-même, puis la valeur de
cette distance est affichée à l'écran.
.. note::
Si cela ne fonctionne pas après l'exécution ou s'il y a un message d'erreur
indiquant: \"wiringPi.h: Aucun fichier ou répertoire de ce type », veuillez
vous référer à :ref:`faq_c_nowork`.
**Code**
.. code-block:: c
#include
#include
#include
#define Trig 4
#define Echo 5
void ultraInit(void)
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
float disMeasure(void)
{
struct timeval tv1;
struct timeval tv2;
long time1, time2;
float dis;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
while(!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL);
while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL);
time1 = tv1.tv_sec * 1000000 + tv1.tv_usec;
time2 = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(time2 - time1) / 1000000 * 34000 / 2;
return dis;
}
int main(void)
{
float dis;
if(wiringPiSetup() == -1){ // En cas d'échec d'initialisation de wiringPi, afficher un message à l'écran
printf("setup wiringPi failed !");
return 1;
}
ultraInit();
while(1){
dis = disMeasure();
printf("%0.2f cm\n\n",dis);
delay(300);
}
return 0;
}
**Explication du Code**
.. code-block:: c
void ultraInit(void)
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
Initialise les broches du capteur ultrasonique ; en même temps, définit Echo
comme entrée et Trig comme sortie.
.. code-block:: c
float disMeasure(void){};
Cette fonction permet de mesurer la distance détectée par le capteur ultrasonique
en calculant le temps de retour de l'écho.
.. code-block:: c
struct timeval tv1;
struct timeval tv2;
`struct timeval` est une structure utilisée pour stocker l'heure actuelle.
La structure complète est la suivante :
.. code-block:: c
struct timeval
{
__time_t tv_sec; /* Secondes */
__suseconds_t tv_usec; /* Microsecondes */
};
Ici, `tv_sec` représente les secondes écoulées depuis l'Ère Unix lors de
la création de `struct timeval`. `tv_usec` correspond aux microsecondes,
soit une fraction de seconde.
.. code-block:: c
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
Envoie une impulsion ultrasonore de 10 µs.
.. code-block:: c
while(!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL);
Cette boucle vide est utilisée pour s'assurer qu'au moment de l'envoi du
signal de déclenchement, il n'y a pas de signal d'écho parasite, puis pour
obtenir l'heure actuelle.
.. code-block:: c
while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL);
Cette boucle vide est utilisée pour s'assurer que l'étape suivante n'est
effectuée que lorsque le signal d'écho est reçu, puis pour obtenir à nouveau
l'heure actuelle.
.. code-block:: c
time1 = tv1.tv_sec * 1000000 + tv1.tv_usec;
time2 = tv2.tv_sec * 1000000 + tv2.tv_usec;
Convertit le temps stocké par `struct timeval` en microsecondes complètes.
.. code-block:: c
dis = (float)(time2 - time1) / 1000000 * 34000 / 2;
La distance est calculée à partir de l'intervalle de temps et de la vitesse de
propagation du son. La vitesse du son dans l'air est de 34000 cm/s.