Projets:Wi-canne
Description du projet
Projet initié pendant le fabrikarium arianegroup aux Mureaux du 16 au 18 octobre 2019.
Ce projet a pour objectif de créer une "canne blanche" augmentée à destination des déficient·e·s visuels.
La wi-canne renseigne sur les reliefs du sol et l'environnement proche pour faciliter les déplacements. Un signal sonore ou haptique (moteur vibrant) indique les obstacles perçus par les capteurs embarqués.
Ce projet fait suite au projet de gant sonar
Analyse de l'existant
Systèmes existants :
- Tom Pouce
- Minitact
Une description précise de ces systèmes est donnée dans la thèse de doctorat de Joselin Villanueva "Contribution à la télémétrie optique active pour l'aide aux déplacements des non-voyants (pdf)" (2011)
Equipe (Porteur de projet et contributeurs)
- Porteur de projet : François
- Contribut/eur/rice/s : Aymeric (ArianeGroup), Bruno (ArianeGroup), Laurraine (ArianeGroup), Océane (ArianeGroup), Olivier (ArianeGroup), Robin (ArianeGroup), Yves (My Human Kit)
- Fabmanageuse référente : Lucie
- Responsable de documentation : Pierre
Cahier des charges
- anticiper le relief au sol dans un intervalle de + ou - 10 cm
- retour d'informations par vibreur ou message sonore
- coût de fabrication inférieur à 300 euros
- autonomie de 6 heures
- objet équilibré
- poids maximum : 300g
- recharge par port USB intégrée dans le manche
- ambidextre : symétrique pour utilisation de la main gauche ou de la main droite
- boîtier résistant à la pluie et au soleil
- indications en relief sur le boîtier
- objet autonome, fonctionne sans canne
- indication de l'état de charge de la batterie par un appui bouton
Matériel et outils nécessaires
- imprimante 3D
- circuits électroniques et capteurs
Conception du boîtier
C'est un processus itératif! Plusieurs hypothèses sont explorées.
Electronique
Pour le premier prototype, 2 architectures sont envisagées :
- carte unique intégrée dans une poignée
- système sans-fil à 2 cartes, l'une chargée de la détection (capteurs et traitement des données) qui communique sans-fil avec une seconde dédiée aux signaux d'avertissement sonores et vibrants.
Version à carte unique
Version sans fil à 2 cartes
Premier prototype
Basé sur l'architecture à carte unique
Composants nécessaires
Ex. | Composant | Type |
---|---|---|
1 | arduino nano | carte à microcontrôleur |
1 | module buzzer | buzzer piezo |
1 | module moteur | double pont en H L9110S |
2 | moteur vibrant | |
1 | écran LCD 2 lignes I2C | |
1 | ADXL335 | accéléromètre 3 axes analogique |
3 | module CJVL53L0XV2 | capteur ToF STmicroelectronics VL53L0X |
1 | module SRF05 | capteur de distance à ultrason |
/!\ le capteur ultrason est cablé pour fonctionner avec une seule broche, utilisée alternativement pour envoyer l'impulsion ultrasonique et pour la recevoir. Cette alternance est programmée dans le code.
/!\ L'accéléromètre représenté sur le circuit dans un bloc rouge n'est pas utilisé dans ce prototype. L'utilisa/teur/trice étant en mouvement, les données sont difficiles à interpréter.
Capteurs testés
Les capteurs de distance sont basés sur plusieurs principes techniques : Lidar, Ultrason, LED ou VCSEL (diodes laser), ... Voir lexique en bas de cette page
Capteur | Type de détection | Champ de vue | intervalle de distance | fréquence | consommation |
---|---|---|---|---|---|
VL53L0X | VCSEL (940 nm) | 25° | 5 à 120 cm | ? | 20 mA |
VL53L1X | VCSEL (940nm) | 27° | 4 à 400 cm | 50 Hz | 20 mA ? |
TFMini | led infrarouge (850nm) | 2,3° | 30 à 1200 cm | 100 Hz | 120 mA max |
TFMini plus | led infrarouge (850 nm) | 3,6° | 10 à 1200 cm | 1000 Hz max. | ? |
HC-SR05 | ultrason | 15° | 2 à 450 cm | 40 Hz max | 10 à 40 mA |
SRF05 | ultrason 40 kHz | 30° | 4 à 400 cm | 20 Hz max | ? |
(Données assemblées à partir de sources diverses, à prendre avec des pincettes!)
Sur la comparaison des caractéristiques de différents types de capteurs de distance, voir aussi https://www.sparkfun.com/distance_sensor_comparison_guide
Carte CJVL53L0XV2
Carte de développement pour le capteur ToF miniature VL53L0X de STMicroelectronics. Ce capteur fonctionne dans un intervalle de 5 à 120 cm en utilisant un laser infrarouge dans un champ de vue (FoV) de 25°. La communication se fait par le protocole I2C.
documentation
ressources
Carte VL53L1X-SATEL
Carte de développement pour le capteur miniature ToF VL53L1X. Ce capteur permet de réaliser des mesures de distance entre 4 et 400 cm en utilisant un laser infrarouge à une fréquence de 50Hz, dans un champ de vue (FOV) de 27°. Ce capteur se base sur la technologie FlightSense, brevetée par ST Microelectronics.
Le brochage n'est pas clairement indiqué sur la carte, le voici :
documentation
ressources
- https://www.st.com/en/evaluation-tools/vl53l1x-satel.html
- https://www.st.com/en/imaging-and-photonics-solutions/vl53l1x.html
Capteur accéléromètre ADXL335 (Adafruit)
Accéléromètre trois-axes basé sur la puce ADXL335 d'Analog Devices. Ce capteur renvoie 3 mesures analogiques de la gravité sur les axes X, Y, Z. Le module utilisé ici est concçu et fabriqué par Adafruit, il permet de récupérer les mesures à une fréquence de 50 Hz.
Ce capteur doit être calibré si on veut obtenir des mesures précises.
documentation
ressources
- https://learn.adafruit.com/adafruit-analog-accelerometer-breakouts?view=all
- https://www.analog.com/en/products/adxl335.html#product-documentation
Capteur Benewake TFmini
Il s'agit d'un capteur ToF vendu sous l'appellation LiDAR, toutefois il utilise plutôt une diode LED infrarouge et une optique adéquate. Ce capteur permet de mesurer une distance comprise entre 30 centimètres et 12 mètres, à une fréquence de 100Hz, soit 100 mesures par seconde. Il fonctionne à une tension de 5v et communique par une interface série (UART).
zone de détection
- 1 : zone aveugle du capteur, entre 0 et 30cm, la distance mesurée n'est pas fiable
- 2 : zone de détection en conditions extrêmes (lumière exterieure très forte > 100 kLux et réflexion sur une surface très faiblement réfléchissante)
- 3 : zone de détection en lumière extérieure (autour de 70 kLux)
- 4 : zone de détection en intérieur ou par faible lumière extérieure
- 5 : distance latérale dans laquelle la mesure peut être considérée comme fiable
documentation
ressources externes
- fabricant : Benewake
- https://learn.sparkfun.com/tutorials/tfmini---micro-lidar-module-hookup-guide
- https://wiki.dfrobot.com/TF_Mini_LiDAR_ToF__Laser_Range_Sensor_SKU__SEN0259
Capteur Benewake TFmini Plus
Capteur conçu sur le même principe que le TFmini. Il s'en différencie sur plusieurs points :
- boîtier IP65, résistant à l'eau et à la poussière
- suffisamment résistant aux vibrations pour être installé sur un drone
- trajet de lumière optimisé et algorithme différent pour minimiser l'influence du milieu lumineux, cf. zone de détection ci-dessous
- fréquence des mesures ajustable jusqu'à 1000 Hz
Ce capteur est conçu à partir du circuit intégré OPT3101 de Texas Instruments.
zone de détection
- 1 : zone aveugle du capteur entre 0 et 10 cm
- 2 : zone de détection d'un objet très faiblement réfléchissant (reflectivité de 10%)
- 3 : zone de détection de d'un objet réfléchissant (réflectivité de 90%)
documentation
Ressources
- fabricant : Benewake
- capteur TI OPT3101 : http://www.ti.com/tool/BW-3P-TFMINI-PLUS + http://www.ti.com/product/OPT3101
Capteur de distance à ultrason HC-SR05 (Velleman VMA306)
Ce capteur permet de mesurer la distance avec un obstacle en mesurant le temps de rebond d'une impulsion ultrasonique. Il est capable de détecter un obstacle à une distance maximum de 4,5m.
zone de détection
Ce schéma correspond au module HC-SR04 qui utilise le même type de transducteur ultrasonique.
documentation
- datasheet
- schéma électrique
- distributeur : Velleman
Capteur de distance à ultrason SRF05
Ce capteur permet de mesurer la distance avec un obstacle en mesurant le temps de rebond d'une impulsion ultrasonique à 40 kHz. Il est basé sur le transducteur ultrasonique T400S16
zone de détection
D'après la datasheet du fabricant du transducteur.
Circuits de test
distance et mouvement
Un circuit test est réalisé pour tester différents composants, il intègre un accéléromètre analogique, un capteur de distance TFmini et un afficheur LCD pour le retour d'informations.
// Télémètre Lidar TFmini avec CARTE ARDUINO MEGA 2560 // YLC 16/10/2019 /*--------------------------------------------------- Pour montage sur une carte avec 1 seul port série (UNO, NANO) definir un port série logiciel pour le lidar : (NB : ralentit les mesures car cela prend des temps de cycle du contrôleur) #include<SoftwareSerial.h> // définit un port série logiciel SoftwareSerial Serial1(2,3); // nomme le port logiciel "Serial1" (pin2 = RX, pin3 = TX) Sur carte Arduino MEGA utiliser directement les ports série Serial et Serial1 brochages MEGA : 18 TX du lidar 19 RX du lidar 20 SDA du LCD 21 SCL du LCD Format des données reçues du lidar (9 octets) : (le code d'en-tête est répété dans les 2 premiers octets) les valeurs distance et force sont fournies sur 2 octets en little endian (poids faible en premier) octet0=0x59 octet1=0x59 octet2=Dist_faible octet3=Dist_fort octet4=force_faible octet5=force_fort octet6=mode octet7=0x00 octet8=somme de contrôle -----------------------------------------------------*/ #include <Wire.h> #include <math.h> #include <LiquidCrystal_I2C.h> int i = 0; // index sur la table de stockage const int entete = 0x59; // Identifiant du flux de données const int x_out = A1; /* connect x_out of module to A1 of UNO board */ const int y_out = A2; /* connect y_out of module to A2 of UNO board */ const int z_out = A3; /* connect z_out of module to A3 of UNO board */ int data[9]; // Table de stockage des données fournies par le lidar int dist; // valeur de la distance mesurée int force; // force du signal reçu int ctrol; // somme de controle des données reçues (checksum) int corr = 5; // valeur de correction de la mesure lue en cm int x_adc_value; int y_adc_value; int z_adc_value; double x_g_value; double y_g_value; double z_g_value; double roll, pitch, yaw; LiquidCrystal_I2C lcd(0x3f,20,4); // déclaration afficheur LCD série I2C #define TRACES 1 // 1 pour activer trace sur port série vers ordinateur, 0 pour la désactiver void setup() { #if TRACES // si mise au point activée Serial.begin(115200); // vitesse du port de communication avec l'ordinateur #endif Serial1.begin(115200); // vitesse du port de communication avec le LiDAR lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0,0); lcd.print("Hello, world!"); } void loop() { // Accelerometre x_adc_value = analogRead(x_out); /* Digital value of voltage on x_out pin */ y_adc_value = analogRead(y_out); /* Digital value of voltage on y_out pin */ z_adc_value = analogRead(z_out); /* Digital value of voltage on z_out pin */ x_g_value = ( ( ( (double)(x_adc_value * 5)/1024) - 1.65 ) / 0.330 ); /* Acceleration in x-direction in g units */ y_g_value = ( ( ( (double)(y_adc_value * 5)/1024) - 1.65 ) / 0.330 ); /* Acceleration in y-direction in g units */ z_g_value = ( ( ( (double)(z_adc_value * 5)/1024) - 1.80 ) / 0.330 ); /* Acceleration in z-direction in g units */ roll = ( ( (atan2(y_g_value,z_g_value) * 180) / 3.14 ) + 180 ); pitch = ( ( (atan2(z_g_value,x_g_value) * 180) / 3.14 ) + 180 ); // Affichage LCD valeurc accelerometre lcd.setCursor(0,3); lcd.print(roll); lcd.print(" "); lcd.print(pitch); if (Serial1.available()) { lcd.setCursor(0,0); lcd.print("OK "); // test si données fournies par le lidar // Lecture entete 1 data[0] = Serial1.read(); if (data[0] == entete) { data[1] = Serial1.read(); if (data[1] == entete) { i=1; for(i = 2; i < 9; i++) { // on lit les 7 octets suivants data[i] = Serial1.read(); // on stocke les données lues dans un tableau } ctrol = data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+data[7]; if(data[8] == (ctrol&0xff)) { dist = data[2]+data[3]*256; force = data[4]+data[5]*256; if (dist < 1e-5) { dist = 0.0; } lcd.setCursor(7, 0); // affichage mesures sur l'écran LCD lcd.print(dist); lcd.print(" cm "); lcd.setCursor(7, 1); lcd.print(force); lcd.print(" "); } } } else { } } else { lcd.setCursor(0,0); lcd.print("ERREUR"); // test si données fournies par le lidar } }
Lexique
FoV (Field of View) : champ de vue, angle de sensibilité d'un capteur optique. cf. https://fr.wikipedia.org/wiki/Champ_de_vue
laser (light amplification by stimulated emission of radiation) : « amplification de la lumière par émission stimulée de radiation » rayonnement lumineux spatialement et temporellement cohérent basé sur l'effet laser. cf. https://fr.wikipedia.org/wiki/Laser
LiDAR (Light Detection and Ranging) : procédé d'estimation de la distance à l'aide d'un faisceau lumineux, en général produit par un laser. cf. https://fr.wikipedia.org/wiki/Lidar
lux unité de mesure de l'éclairement lumineux. cf. https://fr.wikipedia.org/wiki/Lux_(unit%C3%A9)
ToF (Time of Flight) : Mesure du temps nécessaire pour parcourir une distance. cf. https://en.wikipedia.org/wiki/Time_of_flight
UART (Universal asynchronous receiver-transmitter) : interface hardware de communication asynchrone, dont le type de données et la vitesse de transmission peut-être définie. cf. https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter
VCSEL (Vertical-Cavity Surface-Emitting Laser) : à prononcer vixel! diode laser à cavité verticale émettant par la surface. cf. https://fr.wikipedia.org/wiki/Diode_laser_%C3%A0_cavit%C3%A9_verticale_%C3%A9mettant_par_la_surface