Управление сервоприводом с помощью Raspberry Pi Pico W и ШИМ

Сервопривод - это один из наиболее фундаментальных способов научиться использовать широтно-импульсную модуляцию (ШИМ) в Raspberry Pi. В этой статье я покажу, как это сделать с помощью Raspberry Pi Pico W.

Цели учебника по ШИМ

Сервопривод с Pico W и ШИМ
  • Узнайте, как использовать ШИМ для управления углом поворота сервопривода
  • Настройка сервера с помощью Pico W
  • Сервер доставляет веб-страницу с ползунком для управления сервоприводом

Необходимые детали

  • Raspberry Pi Pico W с заголовками
  • Провод перемычки
  • Сервопривод (мы используем микросерво Tower Pro SG90)

Что такое широтно-импульсная модуляция?

Дети находят забавным многократное включение и выключение света.

Для них так забавно наблюдать, как свет мерцает и гаснет, когда они переключают выключатель. Родители, возможно, не находят это забавным, но для всех нас это является моментом обучения.

Если вы или ваши дети делали это, то вы испытали примитивную форму широтно-импульсной модуляции.

С помощью Raspberry Pi вы можете легко сделать это в автоматическом режиме. По сути, вы сообщаете Raspberry Pi, сколько раз за определенный период вы хотите, чтобы все было "включено".

Это позволяет регулировать яркость светодиодов:

пульт дистанционного управления picockpit gpio pwm
Переключение яркости светодиодов с помощью функции PWM в PiCockpit

Кроме того, это позволяет контролировать угол наклона руки сервопривода.

Важная концепция ШИМ: рабочий цикл

Рабочий цикл - это время, в течение которого цепь остается "высокой", что означает, что она включена.

Итак, предположим, что ваша схема включена половину времени. Поэтому мы можем сказать, что рабочий цикл составляет 50%.

Если он постоянно включен, его рабочий цикл будет равен 100%, и наоборот, если он постоянно выключен, это означает 0.

Иллюстрация рабочего цикла от Sparkfun (CC BY-SA 4.0)

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

Для светодиода это означает, что светодиод горит в течение определенного времени, затем подается питание, затем снова подается питание и так далее.

Таким образом, светодиод никогда не становится достаточно ярким, чтобы достичь своей полной яркости, и не имеет достаточно времени, чтобы полностью потемнеть.

Сервоуправление SG90 с ШИМ

Здесь нужно быть осторожным, так как не все сервоприводы работают одинаково. Это руководство относится именно к микросерво Tower Pro SG90.

SG90 вращается на 180 градусов, но некоторые сервоприводы имеют угол поворота 120 градусов. Сервоприводы для радиоуправления, скорее всего, будут 120-градусными, поэтому обязательно проверьте технические характеристики сервопривода, которым вы хотите манипулировать, так как можно повредить сервопривод, если подать на него сигнал, выходящий за пределы диапазона.

Это технический паспорт для SG90 от Luxor Parts:

В техническом описании указаны две важные вещи: какой цвет соответствует положительному, заземленному и сигнальному, а также частота импульсов/дежурный цикл.

  • Коричневый = отрицательный
  • Красный = положительный
  • Оранжевый = сигнал

И для частоты импульсов/дежурного цикла

  • Вам потребуется рабочий цикл 20 мс или 50 Гц.
  • Сигнал длительностью 1 мс = ноль градусов
  • Сигнал длительностью 2 мс = поворот на 180 градусов
При сигнале длительностью 1 мс сервопривод поворачивается на ноль градусов.

Это означает, что каждые мс сервопривод будет искать обновление. Если вы продолжите посылать ему сигнал 2 мс, он останется на полном обороте (180 градусов). Если вы измените его на 1,5 мс, он будет вращаться на 90 градусов, а при 1 мс он будет вращаться на ноль градусов.

При сигнале длительностью 2 мс сервопривод поворачивается на 180 градусов.

Подключение сервопривода к Pico W

Для того чтобы использовать наш код, вам необходимо подключить сигнальный провод к GPIO 0. Сигнальный провод - это оранжевый провод на SG90.

Затем подключите красный провод к VBUS (что дает 5 В). Как видно из технического описания, рабочее напряжение для SG50 составляет от 4,8 В до 6 В, поэтому вывод 3,3 В на Pico W не подойдет.

Кодирование сервоуправления Pico W

Вы можете найти код здесь на нашем GitHub.

Давайте пройдемся по коду.

В main.py, который является соглашением об именовании файла, который мы хотим запустить при загрузке, мы создаем класс для сервопривода и инстанцируем его:


class Servo:
    def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
        self.pwm = machine.PWM(machine.Pin(pin))
        self.pwm.freq(freq)
        self.MIN_DUTY = MIN_DUTY
        self.MAX_DUTY = MAX_DUTY
        
    def rotateDeg(self, deg):
        if deg < 0:
            deg = 0
        elif deg > 180:
            deg = 180
        duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
        self.pwm.duty_ns(duty_ns)

servo = Servo()

Класс Servo использует класс machine.PWM, доступный в MicroPython. См. документацию здесь.

В данном примере мы используем Pico W в качестве точки доступа. Вот код для этого:

ssid = 'Servo-Control'
password = 'PicoW-Servo'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

Как видно из первых двух строк, SSID, который вы ищете, это Сервоуправление и пароль PicoW-Servo.

После входа в сеть WiFi вы можете перейти к IP-адресу Pico W, который по умолчанию равен 192.168.4.1. Кроме того, вы можете проверить журнал на Thonny, чтобы узнать IP-адрес вашего Pico.

Как веб-страница взаимодействует с сервоприводом?

Управление ползунком сервопривода

Когда вы заходите на IP-адрес Pico W, вам отправляется файл index.html, который можно найти в репозитории Github.

Файл index.html содержит эти важные строки:

 <form id="form">
            <input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
            <output></output>
        </form>

Как видно, имеется объект , который и является ползунком.

Имеется также , который отображает степень поворота.

Часть JavaScript обновляет , а также обновляет URL, чтобы Pico W мог перехватить данные и повернуть сервопривод.

Элементы и имеют родителя .

Вот сценарий на передней стороне,