from machine import Pin, ADC, I2C
import time
import ssd1306
# 1. Шаговый двигатель
step = Pin(26, Pin.OUT)
dir = Pin(27, Pin.OUT)
dir.value(1)
# 2. Потенциометр
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB) # Диапазон 0-3.3V
pot.width(ADC.WIDTH_12BIT) # Значения 0-4095
# 3. Экран
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
STEPS_PER_REVOLUTION = 200
# 1. Блок для просто вращения
SPEED_RPM = 60 # 60 оборотов в минуту = 1 оборот в секунду
SPEED_RPS = SPEED_RPM / 60 # Переводим в обороты в секунду
# Рассчитываем задержку
delay = 1 / (STEPS_PER_REVOLUTION * SPEED_RPS) # sleep(STEP_time) - это задержка (контроллер ничего не делает определнное время), необходим чтобы регулировать скорость шагов
while True:
# 2. Читаем потенциометр
pot_value = pot.read()
# Превращаем 0-4095 в задержку 0.001-0.02 секунды
# 0 на потенциометре = 20 мс (медленно)
# 4095 на потенциометре = 1 мс (быстро)
delay = 0.001 + (0.019 * (1 - pot_value / 4095))
# 2. Считаем скорость
rps = 1 / (delay * STEPS_PER_REVOLUTION)
rpm = rps * 60
print('Пот: ', pot_value, '| ', rpm, 'об/мин') #почему-то визуально замедляет вращение вала
# 3. Добавляем экранчик (почему-то после его добавления вал визуально очень медленно крутится)
oled.fill(0) # Очищаем
oled.text("STEPPER", 35, 0)
oled.text("--------", 30, 10)
oled.text("RPM:", 10, 25)
oled.text(str(round(rpm, 1)), 60, 25)
oled.show()
# 1. Делаем шаг
step.value(1)
time.sleep(delay / 2)
step.value(0)
time.sleep(delay / 2)