Андрей Смирнов
Время чтения: ~12 мин.
Просмотров: 0

Самодельный лидар на arduino и vl53l0x tof-дальномере

Английский сонник

Зона Семьи

Прямо за карьерой в центральной полосе расположен сектор, который отвечает за взаимоотношения в семейном кругу. Его лучше обустроить для отдыха. Это может быть беседка или летняя терраса, предназначенная для чаепития или обедов.

От соседей обязательно отгородить уютное место зелёными растениями, чтобы меньше было взглядов на ваш семейный отдых.

Здесь же можно выкопать небольшой прудик, или любое водное сооружение, которое будет сглаживать общение.

Исходный код программы

В этом проекте мы использовали библиотеку NewPing.h для ультразвукового датчика, разработанную Tim Eckel. Хотя с ультразвуковым датчиком можно вполне успешно работать и без этой библиотеки, но в виде исключения мы в этом проекте решили использовать ее потому что она имеет много полезных функций для работы с ультразвуковым датчиком и значительно сокращает код программы.

Сначала желательно протестировать работу ультразвукового датчика с помощью примеров из данной библиотеки и лишь затем загружать в плату Arduino код программы для нашего проекта сигнализации.

Переключающий контакт (Trigger pin) датчика подключен к контакту 12 платы Arduino, а Echo pin – к контакту 11 платы Arduino. MAX_DISTANCE обозначает максимальную дистанцию, на котором датчик может обнаруживать препятствие. Оно составляет 500 см (5 м).

Установим скорость последовательного порта (в бодах/с), с которой будут передаваться данные от ультразвукового датчика к плате Arduino.

Контакт 10 конфигурируется для работы на вывод данных и к нему подключен зуммер. Другой контакт зуммера подключен к контакту GND платы Arduino.

В функции void echoCheck() команда sonar.ping_result / US_ROUNDTRIP_CM используется для расчета расстояния от датчика до препятствия. Переменная flag используется чтобы дать сигнал включения зуммера когда препятствие находится на расстоянии менее 50 см от датчика. Вы можете изменить это расстояние на то, которое вам необходимо (будет зависеть от размеров вашей двери).

Работа с ультразвуковым датчиком с помощью библиотеки NewPing.h снабжена подробными комментариями от авторов этой библиотеки. Изучая примеры этой библиотеки вы можете узнать много полезного о работе с ультразвуковым датчиком.

Изначально ультразвуковой датчик предназначен для измерения расстояний, но в этом проекте мы его применили, как вы можете видеть – в качестве охранной системы (сигнализации на дверь). Но его также можно применить и в других нестандартных проектах, например, для измерения уровня воды в баке.

Далее приведен полный текст программы.

О датчике VL53L0X

VL53L0X использует измерения дальности инфракрасного излучения для измерения дальности, что позволяет ему получать точные результаты независимо от цвета и поверхности цели.

Датчик VL53L0X от Adafruit (слева) и Pololu (справа)

Измерения расстояния могут быть считаны через цифровой интерфейс I²C. Плата имеет линейный регулятор 2,8 В и встроенные регуляторы уровня, которые позволяют ей работать в диапазоне входного напряжения от 2,6 В до 5,5 В, а расстояние между выводами 0,1″ облегчает использование со стандартными макетами без припоя.

Характеристики

  • Размеры: 0,5″ × 0,7″ × 0,085″ (13 мм × 18 мм × 2 мм)
  • Вес: 0,5 г (0,02 унции)
  • Рабочее напряжение: от 2,6 В до 5,5 В
  • Ток питания: 10 мА (типичное среднее значение во время активного измерения). Зависит от конфигурации, цели и среды. Пиковый ток может достигать 40 мА.
  • Выход (I²C): считывание 16-битного расстояния (в миллиметрах)
  • Диапазон измерения расстояния: до 2 метров (6,6 фута).

График таблицы характеристик VL53L0X типичной производительности измерения дальности (в режиме по умолчанию):

Эффективный диапазон зависит от конфигурации, цели и среды. В техническом описании не указан минимальный диапазон, но эффективный предел составляет около 3 см.

Распиновка

Для использования платы VL53L0X необходимо как минимум четыре соединения (см. схему ниже):

  • VIN,
  • GND,
  • SCL,
  • SDA.

Вывод VIN должен быть подключен к источнику от 2,6 до 5,5 В, а заземление должно быть подключено к 0 вольт. Встроенный линейный регулятор напряжения преобразует VIN в источник питания 2,8 В для интегральной схемы VL53L0X.

Контакты I²C, SCL и SDA подключены к встроенным переключателям уровня, что делает их безопасными для использования при напряжениях свыше 2,8 В; они должны быть подключены к шине I²C, работающей на том же логическом уровне, что и VIN.

Вывод XSHUT является входом, а вывод GPIO1 — выходом с открытым стоком; оба контакта вытянуты платой до 2,8 В. Они не подключены к переключателям уровня на плате и не допускают 5 В, но их можно использовать как есть со многими микроконтроллерами 3,3 В и 5 В: микроконтроллер может считывать выходной сигнал GPIO1, пока его логический верхний порог ниже 2,8 В, и микроконтроллер может чередовать свой собственный выход между состояниями низкого и высокого импеданса, чтобы управлять выводом XSHUT. В качестве альтернативы, 4-канальный двунаправленный логический переключатель уровня может использоваться снаружи с этими выводами.

Вакансии

Программирование аппаратно-программных средств arduino, разработка чертежей в SolidWorks.

PIN (пин, вывод)Описание
VDDРегулируемый выход 2,8 В. Почти 150 мА доступно для питания внешних компонентов. Если вы хотите обойти внутренний регулятор, вместо этого вы можете использовать этот вывод в качестве входа 2,8 В с отключенным VIN.
VINЭто основной источник питания от 2,6 до 5,5 В. Переключатели уровня SCL и SDA поднимают линии I²C высоко до этого уровня.
GNDЗаземление (0 В) для подключения вашего источника питания.
SDAСдвинутая по уровню линия данных I²C: ВЫСОКИЙ (HIGH) это VIN, НИЗКИЙ (LOW) — это 0 В
SCLЛиния синхронизации I²C со сдвигом уровня: ВЫСОКИЙ (HIGH) это VIN, НИЗКИЙ (LOW) — это 0 В
XSHUTЭтот вывод является активным-низким входом отключения; плата тянет его до VDD, чтобы включить датчик по умолчанию. Низкий уровень этого вывода переводит датчик в аппаратный режим ожидания. Этот вход не смещен по уровню.
GPIO1Программируемый выход прерывания (логический уровень VDD). Этот вывод не сдвинут по уровню.

Разбор скетча

Ну что ж, пришло время разобрать скетч. Объяснять простые моменты я не буду, а постараюсь рассказать про интересные участки кода.

Рассмотрим самый интересный участок скетча, который и отвечает за работу проекта. Поделим этот участок кода на две части, которые вы можете увидеть выше. Рассмотрим каждую часть в отдельности.

1 часть кода Как вы видите, составляющим первой части кода является действие, которое называется условием. Мы указываем условие, при котором выполняются некоторые команды. Смысл этой команды такой: если расстояние, которое замерил дальномер, больше или равно минимальному значению (это минимальное значение мы задали в начале скетча) и меньше или равно максимальному значению (это максимальное значение мы также указали в начале скетча), то поворачиваем сервопривод на угол, вычисляющийся по формуле (10*(замеряемая длина — минимальное значение)).

2 часть кода Вторая часть кода продолжает первую часть… Иначе (при значении, не попадающим в указанный нами интервал), если замеренная датчиком длина меньше минимального значения, то сервопривод устанавливается в положение с углом поворота равным 0 градусов. Иначе сервопривод устанавливается в положение с максимальным углом поворота равным 180 градусов.

То есть мы указали для сервопривода все возможные случаи работы: рабочее состояние, положение сервопривода с углом в 0 градусов и в положении с 180 градусами

Общее

Для точного трехмерного сканирования помещения я создал этот Lidar (LIght Detection And Ranging) турель. Основан он на Garmin LIDAR-Lite v3, который сканирует свое окружение с помощью инфракрасного лазерного луча сама платформа вращается с помощью небольших серводвигателей. Это видео показывает, что в итоге получилось:

Время сканирования в основном зависит от выбранного шага серводвигателей. Диапазон составляет от менее минуты до 30 минут (полное разрешение, более 32 000 точек данных). Точность измерений составляет около 1 см, дальность до 40 метров.

Программное обеспечение для сбора и визуализации, которое я создал для этого проекта, может извлечь облако точек для дальнейшего использования (3D-печать, программное обеспечение CAD и т. Д.).

Шаг 7. Установка программного обеспечения

Установите всё что нужно в следующем порядке, как написано ниже.

Arduino IDE

Загрузите и установите Arduino IDE (интегрированное окружение разработки), если еще не установлена. Скачать можно здесь.

Processing 3

Загрузите и установите «Processing 3» отсюда.

Передатчик акустического радара

Скопируйте содержимое файла ниже в «эскиз» Arduino, сохраните его, а затем загрузите в свой Arduino Uno R3:

Закройте Ardino IDE, но оставьте кабель USB подключенным.

Приемник акустического радара

Скопируйте содержимое файла ниже в скетч для «Processing 3» (может понадобиться переименовать расширение .ino в .pde):

Общие сведения

Ультразвуковой датчик HC-SR04 использует точно такую же технологию, что и летучие мыши (ультразвук). Если не вдаваться в подробности, то описать принцип работы можно, датчик посылает звуковые импульсы частотой 40 кГц и прослушивает эхо. В отличии от других датчиков, HC-SR04 не реагирует на солнечный свет или черные предметы, но может давать ложные показания от ткани или тонких предметов.
На передней части HC-SR04 расположено два ультрозвуковых датчика, первый с надписью T (Transmiter) — это передатчик ультрозвуковых волн (TCT40-16T), а второй с надписью R (Receive) — это приемник отраженных ультрозвуковых волн (TCT40-16R), по центру расположен выводной кварцевый генератор на 27 МГц.

С другой стороны датчика HC-SR04, расположена электрическая обвязка, в которой выделяется три основных микросхема и электрическая обвязка. Для взаимодействия с контроллером Arduino установлен четырех выводной разъем, назначение контактов можно посмотреть ниже.

Назначение контактов:
► VCC: «+» питание модуля
► Trig : вход триггера
► Echo: выход, эхо.
► GND: «-» питание модуля

Элементы платы

Troyka-контакты

Датчик подключается к управляющей электронике по трём проводам.

  • Питание (V) — красный провод. На него должно подаваться напряжение 5 В (или 3,3 В).
  • Земля (G) — чёрный провод. Должен быть соединён с землёй микроконтроллера.
  • Сигнальный (S) — жёлтый провод. Подключается к цифровому входу микроконтроллера. Через него датчик передает микроконтроллеру бинарное значение, ноль или единицу.

Оптопара TCRT5000

Оптопара TCRT5000 — это собранные в одном корпусе светоиод (синий на рисунке) и фототранзистор n-p-n типа (чёрный на рисунке). Светодиод излучает в инфракрасном диапазоне на длине волны 950 нм. Свет отражается от поверхности и попадает на фототранзистор.

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

Инвертор

На борту цифрового датчика расположен инвертирующий триггер Шмитта. При низком напряжении на фототранзисторе — на выходе датчика единица, при высоком — ноль.

Переменный резистор

Переменный резистор позволяет настраивать датчик линии на различные оттенки серого. Если повернуть ручку резистора до упора против часовой стрелки (максимальное сопротивление), то датчик будет выдавать логический ноль над поверхностью светлого оттенка серого. Если повернуть ручку до упора по часовой стрелке (минимальное сопротивление) то датчик будет реагировать только на самые тёмные оттенки. Варьируя сопротивление, вы можете настроить датчик на нужный вам оттенок.

Сигнальный светодиод

Сигнальный светодиод загорается, когда датчик находится над светлой (по его мнению) поверхностью. Наличие диода позволяет более точно откалибровать датчик. Оттенок серого, над которым он загорается в зависимости от настройки можно считать реперной точкой.

Подключение ультразвукового датчика к Arduino с помощью TinkerCad Circuits

С вашим основным пониманием того, как ультразвуковой датчик работает, теперь вы готовы к подключению устройства к Arduino. Чтобы изучить работу ультразвукового датчика, вы можете построить виртуальную функциональную схему с помощью TinkerCad Circuits.

TinkerCad Circuits является бесплатным онлайн-симулятором схем, который позволяет моделировать различные электрические и электронные схемы, прежде чем соединять их на реальной макетной плате. Вы даже можете протестировать проекты Arduino (в том числе код) с TinkerCad Circuits. Вы можете получить ценные знания в области электроники с помощью экспериментов до принятия решения о создании физической схемы.

На рисунке ниже показан проект функционального ультразвукового датчика Arduino, построенного с помощью TinkerCad Circuits.

Используйте схему ниже в качестве ориентира, если у вас есть макетная плата для экспериментов с ультразвуковым датчиком.

4Библиотека для работы с эхолокатором HC-SR04

Также для работы с ультразвуковым дальномером написано множество библиотек. Например, вот эта библиотека Ultrasonic. Установка библиотеки происходит стандартно: скачать, разархивировать в директорию /libraries/, которая находится в папке с Arduino IDE. После этого библиотекой можно пользоваться.

Установив библиотеку, напишем новый скетч.

#include <Ultrasonic.h> // подключаем библиотеку

Ultrasonic ultrasonic(12, 11); // Trig - 12, Echo - 11

void setup() {
  Serial.begin(9600); // инициализация послед. порта
}

void loop() {
  float dist_cm = ultrasonic.Ranging(CM); // дистанция в см
  Serial.println(dist_cm); // выводим дистанцию в порт
  delay(100);
}

Результат его работы тот же – в мониторе последовательного порта выводится дистанция до объекта в сантиметрах.

Если в скетче написать float dist_cm = ultrasonic.Ranging(INC); – дистанция будет отображаться в дюймах.

Наука, изучающая экологию: основные понятия и цели

Необходимые компоненты

  1. Плата Arduino Uno или Pro Mini.
  2. ЖК дисплей 16×2.
  3. Шкала (линейка).
  4. Батарейка на 9 В.
  5. Макетная плата.
  6. Соединительные провода.

4Калибровка ультразвукового дальномера

После небольшого опыта использования данного прибора, выявилось, что измеренное расстояние отличается от действительного, причём чем больше расстояние от датчика до цели, тем больше отклонение. В связи с этим возникла необходимость в корректировке показаний дальномера.

Для этого я измерил на всём рабочем диапазоне датчика (от 0 до 400 см) расстояния и составил таблицу из двух столбцов: реальное расстояние и показания датчика. По этим данным построил график:

График отклонения показаний ультразвукового дальномера

Здесь зелёным цветом показан график для идеального дальномера, как должно быть, а красным – реального, который в моём случае занижает показания.

Зависимость получилась линейная. Прекрасно! Из курса геометрии мы помним, что уравнение прямой, проходящей через две точки: (x − x1)/(x2 − x1) = (y − y1)/(y2 − y1)

Подставив вместо x1, 2 и y1, 2 значения из таблицы и упростив выражение, я получил уравнение для графика измерений ультразвукового дальномера: y = 0,97x + 0,27

В уравнении прямой коэффициент 0,97 возле «икс» является тангенсом угла наклона прямой к оси абсцисс. Назовём его tg(α). Можно посчитать, что угол наклона прямой равняется 44,13 градусам (арктангенс от 0,97), а в идеальном случае он должен быть равен 45 градусам (и уравнение прямой идеального дальномера очень простое: y = x, то есть каждому измеренному числу соответствует точно такое же реальное расстояние). Постоянная 0,27 – это смещение графика относительно нуля по оси ординат.

Посмотрим на следующий рисунок. Видны два прямоугольных треугольника, приподнятые над осью OX. Один из катетов, назовём его h, треугольника с углом α равен измеренному дальномером расстоянию Rизм за вычетом константы b, равной 0,27. Катет другого треугольника равен реальному расстоянию Rреал. У обоих треугольников катеты h равны. Зная длину катета h и тангенс угла α (равный 0,97), мы узнаем реальное расстояние Rреал, поделив, длину катета h на tg(α),

Последовательность коррекции показаний ультразвукового дальномера

Таким образом, для того чтобы скорректировать ошибку при измерениях дальномера, нужно следовать формуле: Rреал = (Rизм − b) / tg(α) = (Rизм − 0,27) / 0,97 Обратите внимание, что это выражение можно было получить из предыдущего уравнения, выразив x через y. В вашем случае коэффициент и константа, естественно, будут отличаться

Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно

В вашем случае коэффициент и константа, естественно, будут отличаться. Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно.

Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера (до калибровки).

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации