Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

ЛИДАР Arduino

Компоненты и расходные материалы

Arduino UNO
× 1
Датчик дальномера SparkFun ToF - VL6180
VL53L0X для большого диапазона и VL6180X для малого диапазона. здесь я использовал VL6180X
× 1
серводвигатель
× 1

Приложения и онлайн-сервисы

IDE Arduino
Обработка

Об этом проекте

Немного о LiDAR

LIDAR (Light Detection and Ranging) - это оптическая система дистанционного зондирования, которая может измерять расстояние до цели, освещая ее светом. Технология LIDAR используется в робототехнике для восприятия окружающей среды, а также для классификации объектов. Способность технологии LIDAR предоставлять двумерные карты высот местности, высокоточного расстояния до земли и скорости приближения может обеспечить безопасную посадку роботизированных и пилотируемых транспортных средств с высокой степенью точности.

ЛИДАР состоит из передатчика, который освещает цель лазерным лучом, и приемника, способного обнаруживать составляющую света, которая по существу коаксиальна передаваемому лучу. Датчики приемника рассчитывают расстояние на основе времени, необходимого свету, чтобы достичь цели и вернуться. Механический механизм с зеркалом перемещает луч света, чтобы охватить требуемую сцену в плоскости или даже в трех измерениях, используя вращающееся зеркало.

Один из способов измерить время пролета светового луча - использовать импульсный лазер, а затем напрямую измерить прошедшее время. В таких устройствах требуется электроника, способная определять пикосекунды, и поэтому они очень дороги. Другой метод - измерить фазовый сдвиг отраженного света.

Коллимированный инфракрасный лазер используется для измерения фазового сдвига. Для поверхностей, имеющих шероховатость больше, чем длина волны падающего света, будет возникать диффузное отражение. Компонент инфракрасного света будет возвращаться почти параллельно передаваемому лучу для объектов.

Датчик измеряет фазовый сдвиг между переданным и отраженным сигналами. На картинке показано, как эту технику можно использовать для измерения расстояния. Длина волны модулирующего сигнала подчиняется уравнению:

  c =f ∙ τ  

где c - скорость света, f - частота модуляции, а τ - известная длина модулирующей волны.

Общее расстояние D ', которое проходит излучаемый свет, составляет:

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

где A - измеренное расстояние. B - расстояние от блока измерения фазы. Таким образом, требуемое расстояние D между светоделителем и целью равно

  D =τ * θ / 4π  

где θ - это измеренная электронным способом разность фаз между прошедшим и отраженным световыми лучами.

Можно показать, что диапазон обратно пропорционален квадрату амплитуды принимаемого сигнала, что напрямую влияет на точность датчика.

(скопировано с http://home.roboticlab.eu/en/examples/sensor/lidar).

В рамках проекта последнего года обучения мне нужна 2D-карта окружающей среды для моего автономного транспортного средства, поэтому я выбрал LiDAR, потому что он очень быстрый и точный. В отличие от сонаров, отражающих ультразвуковые волны, «конус» зондирования очень узкий.

VL6180x или Vl53l0x - оптический датчик от STMicroelectronics. VL53L0x намного более точен и не имеет проблем с линейностью или «двойного изображения», когда вы не можете определить, находится ли объект очень далеко или очень близко.

Этот датчик времени полета фактически используется в нашем мобильном телефоне для настройки фокуса камеры.

Принципиальная схема

Установить библиотеку Adafruit

Код Arduino

  #include  #include "Adafruit_VL6180X.h" #include  Adafruit_VL6180X vl =Adafruit_VL6180X (); Servo myservo; float pos =0; const float Pi =3.14159; пустая настройка () {myservo.attach (9); Serial.begin (115200); в то время как (! серийный номер) {задержка (1); } если (! vl.begin ()) {while (1); }} void loop () {для (pos =0; pos <=180; pos + =.5) {myservo.write (pos); uint8_t range =vl.readRange (); Serial.println (String (диапазон) + «p» + String (pos * Pi / 180) + «p» + String (pos)); задержка (10); } / * для (pos =180; pos> =0; pos - =.5) {myservo.write (pos); uint8_t range =vl.readRange (); {Serial.println (String (диапазон) + «p» + String (pos * Pi / 180) + «p» + String (pos)); задержка (10);}} * / myservo.write (0); задержка (2000);}  

Код обработки (обратитесь к другому проекту радара, если вам нужен хороший интерфейс радара) измените номер порта Arduino (например, «COM 3») перед запуском.

  import processing.serial. *; Serial myPort; String val; int range, i =0; float pos; void setup () {size (550,500); String portName ="COMx"; // x =номер вашего порта Arduino myPort =new Serial (this, portName, 115200); фон (255);} void draw () {если (myPort.available ()> 0) {val =myPort.readStringUntil ('\ n'); if (val! =null) {String [] nums =split (val, "p"); // разделение полученных данных, разделенных 'p' if (nums.length ==3) {range =int (nums [0 ]); // преобразование строки в целое число pos =float (nums [1]); я =int (число [2]); если (я ==180) {фон (255); }}}} translate (25, -50); строка (250,500,250-2 * (диапазон * cos (pos)), 500-2 * (диапазон * sin (pos))); }  

Скорость датчика ограничена 10 Гц, а отклик сервопривода плохой на более высокой скорости. Если кто-то планирует сделать высокоскоростной лидар, используйте шаговый двигатель или двигатели постоянного тока с системой обратной связи. используйте контактные кольца для непрерывного вращения (https://www.adafruit.com/product/736).

Любые вопросы, предложения приветствуются!

Код

  • Код Arduino
  • код обработки
Код Arduino Arduino
 #include  #include "Adafruit_VL6180X.h" #include  Adafruit_VL6180X vl =Adafruit_VL6180X (); Servo myservo; float pos =0; const float Pi =3.14159; пустая настройка () {myservo.attach (9); Serial.begin (115200); в то время как (! серийный номер) {задержка (1); } если (! vl.begin ()) {while (1); }} void loop () {для (pos =0; pos <=180; pos + =.5) {myservo.write (pos); uint8_t range =vl.readRange (); Serial.println (String (диапазон) + «p» + String (pos * Pi / 180) + «p» + String (pos)); задержка (10); } / * для (pos =180; pos> =0; pos - =.5) {myservo.write (pos); uint8_t range =vl.readRange (); {Serial.println (String (диапазон) + «p» + String (pos * Pi / 180) + «p» + String (pos)); задержка (10); }} * / myservo.write (0); задержка (1000);} 
код обработки Processing
 import processing.serial. *; Serial myPort; String val; int range, i =0; float pos; void setup () {size (550,500); frameRate (36); String portName ="COMx"; // x =номер вашего порта Arduino myPort =new Serial (this, portName, 115200); фон (255); } void draw () {если (myPort.available ()> 0) {val =myPort.readStringUntil ('\ n'); if (val! =null) {String [] nums =split (val, "p"); // разделение полученных данных, разделенных 'p' if (nums.length ==3) {range =int (nums [0 ]); // преобразование строки в целое число pos =float (nums [1]); я =int (число [2]); если (я ==180) {фон (255); }}}} translate (25, -50); строка (250,500,250-2 * (диапазон * cos (pos)), 500-2 * (диапазон * sin (pos))); } 

Производственный процесс

  1. Газовый фонарь
  2. Лазерная указка
  3. Фонарик
  4. Калейдоскоп
  5. Полупроводниковый лазер
  6. Фотография
  7. Сигнал трафика
  8. Лампочка
  9. Оптическое волокно
  10. Кадьяк 3D LiDAR