こんにちは! けい(Twitter)です。
今回は、ラズパイピコを使って、サーボモーター(sg90)をPWM信号で制御する方法についてまとめていきたいと思います。
また、プログラムはMicroPythonで行いますので、MicroPythonの環境構築がまだでしたら、以前の記事を参考にしてみてください。
目次
必要な物
Raspberry Pi Pico
サーボモーター
TOWER PROのsg90を使用します。
sg90は小型で低価格な、良く用いられているサーボモーターです。
回路図
赤色の線はpin40のVBUSに、黒色の線はGNDに、黄色の線はpin1のGP0に繋いでいます。
sg90の動作電圧が5Vなので、VBUS(5V)に繋ぐ必要があります。
プログラム
こちらはサーボモーターを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信号が生成できます。
なので、ラズパイピコとサーボモーターを組み合わせた作品をぜひ作ってみて下さい。