Dans le ce billet, nous verrons comment utiliser un capteur de distance infrarouge ou pour mesurer précisément la distance entre le capteur et un objet en face de celui ci. Dans un prochain billet, nous verrons comment réaliser la même chose avec un capteur à ultra-sons.

Le capteur de distance infrarouge 

Il s’agit un capteur infrarouge sharp permettant de détecter des objets de 10 à 80cm de distance (le câblage et le code seront identiques avec le capteur sharp IR 20-150cm, et probablement identiques avec pas mal d’autres capteurs IR. Vérifiez les datasheets pour voir le câblage sur des modèles différents).

Les capteurs infrarouges sont généralement sur le modèle de celui ci (il en existe d’autres, mais on trouve très facilement ce modèle) :
Image IPB

Le câblage

Comme vous pouvez le voir, vous avez 3 fils. Le câblage est extrêmement simple :

  • Le fil noir est connecté à la masse (connecteur P1-06 du raspberyPi, 3ème en partant du haut, colonne de droite)
  • Le fil rouge est connecté au +3.3V (connecteur P1-01 du Raspberry, premier pin, en haut à gauche des GPIO)
  • Le fil blanc est connecté à une entrée analogique de votre MCP3008.

Le programme

A partir de la, vous pouvez lire les valeurs avec un code très simple :

#!/usr/bin/env python
import time
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#fonction lisant les donnees SPI de la puce MCP3008, parmi 8 entrees, de 0 a 7
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)
GPIO.output(clockpin, False) # start clock low
GPIO.output(cspin, False) # bring CS low

commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin, True)
else:
GPIO.output(mosipin, False)
commandout <<= 1
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)

adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(12):
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1

GPIO.output(cspin, True)

adcout /= 2 # first bit is 'null' so drop it
return adcout

# ces numeros de pins GPIO doivent etre modifies pour correspondre aux broches utilisees.
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25

# definition de l'interface SPI
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)

#definition du ADC utilise (broche du MCP3008)
adcnum = 0
while True:
# Lecture de la valeur brute du capteur
read_adc0 = readadc(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)
# conversion de la valeur brute lue en milivolts = ADC * ( 3300 / 1024 )
millivolts = read_adc0 * ( 3300.0 / 1024.0)
print "valeurs lues : "
print "\tvaleur brute : %s" % read_adc0
print "\ttension : %s millivolts" % millivolts
time.sleep(0.5)

Exemple de valeurs et utilisation du capteur

Si vous souhaitez savoir la distance correspondant à la valeur lue, il faudra se référer à la courbe en page 5 des spécifications.
En pratique, on à approximativement les correspondances suivantes :

  • 10cm : 2300mV
  • 20cm : 1350mV
  • 30cm : 900mV
  • 40cm : 750mV
  • 50cm : 650mV
  • 60cm : 500mV
  • 70cm : 450mV
  • 80cm : 440mV

Quand vous serez en dessous d’une certaine distance à l’objet (moins de 10cm), la valeur lue apparaîtra comme plus grande. Ainsi, en dessous de 10cm, s’approcher d’un objet peut donner l’impression de s’en éloigner. Une solution est de placer le capteur à l’arrière du robot, ou au moins à 10cm du bord de celui ci, de sorte que la distance aux obstacles soit au moins égale à 10cm.

Vous trouverez ici la datasheet de ce capteur sharp IR 10-80cm, pour de plus amples détails.

Au passage, un capteur IR à très courte portée (5 ou 10cm) pourra permettre de détecter le vide devant le robot et éviter de tomber dans des escaliers.

Réseaux sociaux