Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
.NET対応組み込みデバイス「Netduino」入門(9)

.NET対応組み込みデバイス「Netduino」入門(9)

サーボモーターをコントロールしよう

2015年8月21日

Netduinoはセンサー入力系だけでなく豊富な出力系も活用できる。今回は、ラジコン経験者にはなじみがあるサーボモーターをNetduinoから制御してみよう。

Microsoft MVP for Windows Platform Development 初音 玲
  • このエントリーをはてなブックマークに追加

 前回までの数回はセンサー値取得とクラウドという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(-)
表1 SG90スペック

「μ秒」はマイクロ秒のことで、ミリ秒(m秒)の1000分の1、つまり「1μ秒」=0.000001秒を表す。

SG90の制御方法

 SG90はパルス信号のプラス電圧がかかっている時間で制御する。

図1 制御用パルス信号

 例えば、2万μ秒=20m秒周期の中で、プラス電圧のかかっている時間が、500μ秒前後ならば最右端1500μ秒前後なら真ん中2400μ秒前後ならば最左端になる(図2)。

サーボモーターの動き
図2 サーボモーターの動き

 なお、最端付近の指定値は個体差により多少前後する。それを考えると0~180度ではなく5~175度くらいを可動範囲の目安とし、あとはサーボモーターから伸ばすロットリンケージロットと呼ぶ。図3)の長さを微調整できるようにして、操作位置対応するとよいだろう。

リンケージロット
図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)。

図4 参照設定の追加

参照設定の追加は、ソリューションエクスプローラーでプロジェクト名を右クリックして、そこで表示されるコンテキストメニューから[追加]-[参照]を選択する。これにより、このダイアログが表示される。

 これでPWM出力のためのコードは、

  SetPulse(パルス周期[μ秒], パルス幅[μ秒])

という形で指定できるようになる。

NetduinoでのSG90制御

 PWM出力を使ってパルス幅に500μ秒や2400μ秒を指定して動作させてみると、サーボモーター本体と白いアーム(サーボホーンと呼ぶ)の相対角度が0度や180度からずれてしまう。個体差や製造ロットによる多少の違いはあるので、リンケージロットで吸収するかパルス幅を微調整して気にならない範囲に収めてみるといいだろう。

 なお、今回購入したものでは、550~2450μ秒の範囲で指定すると程よい状態になってくれたので、本稿のサンプルコードではその値を採用している。

配線について

 図5を参考に配線してほしい。サーボモーターの制御信号(オレンジ)を9番ピン、VCC(赤)を5V、GND(ブラウン)をGNDに接続する。

図5 直結配線例

 実際に接続すると、図6の写真のようになる。

図6 実際の接続例

ノイズを考慮した配線

 サーボ機構が入っているとはいえ、サーボモーターもモーターなのでノイズ源になる可能性がある。その点を考慮するならばVCCとGNDの間に0.1μFのセラミックコンデンサーを入れておくといいだろう(図7)。

図7 ノイズを考慮した配線

SG90制御用ソースコード

 プロジェクトの作成方法は、これまでと同様なので割愛する(第3回などを参考にされたい。本稿の例では、プロジェクト名はVB.NET用は「SG90MotorVB」、C#用は「SG90MotorCS」とした)。上記の参照設定の削除と追加を忘れないように行ってほしい。

Visual Basic
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
C#
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);
      }
    }

  }
}
リスト1 SG90制御コード(上:Module.vb、下:Program.cs)より抜粋

アプリ実行

 アプリを実行すると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]を参照してください。

.NET対応組み込みデバイス「Netduino」入門(9)
7. Netduinoの計測結果をクラウド集計

Netduinoで計測した室温データをクラウドに送信してWebから見えるようにしてみよう。

.NET対応組み込みデバイス「Netduino」入門(9)
8. GR-PEACHボードとAzure Event Hubでクラウド集計

ついに発売開始されたGR-PEACHを利用。Microsoft Azure Event Hubを使って室温データをクラウドに送信してWebから見えるようにしてみよう。

.NET対応組み込みデバイス「Netduino」入門(9)
9. 【現在、表示中】≫ サーボモーターをコントロールしよう

Netduinoはセンサー入力系だけでなく豊富な出力系も活用できる。今回は、ラジコン経験者にはなじみがあるサーボモーターをNetduinoから制御してみよう。

.NET対応組み込みデバイス「Netduino」入門(9)
10. Windows 10+Visual Studio 2015でNetduinoアプリを動かすには?

本シリーズのNetduinoサンプルをWindows 10+Visual Studio 2015で動かす方法と注意点を番外編のコラムとしてまとめた。

.NET対応組み込みデバイス「Netduino」入門(9)
11. NetduinoでDCモーターをコントロールしよう

ミニ四駆やプラレールに使われるなど、電池やバッテリーを動力源にできる「DCモーター」を、Netduinoから制御する方法を解説する。

サイトからのお知らせ

Twitterでつぶやこう!