Освой MicroPython играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Класс PWM
Мигание светодиодом
Сервопривод
В состав machine входит класс PWM, который используется для широтно-импульсной модуляции.
import machine
pwm = machine.PWM(machine.Pin(15))
Обычно отдельно импортируют класс PWM и другие необходимые классы (см. примеры ниже).
Создать объект PWM можно, указав нужный вывод. Также можно сразу указать частоту и цикл.
from machine import Pin, PWM
pwm1 = PWM(Pin(26))
pwm2 = PWM(Pin(26), frequency)
pwm3 = PWM(Pin(26), freq=5000, duty=512) # сразу в одном месте
Получить значение частоты или установить новое значение можно через метод freq(). Для светодиодов нет необходимости устанавливать слишком больше значения включения/выключения света в секунду, так как человеческий глаз не увидит быструю смену состояний.
pwm.freq() # get current frequency
pwm.freq(5000) # set frequency
Параметр duty cycle (рабочий цикл) - количество времени в процентах, когда сигнал есть или его нет. Установить и узнать значение цикла можно через метод duty(). Во многих примерах в интернете использовались значения в диапазоне от 0 до 1023, однако в моём случае при работе с M5Stick-C программа ругалась и просила использовать диапазон от 0 до 100. Чтобы светодиод светился вполнакала, установите значение из середины диапазона.
pwm.duty() # get current duty cycle
pwm.duty(100) # set duty cycle
Отключить ШИМ можно через метод deinit().
pwm.deinit()
Подключим светодиод к выводу 26 и будем постепенно увеличивать и уменьшать яркость светодиода.
from machine import Pin, PWM
from time import sleep
frequency = 5000
led = PWM(Pin(26), frequency)
print(led.freq())
print(led.duty())
while True:
for duty_cycle in range(1, 100):
led.duty(duty_cycle)
sleep(0.005)
for duty_cycle in range(100, 1, -1):
led.duty(duty_cycle)
sleep(0.005)
Используя ШИМ, мы можем поворачивать сервопривод. Подключение как у светодиода (земля и сигнал) и плюс питание 3.3V. Код тоже остаётся без особых изменений. Будем вращать сервопривод туда-сюда.
from machine import Pin, PWM
from time import sleep
servo = PWM(Pin(26), freq=150)
while True:
for duty_cycle in range(1, 100):
servo.duty(duty_cycle)
sleep(0.02)
for duty_cycle in range(100, 1, -1):
servo.duty(duty_cycle)
sleep(0.02)
В документации говорится, что нужно использовать частоту 50 Гц и значения от 40 до 115 (77 - среднее положение) для duty(). В M5Stick-C (ESP32 Pico) я использовал другие значения.