Идея создать автопоилку появилась достаточно давно. Я периодически забываю наполнять поилку водой и муравьи от этого страдают. Мне их жалко.
Чтобы решить их и мою проблему нам понадобятся.
Контроллер. В моём случае я попробовал использовать PyBoard. Надо сказать, под такие проекты это более чем подходящий вариант. Хотя было бы неплохо иметь более расширенный функционал Python. Здесь он совсем урезан.
Драйвер мотора. Выбор здесь пал на MiniMoto на 8830. Имеет шину I2C, простой в управлении и расчитан как раз на 5В. В процессе экспериментов был также опробован драйвер на DRV8871 с управлением через PWM, но добиться от него вменяемых результатов пока не удалось.
Помпа. Поискав немного на Aliexpress, выбрал такой вариант. Хорошо, что заказал сразу несколько штук - одна оказалась бракованной.
Все ингридиенты на месте. Можно собирать.
Для начала поймём как управлять драйвером мотора. Для этого соединим выводы SCL и SDA с ножками X1 и X2 на PyBoard. С помощью команд в консоли питона определим, что драйвер слушает адрес 0x64 на шине I2C:
from machine import I2C
i2c_contoller = I2C(scl='X1', sda='X2', freq=400000)
i2c_contoller.scan()
Так как драйвер мотора управляется фактически двумя байтами (первый - команда типа "вперёд", "назад", "стоп", а второй - доля напряжения на выходе относительно питания), то лучше напишем простую функцию, где будем передавать значение 0..1 для управления скоростью момпы.
Из спецификации на микросхему уровень выходного напряжения задаётся по формуле: 4 x VREF x (VSET +1) / 64. Где VREF = 1.285V, а VSET это диапазон 0x06h..0x3Fh. Реализация функции в коде - def set_throttle(i2c, current_cmd, ratio):.
В общем-то всё. Остальное "дело техники". Соединяем выводы помпы с выходом MiniMoto, добавляем блок питания для миниконтроллера и драйвера. И не забываем про код с простой обвязкой - https://gitlab.com/agglutinator/ant_rinser. Скрипт main.py достаточно просто выложить в корень диска контроллера и перегрузить его.
С текущими настройками контроллер будет включать помпу на полсекунды два раза в сутки.