.NET対応組み込みデバイス「Netduino」入門(9)
サーボモーターをコントロールしよう
Netduinoはセンサー入力系だけでなく豊富な出力系も活用できる。今回は、ラジコン経験者にはなじみがあるサーボモーターをNetduinoから制御してみよう。
前回までの数回はセンサー値取得とクラウドというIoT的な内容を紹介してきた。今回はIoT的な方向から離れて、ホビーユースなどでも応用範囲の広いサーボモーター制御について紹介したい。
Netduinoの使い道はセンサー入力系だけではない。デジタル出力、PWM出力、I2C出力など豊富な出力系を活用した利用方法もある。今回説明するサーボモーターの使い方が分かれば、Netduinoを組み込んでラジコンの自動制御なども可能になる。
サーボモーターについて
サーボモーターは指定された位置に回転軸を設定できるサーボ機構が組み込まれたモーターだ。通常のモーターのように回転し続けるのではなく、多くの製品は180度の稼働範囲内の任意の角度で停止する。
今回利用するサーボモーターは価格も安く入手しやすいSG90を使う。
まずはSG90のデータシートを確認してみる。
SG90の特徴
項目 | スペック | |
---|---|---|
動作角度 | 180度 | |
トルク | 1.8kg/cm(4.8v時) | 軸から1cmの位置で1.8kgのものが動かせる |
動作スピード | 0.1秒/60度(4.8v時) | |
動作電圧 | 4.8~5V | |
デッドバンド幅 | 10μ秒 | 制御信号入力後の無応答時間 |
パルス周期 | 10,000~20,000μ秒 | |
動作パルス幅 | 500~2400μ秒 | データシートには1000~2000μ秒とあるが 主要メーカーのサーボと同様に500μ秒前後~2500μ秒前後が 動作パルス幅となっていた |
信号線 | オレンジ 赤 ブラウン |
制御信号 VCC(+) GND(-) |
「μ秒」はマイクロ秒のことで、ミリ秒(m秒)の1000分の1、つまり「1μ秒」=0.000001秒を表す。
SG90の制御方法
SG90はパルス信号のプラス電圧がかかっている時間で制御する。
例えば、2万μ秒=20m秒周期の中で、プラス電圧のかかっている時間が、500μ秒前後
ならば最右端、1500μ秒前後
なら真ん中、2400μ秒前後
ならば最左端になる(図2)。
なお、最端付近の指定値は個体差により多少前後する。それを考えると0~180度ではなく5~175度くらいを可動範囲の目安とし、あとはサーボモーターから伸ばすロット(リンケージロットと呼ぶ。図3)の長さを微調整できるようにして、操作位置対応するとよいだろう。
Netduinoでのパルス出力
Netduinoのデジタル出力ピンであれば、プラス電圧のOn/Off制御が可能だ。そこで、Onにして1500μ秒待ってからOffにして1万8500μ秒待つというのを繰り返せば、サーボモーターの位置を真ん中に制御できる。
.NET Micro Frameworkでの処理待ち合わせは、Thread.Sleep
メソッドを使う。しかしここで問題が生じる。Thread.Sleep
の指定はm秒であり1m秒以下の待ち合わせ調整はできない。
このような細かなパルス制御を行うには、アナログ出力と表現されることもあるPWM(Pulse Width Modulation)出力を使う。PWM出力は、Netduino Plus 2のデジタル入出力ピンの3番
ピン、5番
ピン、6番
ピン、9番
ピン、10番
ピン、11番ピン
が対応している
2つのPWM用ライブラリ
NetduinoにはPWM出力用のライブラリが2つある。1つは「Microsoft.SPOT.Hardware.PWM」ライブラリで、もう1つはNetduinoに特化した「SecretLabs.NETMF.Hardware.PWM」ライブラリだ。
今回はコードの書きやすい「SecretLabs.NETMF.Hardware.PWM」ライブラリを使ってプログラムを作成する。(※作成方法は後述)そのためには、[Netduino Plus 2 Application]テンプレート(Visual Studio 2013の場合。Visual Studio 2015では[Netduino Application (Univertsal)]テンプレート)を使ってプロジェクト新規作成したときに自動的に追加された「Microsoft.SPOT.Hardware.PWM」ライブラリの参照を削除し、「SecretLabs.NETMF.Hardware.PWM」ライブラリの参照を追加する(図4)。
参照設定の追加は、ソリューションエクスプローラーでプロジェクト名を右クリックして、そこで表示されるコンテキストメニューから[追加]-[参照]を選択する。これにより、このダイアログが表示される。
これでPWM出力のためのコードは、
SetPulse(パルス周期[μ秒], パルス幅[μ秒])
という形で指定できるようになる。
NetduinoでのSG90制御
PWM出力を使ってパルス幅に500μ秒や2400μ秒を指定して動作させてみると、サーボモーター本体と白いアーム(サーボホーンと呼ぶ)の相対角度が0度や180度からずれてしまう。個体差や製造ロットによる多少の違いはあるので、リンケージロットで吸収するかパルス幅を微調整して気にならない範囲に収めてみるといいだろう。
なお、今回購入したものでは、550~2450μ秒の範囲で指定すると程よい状態になってくれたので、本稿のサンプルコードではその値を採用している。
配線について
図5を参考に配線してほしい。サーボモーターの制御信号(オレンジ)を9番
ピン、VCC(赤)を5V
、GND(ブラウン)をGND
に接続する。
実際に接続すると、図6の写真のようになる。
ノイズを考慮した配線
サーボ機構が入っているとはいえ、サーボモーターもモーターなのでノイズ源になる可能性がある。その点を考慮するならばVCCとGNDの間に0.1μFのセラミックコンデンサーを入れておくといいだろう(図7)。
SG90制御用ソースコード
プロジェクトの作成方法は、これまでと同様なので割愛する(第3回などを参考にされたい。本稿の例では、プロジェクト名はVB.NET用は「SG90MotorVB」、C#用は「SG90MotorCS」とした)。上記の参照設定の削除と追加を忘れないように行ってほしい。
Imports SecretLabs.NETMF.Hardware
Imports SecretLabs.NETMF.Hardware.Netduino
Module Module1
Sub Main()
Dim Servo = New PWM(Pins.GPIO_PIN_D9)
Do While (True)
Servo.SetPulse(20000, 550)
Thread.Sleep(1000)
Servo.SetPulse(20000, 1500)
Thread.Sleep(1000)
Servo.SetPulse(20000, 2450)
Thread.Sleep(1000)
Loop
End Sub
End Module
|
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System.Threading;
namespace SG90MotorCS
{
public class Program
{
public static void Main()
{
var Servo = new PWM(Pins.GPIO_PIN_D9);
while (true)
{
Servo.SetPulse(20000, 550);
Thread.Sleep(1000);
Servo.SetPulse(20000, 1500);
Thread.Sleep(1000);
Servo.SetPulse(20000, 2450);
Thread.Sleep(1000);
}
}
}
}
|
アプリ実行
アプリを実行すると0度、90度、180度と1秒間隔で位置を変更する。
【動画】SG90モーター制御
応用例
サーボモーターは、サーボホーンの先にリンケージロットを取り付けて他の物を操作して、初めて真価を発揮する。例えば、リンケージロットにより手動操作の部分を自動化するときに使うと効果的だ。
【動画】ストップレールコントロール
まとめ
サーボモーターを1つだけ動かすのであれば、今回のようにNetduinoにサーボモーターを直結して使っても問題が起こることは少ない。しかし、もっと多数のサーボモーターを制御するのであれば、Netduinoの5V
から供給するのではなく、サーボモーター用の電源を別途用意して5V供給するのがよいだろう。このあたりは回を改めて、Adafruit I2C接続16チャンネル12ビットPWM/サーボ シールドを使った複数サーボモーターの制御を実際にご紹介したいと考えている。
次回は、同じモーターでもミニ四駆やプラレールの駆動にも使われているDCモーター(FA130)の制御について取り上げたい。また、モータードライバー TA7291Pやモータードライバー MP4207と電池ボックスも必要になるので、実際に試したい人は事前に購入しておいてほしい(※2015/09/04追記)。
※以下では、本稿の前後を合わせて5回分(第7回~第11回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
8. GR-PEACHボードとAzure Event Hubでクラウド集計
ついに発売開始されたGR-PEACHを利用。Microsoft Azure Event Hubを使って室温データをクラウドに送信してWebから見えるようにしてみよう。
9. 【現在、表示中】≫ サーボモーターをコントロールしよう
Netduinoはセンサー入力系だけでなく豊富な出力系も活用できる。今回は、ラジコン経験者にはなじみがあるサーボモーターをNetduinoから制御してみよう。
10. Windows 10+Visual Studio 2015でNetduinoアプリを動かすには?
本シリーズのNetduinoサンプルをWindows 10+Visual Studio 2015で動かす方法と注意点を番外編のコラムとしてまとめた。