Différences entre versions de « Projets:Wi-canne »

De wikilab
(changements plan)
Ligne 1 : Ligne 1 :
= Wi-canne =
 
  
== Description du projet ==
+
 
 +
= Description du projet =
  
 
Projet initié pendant le fabrikarium arianegroup aux Mureaux du 16 au 18 octobre 2019.   
 
Projet initié pendant le fabrikarium arianegroup aux Mureaux du 16 au 18 octobre 2019.   
Ligne 9 : Ligne 9 :
 
Des capteurs viennent renseigner sur les aspérités du sol et l'environnement proche pour faciliter les déplacements. Un signal sonore ou vibrant indique l'environnement perçu par les capteurs.
 
Des capteurs viennent renseigner sur les aspérités du sol et l'environnement proche pour faciliter les déplacements. Un signal sonore ou vibrant indique l'environnement perçu par les capteurs.
  
== Analyse de l'existant ==
+
= Analyse de l'existant =
  
 
Systèmes existants :
 
Systèmes existants :
Ligne 15 : Ligne 15 :
 
* Mini tact
 
* Mini tact
  
== Equipe (Porteur de projet et contributeurs) ==
+
= Equipe (Porteur de projet et contributeurs) =
  
 
* Porteur de projet : François
 
* Porteur de projet : François
Ligne 22 : Ligne 22 :
 
* Responsable de documentation : Pierre
 
* Responsable de documentation : Pierre
  
== Cahier des charges ==
+
= Cahier des charges =
  
 
* anticiper le relief au sol dans un intervalle de + ou - 10 cm
 
* anticiper le relief au sol dans un intervalle de + ou - 10 cm
Ligne 37 : Ligne 37 :
 
* indication de l'état de charge de la batterie par un appui bouton
 
* indication de l'état de charge de la batterie par un appui bouton
  
== Matériel et outils nécessaires ==
+
= Matériel et outils nécessaires =
  
 
* imprimante 3D
 
* imprimante 3D
 
* circuits électroniques et capteurs
 
* circuits électroniques et capteurs
  
== Electronique ==
+
= Electronique =
  
 
A ce stade, 2 architectures sont envisagées :
 
A ce stade, 2 architectures sont envisagées :
Ligne 49 : Ligne 49 :
 
* 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.
 
* 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 à carte unique ==
  
 
[[File:electronique_scenario_filaire.png|600px|none|alt=version à carte électronique unique]]
 
[[File:electronique_scenario_filaire.png|600px|none|alt=version à carte électronique unique]]
  
=== Version sans fil à 2 cartes ===
+
== Version sans fil à 2 cartes ==
  
 
[[File:electronique_scenario_sans_fil.png|600px|none|alt=version sans fil]]
 
[[File:electronique_scenario_sans_fil.png|600px|none|alt=version sans fil]]
  
== Circuits de test ==
+
= Capteurs testés =
 
 
=== 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.
 
 
 
[[File:arduino_mega_tfmini_adxl335_2lignes.png|800px|alt=circuit de test capteurs]]
 
 
 
<nowiki>
 
// 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
 
}
 
}
 
</nowiki>
 
 
 
== Capteurs testés ==
 
  
 
{| class="wikitable"
 
{| class="wikitable"
Ligne 231 : Ligne 107 :
 
Sur la comparaison des caractéristiques de différents types de capteurs de distance, voir aussi https://www.sparkfun.com/distance_sensor_comparison_guide
 
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 CJVL53L0XV2 ==
  
 
[[File:CJVL53L0XV2.jpg|300px|none|alt=carte de développement pour le capteur VL53L0X]]
 
[[File:CJVL53L0XV2.jpg|300px|none|alt=carte de développement pour le capteur VL53L0X]]
Ligne 237 : Ligne 113 :
 
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.
 
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 ====
+
=== documentation ===
  
 
* [[Media:vl53l0x.pdf|datasheet du circuit intégré VL53L0X]]
 
* [[Media:vl53l0x.pdf|datasheet du circuit intégré VL53L0X]]
  
==== ressources ====
+
=== ressources ===
  
 
* https://www.st.com/en/imaging-and-photonics-solutions/vl53l0x.html
 
* https://www.st.com/en/imaging-and-photonics-solutions/vl53l0x.html
  
=== Carte VL53L1X-SATEL ===
+
== Carte VL53L1X-SATEL ==
  
 
[[File:VL53L1X-SATEL.jpg|300px|none|alt=carte de développement pour le capteur VL53L1X-SATEL]]
 
[[File:VL53L1X-SATEL.jpg|300px|none|alt=carte de développement pour le capteur VL53L1X-SATEL]]
Ligne 255 : Ligne 131 :
 
[[File:VL53L1X-SATEL_brochage.png|400px|none|alt=brochage de la carte VL53L1X-SATEL]]
 
[[File:VL53L1X-SATEL_brochage.png|400px|none|alt=brochage de la carte VL53L1X-SATEL]]
  
==== documentation ====
+
=== documentation ===
  
 
* [[Media:vl53l1x-satel.pdf|datasheet de la carte VL53L1X-SATEL]]
 
* [[Media:vl53l1x-satel.pdf|datasheet de la carte VL53L1X-SATEL]]
 
* [[Media:vl53l1x.pdf|datasheet du circuit intégré VL53L1X]]
 
* [[Media:vl53l1x.pdf|datasheet du circuit intégré VL53L1X]]
  
==== ressources ====
+
=== ressources ===
  
 
* https://www.st.com/en/evaluation-tools/vl53l1x-satel.html
 
* https://www.st.com/en/evaluation-tools/vl53l1x-satel.html
 
* https://www.st.com/en/imaging-and-photonics-solutions/vl53l1x.html
 
* https://www.st.com/en/imaging-and-photonics-solutions/vl53l1x.html
  
=== Capteur accéléromètre ADXL335 (Adafruit) ===
+
== Capteur accéléromètre ADXL335 (Adafruit) ==
  
 
[[File:adafruit_adxl335.jpg|300px|none|alt=capteur ADXL335]]
 
[[File:adafruit_adxl335.jpg|300px|none|alt=capteur ADXL335]]
Ligne 273 : Ligne 149 :
 
Ce capteur doit être calibré si on veut obtenir des mesures précises.
 
Ce capteur doit être calibré si on veut obtenir des mesures précises.
  
==== documentation ====
+
=== documentation ===
  
 
* [[Media:ADXL335.pdf|datasheet]]
 
* [[Media:ADXL335.pdf|datasheet]]
  
==== ressources ====
+
=== ressources ===
  
 
* https://learn.adafruit.com/adafruit-analog-accelerometer-breakouts?view=all
 
* https://learn.adafruit.com/adafruit-analog-accelerometer-breakouts?view=all
 
* https://www.analog.com/en/products/adxl335.html#product-documentation
 
* https://www.analog.com/en/products/adxl335.html#product-documentation
  
=== Capteur Benewake TFmini ===
+
== Capteur Benewake TFmini ==
  
 
[[File:benewake_tfmini.jpg|300px|alt=caption capteur TFmini]]
 
[[File:benewake_tfmini.jpg|300px|alt=caption capteur TFmini]]
Ligne 288 : Ligne 164 :
 
Il s'agit d'un capteur ToF vendu sous l'appellation LiDAR, toutefois il n'utilise pas de laser mais 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).
 
Il s'agit d'un capteur ToF vendu sous l'appellation LiDAR, toutefois il n'utilise pas de laser mais 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 ====
+
=== zone de détection ===
  
 
[[File:benewake_tfmini_operating_range.png|800px|none|alt=|caption capteur TFmini, zone de détection]]
 
[[File:benewake_tfmini_operating_range.png|800px|none|alt=|caption capteur TFmini, zone de détection]]
Ligne 298 : Ligne 174 :
 
* 5 : distance latérale dans laquelle la mesure peut être considérée comme fiable
 
* 5 : distance latérale dans laquelle la mesure peut être considérée comme fiable
  
==== documentation ====
+
=== documentation ===
  
 
* [[Media:benewake_tfmini_datasheet.pdf|datasheet]]
 
* [[Media:benewake_tfmini_datasheet.pdf|datasheet]]
Ligne 304 : Ligne 180 :
 
* [[Media:benewake_tfmini_arduino_tutorial.pdf|arduino tutorial]]
 
* [[Media:benewake_tfmini_arduino_tutorial.pdf|arduino tutorial]]
  
==== ressources externes ====
+
=== ressources externes ===
  
 
* fabricant : [http://en.benewake.com/ Benewake]
 
* fabricant : [http://en.benewake.com/ Benewake]
Ligne 310 : Ligne 186 :
 
* https://wiki.dfrobot.com/TF_Mini_LiDAR_ToF__Laser_Range_Sensor_SKU__SEN0259
 
* https://wiki.dfrobot.com/TF_Mini_LiDAR_ToF__Laser_Range_Sensor_SKU__SEN0259
  
=== Capteur Benewake TFmini Plus ===
+
== Capteur Benewake TFmini Plus ==
  
 
[[File:benewake_tfminiplus.jpg|300px|alt=caption capteur TFmini plus]]
 
[[File:benewake_tfminiplus.jpg|300px|alt=caption capteur TFmini plus]]
Ligne 322 : Ligne 198 :
 
Ce capteur est conçu à partir du circuit intégré OPT3101 de Texas Instruments.
 
Ce capteur est conçu à partir du circuit intégré OPT3101 de Texas Instruments.
  
==== zone de détection ====
+
=== zone de détection ===
  
 
[[File:benewake_tfminiplus_operating_range.png|800px|none|alt=|caption capteur TFmini plus]]
 
[[File:benewake_tfminiplus_operating_range.png|800px|none|alt=|caption capteur TFmini plus]]
Ligne 330 : Ligne 206 :
 
* 3 : zone de détection de d'un objet réfléchissant (réflectivité de 90%)
 
* 3 : zone de détection de d'un objet réfléchissant (réflectivité de 90%)
  
==== documentation ====
+
=== documentation ===
  
 
* [[Media:benewake_tfminiplus_datasheet.pdf|datasheet]]
 
* [[Media:benewake_tfminiplus_datasheet.pdf|datasheet]]
 
* [[Media:benewake_tfminiplus_product_manual.pdf|product manual]]
 
* [[Media:benewake_tfminiplus_product_manual.pdf|product manual]]
  
==== Ressources ====
+
=== Ressources ===
  
 
* fabricant : [http://en.benewake.com/ Benewake]
 
* fabricant : [http://en.benewake.com/ Benewake]
 
* capteur TI OPT3101 : http://www.ti.com/tool/BW-3P-TFMINI-PLUS + http://www.ti.com/product/OPT3101
 
* 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) ===
+
== Capteur de distance à ultrason HC-SR05 (Velleman VMA306) ==
  
 
[[File:capteur_hc-sr05.jpg|300px|none|alt=capteur de distance à ultrason HC-SR05]]
 
[[File:capteur_hc-sr05.jpg|300px|none|alt=capteur de distance à ultrason HC-SR05]]
Ligne 346 : Ligne 222 :
 
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.
 
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 ====
+
=== zone de détection ===
  
 
Ce schéma correspond au module HC-SR04 qui utilise le même type de transducteur ultrasonique.
 
Ce schéma correspond au module HC-SR04 qui utilise le même type de transducteur ultrasonique.
Ligne 352 : Ligne 228 :
 
[[File:HC-SR04_detection_angle.jpg|500px|none|alt=zone de détection du capteur ultrasonique]]
 
[[File:HC-SR04_detection_angle.jpg|500px|none|alt=zone de détection du capteur ultrasonique]]
  
==== documentation ====
+
=== documentation ===
  
 
* [[Media:capteur_hc-sr05_datasheet.pdf|datasheet]]
 
* [[Media:capteur_hc-sr05_datasheet.pdf|datasheet]]
Ligne 358 : Ligne 234 :
 
* distributeur : [https://www.velleman.eu/products/view/?country=be&lang=fr&id=435526 Velleman]
 
* distributeur : [https://www.velleman.eu/products/view/?country=be&lang=fr&id=435526 Velleman]
  
== Lexique ==
+
= 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.
 +
 
 +
[[File:arduino_mega_tfmini_adxl335_2lignes.png|800px|alt=circuit de test capteurs]]
 +
 
 +
<nowiki>
 +
// 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
 +
}
 +
}
 +
</nowiki>
 +
 
 +
= Lexique =
  
 
'''FoV (Field of View)''' : champ de vue, angle de sensibilité d'un capteur optique. cf. https://fr.wikipedia.org/wiki/Champ_de_vue
 
'''FoV (Field of View)''' : champ de vue, angle de sensibilité d'un capteur optique. cf. https://fr.wikipedia.org/wiki/Champ_de_vue

Version du 17 octobre 2019 à 14:45


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.

Des capteurs viennent renseigner sur les aspérités du sol et l'environnement proche pour faciliter les déplacements. Un signal sonore ou vibrant indique l'environnement perçu par les capteurs.

Analyse de l'existant

Systèmes existants :

  • Tom Pouce
  • Mini tact

Equipe (Porteur de projet et contributeurs)

  • Porteur de projet : François
  • Contribut/eur/rice/s : Aymeric (Ariane Group), Bruno (Ariane group), Laurraine (Ariane Group), Océane (Ariane Group), Olivier (Ariane Group), Robin (Ariane Group), 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

Electronique

A ce stade, 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 à carte électronique unique

Version sans fil à 2 cartes

version sans fil

Capteurs testés

Capteur Type de détection Champ de vue intervalle de distance fréquence consommation
VL53L0X laser infrarouge 25° 5 à 120 cm ? 20 mA
VL53L1X laser infrarouge 27° 4 à 400 cm 50 Hz 20 mA ?
TFMini led infrarouge 2,3° 30 à 1200 cm 100 Hz 120 mA max
TFMini plus led infrarouge 3,6° 10 à 1200 cm 1000 Hz max. ?
HC-SR05 ultrason 15° 2 à 450 cm 40 Hz max 10 à 40 mA

(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 VL53L0X

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 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 :

brochage de la carte VL53L1X-SATEL

documentation

ressources

Capteur accéléromètre ADXL335 (Adafruit)

capteur ADXL335

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

Capteur Benewake TFmini

caption capteur TFmini

Il s'agit d'un capteur ToF vendu sous l'appellation LiDAR, toutefois il n'utilise pas de laser mais 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

Capteur Benewake TFmini Plus

caption capteur 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

Capteur de distance à ultrason HC-SR05 (Velleman VMA306)

capteur de distance à ultrason HC-SR05

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.

zone de détection du capteur ultrasonique

documentation

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.

circuit de test capteurs

// 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