【M5stickV】PWMでサーボモータを動かす

M5stickV PWM

こんにちは、けいです。

今回は,M5stickVでPWM信号を出力して,サーボモータを制御する方法について解説していきます.
まだ今までの記事を読んでいない方は,ぜひ読んでみてください.

ハード構成

使ったもの

スイッチサイエンスでM5stickVを買うのがたぶん一番安いと思うが、よく売り切れているのでアマゾンから買う手もある。

Groveコネクタ

M5stickVの唯一のピンである、Groveコネクタを使う。
M5stickVにある下部のピンのことだ。

ピンはGroveの独自規格なので、専用のコネクタケーブルを使う。

Groveはこのようなピン配置となっている。



ケーブルをつけるとこのようになる。

Groveピンで使うのは、groundと35番の二つのピンだけである。

M5stickVからサーボに電源供給するのは少し怖いので、外部電源を用いた。

35番のピンがPWM信号を出力する。
もちろん、34番のピンでも同様に行うことが可能だ。

回路図

回路はいたってシンプル。
サーボモータは家にあったsg90を使ったので、電池を3本つないだ。

コード解説

コード

Machineモジュール

from machine import Timer,PWM

PWMを使うのにあたって、MachineモジュールからTimerクラスとPWMクラスをインポートする。

tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
ch = PWM(tim, freq=50, duty=2.5, pin=35)

TimerクラスとPWMクラスのインスタンスを生成。
Timerクラスによってハードウェアタイマーを生成し、PWMクラスでTimerオブジェクトを引数として与えて、周波数やデューティー比、ピン番号を割り当てる。

sg90のデータシートより、周波数は50Hzと設定した。

arg = {-90:2.5, 0:7.25, 90:12}	# arg:duty

PWMのデューティー比で角度を制御するが、コードを書くときいちいち確認するのが面倒くさいので、辞書を使った。
サーボの可動域が-90° ~+90° なので、今回は3つの角度を設定した。

ch.duty(arg[0])

chはPWMクラスのインスタンスで、PWM.duty関数を使うことで、PWMのデューティー比を変化させる。
arg[0] = 7.25 で、デューティー比を7.25にする関数である。

動作

今回は、PWM制御の使い方の解説なので、込み入った関数を使わずに順番に角度を変えていくコードを書いた。
実際の挙動はこのようになる。

参考にさせて頂いたサイト

パスコンパスさん

パスコンパスさんが、サーボモータを使ってM5stickVを動かしているのを知って、初めてPWM制御が使えることを知った。

Sipeed公式ドキュメント

スイッチサイエンス

最後まで読んでくださりありがとうございました。
他にも色々な事を紹介していますので、読んでくれたら嬉しいです。