Ранее на нашем сайте мы уже рассмотрели серию статей про набирающую сейчас популярность плату Raspberry Pi Pico: подключение к ней ЖК дисплея и OLED дисплея, использование в ней АЦП и подключение ультразвукового датчика для определения расстояний.
В этой же статье мы рассмотрим подключение сервомотора (серводвигателя) к плате Raspberry Pi Pico и управление им с помощью широтно-импульсной модуляции (ШИМ). Программирование платы будет осуществляться на языке MicroPython.
Необходимые компоненты
- Плата Raspberry Pi Pico (купить на AliExpress).
- Сервомотор SG90 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Основные принципы ШИМ
Широтно-импульсная модуляция (на англ. Pulse-width modulation – PWM) – это технология, которая изменяет амплитуду цифрового сигнала таким образом, чтобы обеспечить на нагрузке необходимое среднее значение напряжения. Изменяя коэффициент заполнения (цикл занятости, duty cycle) широтно-импульсной модуляции, можно регулировать значение мощности сигнала, поступающего на нагрузку. На следующем рисунке показан пример ШИМ сигнала.
На представленном рисунке показан ШИМ сигнал с коэффициентом заполнения 50%. Мы можем изменять коэффициент заполнения ШИМ сигнала в пределах от 0% to 100%. Период ШИМ сигнала – это сумма длительности моментов ON и OFF как показано на рисунке. Частота ШИМ сигнала показывает как быстро в ШИМ сигнала протекает один период. Формула для ее расчета выглядит следующим образом:
Frequency = 1/Time Period
Time Period = On time + Off time
Более подробно про технологию широтно-импульсной модуляции вы можете прочитать в статье про использование ШИМ в плате Arduino.
В данном проекте мы, изменяя коэффициент заполнения ШИМ сигнала, будем управлять сервомотором (серводвигателем), подключенным к плате Raspberry Pi Pico.
Схема проекта
Схема подключения сервомотора к плате Raspberry Pi Pico представлена на следующем рисунке.
Как видите, схема соединений очень проста. Мы знаем, что у сервомотора три провода. Черный или коричневый провод – для подключения к земле (ground), красный – для подачи питания (VCC), желтый или оранжевый – для подачи управляющего импульсного сигнала. В схеме мы подключили провод VCC серводвигателя к контакту VBUS платы Raspberry Pi Pico, сигнальный провод сервомотора подключен к контакту GPIO0 платы, а земля сервомотора – к земле платы.
Объяснение программы для Raspberry Pi Pico
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Для начала вам необходимо скачать с репозитория GitHub каталог обучающих программ для платы Raspberry Pi Pico. В этом каталоге вам нужен будет подкаталог с именем “T6_How to Control a Servo Motor using Pico”. Внутри этого подкаталога вы найдете подкаталог “code”, а в нем файл программы “main.py”, который вам нужно открыть в редакторе Thonny (или другом аналогичном).
Вначале в программе мы подключаем (импортируем) необходимые библиотеки.
1 2 |
from machine import Pin, PWM from time import sleep |
Функции Pin() и PWM() описаны в импортированный библиотеке machine.py. Функция Pin() в нашем случае используется для объявления сигнального (управляющего) контакта сервомотора.
1 2 |
pwm = PWM(Pin(0)) pwm.freq(50) |
Поскольку у нас сигнальный контакт сервомотора подключен к контакту GPIO0 платы, то с помощью функции PWM() мы его сделали ШИМ контактом, то есть контактом, на котором будет формироваться ШИМ сигнал. Переменная pwm у нас в коде используется в качестве объекта. Далее мы назначили частоту для ШИМ сигнала равную 50Hz с помощью функции pwm.freq(50).
1 2 3 4 5 |
#Function to set an angle #The position is expected as a parameter def setServoCycle (position): pwm.duty_u16(position) sleep(0.01) |
Затем мы используем функцию setServoCycle(position) для установки позиции сервомотора изменяя параметр позиции в диапазоне от 1000 до 9000. Дело в том, что в данном случае позиция сервомотора задается не в градусах, как мы привыкли для других микроконтроллерных платах, а в микросекундах. И значения 1000-9000 соответствуют диапазону градусов 0-180.
Мы в бесконечном цикле while будем использовать два цикла. Первый из них используется для установки позиции оси сервомотора от 0 до 180, что соответствует значениям микросекунд от 1000 до 9000. А второй цикл используется для установки позиции оси сервомотора от 180 до 0, что соответствует значениям микросекунд от 9000 до 1000.
1 2 3 4 5 |
while True: for pos in range(1000,9000,50): setServoCycle(pos) for pos in range(9000,1000,-50): setServoCycle(pos) |
Теперь, код у нас код программы полностью готов, откройте в Thonny IDE файл “main.py”. Начните его сохранение при помощи нажатия комбинации кнопок “ctrl+shift+s” на клавиатуре. Перед сохранением файла убедитесь в том, что плата Raspberry Pi Pico подключена к вашему компьютеру. После нажатия клавиш “ctrl+shift+s” у вас откроется диалоговое окно как показано на приведенном ниже рисунке. В этом диалоговом окне выберите Raspberry Pi Pico, введите имя файла “main.py” и сохраните его на плате. Это приведет к тому, что программа в файле “main.py” будет исполняться всегда, когда на плату Raspberry Pi Pico будет подаваться питание.
Когда программа проекта запустится на вашей плате, что ось сервомотора будет последовательно поворачиваться сначала от 0 до 180 градусов, а потом от 180 до 0 градусов. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы на MicroPython
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from time import sleep from machine import Pin from machine import PWM pwm = PWM(Pin(0)) pwm.freq(50) #функция для установки угла поворота оси сервомотора #позиция оси сервомотора вводится в качестве параметра функции def setServoCycle (position): pwm.duty_u16(position) sleep(0.01) while True: for pos in range(1000,9000,50): setServoCycle(pos) for pos in range(9000,1000,-50): setServoCycle(pos) |