Sonar à ultrasons

Ce tutoriel explique comment mettre en oeuvre le capteur de distance par ultrasons US100 Grove en MicroPython.

Matériel requis

  1. Une carte d’extension de base Grove
  2. La carte NUCLEO-WB55
  3. Un capteur à ultrasons US100 Grove

Le capteur de distance à ultrasons Grove :


Grove - Ultrasonic


Crédit image : Seeed Studio

Principe de fonctionnement :

Le capteur US100 émet des ultrasons et calcule le temps qu’ils mettent à revenir vers lui, ce qui lui permet de mesurer la distance le séparant d’un objet qui les a réfléchis, comprise entre 2 cm et 4,5 m. Il communique avec la carte par le biais de la liaison série (UART) à une fréquence de 9600 bauds. L’UART2 (ou LPUART) est câblé sur les broches PA2 et PA3 du STM32WB55, qui correspondent au connecteur “UART” du Grove Base Shield.

Montage

Pour faire communiquer le capteur avec la carte il faut connecter la broche Echo/Rx du capteur à la broche Rx du Grove Base Shield et la broche Trig/Tx à la broche Dx du Grove Base Shield. Attention : il faut bien veiller à ce que les broches Dx/Tx et Rx soient croisées entre le capteur et la carte car ces lignes sont unidirectionnelles. Dx/Tx correspond à la transmission d’un message tandis que Rx correspond à sa réception. Le Grove Base Shield réalise d’office ce croisement entre la carte et le capteur.

Il faut ensuite alimenter le capteur en reliant la broche VCC à la broche Vcc du Grove Base Shield ou alors tirer un fil supplémentaire pour connecter le deuxième GND à un GND quelconque de la NUCLEO-WB55 ou du Grove Base Shield.


Schéma de câblage du capteur à ultrasons


Le code MicroPython

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement.

Il faut ajouter le fichier US100.py dans le répertoire du périphérique PYBLASH.

Etape 1 : Pour faire fonctionner le programme, nous devons dans un premier temps importer 2 bibliothèques au tout début de notre code de cette façon :

from us100 import US100 # Pilote du sonar
from time import sleep # Pour temporiser

Etape 2 : On crée un objet correspondant au capteur qu’on nomme sonar :

sonar = US100()

Etape 3 : On affiche sur le terminal série la distance en cm que mesure le capteur toutes les secondes dans une boucle infinie :

while True:
    print('Distance : %.1f cm ' % (sonar.distance_mm()/10))
    sleep(1)

Résultat :

En approchant la main ou un objet du capteur, on peut voir la distance qui évolue.


Affichage des données du capteur ultrason


Les valeurs en -0,1 cm correspondent à une erreur de mesure. Soit le capteur mesure une trop grande distance, soit l’objet est orienté de telle façon que le signal du capteur rebondit dessus mais est dirigé dans une autre direction et ne revient donc pas au capteur, qui ne peut pas mesurer la distance.

Pour aller plus loin

Nous avons développé un code que vous pouvez trouver en cliquant sur ce lien qui simule le fonctionnement d’un capteur de recul automobile. Il faut ajouter un buzzer sur le port A3 du Grove Base Shield comme montré ci-dessous. Le buzzer produit un son court qui se répète à une vitesse variant en fonction de la distance que détecte le capteur. Le buzzer commence à émettre des sons pour une distance inférieure à 75 cm et produit un son continu lorsque la distance est inférieure à 5 cm. Le détecteur de recul est activé/désactivé en appuyant sur le bouton SW1 de la carte qui est géré par le mécanisme des interruptions. La led rouge LED1 s’allume lorsque le détecteur est activé.

Schéma de câblage du détecteur de recul

Le listing complet :

Editez maintenant le script main.py du périphérique PYBLASH :

from us100 import US100
from pyb import Pin, Timer
from time import sleep_ms

sonar=US100()

BUZZER = Pin('A3') # Pin A3 (shield Grove et connecteur Arduino) cablée sur Pin PA0 (microcontrôleur)
tim = Timer(2, freq=440)	# TIM2 channel 1 cablé sur A3
ch = tim.channel(1, Timer.PWM, pin=BUZZER)	#Mode PWM sur sur A3

# Initialisation du flag d'interruption
i = 0

# Initialisation du bouton poussoir
sw=pyb.Switch()

# Fonction d'interruption du bouton poussoir
def appuie():
	global i
	pyb.LED(1).toggle()
	if i==0:
		i = 1
	else:
		i = 0

sw.callback(appuie)

# Fonction qui fait sonner le buzzer
def buzz(temps):
	ch.pulse_width_percent(20) # Rapport cyclique de 20%
	sleep_ms(50)
	ch.pulse_width_percent(0)
	sleep_ms(temps)
	
while True: # Boucle infinie qui enclenche le radar s'il y'a eu appui du bouton, l'éteint si appui à nouveau
	if i == 1:
		d = sonar.distance_mm()/10
		print(d)
		
		# pas de son
		if d > 75:
			ch.pulse_width_percent(0)
			
		# son continu
		elif d < 5 and d > 0:
			buzz(0)
			
		# son évoluant en fonction de la distance
		else:
			t = int(d*5)
			buzz(t)
	# eteint le buzzer
	ch.pulse_width_percent(0)
	sleep_ms(5)