Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino LIDAR

Componenten en benodigdheden

Arduino UNO
× 1
SparkFun ToF-afstandszoekersensor - VL6180
VL53L0X voor lange afstand en VL6180X voor korte afstand. hier gebruikte ik VL6180X
× 1
servomotor
× 1

Apps en online services

Arduino IDE
Verwerking

Over dit project

Een paar dingen over LiDAR

LIDAR (Light Detection and Ranging) is een optisch teledetectiesysteem dat de afstand van een doel kan meten door het met licht te verlichten. In de robotica wordt LIDAR-technologie gebruikt voor zowel de waarneming van de omgeving als de classificatie van objecten. Het vermogen van LIDAR-technologie om 2D-hoogtekaarten van het terrein, zeer nauwkeurige afstand tot de grond en naderingssnelheid te bieden, kan een veilige landing van robot- en bemande voertuigen mogelijk maken met een hoge mate van precisie.

LIDAR bestaat uit een zender die een doel verlicht met een laserstraal, en een ontvanger die de lichtcomponent kan detecteren die in wezen coaxiaal is met de uitgezonden straal. Ontvangersensoren berekenen een afstand op basis van de tijd die het licht nodig heeft om het doel te bereiken en terug te keren. Een mechanisch mechanisme met een spiegel zwaait de lichtstraal om de gewenste scène in een vlak of zelfs in drie dimensies te dekken, met behulp van een draaiende knikspiegel.

Een manier om de vluchttijd van de lichtstraal te meten, is door een gepulseerde laser te gebruiken en vervolgens de verstreken tijd direct te meten. In dergelijke apparaten is elektronica vereist die picoseconden kan oplossen en is daarom erg duur. Een andere methode is om de faseverschuiving van het gereflecteerde licht te meten.

Gecollimeerde infraroodlaser wordt gebruikt voor de faseverschuivingsmeting. Voor oppervlakken met een ruwheid groter dan de golflengte van het invallende licht zal diffuse reflectie optreden. De component van het infraroodlicht zal bijna evenwijdig aan de uitgezonden bundel voor objecten terugkeren.

De sensor meet de faseverschuiving tussen de uitgezonden en gereflecteerde signalen. De afbeelding laat zien hoe deze techniek kan worden gebruikt om afstanden te meten. De golflengte van het modulerende signaal voldoet aan de vergelijking:

c =f ∙ τ  

waarbij c de lichtsnelheid is en f de modulerende frequentie en τ de bekende modulerende golflengte.

De totale afstand D' die door het uitgestraalde licht wordt afgelegd is:

D' =B + 2A =B + (θ * τ) / 2π 

waarbij A de gemeten afstand is. B is de afstand tot de fasemeeteenheid. De vereiste afstand D, tussen de bundelsplitser en het doel, wordt daarom gegeven door

D =τ * θ / 4π 

waarbij θ het elektronisch gemeten faseverschil is tussen de doorgelaten en gereflecteerde lichtbundels.

Het kan worden aangetoond dat het bereik omgekeerd evenredig is met het kwadraat van de ontvangen signaalamplitude, wat direct van invloed is op de nauwkeurigheid van de sensor.

(gekopieerd van http://home.roboticlab.eu/en/examples/sensor/lidar).

Als onderdeel van mijn afstudeerproject heb ik de 2D-kaart van de omgeving nodig voor mijn autonome voertuig, dus ik kies voor LiDAR omdat het zo snel en nauwkeurig is. In tegenstelling tot sonars die ultrasone golven weerkaatsen, is de 'kegel' van detectie erg smal.

VL6180x of Vl53l0x is een optische sensor van STMicroelectronics. VL53L0x is veel nauwkeuriger en heeft geen lineariteitsproblemen of 'dubbele beeldvorming' waarbij je niet kunt zien of een object heel ver of heel dichtbij is.

Deze vluchttijdsensor wordt in onze mobiele telefoon gebruikt om de focus van de camera aan te passen.

Schakelschema

Installeer de Adafruit-bibliotheek

Arduino-code

#include #include "Adafruit_VL6180X.h"#include Adafruit_VL6180X vl =Adafruit_VL6180X();Servo myservo;float pos =0;const float Pi =3.14159; void setup() { myservo.attach(9); Serieel.begin(115200); while (!Serial) { vertraging(1); }if (! vl.begin()) { while (1); } }void loop() { for (pos =0; pos <=180; pos +=.5) { myservo.write(pos); uint8_t bereik =vl.readRange(); Serial.println(String(bereik)+"p"+String(pos*Pi/180)+"p"+String(pos)); vertraging(10); } /*for (pos =180; pos>=0; pos -=.5) { myservo.write(pos); uint8_t bereik =vl.readRange(); { Serial.println(String(bereik)+"p"+String(pos*Pi/180)+"p"+String(pos)); vertraging(10);} }*/ mijnservo.write(0); vertraging (2000);} 

Verwerkingscode (raadpleeg een ander radarproject als u een goede radarinterface nodig heeft) verander het Arduino-poortnummer (bijv. "COM 3") voordat u begint.

import processing.serial.*;Serial myPort;String val;int range,i=0;float pos;void setup(){ size(550.500); String portName ="COMx";//x=uw arduino-poortnummer myPort =new Serial (this, portName, 115200); background(255);}void draw(){ if ( myPort.available()> 0) { val =myPort.readStringUntil('\n'); if(val!=null) { String [] nums=split(val,"p");// splitsen van de ontvangen gegevens opgezocht door 'p' if(nums.length==3) { range=int(nums[0 ]); //string naar integer conversie pos=float(nums[1]); i=int(nums[2]); if(i==180){ achtergrond(255); } } }}vertalen(25,-50);line(250,500,250-2*(bereik*cos(pos)),500-2*(bereik*sin(pos))); } 

De snelheid van de sensor is beperkt tot 10 Hz en de respons van de servo is slecht bij hogere snelheden. Als iemand van plan is om LIDAR met hoge snelheid te maken, gebruik dan een stappenmotor of DC-motoren met feedbacksysteem. gebruik sleepringen voor continue rotatie (https://www.adafruit.com/product/736).

Vragen, suggesties zijn welkom!

Code

  • Arduino-code
  • verwerkingscode
Arduino-codeArduino
#include #include "Adafruit_VL6180X.h"#include Adafruit_VL6180X vl =Adafruit_VL6180X();Servo myservo;float pos =0;const float Pi =3.14159; void setup() { myservo.attach(9); Serieel.begin(115200); while (!Serial) { vertraging(1); } if (! vl.begin()) { while (1); } }void loop() { for (pos =0; pos <=180; pos +=.5) { myservo.write(pos); uint8_t bereik =vl.readRange(); Serial.println(String(bereik)+"p"+String(pos*Pi/180)+"p"+String(pos)); vertraging(10); } /*for (pos =180; pos>=0; pos -=.5) { myservo.write(pos); uint8_t bereik =vl.readRange(); { Serial.println(String(bereik)+"p"+String(pos*Pi/180)+"p"+String(pos)); vertraging(10); } }*/ mijnservo.write(0); vertraging(1000);}
verwerkingscodeVerwerking
import processing.serial.*;Serial myPort;String val;int range,i=0;float pos;void setup(){ size(550.500); framesnelheid(36); String portName ="COMx";//x=uw arduino-poortnummer myPort =new Serial (this, portName, 115200); achtergrond(255); }void draw(){ if ( myPort.available()> 0) { val =myPort.readStringUntil('\n'); if(val!=null) { String [] nums=split(val,"p");// splitsen van de ontvangen gegevens opgezocht door 'p' if(nums.length==3) { range=int(nums[0 ]); //string naar integer conversie pos=float(nums[1]); i=int(nums[2]); if(i==180){ achtergrond(255); } } } }vertalen(25,-50);line(250,500,250-2*(bereik*cos(pos)),500-2*(bereik*sin(pos))); }

Productieproces

  1. Gaslantaarn
  2. Laseraanwijzer
  3. Zaklamp
  4. Caleidoscoop
  5. Halfgeleiderlaser
  6. Foto
  7. Verkeerssignaal
  8. Gloeilamp
  9. Optische vezel
  10. Gebaargestuurde interactieve tafellamp
  11. Kodiak 3D LiDAR