Освой MicroPython играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

MicroPython. PWM (ШИМ)

Класс PWM
Мигание светодиодом
Сервопривод

Класс 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 и будем постепенно увеличивать и уменьшать яркость светодиода.

PWM

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) я использовал другие значения.

Дополнительные материалы

PWM для Arduino

Реклама