Перистальтический насос‑дозатор на 3D‑принтере для лабораторной установки водоподготовки

—

от автора

Собираю электронику насоса‑дозатора

Я занимаюсь промышленной водоподготовкой. Сейчас у нас исследовательский проект: изучаем методы предочистки высокоминерализованной воды. Пробуем разные коагулянты и флокулянты, меняем дозы и градиенты перемешивания. Каждый режим держим около двух часов, потом отбираем пробы и сравниваем результат.

Для такого исследования нужен точный перистальтический насос‑дозатор на маленький расход. Реагенты должны поступать в воду непрерывно, с заданной дозой в мг/л, от 1 до 13 мл/мин. Если подача плавает, непонятно, что сработало — реагент или случайность. Реагентов два — коагулянт и флокулянт, значит, нужно два канала.

Подходящий готовый насос я не нашёл и спроектировал свой. Ниже — как он устроен, где я ошибся и как он работает сейчас.

Насос‑дозатор ВАКО‑ДП1: печатная головка на моторе NEMA17, корпус с электроникой

Насос‑дозатор на лабораторном столе, вид сбоку

Лицевая панель: тумблер, индикатор «Работа», головка

Насос‑дозатор перед штативом с бюретками

Один насос — один канал, корпуса ставятся друг на друга

Требования

  • два канала, подача 1–13 мл/мин на канал;

  • уставка в мг/л: я знаю дозу реагента и расход воды, а мл/мин пусть считает насос;

  • калибровка на месте, без лаборатории метрологии;

  • с раствором контактирует только трубка — реагенты агрессивные.

Готовые насосы: дорого или не то

Лабораторный перистальтический дозатор стоит около 24 000 ₽ за канал. Два канала — 48 000 ₽. За эти деньги насос качает мл/мин, а пересчёт из мг/л — на отдельном контроллере или на калькуляторе с ручной уставкой после каждого изменения расхода.

Доступные дозаторы — аквариумные и бытовые — работают по таймеру: включаются по расписанию, быстро выдают порцию и стоят до следующего включения. Мне нужна непрерывная подача с постоянной скоростью 0,5–30 мл/мин: реагент поступает в поток воды всё время, а не порциями раз в час. Для этого нужен шаговый мотор — у него подача жёстко привязана к частоте шагов.

Итого: готовые насосы либо дороги, либо не умеют держать около 1 мл/мин, дозировать в мг/л и работать в два канала.

Открытые проекты: попробовал несколько — не завелись

На Thingiverse и GitHub десятки проектов перистальтических насосов для 3D‑печати. Я напечатал и собрал несколько. Ни один не заработал на моей трубке и моих подачах без переделки: где‑то конструкция рассчитана на другую трубку, где‑то пережим задан жёстко.

Из одного проекта я взял порядок укладки: сначала трубка, потом ротор. Остальное спроектировал сам: головку, в которой пережим меняется сменной деталью, а не переделкой всей модели.

Головка: ролики, дуга и шаг

Головка в разнесённом виде: крышка, ротор с тремя роликами, вкладыш‑калибр, корпус головки, мотор NEMA17

Головка без крышки качает воду. Блок питания показывает 12 В и 0,36 А — около 4,3 Вт

Анимация: ролики перегоняют порции раствора от входа к выходу

Анимация головки в изометрии

Головка укладывается в габарит NEMA17: 42,3 × 42,3 мм, высота 26,5 мм вместе с крышкой. Корпус садится на центрирующий выступ мотора Ø22 мм. Модель параметрическая, в OpenSCAD: все размеры вынесены в переменные, в конце файла — самопроверка зазоров и толщин стенок.

Ротор. Три ролика, каждый — два подшипника 623 (3 × 10 × 4) стопкой на винте M3. Получается ролик Ø10 × 8 мм. Ролики катятся по трубке, а не трут её: трубка изнашивается медленнее, момент на валу меньше. Оси роликов на радиусе 8,5 мм.

Дорожка. Трубка — силикон 2 × 4 мм. Ось пережатой трубки идёт по радиусу 14,35 мм. Длина окружности — 90,2 мм. Теоретический объём за оборот:

V = π · r² · L = π · (1 мм)² · 90,2 мм ≈ 283 мм³ = 0,283 мл

Реальная перистальтика даёт меньше теории: трубка не распрямляется мгновенно, часть объёма остаётся в зоне пережима. Поэтому реальный коэффициент даёт только калибровка. Стартовое значение в прошивке — 0,25 мл/об.

Пульсация. Три ролика — три порции за оборот. Каждая порция — объём трубки между соседними роликами, треть окружности: не больше 0,095 мл.

Почему пережатая дуга больше шага роликов

Вкладыш охватывает ротор на 180°. Полностью трубка пережата на 140°: остальное уходит на плавный заход трубки под ролик и выход из‑под него.

Ролики стоят через 120°. Раз пережатая дуга 140° больше шага 120°, в любой момент хотя бы один ролик находится в зоне полного пережима. Путь с входа на выход всегда закрыт. Обратного протока нет, клапаны не нужны.

Это условие проверяйте первым в любой перистальтической головке. Если пережатая дуга меньше шага роликов, в какой‑то фазе оборота трубка открыта насквозь, и насос течёт назад. Оговорку я нашёл только на установке: условие работает, только если ролик действительно закрывает трубку. Об этом ниже.

Видео работы насоса, приложения и установки — на странице проекта: dozator.sergey‑kireev.ru

Сменный вкладыш‑калибр

Вкладыш‑калибр: полукольцо с канавкой под трубку, номер — насечками на кромке

Зазор между роликом и дном канавки задаёт вкладыш — полукольцо, которое вставляется в карман корпуса. Название вкладыша — это зазор в мм: G1.70 — зазор 1,70 мм.

Трубка 2 × 4 при полном смыкании — это две стенки по 1 мм, то есть 2,0 мм. Всё, что меньше, — пережим сверх смыкания:

Вкладыш

Зазор, мм

Пережим

G1.90

1,90

5%

G1.80

1,80

10%

G1.70

1,70

15%

G1.60

1,60

20%

G1.40

1,40

30%

G1.20

1,20

40%

G1.00

1,00

50%

Почему зазор задаёт деталь, а не винт: трубки разных партий отличаются по мягкости и толщине стенки, а печатный корпус имеет разброс около 0,1 мм. Подстроечный винт с пружиной добавляет деталей и люфтов. Вкладыш печатается за 20 минут, весит пару граммов PETG и вынимается двумя винтами M3, вкрученными в отверстия на торце.

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

Замена трубки за минуту

Замена трубки: снять крышку, снять ротор, уложить трубку, вернуть ротор и крышку

Крышка держится на четырёх потайных винтах M3. Два задних проходят сквозь крышку и корпус головки прямо в резьбу мотора, два передних вкручиваются в PETG.

Порядок замены:

  1. Снять крышку — четыре винта.

  2. Снять ротор с вала рукой.

  3. Уложить трубку в канавку. Без ротора она ложится свободно по всей дуге, видно, что села до дна.

  4. Надеть ротор и провернуть рукой 2–3 оборота — ролики сами дожмут трубку в канавку.

  5. Поставить крышку.

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

Печать

Все детали печатаются из PETG без поддержек на обычном принтере с соплом 0,4 мм. Головка — около 47 г пластика и около двух часов печати. Корпус с электроникой — ещё около 150 г. PLA не подходит: под постоянным прижимом трубки он ползёт.

Печать лицевой панели корпуса из PETG

Рабочее место: насосы в сборке

Первая сборка

Первый насос я собрал на головке v1.2, с первой версией прошивки и приложения.

Прототип на столе: корпус, мотор с головкой, плата ESP32 и драйвер на печатной площадке

Отладка: насос качает воду из стакана, электроника пока снаружи корпуса

Сборка головки — девять шагов, те же картинки лежат в инструкции:

Шаги 1–9: от нижней пластины ротора до собранной головки. Снаружи — четыре винта заподлицо и две трубки

Электроника: ESP32, TMC2209, NEMA17

Плата‑адаптер: разъём мотора, клемма 12 В, DIP‑переключатели микрошага. От ESP32 — три провода: STEP, DIR, EN

Драйвер TMC2209: вставляется в адаптер, ток мотора — подстроечником

Состав:

  • Мотор NEMA17 17HS4401.

  • Драйвер TMC2209 в автономном режиме, без UART. Микрошаг 1/16 задаётся перемычками: 200 × 16 = 3 200 микрошагов на оборот. Режим StealthChop — без гула шагов.

  • Контроллер ESP32-WROOM-32 на плате расширения.

  • Питание — адаптер 12 В 2 А, насос берёт до 10 Вт.

Ток мотора выставлен подстроечником драйвера: 0,7–0,8 А RMS. По расчёту пиковый момент на валу — не больше 0,08 Н·м, мотор при таком токе даёт 0,25–0,28 Н·м: запас больше трёх раз. Поднимать ток выше не нужно: лишнее тепло уходит через фланец мотора в PETG‑корпус головки.

Корпус 118 × 88 × 99 мм в разнесённом виде

Платы стоят на съёмной задней крышке: электроника собирается на столе и вставляется в корпус целиком

Схема проводки: три провода между ESP32 и драйвером, питание через разъёмы с готовыми проводами. Паять почти нечего

Грабли № 1: выводы, которых нет

Распиновка из моей первой, трёхканальной схемы на эту плату не подошла: у платы расширения часть выводов ESP32 на гребёнки не выведена. Проверил миганием: GPIO 16, 18, 19, 27 и 33 не отзываются, отзываются 4, 17, 25, 26 и 32. Итоговая распиновка: STEP — GPIO25, DIR — GPIO17, EN — GPIO26, светодиод — GPIO4.

Мораль: у китайских плат расширения распиновку проверяйте на живой плате, а не по картинке продавца.

Генерация шагов: аппаратный таймер

Подача перистальтического насоса пропорциональна частоте шагов:

f [Гц] = Q [мл/мин] × K [шагов/мл] / 60

K — калибровочный коэффициент, хранится во флеш‑памяти. Стартовое K = 12 800 шагов/мл: это 3 200 микрошагов на оборот при 0,25 мл/об.

Диапазон частот:

Подача, мл/мин

Частота шагов, Гц

0,5

107

1

213

5

1 067

30

6 400

В первой версии прошивки шаги выдавал ШИМ‑модуль LEDC. Он умеет только целые герцы. На 1 мл/мин нужно 213,3 Гц — округление даёт ошибку подачи. На малых подачах она доходила до 1%, а на 0,1 мл/мин — до 2,5%.

Сейчас шаги генерирует аппаратный таймер ESP32 с тактом 40 МГц, то есть 25 нс. Прерывание переключает ножку STEP, период тревоги — 40 000 000 / (2f) тиков. Для 213,3 Гц это 93 750 тиков, и частота задаётся с ошибкой меньше 0,02% во всём диапазоне.

Второй плюс: шаги считаются прямо в прерывании. Счётчик поданного объёма и калибровка работают по реально выданным шагам, а не по «уставка × время». Разовая доза выдаётся на максимальной скорости — объём считается шагами, скорость на него не влияет.

Приложение в телефоне

Экрана и кнопок на насосе нет. Каждый насос раздаёт свою Wi‑Fi‑сеть. Телефон подключается — и приложение открывается само, как страница авторизации в кафе. Насос можно подключить и к сети лаборатории, тогда он доступен по имени через mDNS. Прошивка обновляется по воздуху.

Приложение написано на React с Tailwind и компонентами shadcn/ui. Сборка — один файл index.html: 450 КБ, в gzip — 130 КБ. Он вшит в прошивку массивом байтов, файловая система не нужна.

Приложение можно пощёлкать прямо в браузере — насос там имитируется: dozator.sergey‑kireev.ru/demo

Режим «Доза»

Режим «Доза»: 5 мг/л при расходе линии 30 л/ч и растворе 5 г/л — насос ставит 0,50 мл/мин

Вводите три числа: дозу реагента в мг/л, расход воды в линии в л/ч и концентрацию раствора в г/л. Насос считает подачу:

Q [мл/мин] = D [мг/л] × Qл [л/ч] / (C [г/л] × 60)

Проверка размерности: мг/л × л/ч = мг/ч; делим на г/л — получаем мл/ч; делим на 60 — мл/мин. Пример со скриншота: 5 × 30 / (5 × 60) = 0,50 мл/мин.

Если результат выходит за 0,1–30 мл/мин, насос уставку не применяет и подсказывает, до какой концентрации развести или укрепить раствор.

Подача ниже 0,5 мл/мин: приложение предлагает развести раствор, чтобы дозирование шло ровно

Ниже 0,5 мл/мин перистальтика подаёт порциями: одна порция — до 0,095 мл, а на таких оборотах порции идут редко. Разбавить раствор и качать больше — точнее, чем делать вид, что насос держит 0,2 мл/мин ровно.

Калибровка мерным цилиндром

Калибровка: быстрая за 1 минуту или точная до 10 минут. Опускаете трубку в цилиндр, вводите объём — насос пересчитывает K

Два режима:

  • Быстрая — ровно 1 минута на 20 мл/мин, в цилиндр набирается около 20 мл.

  • Точная — на текущей рабочей уставке. Длительность — время, за которое накапает 20 мл, но от 1 до 10 минут: на 10 мл/мин — 2 минуты, на 5 — 4, на 2 — 10.

Зачем точная на рабочей уставке: объём за оборот у перистальтики зависит от оборотов. Коэффициент, снятый на 20 мл/мин, на 1 мл/мин ошибается на проценты.

Новая трубка — новая калибровка. Приложение напоминает об этом, когда сбрасываете счётчик наработки трубки.

Что ещё

  • счётчик поданного объёма;

  • счётчик наработки трубки — видно, когда её менять;

  • прокачка линии за 30 секунд;

  • разовая доза заданного объёма;

  • реверс.

API

Всё, что умеет приложение, доступно GET‑запросами с ответом в JSON. Насос можно подключить к автоматике или скрипту на ноутбуке:

/api/status/api/set?flow=2.5                        # уставка, мл/мин/api/dosing?on=1&d=5&q=30&c=5            # режим «Доза»: мг/л, л/ч, г/л/api/run?on=1/api/dir?rev=1                           # реверс/api/prime?s=30                          # прокачка/api/dose?ml=10                          # разовая доза/api/cal_start  /api/cal_finish?g=  /api/cal_cancel/api/reset?what=total|tube

Если уставка режима «Доза» выходит за пределы, ответ {"ok":0,"flow":…,"min":…,"max":…} и ничего не меняется.

Грабли № 2: вкладыши, которые не закрывали трубку

Первый комплект вкладышей был G1.60–G1.90, пережим 5–20%. Диапазон я выбрал по расчёту: чем больше пережим, тем быстрее изнашивается трубка и тем больше момент на валу.

На испытаниях вылезли две проблемы:

  1. Ниже 4 мл/мин в цилиндре набиралось меньше уставки.

  2. Когда на дуге оставался один ролик, через трубку проходил воздух.

Второй пункт объяснил первый. Силиконовая трубка оказалась мягче, чем я закладывал. Ни один вкладыш из первого комплекта не пережимал её полностью. Условие «пережатая дуга 140° больше шага 120°» формально выполнялось, но ролик в зоне пережима трубку не закрывал. Пока на дуге два ролика, их двух неполных пережимов хватало. Когда оставался один — появлялся канал, и раствор шёл назад.

Почему страдали именно малые подачи: утечка через неплотный пережим почти не зависит от оборотов. На 10 мл/мин она теряется на фоне подачи. На 1–2 мл/мин она становится заметной долей расхода.

Тогда я напечатал три тугих вкладыша: G1.40, G1.20 и G1.00 — пережим 30, 40 и 50%.

С G1.40 насос ровно подаёт около 1 мл/мин. Воздух больше не проходит. Сейчас G1.40 — стартовый вкладыш для силиконовой трубки, а тугие вкладыши вошли в комплект. Всего их десять, от G1.0 до G1.9.

Выводы:

  • Условие «дуга больше шага» необходимое, но не достаточное. Проверяйте, что ролик действительно закрывает трубку.

  • Каталожная толщина стенки трубки — не повод выбирать пережим по расчёту. Выбирайте по факту, на вашей трубке и вашей подаче.

  • Проверка на столе при 10 мл/мин ничего не говорит о работе на 1 мл/мин. Проверяйте на нижней рабочей подаче.

Два насоса на установке

Насос на установке. Трубка в мерном цилиндре — так проверяю расход

Насос‑дозатор на лабораторном столе перед вытяжным шкафом

Насос‑дозатор на лабораторном оборудовании

Два насоса уже неделю работают на установке по 10–12 часов в день.

  • Коагулянт — технический сульфат алюминия, раствор 12,5 г/л, 5–7,5 мл/мин.

  • Флокулянт — раствор 0,015–0,05 г/л, 3,3–13,3 мл/мин.

Расход проверяю мерным цилиндром, он совпадает с заданным.

Видео на 3:25 с настройкой дозы и калибровкой — на странице проекта: dozator.sergey‑kireev.ru

Скоба и заборник

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

Скоба на стенку ёмкости. Надевается на кромку без клея и винтов, трубка защёлкивается в канавку и не заламывается. Конец трубки уходит под воду — нет капель и корки на кончике.

Скоба‑кольцо, на фоне два насоса на установке

Скоба‑кольцо на стенке ёмкости с трубкой

Путь трубки внутри скобы

Модель скобы‑кольца

Заборник для канистры. Бросаете в канистру — ложится на дно и не всплывает: внутри три нержавеющие гайки. Раствор заходит через щели на высоте 33 мм, осадок со дна не подсасывается. Разбирается поворотом, без ключей.

Заборник в разнесённом виде: камера со щелями и утяжелитель

Камера заборника со щелями‑фильтром и штуцером

Шаг 1. Надеть три нержавеющие гайки M10 на шток утяжелителя

Шаг 2. Положить силиконовую прокладку Ø26 на торец: она закрывает карман с гайками

Шаг 3. Надеть камеру, совместив кулачки с пазами, и повернуть на 60° до щелчка

Шаг 4. Надеть трубку 2×4 на штуцер до упора, стяжка не нужна

Где ещё пригодится

Я делал насос под реагенты водоподготовки, но точный объём жидкости нужно подавать и в других местах:

  • лаборатории — дозирование реагентов на пилотных установках, подача раствора с постоянной скоростью;

  • аквариумы — удобрения для растений, кальций, KH и магний для морского аквариума;

  • бассейны — корректор pH, коагулянт, хлорсодержащие средства (для гипохлорита — трубка PharMed BPT);

  • напитки — сиропы, ароматизаторы, добавки при домашнем пивоварении. Раствор касается только трубки, поэтому достаточно поставить пищевую силиконовую.

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

Параметр

Значение

Статус

Подача

0,5–30 мл/мин

3,3–13,3 проверено на установке

Точность после калибровки

±5%

по мерному цилиндру

Давление на выходе

до 1 бар

расчёт

Самовсасывание

с глубины 0,5 м

расчёт

Температура раствора

до 40 °C

—

Сколько стоит

Комплектующие на один насос, цены Ozon:

Позиция

Кол‑во

≈ ₽

Мотор NEMA17 17HS4401

1

800

Драйвер TMC2209

1

1 400

Плата‑адаптер драйвера

1

400

ESP32 с платой расширения

1

630

Блок питания 12 В 2 А, гнездо, штекер

1

660

Подшипник 623

6

400

Винты, гайки, термовставки, ножки

—

300

Светодиод, провода с разъёмами

—

110

Трубка силиконовая 2 × 4

0,4 м

60

PETG

≈200 г

300

Итого

≈5 100

Два канала обошлись примерно в 10 200 ₽ комплектующих против 48 000 ₽ за готовые. Время на проектирование я не считал.


Сергей Киреев, инженер‑технолог по водоподготовке. Telegram: t.me/sr_kireev

Подробности, видео и демо приложения — на странице проекта: dozator.sergey‑kireev.ru

ссылка на оригинал статьи https://habr.com/ru/articles/1087116/