Cet article présente la réalisation d’un LIDAR avec un capteur laser Time-of-Flight (ToF) .
Matériels nécessaire :
- Une carte Esus
- Un capteur VL53L0X de chez Pololu
- Un servomoteur AX12
Logicielle:
- Librairie pour le capteur VL53L0X, ici.
- Processing
- Arduino IDE
Synoptique
Le servomoteur AX12 est câblé sur la sortie Tx de la carte Esus. Puis le capteur VL53L0X, IO n°2 pour SDA et n°13 pour le signal SDL du bus I2C.
L’alimentation doit être d’au moins 7 Volt pour faire fonctionner le servomoteur. La capteur laser est alimenté par une tension de 3.3V présente sur la carte Esus.
Le code de la carte Esus
La carte Esus contrôle le servomoteur pour le déplacement d’un angle de 0 à 300° aller-retour. De plus, elle gère l’acquisition de la distance obtenu par le capteur VL53L0X.
Voici le setup :
void setup()
{
// init serial
Serial.begin(9600);
// init serial AX12
swSer.begin(1000000);
// init I2C
Wire.begin(2, 13);//SDA, SCL
// init VL53L0X
sensor.init();
sensor.setTimeout(500);
state = 1;
}
La boucle infini :
void loop()
{
// servomotor control
AX12_GoalPosition(0xFE, angle, 1023);
// read distance
data = sensor.readRangeSingleMillimeters();
// send distance
Serial.write(data>>8);
Serial.write(data);
// send angle
Serial.write(angle>>8);
Serial.write(angle);
// angle between 0 and 300 °
if(( angle <= 300)and(state == 1))
{
angle = angle + 1;
}
else
{
state = 2;
}
if(( angle >= 0)and(state == 2))
{
angle = angle - 1;
}
else
{
state = 1;
}
delay(5);
Voici le programme complet, ici.
Le programme de visualisation
Voici le programme Processing de visualisation :
import processing.serial.*;
Serial myPort;
String val;
int distance_mm, val_old;
int angle;
float radian;
float pox,poy;
int x=0;
void setup()
{
size(400, 400);
background(255);
myPort = new Serial(this, "COM13", 9600);
}
void draw()
{
if(myPort.available() >= 4)
{
val_old = distance_mm;
distance_mm = (myPort.read() << 8) | (myPort.read());
print("Val1:");
println(distance_mm);
distance_mm = distance_mm/2;
angle = (myPort.read() << 8) | (myPort.read());
print("Angle:");
println(angle);
myPort.clear();
if(angle <= 45)
{
angle = angle + 315;
}
else
{
angle = angle - 45;
}
}
// conversion degre radian
radian = (angle * 3.14)/180;
pox = int(cos(radian)*distance_mm);
poy = int(sin(radian)*distance_mm);
clear();
background(255);
stroke(0, 0, 0);
// grille
line(200,0,200,400);
line(0,200,400,200);
stroke(255, 0, 0);
line(200,200,int(pox)+200,200-int(poy));
}
Améliorations
- Vitesse
- Retour de l’angle du servomoteur AX12



