Перистальтический насос‑дозатор на 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.
Порядок замены:
Снять крышку — четыре винта.
Снять ротор с вала рукой.
Уложить трубку в канавку. Без ротора она ложится свободно по всей дуге, видно, что села до дна.
Надеть ротор и провернуть рукой 2–3 оборота — ролики сами дожмут трубку в канавку.
Поставить крышку.
Это и есть идея из открытого проекта: сначала трубка, потом ротор. Если заводить трубку прокруткой ротора, она трётся о торцы подшипников.
Печать
Все детали печатаются из 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%. Диапазон я выбрал по расчёту: чем больше пережим, тем быстрее изнашивается трубка и тем больше момент на валу.
На испытаниях вылезли две проблемы:
Ниже 4 мл/мин в цилиндре набиралось меньше уставки.
Когда на дуге оставался один ролик, через трубку проходил воздух.
Второй пункт объяснил первый. Силиконовая трубка оказалась мягче, чем я закладывал. Ни один вкладыш из первого комплекта не пережимал её полностью. Условие «пережатая дуга 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
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.