今回はMakeCodeで270°サーボモータを動かしてみようで作成したコードをPWMで書き直してみます。
先にPWMについて触れておきます。
PWMとはパルス幅変調(pulse width modulation)のことで、マイコンからの信号を調節します。
前回のサーボモータでは、信号電流は 0 か 1 のどちらかであるはずなのに、モータに対して様々な角度の信号を送信することができていました。
この様々な信号の送信の際にPWMは用いられています。
PWMを見るために、最初にデジタル信号についてを整理しておきます。
デジタル信号では一定の周期において、マイコンから電気を流すとHIGHになり、電気を流さないとLOWとなります。
デジタル信号では周期毎にHIGHのLOWのどちらかの状態を取るが、PWMではこの周期を更に細かく制御していきます。
PWMでは周期Tにおいて、パルス幅τ(タウと読む)分だけ信号を送ることで信号をアナログ信号のように振る舞うことができるようになります。
周期TはHz(ヘルツ)で表し、1秒間に何周期あるかを示します。
50Hzでは1秒間に50周期あることになりますので、50Hzでの周期Tは0.02秒(20ms)になります。
パルス幅τは1msのような数値で指定します。
次に大事になるのがデューティ比Dになります。
デューティ比はD = τ / Tで導くので、周期Tが50Hz(20ms)っでパルス幅τが1msの場合は、D = 1 / 20 = 0.05(5%)となります。
マイクロビットを含むマイコンでは上記の考え方が大事になります。
早速、PWMで動かしてみましょう。
マイクロビットのPWMでサーボモータを動かす時はデューティ比からアナログ値を計算してモータに信号を送信することになっています。
デューティ比毎にモータがどれ程回転するのか?はモータの方で決まっていて、モータを含んだモジュール毎にデータシートがあり記載されています。
とりあえず、今回はデータシートには触れずに仕様のみを挙げておきます。
周波数 50Hzにおいて、サーボモータに送る信号の
・最小のデューティ比が2.5%
・中間のデューティ比が7.25%
・最大のデューティ比が12%
になり、モータの回転角は
・デューティ比 2.5%では回転角は-45°
・デューティ比 7.25%では回転角は90°
・デューティ比 12%では回転角は225°
になります。
この値をマイクロビット(MakeCode)の方で用意されているアナログで出力するブロックに対応していきます。
アナログで出力するブロックでは0 〜 1023の値を指定する為、デューティ比をMakeCodeの仕様に合わせます。
最小のデューティ比 2.5%の場合、アナログ値は1023 * 0.025 ≒ 26になります。
MakeCodeで270°サーボモータを動かしてみようの内容では回転角が 0°の挙動がおかしかったので、今回は回転角 0°も追加した形で、
上記の動画のような挙動になるようにコードを作成します。
※回転角 0°が少しずれていますが、微調整に挑戦してみてください。
最初だけのブロックでパルス周期Tを20マイクロ秒(ms)で設定します。
あとは上で触れたデューティ比に対応したアナログ値を指定します。
マイクロビットにフラッシングして、動作を確認してみましょう。