Дальномер AJ-SR04M - укрощение строптивого
- Войдите на сайт для отправки комментариев
Прелюдия:
Уже больше года пылились у меня в закромах два вышеупомянутых модуля, заказанных в свое время на Aliexpress для использования в запланированной системе автоматического сбора дождевой воды. В свою очередь эта система, конструктивно представляющая собой водонапорную башню (две бочки для сбора дождевой воды внизу под водосточными трубами и две — на высоте около 5 метров — на потолке второго этажа бани), станет в будущем частью автоматизированной системы полива стратегически важных грядок на дачном участке. Это не только грядки в теплице, но и те, что находятся под открытым небом, но требуют обильного полива. Уж больно утомили два последних засушливых сезона, вынуждавших практически ежедневно стоять по полтора часа над грядками, разбрызгивая воду до полного ее исчерпания в неглубоком колодце, доставшемся от прежнего хозяина участка.
Людия
Если верить Интернетам, программирование этого модуля практически не отличается от обращения с его широко распространенным собратом (HC-SR04).
int trigPin = 10; int echoPin = 11; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration / 58; Serial.print(distance); Serial.println(" cm"); delay(100); }
Некоторое отличие лишь в получаемых результатах, ибо датчик AJ-SR04M нет смысла приближать к препятствию ближе, чем на 18 см. Это плата за объединение передатчика и приемника в единое целое - требуется некоторое время для завершения переходных процессов из режима передачи в режим приема.
Первая попытка, она же первый облом:
Первый блин оказался комом. Датчик был без труда установлен в подготовленном для этой цели кронштейне, размещенном примерно в четверти метра над зеркалом воды в наполненной до краев бочке. Первое значение снять, измеренное рулеткой значение примерно соответствует ему (отклонение в 1 см не в счет - это легко списать погрешность измерений). Вычерпываю из бочки воду, провожу измерения и скучнею с каждым новым замером - результаты от датчика все больше отстают от того, что замерено рулеткой, пока вообще не перестают изменяться. Что-то явно пошло не так... Сам датчик явно в порядке, ведь проводившиеся незадолго перед этим измерения до стены давали точные результаты. Ошибка, по-видимому, кроется в схеме измерения. Остается найти, где именно. Как говаривал Семен Семенович Горбунков - "будем искать".
Нашел бумажку с записью результатов измерений:
С показания 51 датчик перестал следить за снижением уровня воды в бочке.
Интересно, наступит ли когда-нибудь тот день, когда вы все уже прекратите пытаться сделать измерительный прибор из парктроника? Как и вообще разводить телеметрию в сраном баке для полива. Каждый месяц новый страдалец приходит с этой гениальной идеей.
Поставь сортирный клапан и не насилуй мосх.
Злые вы. И нетерпеливые. Немного терпения - все будет хорошо. Все поженятся. Проживут долго и счастливо. И умрут в один день.
А пока:
Вторая попытка, тоже безуспешная
После некоторого раздумья я таки решил набраться мудрости у изготовителей датчика и изучить "this fucking manual". Ну а там естественным образом наткнулся на диаграмму направленности и понял, что шансов заглянуть в бочку этим датчиком в его девственном состоянии у меня нет:
Датчик вполне себе неплохо "видит" препятствия и на углах вплоть до 90. Стало быть, при первой попытке датчик (относительно) правильно определял расстояние до тех пор, пока стенки бочки особо не выделялись над поверхностью воды. А по мере вычерпывания сигнал, отраженный от стенок бочки, становился все более заметным и вносил все больший вклад в регистрируемое датчиком эхо. А с некоторого момента полностью забил собой отражение от воды (отодвигавшееся все больше и больше вправо по оси времени).
Вот такую модель построил мой "изнасилованный мосх" и выдал рекомендацию сузить каким-то образом "широкоугольное" зрение строптивого датчика. Первая мысль, пришедшая в голову - засунуть датчик в трубку небольшого диаметра и отсечь таким образом боковые части лепестка направленности.
Сказано - сделано. Датчик был помещен в отрезок канализационной трубы диаметром 40 мм и закреплен там примерно в 5 см от обреза. Нести полученную конструкцию на дачу "для проверки в полевых условиях" не пришлось. На всех направлениях и на любых расстояниях от препятствий Ардуина стабильно выводила в терминал одно и то же значение - пресловутые 18 см. Что для этого датчика является индикатором расположения ближе минимальной дистанции обнаружения. Труба оказалась не только канализационной но и громогласной - с удовольствием поглощала уходящую в стороны часть излучаемой энергии и сама становилась излучателем еще долго после окончания излучения.
"Насилие над мосхом" продолжилось, теперь в поисках борьбы с наведеным излучением трубы.
Ну то, что канализационная труба хорошо отражает ультразвук, вещь достаточно очевидная. Если уж было желание попытаться как-то избавиться от влияния боковых поверхностей, единственный вариант - труба из материала хорошо поглощающего ультразвук.
Притом, очень хорошо.
Порядок "коэффициента поглощения", исходя из положения бокового лепестка на 3 м и минимальной дальности 0.18 я бы оценил в (3.0/0.18)^2=280. Честно говоря, не готов сказать навскидку, существуют ли такие в природе.
Злые вы. И нетерпеливые. Немного терпения - все будет хорошо. Все поженятся. Проживут долго и счастливо. И умрут в один день.
И нетерпеливые.
Вот бы взять эту терпеливость, да к поливу грядок приложить, вместо забивания гвоздей отверткой.
У меня система водоснабжения несколько другая, но может сама идея и использованные компоненты помогут.
На даче жены много лет назад сделана система подачи воды из колодца. Уровень воды в колодце весной выше уровня земли (родник вода холодная чистая, вытекает через трубу на уровне земли) Ближе к концу лета уровень воды падает до небольшой лужи на дне колодца, бывает высыхает совсем. Когда воды мало откачивается очень быстро, и насос оголялся, но и заполняется - быстро.
В колодце подвешен насос для чистой воды Gardena cо встроенной автоматикой, датчики кондукторного типа. Опустилась ниже среднего датчика - выключился, поднялось выше верхнего - включилось.
Gardena качает воду в бочку 1.5 тонны. Наверху бочки стоит тоже трех-электродный датчик кондукторного типа от Овен. Датчик подключен к блоку автоматики тоже от Овен САУ-М2, который в зависимости от уровня в бочке включает Гардену (поддерживает максимальный высокий уровень в бочке, естественно с небольшим гистерезисом, чтобы Гардену не мучить.
Ну а дальше насосная станция, разводка по потребителям.
Работает все это уже очень давно, никаких проблем. У Овена в принципе и измерители уровня есть, посмотрите, может найдете.
Я тоже измеритель уровня хотел в колодец, но ограничился этой автоматикой, все равно повлиять на уровень не могу.
Если напряжение на Гардену САУ-М2 дает и не снимает его за 1 час - сигнал, что нет воды в колодце, или бочка заполняется с пустой - весной.
...
единственный вариант - труба из материала хорошо поглощающего ультразвук.
Притом, очень хорошо.
...
Ну, как говорится - бинго. Так что
Третья попытка - удачная
Я не стал искать трубу из супер-пупер поглощающего материала. У меня перед глазами пронеслись сонмы микрофонов на трибунах - все как один в поролоновых чехлах, призванных отсекать помехи от ветра. В памяти всплыла и теплоизоляция для труб, представляющая собой ту самую поролоновую трубу. Солидную такую, толстостенную, но при этом абсолютно нежесткую. Да еще и с разрезом вдоль. Но вот если эту изоляцию не надеть на трубу, а вставить вовнутрь, то... Сказано - сделано: во время следующего заезда в Мерлен я подобрал пару изоляция+труба такую, чтобы изоляция с натягом входила вовнутрь. Получилось труба пятидесятка (дватцатисантиметровый отрезок) и изоляция 28/13 (внутренний диаметр 28 мм, толщина стенки 13). Приехал домой, забил изоляцию в трубу - последние сантиметры давались со значительным трудом. Вставил датчик. Получилась вот такая конструкция:
Помня облом, случившийся при второй попытке, я проверил получившуюся конструкцию, не отходя от десктопа - в терминал выводились числа, примерно соответствующие расстоянию до того препятствия, на который я направлял датчик. Можно было выходить в поле...
Дальше - рутинные действия:
Закрепляю датчик над бочкой, заполненной до перелива. Подключаю его к ардуинке, снабженной bluetooth-модулем и соответствующим скетчем. Устанавливаю связь со смартфоном, на котором крутится приложение MoDyz, позволяющего использовать смартфон в качестве дисплея для ардуинки, и начинаю записывать в табличку показания с датчика и текущее расстояние от среза трубы до водной поверхности, понемногу вычерпывая воду:
Все. Уперлись в дно. Во всем диапазоне измерений разница составляла 2-3 см, что соответствовало расстоянию от датчика до среза трубы плюс погрешность измерения рулеткой. Погрешность не более +/- 1 см, что для стандартной 200-литровой бочки составляет 4-5 л. Точность более чем достаточная для проектируемой мной системы водосбора и -распределения.
Можно двигаться дальше.
В процессе принуждения дальномера к корректному измерению уровня воды в бочке скетч обрастал дополнительными функциями и разросся до размера в полторы сотни строк. В нем появился блок функций для работы с двумя последовательными портами: аппаратный используется для отладки (ввод/вывод через терминал Arduino IDE), а программный (SoftwareSerial) - для подключения Bluetooth-модуля и общения через него со смартфоном.
Смартфон в будущем проекте системы водосбора (дождевая вода плюс подкачка из колодца), подъема воды в водонапорные бочки, установленные на высоте около 5 метров на потолке мансардного этажа, и орошения (капельный полив в теплице и на высоких грядках) будет использоваться в качестве переносного терминала для мониторинга ситуации с запасами воды и ее движением во всех элементах системы и настройки логики работы перекачивающих насосов.
Приложение для смартфона - Introductory MoDyz - с июня этого года доступно для скачивания в магазине Google Play. Оно превращает смартфон/планшет в дисплей высокого разрешения, на котором с помощью набора команд можно рисовать все, что душе угодно. Так же, как и на обычном дисплее, только с существенной экономией ограниченных ресурсов микроконтроллера: для работы с ним потребуется пожертвовать лишь двумя выводами (для подключения Bluetooth-модуля), кроме того, экономится и программная память, так как графическая библиотека как таковая отсутствует. Все связанные с графикой вещи реализованы на стороне смартфона, на долю микроконтроллера остается только коммуникация - отправка команд графики / создания органов управления, прием команд от органов управления и реакция на них.
Построением изображения (отправкой соответствующих команд) в скетче занимается функция drawScene() (строки 72-109), а реакцией на команды от смартфона - interpreteCommand() (строки 143-155). В процессе приручения дальномера ничего, кроме вывода текста, не потребовалось, поэтому использовался весьма ограниченный набор функций:
- задание цвета и размера шрифта (функции setTextColors() и setTextSize())
- вывод текста (функции outTextC() и outTextR())
- заполнение прямоугольников (подготовка области для вывода текста - функция fillRectangle())
Результат их применения - на картинке: