Перейти к содержимому

Open

Фотография
* * * * * 3 Голосов

ReefRhythm - Продвинутый контроллер шаговых моторов

diy stepper doser reef-pi reefpi

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 190

#1 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 19 Март 2024 - 14:13

*
Популярное сообщение!

IMG20240311124816.jpg IMG20240311144621.jpg

 

Исходники и всё для самостоятельной сборки.

Также в проекте настроены регулярные автоматические сборки

 

 

 

Код написан на MicroPython + мощной и быстрой нативной библиотеке Ulab/Numpy для вычислений
 

Тема на reef2reef где вероятней будут чаше публиковаться апдейты

 

Описание:

Целью этого проекта является создание высокоточного и стабильного самостоятельного решения для дозирующих насосов с удобным интерфейсом и широкими возможностями интеграции с IoT


Он предназначен для автоматизации и упрощения процесса дозирования, обеспечивая точное и последовательное дозирование без ручных вычислений.  Используя передовые драйверы шаговых двигателей с управлением G-кодом и библиотеку Ulab для высокопроизводительных вычислений, этот проект предлагает передовое решение для аквариумистов и любителей.  Кроме того, он имеет встроенную функцию OTA для плавного обновления прошивки, гарантируя, что система всегда получать последние обновления и улучшения.

TTX:
1)Работа в постоянном режиме 24/7/365

2)Минимальная скорость дозировани от 0.1мл/мин

3)Web интерфейс для управления и OTA обновлений прошивки

4)RES API для интеграции
5)Бесшумная работа моторов

6)Поддержка до 9 помп на одном контроллере.

 

 

Железо:

1)ESP32-S3 N16R8 контроллер с 16MB Flash и 8MB RAM - 5$

Screenshot from 2024-03-19 15-06-19.png

2)BIGTREETECH MKS-Servo42C драйверы шаговых моторов -10$

Screenshot from 2024-03-19 15-05-20.png
3)Блок питания достаточной мощности для шаговых моторов. Рекомендую 12V от 2A - 5$
4)Небольшо DC-DC преобразователь на 3.3V для питания ESP32 - 1$
Screenshot from 2024-03-19 15-07-22.png

 

 

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

1)Nema42 перильстатическая помпа.  Peristaltic Pump 42 Stepper Motor -30$

Screenshot from 2024-03-19 15-04-53.png

2)Резьбовые вставки для 3d печатной резьбы 2M, 3мм глубиной и 3.2мм в диаметры

Screenshot from 2024-03-19 15-08-45.png

3)Небольшой радиатор 40x40mm. Большой выбор которых можно найти по "Nema17 heatsink"

Screenshot from 2024-03-19 15-09-55.png

4)Винты 2M 5mm
3)Провод DC питания с гнездом 5.5x2.5мм

Screenshot from 2024-03-19 15-10-47.png

P.S Без прав модератора я не смогу держать стартовое сообщение актуальным, потому в первую очередь смотрим апдейты на github



#2 Sleepy

Sleepy

    Продвинутый пользователь

  • Администраторы
  • Cообщений: 18 450
  • Меня зовут:Николай
  • Откуда:Москва

Отправлено 19 Март 2024 - 14:46

:9:

 

P.S Без прав модератора я не смогу держать стартовое сообщение актуальным, потому в первую очередь смотрим апдейты на github

Предоставил полные права в ветке, как уже бывало с авторскими проектами у нас.   :wizard:


  • yury88 это нравится

С Уважением, Николай.

Я не отвечаю на "аквариумные" вопросы в личке. Пишите на форум, пожалуйста.


#3 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 19 Март 2024 - 15:00

По поводу интерфеса- он сейчас максимально лаконичный и без дизайна, это дело наживное

При первом запуске контроллер поднимает Wifi точку доступа к которой можно подключиться и потом открыть в браузере 192.168.4.1 для настройки подключения к вашему Wi-fi

photo_2024-03-19_11-51-40.jpg

После этого контроллер сам перезагрузится и будет онлайн.

Дозирование мл за период времни:

dose.jpg

 

Калибровка каждой помпы:

calibration1.jpg calibration2.jpg

 

OTA обновления прошивки:

ota1.jpg ota2.jpg



#4 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 19 Март 2024 - 15:09

Данный проет был мной сделан в первую очередь для интеграции с Reef-pi и как "основа" для чего-то большего.
К примеру на его же основе можно собрать автоматическое тестирование KH. Без пайки десятков проводов и часов отладки.
 

Поэтому следующим релизом будет в первую очередь апдейт для самого reef-pi, но добавить настройку графика дозирования в сам контроллер не особо сложно и это тоже будет добавлено для полностью автономной работы.

 

Сейчас же у меня дозирование работает через встроенный в контроллер API- на reef-pi в Cron просто прописано запускать дозирование по графику.

 

Текущее REST API:

1)Дозировать X мл за X сек:

http://<IP of controller>/dose?id=1&direction=1&volume=50&time=3600

Id- номер помпы от 1 до 9, direction 0 или 1 - в какую сторону помпу работать

volume - сколько мл дозировать

time- время за которое эти мл будут дозированы.

2)Крутить мотор с заданной скоростью оборотов/мин в течении Х секунд. И да, решение можно использовать и для мешалок кальквассера и т.д
http://<IP of controller>/run_with_rpm?id=1&direction=1&rpm=100&time=10

3)Проверить свободную ОЗУ:
http://<IP of controller>/mem_free


  • Sleepy, DNK и Dmitry_N это нравится

#5 vahegan

vahegan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 2 048
  • Меня зовут:Վահե
  • Откуда:Ереван

Отправлено 20 Март 2024 - 01:17

Круто! А где электрическая схема подключений, я что-то не нашел.



#6 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 20 Март 2024 - 01:47

Круто! А где электрическая схема подключений, я что-то не нашел.

Потому что её ещё нет)
Я в выходные позаполняю wiki и добавлю инструкции.
Но она простая до невозможности -от контроллера TX к Rx, Rx к Tx подключить и всё.
+ Питание самого контроллера 3.3v от DC-DC и 12В(оптимально, можно до 24В) на мотор

Screenshot_2024-03-20-06-42-07-90_3aea4af51f236e4932235fdada7d1643.jpg


Вот тут я питаю всё от 5В->12В через повышающий преобразователь, так тоже можно

IMG20240311144621.jpg

#7 vahegan

vahegan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 2 048
  • Меня зовут:Վահե
  • Откуда:Ереван

Отправлено 20 Март 2024 - 09:17

Понятно. А на что клеится радиатор? Драйверная плата, как я понял, предназначена для крепления непосредственно на заднюю часть двигателя. Силовые транзисторы сзади, на них тоже радиатор не установишь.

И еще, в комплекте к драйверной плате я вижу отдельную платку с TMC2209 - с ножками и разъемом для подключения мотора сверху, но не вижу на основной плате колыбельки или места, куда бы можно было воткнуть эту платку. На фотографиях тоже она нигде не видна. Непонятно, к чему она вообще.



#8 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 20 Март 2024 - 10:00

Понятно. А на что клеится радиатор? Драйверная плата, как я понял, предназначена для крепления непосредственно на заднюю часть двигателя. Силовые транзисторы сзади, на них тоже радиатор не установишь.

И еще, в комплекте к драйверной плате я вижу отдельную платку с TMC2209 - с ножками и разъемом для подключения мотора сверху, но не вижу на основной плате колыбельки или места, куда бы можно было воткнуть эту платку. На фотографиях тоже она нигде не видна. Непонятно, к чему она вообще.

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

Для конкретно этой перильстатической головки много мощности не нужно и можно брать укороченный 20-23мм мотор как у меня. Но корпус я делал исходя из стандартного 40мм мотора. Правда подтвердить что всё идеально собирается с 40мм мотором смогу чуть попозже.

Радиаторы эти обычно уже идут с термоскотчем. Но лучше на термоклей силиконовый т. к клеим на нестандартную сторону.

 

По поводу температур:
- этот драйвер - самое холодное решение что есть на рынке, примерно вдвое холоднее 2209.
Потому что это Closed-loop драйвер, делает из шагового мотора аналог сервомотора- он не тратит энергии вообще если это не требуется.
В нашем случае с помпой не греется особо и при работе т. к нагрузка небольшая.
Но т. к я делал помпу что может работать 24/7 - радиатор желателен т. к мы всё таки делаем девайс что должен работать годами. При постоянно работе радиатор примерно 35градусов. Драйвер сам при этом еле тёплый.
- Если собирать обычный дозер что дозирует Х раз в день по минуте- никакие радиаторы вообще не нужны.
 

Та плата что ты видел в комплекте с драйвером- это переходник что бы драйвер подключать на материнские платы 3D принтеров через стандартный "разъём" для обычных драйверов для управления через STEP/DIR/EN
В нашем случае мы это не используем, мы только с этого шлейва подключаем два провода к питанию


  • vahegan это нравится

#9 Krashn056

Krashn056

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 1 536
  • Меня зовут:Дмитрий
  • Откуда:Оренбург

Отправлено 20 Март 2024 - 13:44

Здорово было бы добавить интерфейс 0-10 для подключения к другим компам)
  • yury88 это нравится

#10 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 20 Март 2024 - 14:17

Здорово было бы добавить интерфейс 0-10 для подключения к другим компам)

Ты хочешь управлять сигналом 10V с профилюкса(к примеру), включать и регулировать обороты помпы?
Сделать не сложно, правда для такого этот проект немного оверкилл с его WEB интерфейсами и т.д :)

В простейшем варианте можно из этого проекта просто взять библиотеку Servo42C и написать код из нескольких строк для micropython в boot.py
При этом ничем не ограничивается выбор контроллера. Можно взять обычной raspberry pico без wifi за 1$. Прошивка просто обычная с сайта Micropython
Выглядеть будет примерно так:
from servo42c import *
from machine import UART, Pin, ADC
import time

uart = UART(1)
uart.init(baudrate=38400, rx=rx_pin, tx=tx_pin)
pump = Servo42c(uart, addr=1, speed=1, mstep=1)
pump.set_current(1000)  # Motor current in mA

port = ADC(Pin(26))

while True:
    adc = ADC.read_u16() # 0..65535
    speed = int(adc * 127 / 65535) # Scaling to a range of 0 to 127

    if speed==0:
        pump.stop()
    else:
        pump.move(speed, direction=1)
   time.sleep(1)

Но, ничего не имею против такого режима, можно добавить режим так что при включении в питание помпа будет стартовать автоматически, в т.ч по аналоговому сигналу
Правда холодный старт сейчас секунд 6 занимает, но там есть куда оптимизировать



#11 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 20 Март 2024 - 20:36

В общем по добавлению графика дозирования в сам контроллер там оказалось всё ещё проще чем я думал.
Для Micropython есть библиотека аля "Cron"

 

А для UI, который на самом деле является как раз самым сложным, есть готовые решения.
Базу я уже запилил, осталось протестировать каково оно, так что может внезапно контроллер станет StandAlone решением раньше времени.

 

Screenshot 2024-03-21 013304.png Screenshot 2024-03-21 013321.png


  • Danchik это нравится

#12 Krashn056

Krashn056

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 1 536
  • Меня зовут:Дмитрий
  • Откуда:Оренбург

Отправлено 20 Март 2024 - 20:42

Ты хочешь управлять сигналом 10V с профилюкса(к примеру), включать и регулировать обороты помпы?
Сделать не сложно, правда для такого этот проект немного оверкилл с его WEB интерфейсами и т.д :)

В простейшем варианте можно из этого проекта просто взять библиотеку Servo42C и написать код из нескольких строк для micropython в boot.py
При этом ничем не ограничивается выбор контроллера. Можно взять обычной raspberry pico без wifi за 1$. Прошивка просто обычная с сайта Micropython
Выглядеть будет примерно так:
from servo42c import *
from machine import UART, Pin, ADC
import time

uart = UART(1)
uart.init(baudrate=38400, rx=rx_pin, tx=tx_pin)
pump = Servo42c(uart, addr=1, speed=1, mstep=1)
pump.set_current(1000) # Motor current in mA

port = ADC(Pin(26))

while True:
adc = ADC.read_u16() # 0..65535
speed = int(adc * 127 / 65535) # Scaling to a range of 0 to 127
if speed==0:
pump.stop()
else:
pump.move(speed, direction=1)
time.sleep(1)

Но, ничего не имею против такого режима, можно добавить режим так что при включении в питание помпа будет стартовать автоматически, в т.ч по аналоговому сигналу
Правда холодный старт сейчас секунд 6 занимает, но там есть куда оптимизировать

Было бы не плохо и так и так
Можно усложнить и на каждый градацию в 1В настраивать свою скорость через веб…

#13 DNK

DNK

    Продвинутый пользователь

  • Brandname
  • PipPipPip
  • Cообщений: 19 951
  • Меня зовут:Дмитрий

Отправлено 21 Март 2024 - 05:31

1)Nema42 перильстатическая помпа.  Peristaltic Pump 42 Stepper Motor -30$

Можешь сказать, почему выбрал именно эту помпу? 



#14 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 21 Март 2024 - 05:59

Можешь сказать, почему выбрал именно эту помпу?

Да они просто дешёвые и неплохого качества.
Ротор там метал, а корпус -толстый пластик.
Они мне обошлись вообще в 16$(моторы часто продают по 4$)
Этому проекту не принципиально какая головка будет стоять, можно брать любую.
Корпус и крепление просто поправить
  • DNK и Danchik это нравится

#15 vahegan

vahegan

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 2 048
  • Меня зовут:Վահե
  • Откуда:Ереван

Отправлено 21 Март 2024 - 08:53

А 57 мотор этот драйвер крутить не будет? Правда, тогда придется колхозить какой-то адаптер для крепления на попу двигателя...

Дело в том, что у меня есть древний американский дозатор Watson Marlow. У него перистальтическая головка - бомба, сейчас таких не видел даже на очень дорогих моделях, каждый ролик отдельно подпружинен, все сделано так, чтобы работало вечно. Вот фотка (не моя, но конструкция та же) для иллюстрации:

WatsonMarlow.jpg

Проблема только в том, что она очень старая, и тогда еще не было сантопрена. Мотор, который ее крутит (обычный асинхронник с редуктором), рассчитан на силиконовые трубки, которые выдерживают с месяц непрерывной работы. Была идея заменить мотор на шаговик, с коей целью и был куплен 57-ой мотор (дабы помощнее был), но руки так и не дошли этим заняться. В принципе, для работы в непрерывном режиме оно должно быть самое то...

 



#16 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 21 Март 2024 - 09:23

А 57 мотор этот драйвер крутить не будет? Правда, тогда придется колхозить какой-то адаптер для крепления на попу двигателя...

Дело в том, что у меня есть древний американский дозатор Watson Marlow. У него перистальтическая головка - бомба, сейчас таких не видел даже на очень дорогих моделях, каждый ролик отдельно подпружинен, все сделано так, чтобы работало вечно. Вот фотка (не моя, но конструкция та же) для иллюстрации:

attachicon.gifWatsonMarlow.jpg

Проблема только в том, что она очень старая, и тогда еще не было сантопрена. Мотор, который ее крутит (обычный асинхронник с редуктором), рассчитан на силиконовые трубки, которые выдерживают с месяц непрерывной работы. Была идея заменить мотор на шаговик, с коей целью и был куплен 57-ой мотор (дабы помощнее был), но руки так и не дошли этим заняться. В принципе, для работы в непрерывном режиме оно должно быть самое то...

Есть такой же драйвер на 57 мотор

MKS SERVO 57C

И так уж не повезло что G-Code не совпадает, команды похожи, но длиннее и имеют доп настройки.
Т.е базово нужно портировать библиотеку меняя g-code что бы крутить мотор
Я как сапожник-без сапог пока не готов на такое.
Сначала запилю важные фичи с расписание работы, 0-10V интерфейсом и MQTT


  • vahegan это нравится

#17 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 21 Март 2024 - 09:54

Вообще в основе проекта именно идея управлять готовыми платами через G-code. Мне максимально не нравится что все пытаются изобрести велосипед и на слабых контроллерах напрямую управлять мотором через PWM в реальном времени, цена ошибки будет высока.
Это при том что на рынке огромное кол-во готовых плат где прошилка по контролю уже написана и оттестирована на тысячах устройств.

Особо вкусно выглядят всякие платы для 3D принторов как тот же BIGTREETECH SKR Pico размером с пачку сигарет и уже имеет на борту 4 драйвера и упралять этим можно через G-Code на уровне "покрути мотор столько то"
При это остаётся сделать просто небольшую библиотеку- прослойку с функциями "крути мотор" , а интерфейс можно использовать один на всё.



#18 aquanavt

aquanavt

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 2 592
  • Меня зовут:Егор
  • Откуда:Берлин, Германия

Отправлено 21 Март 2024 - 13:19

Ты хочешь управлять сигналом 10V с профилюкса(к примеру), включать и регулировать обороты помпы?
Сделать не сложно, правда для такого этот проект немного оверкилл с его WEB интерфейсами и т.д :)

Что значит "оверкилл", это же всего лишь помпа с прошивкой. Какая разница потребителю, что там в прошивке, веб-интерфейсы или нет, если процесс сборки ничем не отличается? (распечатать корпус, вставить моторчик, плату, и залить прошивку - все)

 

По-возможности тоже не отказался бы видеть 1-10В интерфейс в этой помпе, с вот такими опциями:
* настройки производительности по уровню сигнала, возможно с интерполяцией. То есть скажем 0В - делаем 0 оборотов в минуту,  4В - 0 оборотов в минуту, 10В - 2 оборота в минуту. Между 4В и 10В пусть будет линейная зависимость

* в веб-интерфейсе можно помпу в режим управления от 1-10В как-то перевести



#19 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 21 Март 2024 - 13:28

Что значит "оверкилл", это же всего лишь помпа с прошивкой. Какая разница потребителю, что там в прошивке, веб-интерфейсы или нет, если процесс сборки ничем не отличается? (распечатать корпус, вставить моторчик, плату, и залить прошивку - все)

По-возможности тоже не отказался бы видеть 1-10В интерфейс в этой помпе, с вот такими опциями:
* настройки производительности по уровню сигнала, возможно с интерполяцией. То есть скажем 0В - делаем 0 оборотов в минуту, 4В - 0 оборотов в минуту, 10В - 2 оборота в минуту. Между 4В и 10В пусть будет линейная зависимость
* в веб-интерфейсе можно помпу в режим управления от 1-10В как-то перевести

Да будет 0-10V. Хотелка понятная- это базовый интерфейс.

По поводу интерполяции и web интерфейса-это как раз не проблема вообще, это делается легко.
Мои думы и сомнения больше всязаны с тем что вы хотите на лету скоростью помпы управлять в полном диапазоне скоростей.
Тут техническая сложность что уже крутящейся помпе менять режим микрошагов нужно аккуратно
  • Krashn056 и Danchik это нравится

#20 yury88

yury88

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • Cообщений: 14 560
  • Меня зовут:Юра
  • Откуда:Филиппины

Отправлено 23 Март 2024 - 18:40

Добавил в reef-pi поддержку REST API дозеров, причём универсальную, а не только под мой.

Ратает через GET двух ссылок(любых)
Ссылки поддерживают шаблоны.
В текущем варианте подставляются параметры:
{{.Volume}} - сколько дозировать Мл

{{.Duration}} - временной параметр сколько помпе работать

{{.Speed}} - скорость, у всех по разному, в этом проекте это RPM

К примеру в моём случае:
1)URL для дозирования:

http://192.168.254.146/dose?volume={{.Volume}}&time={{.Duration}}

2)URL Для калибрования

http://192.168.254.146/run_with_rpm?direction=1&rpm={{.Speed}}&time={{.Duration}}

Завел Pull Request, буду пробиваться через терни ревью
P.S Впервые в жизни вообще Go потрогал :crazy:

Прикрепленные изображения

  • Screenshot 2024-03-23 at 23.26.53.png
  • Screenshot 2024-03-23 at 23.26.11.png

  • Sleepy это нравится





Темы с аналогичными тегами: diy, stepper, doser, reef-pi, reefpi

Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных

Ветка управляется: