Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
В настоящее время я планирую некоторые внутренние работы на следующую весну, но поскольку я только что приобрел старый дом, у меня нет плана дома. Я начал измерять расстояние от стены до стены с помощью линейки, но это медленно и подвержено ошибкам. Я подумал о покупке дальномера, чтобы упростить процесс, но потом я нашел старую статью о создании собственного дальномера с использованием лазера и камеры. Как оказалось, эти компоненты есть у меня в мастерской.
Проект основан на этой статье:
Единственная разница в том, что я буду строить дальномер, используя Raspberry Pi Zero W, ЖК-дисплей и модуль камеры Raspberry Pi. Я также буду использовать OpenCV для отслеживания лазера.
Я предполагаю, что вы разбираетесь в технологиях и комфортно используете Python и командную строку. В этом проекте я использую Pi в безголовом режиме.
Давайте начнем!
Шаг 1: Список материалов
Для этого проекта вам понадобятся:
- дешевый лазер 6 мм 5 мВт
- резистор 220 Ом
- транзистор 2N2222A или аналогичный
- Raspberry Pi Zero W
- Камера Raspberry Pi v2
- ЖК-дисплей Nokia 5110 или аналогичный
- несколько перемычек и небольшой макет
Я использовал свой 3d-принтер, чтобы напечатать приспособление, которое помогло мне во время экспериментов. Я также планирую использовать 3D-принтер для создания полноценного корпуса для дальномера. Вы можете полностью обойтись без него.
Шаг 2: Создание приспособления для лазера и камеры
Система предполагает фиксированное расстояние между объективом камеры и выходом лазера. Чтобы облегчить испытания, я напечатал приспособление, в которое я могу установить камеру, лазер и небольшую схему управления лазером.
Я использовал размеры модуля камеры, чтобы построить крепление для камеры. В основном для измерений я использовал цифровой штангенциркуль и прецизионную линейку. Для лазера я сделал 6-миллиметровое отверстие с небольшим усилением, чтобы лазер не двигался. Я постарался оставить достаточно места, чтобы прикрепить небольшую макетную плату к задней части приспособления.
Я использовал Tinkercad для сборки, вы можете найти модель здесь:
Расстояние между центром линзы лазера и центром линзы камеры составляет 3,75 см.
Шаг 3: Управление лазером и ЖК-дисплеем
Я последовал этому руководству https://www.algissalys.com/how-to/nokia-5110-lcd-on-raspberry-pi, чтобы управлять ЖК-дисплеем с помощью Raspberry Pi Zero. Вместо редактирования файла /boot/config.txt вы можете включить интерфейс SPI с помощью sudo raspi-config через командную строку.
Я использую Raspberry Pi Zero в безголовом режиме, используя последнюю на сегодняшний день версию Raspbian Stretch. Я не буду описывать установку в этом руководстве, но вы можете следовать этому руководству: https://medium.com/@danidudas/install-raspbian-jessie-lite-and-setup-wi-fi-without-access-to- командная строка или использование сети 97f065af722e
Чтобы получить яркую лазерную точку, я использую шину 5V Pi. Для этого я буду использовать транзистор (2N2222a или аналогичный) для управления лазером через GPIO. Резистор 220 Ом на базе транзистора пропускает достаточный ток через лазер. Я использую RPi. GPIO для управления Pi GPIO. Я подключил базу транзистора к выводу GPIO22 (15 вывод), эмиттер к земле, а коллектор к лазерному диоду.
Не забудьте включить интерфейс камеры с помощью sudo raspi-config через командную строку.
Вы можете использовать этот код для проверки своей настройки:
Если все прошло хорошо, у вас должен быть файл dot.jpg, в котором вы увидите фон и лазерную точку.
В коде мы настраиваем камеру и GPIO, затем включаем лазер, делаем снимок и отключаем лазер. Поскольку я запускаю Pi в режиме без головы, мне нужно скопировать изображения с моего Pi на мой компьютер, прежде чем показывать их.
На этом этапе ваше оборудование должно быть настроено.
Шаг 4: Обнаружение лазера с помощью OpenCV
Во-первых, нам нужно установить OpenCV на Pi. У вас есть три способа сделать это. Вы можете установить старую упакованную версию с помощью apt. Вы можете скомпилировать нужную вам версию, но в этом случае время установки может достигать 15 часов, и большую часть этого времени занимает сама компиляция. Или, как я предпочитаю, вы можете использовать предварительно скомпилированную версию для Pi Zero, предоставленную третьей стороной.
Поскольку это проще и быстрее, я использовал сторонний пакет. Вы можете найти шаги по установке в этой статье: https://yoursunny.com/t/2018/install-OpenCV3-PiZero/ Я пробовал много других источников, но их пакеты не были обновлены.
Чтобы отслеживать лазерную указку, я обновил код с https://github.com/bradmontgomery/python-laser-tracker, чтобы использовать модуль камеры Pi вместо USB-устройства. Вы можете напрямую использовать код, если у вас нет модуля камеры Pi и вы хотите использовать камеру USB.
Вы можете найти полный код здесь:
Чтобы запустить этот код, вам необходимо установить пакеты Python: Pillow и Picamera (sudo pip3 install Pillow Picamera).
Шаг 5: Калибровка дальномера
В оригинальной статье автор разработал процедуру калибровки, чтобы получить необходимые параметры для преобразования координат y в фактическое расстояние. Я использовал стол в гостиной для калибровки и старый кусок крафт-бумаги. Каждые 10 см или около того я записывал координаты x и y в электронную таблицу: https://docs.google.com/spreadsheets/d/1OTGu09GLAt … Чтобы убедиться, что все работает правильно, на каждом этапе я проверял захваченные изображения, чтобы убедиться, что лазер был правильно отслежен. Если вы используете зеленый лазер или ваш лазер неправильно отслеживается, вам нужно будет соответствующим образом настроить оттенок, насыщенность и пороговое значение программы.
После завершения этапа измерения пора фактически вычислить параметры. Как и автор, я использовал линейную регрессию; на самом деле Google Spreadsheet сделал всю работу за меня. Затем я повторно использовал эти параметры, чтобы вычислить приблизительное расстояние и сравнить его с фактическим расстоянием.
Пришло время ввести параметры в программу дальномера для измерения расстояний.
Шаг 6: Измерение расстояний
В коде: https://gist.github.com/kevinlebrun/e767a46855e5fd501d820e1c5fcc527c Я обновил переменные HEIGHT, GAIN и OFFSET в соответствии с калибровочными измерениями. Я использовал формулу расстояния из оригинальной статьи, чтобы оценить расстояние, и распечатал расстояние с помощью ЖК-дисплея.
Код сначала настроит камеру и GPIO, затем мы хотим включить подсветку ЖК-дисплея, чтобы лучше видеть измерения. Вход ЖК-дисплея подключен к GPIO14. Примерно каждые 5 секунд мы будем:
- включить лазерный диод
- захватить изображение в память
- отключить лазерный диод
- отслеживать лазер с помощью фильтров диапазона HSV
- записать полученный образ на диск для отладки
- вычислить расстояние на основе координаты y
- запишите расстояние на ЖК-дисплее.
Хотя, конечно, измерения очень точны и достаточно точны для моего случая использования, есть много возможностей для улучшений. Например, лазерная точка очень низкого качества, а лазерная линия на самом деле не отцентрирована. С лазером лучшего качества этапы калибровки будут более точными. Даже камера в моей приманке не очень удачно расположена, наклоняется вниз.
Я также могу увеличить разрешение дальномера, повернув камеру на 90º, используя полный с, и увеличить разрешение до максимального, поддерживаемого камерой. В текущей реализации мы ограничены диапазоном от 0 до 384 пикселей, мы можем увеличить верхний предел до 1640, что в 4 раза превышает текущее разрешение. Расстояние будет еще точнее.
В качестве продолжения мне нужно будет поработать над улучшениями точности, о которых я упоминал выше, и построить корпус для дальномера. Корпус должен иметь точную глубину, чтобы облегчить измерения от стены до стены.
В общем, нынешней системы мне достаточно, и я сэкономлю немного денег на планировании дома!