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) :
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.
[…] pour par exemple mesurer la luminosité ambiante avec une photorésistance. On pourra également mesurer la distance d’un objet en face du Raspberry pi à l’aide d’un capteur infr…, qui pourra nous servir à fabriquer un robot par […]
Bonjour, Il y a un problème d’indentation sur le proggramme