【Raspberry Pi Pico】サーボモーターをPWMで動かす【MicroPython】

【Raspberry Pi Pico】pwmでサーボモーターを動かす

こんにちは! けい(Twitter)です。

今回は、ラズパイピコを使って、サーボモーター(sg90)をPWM信号で制御する方法についてまとめていきたいと思います。

また、プログラムはMicroPythonで行いますので、MicroPythonの環境構築がまだでしたら、以前の記事を参考にしてみてください。

必要な物

Raspberry Pi Pico

サーボモーター

TOWER PROのsg90を使用します。

sg90は小型で低価格な、良く用いられているサーボモーターです。

created by Rinker
TOWER PRO
¥550 (2024/04/26 00:04:12時点 Amazon調べ-詳細)

回路図

赤色の線はpin40のVBUSに、黒色の線はGNDに、黄色の線はpin1のGP0に繋いでいます。

sg90の動作電圧が5Vなので、VBUS(5V)に繋ぐ必要があります。

出典 : Raspberry Pi 公式

プログラム

こちらはサーボモーターを0°~90°の範囲で1秒おきに動かすプログラムです。

from machine import PWM, Pin
import time

servo1 = PWM(Pin(0))
servo1.freq(50)

max_duty = 65025
dig_0 = 0.0725    #0°
dig_90 = 0.12     #90°

while True:
    servo1.duty_u16(int(max_duty*dig_0))
    time.sleep(1)
    servo1.duty_u16(int(max_duty*dig_90))
    time.sleep(1)

プログラム解説

PWM信号をどのように送るかを決めるために、sg90のデータシートを見る必要があります。

  • 電源は5V
  • 周波数は50Hz
  • 0.5~2.4msで変更することで角度を変化させることが可能

1,2行目

machineライブラリからPWMとPinクラスをインポートします。

PWMは、その名の通りPWMを生成するのに必要なクラスです。
また、PinはGPIOの割り当てに必要なクラスです。

4行目

PWMに引数としてPin(番号)を渡すことで、PWMクラスのインスタンスをservo1という変数に生成しています。

5行目

PWMクラスのfreq関数を用いて、PWMの周波数を決定しています。

先ほどデータシートでサーボモータの周波数が50Hzだったので、50を引数にします。

7~9行目

PWMは、デューティー比を決める必要があります。
ラズパイピコは16ビット、つまり65,536がデューティー比100%に対応しています。

サーボモータの0°のデューティー比が7.25%、90°のデューティー比が12%に対応しています。

11行目~

duty_u16という関数でデューティー比を変化させることができます。

デューティー比100%が65,536なのでそれにdig_0またはdig_90をかけることで、必要なデューティー比に変換しています。

プログラムを実行(動画)

こちらの動画が、上のプログラムを動作させている様子です。

まとめ

今回は、ラズパイピコでサーボモーターを動かしてみました。

ラズパイピコはラズパイよりも、リアルタイム性に優れているため、より正確なPWM信号が生成できます。

なので、ラズパイピコとサーボモーターを組み合わせた作品をぜひ作ってみて下さい。