ARMマイコンからのPWM出力でLEDを“ボヤっと”光らせる「mbed」で始めるARMマイコン開発入門(8)(3/3 ページ)

» 2015年05月19日 07時00分 公開
[今岡通博MONOist]
前のページへ 1|2|3       

サーボモータの制御

 続いてサーボモータをPWMで制御してみましょう。

 写真(図8)が今回使うサーボモーター「SG-90」です。秋月電子通商やアマゾンなど通販サイトでは400円程度で入手可能です。mbedだけでなく、Arduinoなどを取り上げる電子工作系サイトの作例では、最も盛んに登場するサーボモーターの1つです。

 そして図9は今回利用するサーボモータの仕様です。全体の周期は20msです。周波数に換算すると50Hzとなります。そのうちパルス幅は1mから2msの間と定められていますので、デューティ比で言うと0.005から0.01までの狭い範囲での制御となります。今回のサーボモータの仕様ではパルス幅1.5msのとき回転軸はちょうど真ん中に位置します。パルス幅2msで+90度、パルス幅1.0msで-90度となります。

photo (図8)マイクロサーボ「SG-80」(出展:秋月電子通商)
photo (図9)SG-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が取り出せますので、サーボーモーターの赤い線はそこに接続します。

photo (図10)ブレッドボードへの実装図

 SG-90以外のサーボモーターを接続する場合は定格電圧やリード線の色はそれぞれのサーボモータの仕様を確認してください。以下が実装した写真(図11)です。サーボモータのリード線の末端はメス型のコネクタになっていますので、写真のようにオスーオスのジャンパワイヤーなどを利用して、ブレッドボードと接続します。

photo (図11)

おわりに

 今回はPWMを使って発光ダイオードの明るさの制御と、サーボモータの制御に挑戦してみました。本当はオシロスコープなどの測定器があれば視覚的に周期やパルス幅やデューティ比を確認できるのですが、趣味や学習で使うにはちょっと高価な機器ですので、その代わりに発光ダイオードやサーボモータでその動作を確認することにしましたが、いかがでしたか。今回は紹介できませんでしたが、PWMを用いてオーディオ信号を生成する方法などもあります。

(次の記事を読む)

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.