- Денисюк Роман Эдуардович
- Факультет компьютерных информационных кехнологий и автоматики
- Кафедра электронной техники
- Специальность «Научные, аналитические и экологические приборы и системы»
- Обоснование, разработка и исследование лазерного дальномера для систем машинного зрения роботов
- Научный руководитель: к. т. н., доц. Кузнецов Дмитрий Николаевич
- Лазерный дальномер своими руками
- Содержание
- Введение
- 1. Лазерный дальномер из веб-камеры
- 1.1. Принцип работы
- 1.2. Компоненты
- 1.3. Программное обеспечение
- 1.4. Дальнейшая работа
- 2. Фазовый лазерный дальномер
- 2.1. Выбор метода измерений
- 2.2. Создание макетного образца
- 3. Заключение
- Лазерный дальномер из web камеры
- Самодельный лидар на Arduino и VL53L0X TOF-дальномере
- Самодельный лидар на Arduino и VL53L0X TOF-дальномере
- Используемые компоненты
- Схема
- Печать корпуса и сборка
- Скетч для Arduino
- Скетч для компьютера
Денисюк Роман Эдуардович
Факультет компьютерных информационных кехнологий и автоматики
Кафедра электронной техники
Специальность «Научные, аналитические и экологические приборы и системы»
Обоснование, разработка и исследование лазерного дальномера для систем машинного зрения роботов
Научный руководитель: к. т. н., доц. Кузнецов Дмитрий Николаевич
Лазерный дальномер своими руками
Содержание
Введение
В продаже, есть большое количество дешевых датчиков – дальномеров, в их числе ультразвуковые и инфракрасные. Все эти устройства работают хорошо, но из-за значительного веса, не подходят для летающих роботов. Миниатюрный робот вертолет, например, может нести около 100 г полезной нагрузки. Это даёт возможность использовать, для поиска препятствий и предотвращения столкновений с ними, машинное зрение, используя веб-камеры (или другие миниатюрные, беспроводные камеры с подключением к компьютеру через USB). А еще лучше, установить две камеры, что обеспечит роботу, стерео зрение, таким образом, благодаря информации о глубине изображения, улучшится обход препятствий. Недостатком этой идеи является сравнительно большой вес камеры.
1. Лазерный дальномер из веб-камеры
1.1. Принцип работы
Лазерная точка проектируется на возможное препятствие, лежащие в поле зрения камеры, расстояние до этого препятствия может быть легко вычислено. Математика здесь очень простая, обработку данных лучше всего производить в компьютерных приложениях. (см. рис. 1.1)
Рисунок 1.1 – Принцип действия дальномера
Итак, вот как это работает. Лазерный луч проецируется на объект в поле зрения камеры. Этот луч должен быть идеально параллелен оптической оси камеры. Лазерная точка захватывается вместе с остальной сценой. Простой алгоритм ищет на изображении яркие пиксели. Предполагая, что точка лазера является яркой на фоне более тёмной обстановки (я использовал обычную лазерную указку купленную в магазине за доллар), изначально положение точки в кадре не известно. Затем нам нужно рассчитать дальность до объекта, основываясь на том, где вдоль оси Y находится лазерная точка, чем ближе она к центру изображения, тем дальше находится объект.
Как мы видим из рисунка выше, расстояние (D) может быть рассчитано по формуле:
Конечно, для решения этого уравнения, вы должны знать, h – фиксированное расстояние между лазерной указкой и камерой. Знаменатель высчитывается так:
Для калибровки системы, мы будем собирать серию измерений, где нам известно, дальность до цели, а также количество пикселей центра изображения до точки лазера.
Используя следующее уравнение, мы можем вычислить угол наклона в зависимости от значения h, а также фактическое расстояние до каждой точки.
Теперь у нас есть расчётные значения, мы можем придумать отношения, что позволяет нам рассчитывать, дальность, зная количеством пикселей от центра изображения. Можно использовать линейную зависимость.
Зная калибровочные данные, можно посчитать:
1.2. Компоненты
Для сборки дальномера требуется не так много деталей: веб-камера и лазерная указка. Для соединения лазерной указки и камеры необходимо вырезать раму из жести или фанеры:
Собранный дальномер должен выглядеть примерно следующим образом:
1.3. Программное обеспечение
Программа-обработчик написана на двух языках: Visual C ++ и Visual Basic. Вы, вероятно, подумаете, что программа на Visual Basic проще, чем на VC ++ в плане кода, но во всём есть компромисс. Код на VC ++ можно собрать бесплатно (при условии, что у вас есть Visual Studio), в то время как код VB требует приобретение программных пакетов сторонних производителей (в дополнение к Visual Studio).
Коды программ написанных на Visual Basic и Visual C ++ можно найти по ссылке: www.cxem.net
1.4. Дальнейшая работа
Одним из конкретных улучшений, которые могут быть внесены в этот дальномер, является проекция горизонтальной лазерной линии, вместо точки. Таким образом, мы сможем вычислять расстояние до цели, для каждого ряда пикселов на изображении [1].
2. Фазовый лазерный дальномер
В даном разделе описаны натуральные испытания макетного образца фазового лазерного дальномера, полученного собственными силами.
2.1. Выбор метода измерений
Принцип действия дальномера физического типа заключается в измерении времени, которое затрачивает посланный дальномером сигнал для прохождения расстояния до объекта и обратно. Способность электромагнитного излучения распространяться с постоянной скоростью дает возможность определять дальность до объекта.
Существует несколько методов измерения дальности:
1. Метод триангуляции.
3. Импульсный метод.
4. Фазовый метод.
Разрабатываемый лазерный дальномер предлагается выполнить но основе фазового метода. Фазовый метод измерения расстояний основан на определении разности фаз посылаемых и принимаемых модулированных сигналов.
Режим работы устройства зависит от его температуры, с изменением которой незначительно изменяется фаза сигнала. Вследствие этого точное начало отсчета фазы определить нельзя. С этой целью фазовые измерения повторяются на эталонном отрезке (калибровочной линии) внутри прибора. Главное преимущество фазового метода измерения – более высокая точность, которая может достигать единиц миллиметров [2].
2.2. Создание макетного образца
Для проверки теоретических положений на практике, проверки устойчивости усилительных каскадов и предварительной оценки чувствительности и уровня шумов измерительного канала отраженного лазерного излучения был разработан и исследован его макетный образец.
В качестве излучателя при разработке макетного образца использован стандартный модуль красного лазерного светодиода (см. рис. 2.1) мощностью 5 мВт длиной волны 650 нм.
Рисунок 2.1 – Модуль лазерного светодиода
Для регистрации отраженного лазерного излучения в качестве фотоприемника использован pin-фотодиод bpw24r (см. рис. 2.2). К преимуществам данного фотодиода следует отнести высокую чувствительность в красной области видимого спектра, узкую диаграмму направленности и малую емкость р-п-перехода (5 пФ). Максимальная рабочая частота 35 МГц.
Рисунок 2.2 – PIN-фотодиод bpw24r
Для генерации рабочего и опорного сигналов использован модуль DDS генератора сигналов на базе микросхемы AD9850 (см. рис. 2.3). Рабочий диапазон генерируемых синусоидальных колебаний лежит в пределах от 1 Гц до 40 МГц, шаг перестройки 1 Гц, относительная нестабильность частоты 10 -5 .
Рисунок 2.3 – Модуль AD9850 DDS генератора сигналов
В качестве микропроцессорного модуля управления использована стандартная плата Arduino Uno (см. рис. 2.4) на базе современного микро-контроллера ATmega328 c тактовой частотой 16 МГц.
Рисунок 2.4 – Микропроцессорный модуль Arduino Uno
На рисунке 2.5 приведена схема модулятора лазерного излучения. Гармоничный сигнал частотой 10 МГц и амплитудой 0,5 В с выхода DDS генератора поступает на электронный усилитель с коэффициентом усиления по напряжению KU = 3, построен на базе операционного усилителя DA1 AD8042. С помощью подстроечного резистора R1 обеспечивается выбор оптимального положения рабочей точки по постоянному току.
Рисунок 2.5 – Функциональная схема модулятора лазерного излучения
На рисунке 2.6 представлена схема отраженного лазерного сигнала, состоящий из фотоусилителя на DA1, смесителя и двухкаскадного избирательного усилителя на DA2 и DA3. Фотопидсилювч превращает измерительный оптический сигнал в электрический. На выходе смесителя формируется низкочастотный разностный сигнал с частотой 1 кГц, который после фильтрации двухзвенный фильтром нижних частот (R3, R4, C4, C5) поступает на избирательный усилитель с коэффициентом усиления около 10000.
Модулятор лазерного излучения и измерительного канала отражен-ного сигнала собраны на отдельных беспаечних монтажных платах (см. рис. 2.7 и 2.8). Программное обеспечение модуля разработано в среде Arduino 1.0.5. Для управления DDS генератором использована стандартная библиотека AH_AD9850.h .
Рисунок 2.6 – Функциональная схема измерительного канала отраженного лазерного излучения
В результате испытаний макетного образца получили:
– Уровень шумов на выходе избирательного усилителя составляет 5 мВ;
– Уровень полезного сигнала на выходе избирательного усилителя при расстоянии до объекта 2 м составляет 200 мВ;
– Самовозбуждение усилителя отсутствует;
– Внешняя засветка фотодиода на результаты измерений не влияет.
Рисунок 2.7 – Макетная плата модулятора
Рисунок 2.8 – Макетная плата измерительного канала отраженного сигнала
3. Заключение
В целом результаты макетирование подтверждают способность предложенного способа измерений, основанного на технике прямого преобразования частоты. Чувствительность измерительного канала достаточна для регистрации отраженного лазерного сигнала. Уровень выходного сигнала позволяет в дальнейшем простыми средствами определять его фазу и вычислять расстояние до объекта.
Источник
Лазерный дальномер из web камеры
В продаже, есть большое количество, дешёвых, датчиков – дальномеров, в их числе ультразвуковые и инфракрасные. Все эти устройства работают хорошо, но из – за значительного веса, не подходят для летающих роботов. Миниатюрный робот вертолет, например, может нести около 100г полезной нагрузки. Это даёт возможность использовать, для поиска препятствий и предотвращения столкновений с ними, машинное зрение, используя веб-камеры (или другие миниатюрные, беспроводные камеры с подключением к компьютеру через USB). А еще лучше, установить две камеры, что обеспечит роботу, стерео зрение, таким образом, благодаря информации о глубине изображения, улучшится обход препятствий. Недостатком этой идеи, является, добавление веса второй камеры.
В этой статье описывается, как маленькая лазерная указка, вместе с одной web камерой, может обеспечить моно машинное зрение, с большим диапазоном информации.
Этот проект основан на статье найденной здесь.
Принцип работы
Смотрите рисунок ниже. Лазерная точка проектируется на возможное препятствие, лежащие в поле зрения камеры, расстояние до этого препятствия может быть легко вычислено. Математика здесь очень простая, обработку данных лучше всего производить в компьютерных приложениях.
Итак, вот как это работает. Лазерный луч проецируется на объект в поле зрения камеры. Этот луч должен быть идеально параллелен оптической оси камеры. Лазерная точка захватывается вместе с остальной сценой. Простой алгоритм ищет на изображении яркие пиксели. Предполагая, что точка лазера является яркой на фоне более тёмной обстановки (я использовал обычную лазерную указку купленную в магазине за доллар), изначально положение точки в кадре не известно. Затем нам нужно рассчитать дальность до объекта, основываясь на том, где вдоль оси Y находится лазерная точка, чем ближе она к центру изображения, тем дальше находится объект.
Как мы видим из рисунка выше, расстояние (D) может быть рассчитано по формуле:
Конечно, для решения этого уравнения, вы должны знать, h- фиксированное расстояние между лазерной указкой и камерой. Знаменатель высчитывается так:
Соединив два предыдущих уравнения, мы получим:
Итак, количество пикселей от центра плоскости изображения до лазерной точки может быть просто рассчитано с картинки. А как насчет других параметров в этом уравнении? Для их получения мы должны выполнить калибровку.
Для калибровки системы, мы будем собирать серию измерений, где нам известно, дальность до цели, а также количество пикселей центра изображения до точки лазера. Эти данные записываем в таблицу ниже:
Источник
Самодельный лидар на Arduino и VL53L0X TOF-дальномере
Самодельный лидар на Arduino и VL53L0X TOF-дальномере
В этом проекте мы сделаем свой лидар. По характеристикам он конечно немного не дотягивает до коммерчески выпускаемых лидаров, но вполне подойдёт для небольшого простого робота, чтобы он мог обнаруживать и избегать препятствия на своём пути или более-менее точно строить карту помещения.
Я объясню вам, что такое лидар, принципы его работы и один из вариантов, как его можно сделать на Arduino и времяпролётном (TOF) инфракрасном датчике расстояния.
Корпус лидара можно сделать по-разному, но для данного проекта разработал я выбрал один из самых простых и удобных вариантов его изготовления — напечатал на 3D-принтере. Корпус сделан так, чтобы верхняя часть, в которой установлен дальномер, мог вращаться на 360 градусов без остановки. Чтобы верхняя часть не болталась и могла легко вращаться, в основании большого размера установлен подшипник.
Лидар (LIDAR, Light Detection and Ranging — «обнаружение и определение дальности с помощью света») — технология получения и обработки информации об удалённых объектах с помощью активных оптических систем, использующих явления поглощения и рассеяния света в оптически прозрачных средах. Лидар как прибор представляет собой, как минимум, активный дальномер оптического диапазона. Есть несколько типов лидаров, один из них – это сканирующие лидары, с помощью которых формируют двумерную или трёхмерную картину окружающего пространства. В данном случае с помощью нашего лидара можно получать информацию о расстояниях в двумерном пространстве, т.е. на плоскости.
VL53L0X – это миниатюрный высокоточный лазерный дальномер, обеспечивающий измерение расстояния до 2 м. Для измерения расстояния используется метод измерения времени (TOF, Time-of-Flight). TOF-дальномеры ещё называют время пролётными дальномерами. В датчике установлен миниатюрный лазер и фоточувствительная матрица диодов. Лазер короткими импульсами испускает свет, который отражаясь от препятствий попадает обратно и регистрируется на фоточувствительной матрице. Датчик измеряет время, за которое свет прошёл путь от излучателя до препятствия и обратно до датчика и на основе этого вычисляет расстояние до препятствия.
Датчик обнаруживает препятствие перед собой, а нам нужно строить двумерную карту с информацией о преградах вокруг. Чтобы получать информацию о преградах вокруг и иметь возможность строить двумерную карту, нам нужно вращать датчик.
Вращая датчик, постоянно измеряется расстояние. После каждого измерения в последовательный порт отправляются данные о текущем расстоянии и угле, на который в данный момент был повёрнут датчик.
Существует несколько способов, как определять текущий угол поворота.
Очень часто используется следующий метод. Используя коллекторный мотор, маленький магнит и датчик холла, можно раскрутить мотор до нужной скорости и затем по датчику холла определять момент, когда при вращении магнит окажется возле датчика холла.
В момент, когда магнит приблизился к датчику холла, в программе переменной «угол» присваивается значение 0. Мотор постоянно вращает датчик, периодически производятся измерения расстояний до препятствий и текущий угол поворота датчика.
Текущий угол поворота вычислить не сложно. В программе можно получить информацию о том, сколько тактов прошло с момента включения микроконтроллера. Если, к примеру, Arduino работает на частоте 16Мгц, в секунду таких тактов будет 16 миллионов, т.е. каждый такт это 1/16 000 000 секунды. Этого более чем достаточно для точного измерения времени при реализации такого лидара. Можно использовать и не системный таймер-счётчик, считающий такты микроконтроллера, принцип будет такой же.
После каждого измерения расстояния вычисляется, сколько тактов прошло с последнего измерения (прошло = текущее – предыдущее). Скорость вращения постоянна и известна (за сколько тактов таймер-счётчика делается один оборот), время, прошедшее с последнего измерения тоже. На основе этих данных и вычисляется текущий угол поворота.
Вместо датчика холла можно использовать магнитный или абсолютный оптический энкодер и при каждом измерении расстояния, ещё получать информацию о текущем угле поворота.
В данном лидаре используется другой способ. Он очень прост в реализации и в некоторых случаях очень удобен. Для его реализации нужен шаговый мотор, маленький магнит и датчик холла.
Шаговый мотор в отличие от коллекторного вращается не постоянно, а проворачивается на небольшой фиксированный угол (который ещё называют «шаг», от сюда и название «шаговый мотор»), после чего вал мотора удерживается в текущем положении до тех пор, пока драйверу мотора не поступит команда опять провернуть вал в нужную сторону.
Магнит и датчик холла используется аналогично первому методу – когда магнит приблизился к датчику холла, в программе переменной «угол» присваивается значение 0. После каждой команды провернуть вал в ту или иную сторону, значение некоторой переменной изменяется в большую или в меньшую сторону (в зависимости от направления поворота), на некоторое значение.
Можно увеличивать или уменьшать значение переменной на единицу после каждого шага или делая несколько шагов, изменять значение переменной на соответствующее число. В таком случае в переменной будет храниться количество шагов.
Можно сразу считать не количество шагов, а вычислять угол, на который провернулся вал шагового мотора. Если дальномер вращается на прямую от мотора, а через редуктор, при вычислении угла делается поправка на придаточное число редуктора. В данном случае мотор подключен не на прямую и сразу вычисляется угол поворота в градусах.
В loop цикле программы сначала делается два шага, производится измерение расстояния и затем к переменной «угол» прибавляется 2.4 (градуса). 2.4 градуса на два шага это с шага используемого шагового мотора и придаточного числа редуктора.
Удобство использования шагового мотора заключается в том, что можно проворачивать датчик на нужный угол, делая один или несколько шагов в нужную сторону и только когда датчик смотрит в нужном направлении, уже и делать измерения расстояния.
После того, как мотор провернёт вал, он будет оставаться в этом положении столько, сколько нужно и в коде можно сколь угодно долго делать что-то до следующей команды драйверу мотора провернуть вал. В случае использования коллекторного мотора, он ждать не будет и продолжит вращать датчик.
Используя шаговый мотор можно сканировать препятствия также, как и в случае с коллекторным мотором, постоянно вращая на 360 градусов датчик и делая измерения.
Если нам нужно измерять расстояния только в определённом направлении, допустим в направлении 0° или 45°, мы может провернуть датчик на нужный угол и затем производить измерения расстояния в этом направлении столь угодно долго.
Если нужно сканировать некоторый сектор, допустим в пределах 200-250°, можно не постоянно вращать на 360градусов, а поворачивать датчик сначала влево, затем вправо в нужных нам пределах.
Используемые компоненты
1 х Arduino NANO
1 х Модуль с датчиком VL53L0X
1 х Повышающий преобразователь
1 х Шаговый мотор
1 х Драйвер шагового мотора на микросхеме A4988
1 х Скользящие контакты (slip ring) на 6 проводов. Диаметр 12.5мм, длина 15мм или меньше
1 х 6710ZZ подшипник
1 х Датчик Холла 49E
1 х Макетная плата
1 х 100 мкФ электролитический конденсатор
1 х 5 мм х 1 мм неодимовый магнит
Так же понадобиться резистор на 10К, немного M3 винтов, гаек, вставных гаек (резьбовые вставки, insert nuts), «пасик» и напечатанный на 3D-принтере корпус, припой и паяльник.
3D-файлы для печати можно скачать по следующей ссылке. Для печати использовался PLA пластик. Вместо стального подшипника можно использовать напечатанный (стальные шарики продаются пакетами, к примеру, как запасные для линейных направляющих). Модель для печати можно начертить самостоятельно или попробовать поискать на сайте Thingiverse, Cults и т.д., к примеру введя в поиск «parametric bearing». Вместо подшипника можно распечатать просто пластиковое кольцо, например, из PLA, PETG, нейлона или пэт. Если используемый пластик будет недостаточно скользить или переживаете, что со временем из-за трения протрёт, сверху и снизу можно наклеить липкую ленту или кольцо из какого-нибудь материала (плёнки для ламинации, плёнки для лазерной печати, упаковки для фломастеров, тонкостенной коробочки и т.д.).
Повышающий стабилизатор нужен для шагового мотора. Такие моторы обычно потребляют максимум сотни миллиампер. Стабилизатор желательно взять с запасом, допустим на 1А или больше. Выходное напряжение питания у стабилизатора, 12В или более. Выбирая стабилизатор, так же учитывайте, что они не должен быть слишком большой, иначе его нельзя будет поместить внутри корпуса.
Схема
Схема проста, часть деталей запаивается на макетной плате.
Через скользящие контакты от Arduino к датчику VL53L03X подключаются контакты +5В, земля и две линии интерфейса I2C (SCL и SDA). К датчику Холла подключается земля, +5В и вывод D8 от Arduino. Также между +5В и D8 устанавливается резистор на 10кОм.
На повышающего преобразователя подаётся 5В. На плате построечным резистором устанавливается выходное напряжение примерно 12В. Эти 12В с выхода стабилизатора подключаются к выводам «питание мотора» модуля драйвера моторов. Так же по линии 12В устанавливается электролитический конденсатор, который нужен что бы драйвер мотора работал без сбоев (на плате его может не быть совсем, а даже когда запаян керамический или танталовый конденсатор, его ёмкости обычно недостаточно). 5В подключается к выводам «питание логики» драйвера моторов. Не перепутайте, где выводы «питание логики» и «питание мотора», иначе драйвер может выйти из строя.
Платы бывают разные, иногда плюс питания для мотора обозначается, допустим надписью VMOT, а плюс питания логики обозначаться как VCC. Выводов GND на плате может быть один или несколько, в данном случае это не имеет значения.
Выводы STEP, DIR и EN от драйвера моторов подключаются к Arduino, а выводы RESET и SLEEP соединяются между собой.
На платах с драйвером моторов A4988 обычно запаян подстроечный резистор, им настраивается ограничение по току для шагового мотора. Ограничение тока для шаговых моторов очень желательно настроить. Если ограничить ток слишком сильно, мотор под нагрузкой или не сможет вообще проворачивать вал или будут пропуски шагов. Если задать слишком большой ток и источник питания способен будет его обеспечить, мотор будет греться или его обмотки просто сгорят. Так же это абсолютно ненужная нагрузка на источник питания. При питании от аккумулятора это приведёт к тому, что он будет быстрей разряжаться. При питании от USB (блока питания, порт компьютера или ноутбука и т.д.) в лучшем случае будет просто лишняя нагрузка, в худшем, когда блок питания или порт не рассчитан на такой ток и нет защиты, это даже может привести к выходу из строя блока питания или порта.
Вот и все. В качестве источника питания используется USB-кабель, подключенный к Arduino NANO.
Печать корпуса и сборка
Загрузите файлы STL, по ссылке выше (после списка деталей) и распечатайте детали корпуса. Настройте слайсер, в зависимости от особенностей вашего принтера и типа пластика, которым будете печатать. В данном случае детали напечатаны PLA пластиком, основные настройки были следующими — 2 периметра, высота слоя 0.3 мм, заполнение 20%. Когда детали корпуса будут готовы, можно приступить к сборке.
Возьмите скользящие контакты и поместите его в верхнюю часть корпуса. Убедитесь, что вращающаяся часть кольца находится на верхней стороне корпуса, чтобы она вращалась одновременно с диском. Теперь установите шаговый мотор, который фиксируется к корпусу двумя 3M винтами и гайкам. Крышка готова:
Теперь установим большой подшипник в верхней части корпуса:
Вплавьте две резьбовые вставки в корпус вращающегося диска, на котором будет закрепляется датчик нужно вплавить вставные гайки. Для этого можно использовать паяльник:
Теперь пропускаем провода от скользящих контактов через отверстие вращающегося диска:
После чего берём датчик и припаиваем к нему 4 провода (+5V, GND, SCL и SDA) от скользящих контактов:
С помощью двух болтов М3 закрепляем модуль дальномера на корпусе вращающегося диска:
Если у вас модуль с другим расстоянием между крепёжными отверстиями, модуль можно закрепить только одним болтом. Если крепёжных отверстий совсем нет, модуль можно приклеить (двустороння липкая лента, термоклеем с помощью клеевого пистолета и т.д.).
Когда датчик будет закреплён, вращающийся диск надевается на подшипник:
На вращающуюся крышку приклеивается неодимовый магнит, а в верхнюю крышку вставляется датчик холла:
Магнит служит для того, чтобы на него на него срабатывал датчик Холла и в этот момент в коде происходит установка переменной «угол» в некоторое значение. Если магнит по размерам позволяет наклеить его по центру под датчиком, это будет самый лучший вариант, т.к. при срабатывании переменной «угол» нужно будет присвоить значение 0. Если нет, магнит можно наклеить возле датчика. Тогда переменной «угол» нужно будет присвоить не 0, а соответствующее значение (на какой угол относительно магнита повёрнут датчик). Если магнит находится с противоположной стороны, нужно присвоить 180. Если угол составляет 20 градусам (на фото выше угол немного больше):
Тогда переменной «угол» нужно присвоить 20 и т.д.
На макетную плату по схеме, приведенной ранее, запаиваем конденсатор, драйвер мотора, 10K резистор, датчик Холла, провода от Arduino и стабилизатора питания:
Всё припаяно, теперь закрепляем (двусторонней липкой лентой, клеем, термоклеем и т.д.) Arduino Nano внутри корпуса и наш лидар почти готов:
Осталось вплавить в нижнюю крышку корпуса три вставные гайки, затем прикрутить крышку корпуса, надеть на шкив пасик и можно переходить к программированию и экспериментам.
Скетч для Arduino
Откройте Arduino IDE и скопируйте в него скетч. Если при загрузке скетча в плату появится сообщение, что отсутствует библиотека «Adafruit_VL53L0X.h»:
Её нужно будет установить. Для этого в меню «Инструменты» выберете пункт «Управлять библиотеками. » и в появившемся окне найдите «Adafruit_VL53L0X» (что бы сократить список, можно ввести в поле поиска «VL53»:
Для VL53L0X кроме библиотеки от Adafruit есть и от Pololu. Подключается она аналогичным образом, но код нужно немного изменить:
В коде для обоих библиотек, в самом начале цикла loop мы проверяем, не сработал ли датчик Холла (в прерывании для этого переменной loop_starts устанавливается значение true) и, если сработал, устанавливаем переменной angle значение 0. Если у вас магнит находится не центру под датчиком, присвойте этой переменной соответствующее число.
Далее в коде отправляем команду драйверу мотора провернуть вал на один шаг, небольшая пауза с помощью delayMicroseconds, затем опять проворачиваем вал на один шаг и опять пауза.
После этого вызываем функцию измерения расстояния и проверяем, считал ли датчик корректные данные. При получении корректных данных от датчика, полученные данные о расстоянии присваиваются переменной r. Затем происходит проверка, выходит ли измеренное расстояние за установленные границы (переменная maxdist) и, если выходит, переменной r присваивается значение maxdist.
В конце цикла в последовательный порт выводятся полученные данные и к текущему значению переменной angle прибавляется значение переменной angle_step (в данном коде это 2.4, т.е. 2.4 градуса). Если у вас шаговый мотор с другим шагом, будете использовать режим микрошага, измените размеры шкивов или будете делать не два, а один, три или ещё сколько-то шагов, не забудьте пересчитать на какой угол будет вращаться датчик и присвоить переменной angle_step соответствующее значение.
Скетч для компьютера
Для визуализации используется приложение Processing, скачать его можно по следующей ссылке. Запустив среду Processing можно переключить языка интерфейса на русский. Для этого в меню нажмите «File», затем » Preferences…» и в открывшемся окне можно будет переключить язык:
Если при запуске появится сообщение, что не найдено Android SDK:
можно проигнорировать это сообщение и просто закрыть окно, нажав на крестик. Только при когда отобразиться окно программы, нужно будет переключить среду Processing из режима работы «Android» в режим «Java». Для этого слева вверху нажмите на «Android»:
И в появившемся меню выберете пункт «Java»:
После чего среда автоматически перезапустится:
Создайте новый скетч (файл -> создать) и скопируйте в него скетч:
Одно из отличий Processing от Arduino IDE заключается в том, как выбирается последовательный порт. В Processing порт выбирается не в меню, а в коде по индексу массива. При запуске скетча, внизу окна выводится список портов:
Найдите в списке порт, к которому подключена Arduino и в строчке:
myPort = new Serial(this, Serial.list()[0], 115200);
при необходимости поменяйте индекс. Если к примеру текущий порт «COM4», замените в коде ноль на единицу:
Источник