Il existe des capteurs de distance infrarouges du fabricant Sharp, qui peuvent être utilisés très simplement avec le Raspberry Pi. Il existe différents télémètres, qui couvrent différentes plages de distance. Ces modules fonctionnent de la même manière que les télémètres laser, mais avec de la lumière infrarouge. Dans ce cas, un émetteur émet un faisceau de lumière et un récepteur transmet une tension analogique en fonction de l’angle d’incidence, ce qui permet de calculer la distance.
Dans ce tutoriel, le capteur de distance GP2Y0A02YK0F montre comment on peut déterminer une distance. Cela peut être utile, par exemple dans la voiture comme PC de voiture (distance de la caméra de recul), comme voiture robot ou dans le contexte domotique.
Pièces de matériel nécessaires – Capteurs de distance
Dans l’ensemble, Sharp propose plusieurs méthodes de mesure de distance dans son offre, où il convient de rechercher individuellement celle qui convient à la tâche. Ce tutoriel est conçu pour le Sharp GP2Y0A02YK0F, qui convient pour des portées de 20 cm à 150 cm. Les distances en dehors de cette plage ne sont pas mesurées correctement.
Les modules suivants sont disponibles:
- GP2Y0A02YK0F (20 cm – 150 cm)
- GP2Y0A41SK0F (4 cm – 30 cm)
- GP2Y0A21 (10 cm – 80 cm)
- GP2Y0A710K0F (100 cm – 550 cm)
En utilisant un capteur autre que le GP2Y0A02YK0F, il se peut que vous deviez ajuster les étapes. Les fiches techniques sont disponibles sur la page d’accueil de Sharp.
Vous aurez également besoin des éléments suivants:
Fonctionnement du capteur de distance infrarouge
Ce capteur IR a besoin d’une tension d’entrée comprise entre 4,5V et 5,5V, il peut donc parfaitement fonctionner avec les 5V du Raspberry Pi. Selon la fiche technique, une tension différente est appliquée à la broche de données, en fonction de la distance à laquelle se trouve l’objet mesuré par le capteur. Ceci est visible dans le graphique suivant:
Connexion du MCP3008
Comme la tension de sortie est analogique, nous devons d’abord la » convertir » à l’aide d’un convertisseur analogique-numérique, afin de pouvoir l’évaluer avec le Raspberry Pi. Cela fonctionne mieux avec un MCP3008 ADC.
Cet appareil est commandé par le canal SPI du Pi et possède huit canaux sur lesquels les tensions analogiques peuvent être converties. Ceux-ci sont divisés en 2 ^ 20, soit 1024 zones (0-1023). Si le MCP3008 est connecté à 3,3V, un signal de 1 signifie 0,00322V (3,22mV). Comme la tension du port SPI du Raspberry Pi est de 3,3V, il ne faut plus appliquer de courant, sinon les GPIO peuvent être endommagés.
L’ensemble du circuit ressemble à ceci:
RaspberryPi | MCP3008 |
---|---|
Broche 1 (3.3V) | Broche 16 (VDD) |
Broche 1 (3.3V) | Broche 15 (VREF) |
Broche 6 (GND) | Broche 14 (AGND) |
Broche 23 (SCLK) | Broche 13 (CLK) |
Broche 21 (MISO) | Broche 12 (DOUT) |
Broche 19 (MOSI) | Broche 11 (DIN) |
Broche 24 (CE0) | Broche 10 (CS/SHDN) |
Broche 6 (GND) | Broche 9 (DGND) |
Le capteur de distance n’a que trois connexions : rouge (5V), noir (GND) et jaune, qui est la broche de données et qui est connectée au MCP3008 ADC. Pour certains, les cloches d’alarme peuvent sonner et demander pourquoi un module de 5V est connecté directement, bien que le SPI du Pi ne devrait pas recevoir plus de 3,3V d’entrée. La fiche technique indique que la tension de sortie du capteur ne dépasse jamais 3V (voir le graphique de la fiche technique). Quiconque a peur que quelque chose arrive au Pi peut mettre un diviseur de tension avec 2 résistances devant lui, mais cela réduit la précision et il faudrait aussi recalculer la formule que j’ai utilisée. Dans mes tests, il n’a jamais atteint des tensions supérieures à 2,7V (GP2Y0A02YK0F). Cela peut être différent pour les autres capteurs Sharp.
Logiciels pour la lecture à distance
Pour contrôler le MCP3008, le port SPI doit être activé. Cela fonctionne comme suit:
sudo raspi-config
« 8 Options avancées » -> « A6 SPI » -> « Oui ».
Après cela, vous devez confirmer le redémarrage.
Dans certains cas, le module (spi-bcm2708) doit également être saisi dans le fichier / etc / modules. Pour cela, il suffit d’appeler
sudo nano /etc/modules
et ajoutez la ligne suivante à la fin (si elle n’existe pas) :
1 |
spi-bcm2807 |
La bibliothèque spidev peut maintenant être installée, si cela n’a pas encore été fait:
sudo apt-get install git python-dev git clone git://github.com/doceme/py-spidev cd py-spidev/ sudo python setup.py install
Maintenant que nous avons installé tous les paquets nécessaires, nous pouvons créer le script pour mesurer la distance.
sudo nano ir_distance.py
Voici le contenu du scénario :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/python import spidev spi = spidev.SpiDev() spi.open(0,0) spi.max_speed_hz=1000000 def readChannel(channel): val = spi.xfer2([1,(8+channel)<<4,0]) data = ((val[1]&3) << 8) + val[2] return data if __name__ == "__main__": v=(readChannel(0)/1023.0)*3.3 dist = 16.2537 * v**4 - 129.893 * v**3 + 382.268 * v**2 - 512.611 * v + 301.439 print "Distanz: %.2f cm" % dist |
Nous pouvons le faire maintenant avec (sudo python ir_distance.py
), après avoir visé un objet, la distance est sortie.
Que se passe-t-il exactement ici ? Tout d’abord, la valeur analogique (entre 0 et 1023) est lue (ligne 15). Cependant, comme nous voulons connaître le voltage, la valeur est divisée par 1023 et multipliée par 3,3 (volts).
Attention : Dans ce cas, nous savons (d’après la fiche technique) que la tension de sortie ne dépasse jamais 2,8V, bien que nous alimentions le capteur avec 5V. Les autres modules (analogiques et numériques) renvoient souvent des signaux avec des tensions aussi élevées que la tension appliquée. Si ce n’est pas le cas, le Raspberry Pi risque d’être endommagé.
À la ligne 16 du scénario, je calcule la tension en centimètres. J’ai trouvé la formule ici et je l’ai un peu adaptée. Pour cela, j’ai testé différentes distances et modifié un peu les facteurs afin que la distance calculée soit la plus précise possible. Comme je l’ai mentionné au début, cette formule ne concerne que le capteur Sharp GP2Y0A02YK0F. Comme les autres capteurs fournissent des signaux analogiques dans la même gamme, cette formule doit être ajustée pour les capteurs correspondants (si quelqu’un fait cela, je serais heureux qu’il l’affiche ci-dessous).
On peut aussi interpoler entre les zones (fiche technique) en stockant tous les indices (volts, distance) et en lisant la valeur spécifique et en calculant la distance par rapport à la tension mesurée par interpolation linéaire
Tôt ou tard, je devrai fixer un tel module à l’intérieur du pare-brise de ma voiture et disposer d’un compteur de distance en cas de stationnement en marche arrière – si quelqu’un ne sait pas encore ce qu’il peut en faire 😉