続いてサーボモータをPWMで制御してみましょう。
写真(図8)が今回使うサーボモーター「SG-90」です。秋月電子通商やアマゾンなど通販サイトでは400円程度で入手可能です。mbedだけでなく、Arduinoなどを取り上げる電子工作系サイトの作例では、最も盛んに登場するサーボモーターの1つです。
そして図9は今回利用するサーボモータの仕様です。全体の周期は20msです。周波数に換算すると50Hzとなります。そのうちパルス幅は1mから2msの間と定められていますので、デューティ比で言うと0.005から0.01までの狭い範囲での制御となります。今回のサーボモータの仕様ではパルス幅1.5msのとき回転軸はちょうど真ん中に位置します。パルス幅2msで+90度、パルス幅1.0msで-90度となります。
それではプログラムを見ていきましょう。2行目でPWM制御に使うピンを指定します。前回のLEDを接続したときはPWMの出力ピンとしてdp1を用いましたが、今回はdp18を使います。
4行目で周期を0.02と設定しています。単位が秒ですので20msということになります。5行目から10行目まで永久ループを構成しています。6行目forループの中でoffset変数の値を徐々に変化させています。これはパルス幅に使いますのでミリ秒で表現すると、1ミリ秒から2ミリ秒まで0.1ミリ秒単位で増加させています。この値を0.25秒ごとにパルス幅の値として設定しています(7行)。
このプログラムは0.25秒ごとに回転軸が-90度から90度までを10刻みで移動し、また元へ戻って同じ動作を繰り返すことになります。
1:#include "mbed.h" 2:PwmOut servo(dp18); 3:int main() { 4: servo.period(0.020); 5: while (1) { 6: for(float offset=0.001; offset<0.002; offset+=0.0001) { 7: servo.pulsewidth(offset); 8: wait(0.25); 9: } 10: } 11:}
図10がブレッドボードに実装した図です。大部分は先ほどのLED fadeの実装と同じです。PWMの出力ピンがdp1からdp18に変更になっています。ブレッドボード上ではdp18は(16 f)となっています。そこにサーボモータのオレンジの線をつなぎます。黒い線はグランドですから、電源ラインのGNDに接続します。このサーボモータは5Vで動作しますので、書き込み器から供給されている+5Vを用います。ブレッドボードでは(28 G)から+5Vが取り出せますので、サーボーモーターの赤い線はそこに接続します。
SG-90以外のサーボモーターを接続する場合は定格電圧やリード線の色はそれぞれのサーボモータの仕様を確認してください。以下が実装した写真(図11)です。サーボモータのリード線の末端はメス型のコネクタになっていますので、写真のようにオスーオスのジャンパワイヤーなどを利用して、ブレッドボードと接続します。
今回はPWMを使って発光ダイオードの明るさの制御と、サーボモータの制御に挑戦してみました。本当はオシロスコープなどの測定器があれば視覚的に周期やパルス幅やデューティ比を確認できるのですが、趣味や学習で使うにはちょっと高価な機器ですので、その代わりに発光ダイオードやサーボモータでその動作を確認することにしましたが、いかがでしたか。今回は紹介できませんでしたが、PWMを用いてオーディオ信号を生成する方法などもあります。
Copyright © ITmedia, Inc. All Rights Reserved.