В данной статье мы рассмотрим подключение датчика измерения расстояния TFMini-S Micro LiDAR (лидара) к плате Arduino. Также в статье мы рассмотрим что такое лидар (LiDAR) и как он работает. LiDAR (light detection and ranging) в переводе означает обнаружение света и определение дальности, является популярным методом дистанционного зондирования, используемым для измерения точного расстояния до объекта на поверхности Земли. Вы могли видеть последние iPhone или телефоны Samsung, использующие датчик LiDAR на задней панели для лучшей производительности камеры.
Поскольку LiDAR имеет множество применений, рассмотрим датчик LiDAR от Benewake, который называется TFMini-S Micro LiDAR Distance Sensor. Этот датчик LiDAR может измерять расстояние до 12 метров. Этот датчик стоит около 40$ , но за такую цену у него весьма впечатляющие возможности.
Сначала мы рассмотрим интерфейс датчика LiDAR TFMini-S с платой Arduino. Используя библиотеку TFMini и базовый пример, можно рассчитать расстояние и уровень сигнала. Мы можем использовать какой-нибудь дисплей, например, ЖК-дисплей 16X2, для отображения измеренного расстояния на ЖК-экране.
Ранее на нашем сайте мы рассматривали подключение к Arduino лидарного датчика VL6180X. Также вы можете прочитать статью о том что такое лидар (LiDAR) и как он работает.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Датчик расстояния TFMini-S Micro LiDAR (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что такое LiDAR и как он работает?
LiDAR, или световое обнаружение и измерение дальности, является популярным методом дистанционного зондирования, используемым для измерения точного расстояния до объекта на поверхности земли. LiDAR использует импульсный лазер для расчета переменных расстояний объекта от поверхности земли.
Его можно использовать для картирования структуры, включая высоту растительности, плотность и другие характеристики по всему региону. LiDAR напрямую измеряет высоту и плотность растительности на земле, что делает его идеальным инструментом для ученых, изучающих растительность на больших территориях.
Как работает лидар?
LiDAR следует простому принципу — направить лазерный луч на объект на поверхности Земли и рассчитать время, необходимое для возвращения к источнику. Учитывая скорость, с которой распространяется свет (примерно 186 000 миль в секунду), процесс измерения точного расстояния с помощью LiDAR кажется невероятно быстрым. Однако это очень технично. Формула, которую аналитики используют для определения точного расстояния до объекта, выглядит следующим образом:
Датчик расстояния TFMini-S Micro LiDAR
Датчик расстояния TFMini-S Micro LiDAR от Benewake поставляется в очень красивой упаковке. Benewake — это компания из Китая, которая является ведущим поставщиком твердотельных датчиков и решений LIDAR. Датчик TFMini-S Micro LiDAR также называется Micro Single-point Ranging Module.
TFMini-S — это усовершенствованная версия TFmini. TFMini-S имеет уникальные оптические, структурные и электронные конструкции. TFmini-S обладает такими преимуществами, как низкая стоимость, малый объем и низкое энергопотребление. Он также имеет несколько интерфейсов для удовлетворения различных требований разработчиков.
Плата датчика имеет интерфейсы UART и I2C. Плата имеет микроконтроллер, такой как контроллер серии STM32 или что-то эквивалентное. Подключив датчик к любому внешнему микроконтроллеру, вы можете получить данные LiDAR. Он имеет 4 контакта в качестве контактов питания и контактов UART. Красный провод - это VCC, черный - это земля. Белый провод - это RX, а зеленый - это TX.
В TFMini-S слепая зона сокращена с 30 см до 10 см, улучшены наружные характеристики и точность различных отражательных способностей. Диапазон расстояний не нарушается окружающим светом, что может соответствовать диапазону внутри помещения, а точность дополнительно оптимизирована. Погрешность характеристики при отражательной способности 10% приближается к фону отражательной способности 90%. Он может обеспечить стабильное, точное, чувствительное и высокочастотное обнаружение диапазона.
Технические характеристики датчика
- Рабочий диапазон 0,1 ~ 12 м.
- Напряжение питания – 5 В.
- Частота кадров 10–1000 Гц.
- Рабочая температура 0℃~60℃.
- Интерфейс связи – UART.
- Точность – ±6 см@(0,1-6 м), ±1%@(6-12 м).
- Поле зрения – 2°.
Приложения
- Однонаправленный LiDAR.
- Обход препятствий.
- Помощь при посадке.
- Следование рельефу местности.
- Роботы избегают препятствий на открытом воздухе.
- Интеллектуальная парковка. Крановые операции.
- Определение местоположения транспортного средства.
- Обнаружение транспортных средств для управления шлагбаумами.
- Высокоточное и высокоскоростное измерение.
- Безопасный для глаз инфракрасный светодиодный свет.
- Компактный размер, легкий.
- Хорошие характеристики для дронов, измеряющих высоту и огибающих рельеф местности.
Взаимодействие датчика расстояния TFMini-S Micro LiDAR с Arduino
Давайте подключим датчик расстояния TFMini-S Micro LiDAR к Arduino. Вы можете подключить датчик к интерфейсу UART или к интерфейсу I2C. Но я предпочитаю интерфейс UART. Подключение довольно простое.
Подключите контакты VCC и GND датчика TFMini к контактам 5 В и GND платы Arduino. Аналогично подключите Tx и RX датчика к контактам D2 и D3 Arduino. Вы можете использовать любые другие контакты для Tx и Rx, которые поддерживают программный последовательный интерфейс.
Исходный код программы (с библиотекой)
Для датчика Benewake TFMini LiDAR есть специальная библиотека. Проверьте репозиторий Github для библиотеки Arduino TFMini.
Я изначально использовал пример кода из библиотеки TFMini и загрузил код. Код был загружен, но я получил сообщение об ошибке, так как датчик не смог проверить расстояние.
Затем я добавил несколько строк в код из некоторых ссылок Github, которые объясняли, почему датчик не работает с предопределенной библиотекой. На этот раз датчик заработал. Вот измененный код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
include <SoftwareSerial.h> #include "TFMini.h" TFMini tfmini; SoftwareSerial SerialTFMini(2, 3); //The only value that matters here is the first one, 2, Rx void getTFminiData(int* distance, int* strength) { static char i = 0; char j = 0; int checksum = 0; static int rx[9]; if (SerialTFMini.available()) { rx[i] = SerialTFMini.read(); if (rx[0] != 0x59) { i = 0; } else if (i == 1 && rx[1] != 0x59) { i = 0; } else if (i == 8) { for (j = 0; j < 8; j++) { checksum += rx[j]; } if (rx[8] == (checksum % 256)) { *distance = rx[2] + rx[3] * 256; *strength = rx[4] + rx[5] * 256; } i = 0; } else { i++; } } } void setup() { Serial.begin(115200); //Initialize hardware serial port (serial debug port) while (!Serial); // wait for serial port to connect. Needed for native USB port only Serial.println ("Initializing..."); SerialTFMini.begin(TFMINI_BAUDRATE); //Initialize the data rate for the SoftwareSerial port tfmini.begin(&SerialTFMini); //Initialize the TF Mini sensor } void loop() { int distance = 0; int strength = 0; getTFminiData(&distance, &strength); while (!distance) { getTFminiData(&distance, &strength); if (distance) { Serial.print(distance); Serial.print("cm\t"); Serial.print("strength: "); Serial.println(strength); } } delay(100); } |
Последовательный монитор распечатал расстояние до моего потолка, а также уровень сигнала. Я подносил руку близко и далеко от датчика и наблюдал изменение расстояния. Слепая зона сократилась с 30 см до 10 см. Следовательно, он обнаружит что-либо только после этого расстояния.
Исходный код программы (без библиотеки)
Если вы хотите использовать датчик расстояния TFMini-S LiDAR с Arduino и без библиотеки, то проверьте следующий код. Вам не нужно добавлять никакую библиотеку в папку Library. Все параметры объяснены и определены в коде для извлечения данных через интерфейс UART.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <SoftwareSerial.h> //header file of software serial port SoftwareSerial Serial1(2, 3); //define software serial port name as Serial1 and define pin2 as RX & pin3 as TX int dist; //actual distance measurements of LiDAR int strength; //signal strength of LiDAR int check; //save check value int i; int uart[9]; //save data measured by LiDAR const int HEADER = 0x59; //frame header of data package void setup() { Serial.begin(9600); //set bit rate of serial port connecting Arduino with computer Serial1.begin(115200); //set bit rate of serial port connecting LiDAR with Arduino } void loop() { if (Serial1.available()) //check if serial port has data input { if (Serial1.read() == HEADER) //assess data package frame header 0x59 { uart[0] = HEADER; if (Serial1.read() == HEADER) //assess data package frame header 0x59 { uart[1] = HEADER; for (i = 2; i < 9; i++) //save data in array { uart[i] = Serial1.read(); } check = uart[0] + uart[1] + uart[2] + uart[3] + uart[4] + uart[5] + uart[6] + uart[7]; if (uart[8] == (check & 0xff)) //verify the received data as per protocol { dist = uart[2] + uart[3] * 256; //calculate distance value strength = uart[4] + uart[5] * 256; //calculate signal strength value Serial.print("dist = "); Serial.print(dist); //output measure distance value of LiDAR Serial.print('\t'); Serial.print("strength = "); Serial.print(strength); //output signal strength value Serial.print('\n'); } } } } } |
Я снова протестировал производительность датчика с этим кодом. Код у меня работал отлично.
Использование датчика расстояния TFMini-S LiDAR с Arduino и ЖК-дисплеем
Теперь протестируем работу датчика с устройством внешнего отображения информации - в качестве такого устройства я выбрал ЖК-дисплей 16×2.
Итак, используя схему цепи, я подключил ЖК-дисплей 16×2 к предыдущей схеме на макетной плате. Я использовал потенциометр 10К для регулировки контрастности ЖК-дисплея.
Теперь это устройство портативно, и мы можем брать его с собой на улицу для тестирования приложений.
Исходный код программы (с ЖК дисплеем)
Я добавил несколько строк кода для работы с ЖК дисплеем к предыдущему коду, например, добавил библиотеку LCD и определил контакты для подключения дисплея. Затем я загрузил код, и он заработал как часы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 10, 9, 8, 7); #include <SoftwareSerial.h> #include "TFMini.h" TFMini tfmini; SoftwareSerial SerialTFMini(2, 3); //The only value that matters here is the first one, 2, Rx void getTFminiData(int* distance, int* strength) { static char i = 0; char j = 0; int checksum = 0; static int rx[9]; if (SerialTFMini.available()) { rx[i] = SerialTFMini.read(); if (rx[0] != 0x59) { i = 0; } else if (i == 1 && rx[1] != 0x59) { i = 0; } else if (i == 8) { for (j = 0; j < 8; j++) { checksum += rx[j]; } if (rx[8] == (checksum % 256)) { *distance = rx[2] + rx[3] * 256; *strength = rx[4] + rx[5] * 256; } i = 0; } else { i++; } } } void setup() { lcd.begin(16, 2); Serial.begin(115200); //Initialize hardware serial port (serial debug port) while (!Serial); // wait for serial port to connect. Needed for native USB port only Serial.println ("Initializing..."); SerialTFMini.begin(TFMINI_BAUDRATE); //Initialize the data rate for the SoftwareSerial port tfmini.begin(&SerialTFMini); //Initialize the TF Mini sensor } void loop() { int distance = 0; int strength = 0; getTFminiData(&distance, &strength); while (!distance) { getTFminiData(&distance, &strength); if (distance) { Serial.print(distance); Serial.print("cm\t"); Serial.print("strength: "); Serial.println(strength); lcd.setCursor(0, 0); lcd.print("Dis: "); lcd.print(distance); lcd.print(" cm"); lcd.setCursor(0, 1); lcd.print("Str: "); lcd.print(strength); } } delay(500); lcd.clear(); } |
Я выбрал свой домашний балкон, чтобы проверить датчик. Было так много препятствий на разных расстояниях, чтобы проверить изменение расстояния. Я перемещал датчик в разных направлениях, чтобы столкнуться с разными препятствиями. И узнал, что датчик обнаружил дальний объект и измерил расстояние до него путем отражения от него луча света.
Датчик может измерять максимальное расстояние до 1200 см. Согласно техническому описанию, его точность составляет около 90%. Поэтому мы можем использовать этот датчик в качестве демо или для базовых приложений.