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

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

Netduinoでロボットコントロール(前編) ― PLEN.Dを直接動かす

2015年12月22日

組み立て式のロボット「PLEN.D」に使われているサーボモーターを、NetduinoのPWM出力で制御してみよう。

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

 今回は、Netduinoを使ってPLEN.Dを制御してみたいと思う。

 PLEN.Dは、PLEN Projectが開発し、DMM.make ROBOTSから2015年5月に発売が開始された、全長25cmの運動神経抜群な組み立て式のロボットだ。その母体となるのは2005年の2005国際ロボット展でプロトタイプが展示されたPLENであるので、約10年の技術的な蓄積がPLEN.Dにも生かされているといえる。

図1 ロボット「PLEN.D」

 PLEN.Dの特徴としては、CPUとしてArduino互換なARM7が搭載されたコントロールボードを持ち、18軸のモーターをスマホでコントロールできる点だろう。今回は、このコントロールボードの代わりをNetduinoで代用してしまおうという目論見(もくろみ)である。

PLEN.Dについて

コントロールボード

 PLEN.Dのコントロールボードは、24個の3ピンが設置された専用設計のボードとなっている。ファームウェアはArduino互換であり、ファームウェア更新はArduino IDEを使って行う。

図2 PLEN.Dのコントロールボード

サーボモーター

 PLEN.Dに使われているサーボモーターは、公式サイトによればデジタルサーボSDR-772となっている。デジタルサーボということは、PWM(パルス信号)により制御可能ということだ。

 SDR-772(図3の下)からのケーブル線は3本あり、一番外側の片側だけ白線が入っている。デジタルサーボの場合、白線は伝統的に信号線であり、また、SG90(図3の上)のコネクター方向(下からオレンジ、赤、ブラウン)と合わせてみても、白線がSG90のオレンジ(=信号線)と一致する。もしそうだとすれば、真ん中がVCC、白ではない側がGNDということになる。

図3 ケーブル線比較(上がSG90、下がSDR-772)

 また、公開されているコントロールボードの基盤レイアウトからも、白線側を接続する内側(図4の右側)が信号線となっている。

図4 コントロールボードの基盤レイアウト(抜粋)

3本のピンが並んでおり、一番右のピンが信号線(=赤色の線)につながっているのが分かる。

NetduinoのPWM出力

 Netduino Plus 2は、デジタル3番5番6番9番10番11番の合計6個のPWM出力が可能だ。

図5 Netduino Plus 2

PLEN.Dとの接続

 NetduinoのPWMでPLEN.Dのサーボモーターが制御できるか、まずは1個で実験してみよう。

 PLEN.Dのコントロールボードから左肩を制御している1番モーターの接続を外し、PWM出力であるデジタル9番ピンと接続する(図6)。

図6 サーボモーターとの接続(白側を黄色で接続)

 実際の配線は次のようになる。

図7 PLEN.Dとの接続

NetduinoのPWM出力プログラミング

 Visual Studio 2015(※Netduino SDKをインストール済みの環境)では、Micro Frameworkのテンプレートがかなりシンプルになっている。

図8 Micro Frameworkのテンプレート

 「Netduino Application (Universal)」テンプレートを選択すれば、Netduinoに必要な参照設定は全て設定された状態でテンプレートが作成される。

 ただし、テンプレートから作成した直後は、「SecretLabs.NETMF.Hardware.NetduinoPlus」ではなく「SecretLabs.NETMF.Hardware.Netduino」が参照設定されているので、気になるようならば参照設定を切り替えるといいだろう。

Visual Basic
Imports SecretLabs.NETMF.Hardware
Imports SecretLabs.NETMF.Hardware.NetduinoPlus

Namespace SDR772MotorVB
  Public Class Program
    Sub Main()
      Dim Servo = New PWM(Pins.GPIO_PIN_D9)

      Do While (True)
        Servo.SetPulse(20000, 1000)
        Thread.Sleep(1000)
        Servo.SetPulse(20000, 1500)
        Thread.Sleep(1000)
        Servo.SetPulse(20000, 2000)
        Thread.Sleep(1000)
      Loop
    End Sub
  End Class

End Namespace
C#
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
using System.Threading;

namespace SDR772MotorCS
{
  public class Program
  {
    public static void Main()
    {
      var Servo = new PWM(Pins.GPIO_PIN_D9);

      while (true)
      {
        Servo.SetPulse(20000, 1000);
        Thread.Sleep(1000);
        Servo.SetPulse(20000, 1500);
        Thread.Sleep(1000);
        Servo.SetPulse(20000, 2000);
        Thread.Sleep(1000);
      }
    }
  }
}
リスト1 Netduinoで左肩サーボモーター動作試験用コード(上:Program.vb、下:Program.cs)

 このコードを実行すると、1秒間隔で、前、中、後と左腕を振る動きをする。

【動画】Netduinoで左肩サーボモーター動作試験

複数のサーボモーターを制御する

 左肩のサーボモーターが制御できたので、右肩のサーボモーターも制御してみよう。2つのサーボモーターに5VとGNDの配線を分配するために、ブレッドボードの電源ラインGNDラインを使用する(図9)。

図9 複数のサーボモーターとの接続

 この例では、左肩のサーボモーター1番はデジタル9番ピン、右肩のサーボモーター10番はデジタル10番ピンと接続している。

Visual Basic
Imports SecretLabs.NETMF.Hardware
Imports SecretLabs.NETMF.Hardware.NetduinoPlus

Namespace SDR772MotorVB
  Public Class Program
    Sub Main()
      Dim LeftShoulderServo = New PWM(Pins.GPIO_PIN_D9)
      Dim RightShoulderServo = New PWM(Pins.GPIO_PIN_D10)

      Do While (True)
        LeftShoulderServo.SetPulse(20000, 1000)
        RightShoulderServo.SetPulse(20000, 1000)
        Thread.Sleep(1000)
        LeftShoulderServo.SetPulse(20000, 1500)
        RightShoulderServo.SetPulse(20000, 1500)
        Thread.Sleep(1000)
        LeftShoulderServo.SetPulse(20000, 2000)
        RightShoulderServo.SetPulse(20000, 2000)
        Thread.Sleep(1000)
      Loop
    End Sub
  End Class

End Namespace
C#
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
using System.Threading;

namespace SDR772MotorCS
{
  public class Program
  {
    public static void Main()
    {
      var LeftShoulderServo = new PWM(Pins.GPIO_PIN_D9);
      var RightShoulderServo = new PWM(Pins.GPIO_PIN_D10);

      while (true)
      {
        LeftShoulderServo.SetPulse(20000, 1000);
        RightShoulderServo.SetPulse(20000, 1000);
        Thread.Sleep(1000);
        LeftShoulderServo.SetPulse(20000, 1500);
        RightShoulderServo.SetPulse(20000, 1500);
        Thread.Sleep(1000);
        LeftShoulderServo.SetPulse(20000, 2000);
        RightShoulderServo.SetPulse(20000, 2000);
        Thread.Sleep(1000);
      }
    }
  }
}
リスト2 複数のサーボモーター制御用コード(上:Program.vb、下:Program.cs)

 このコードを実行すると、1秒間隔で、前、中、後と左腕を振り、それに合わせて右腕も後、中、前と動く。同じ指定値なのに前後逆になるのはサーボモーターの取り付け方向が逆だからだ。

【動画】複数のサーボモーター制御

まとめ

 次回はいよいよI2C接続で16個のPWM出力ができるAdafruit I2C接続16チャンネル12ビットPWM/サーボシールドを使ってPLEN.Dの複数のサーボモーター制御に挑戦する。

※以下では、本稿の前後を合わせて5回分(第12回~第16回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

.NET対応組み込みデバイス「Netduino」入門(14)
12. Bluetoothで遠隔操作しよう

BluetoothでPCと連携し、電源もバッテリー給電とすることで、移動体などへの搭載も可能なコードレス仕様のDCモーター制御を実現してみよう。

.NET対応組み込みデバイス「Netduino」入門(14)
13. littleBitsではんだ付けなしの電子工作を実現

磁石で電子回路をつないで電子工作が行えるlittleBits。Netduinoと組み合わせると、どのような電子工作が実現できるのか? その可能性を探る。

.NET対応組み込みデバイス「Netduino」入門(14)
14. MESHとNetduinoでiOSデバイスとの連携を実現

SONYのスマートDIYキット「MESH」とは? さまざまな連携が実現可能なMESHを使って、NetduinoとiPadを連携をさせてみよう。

.NET対応組み込みデバイス「Netduino」入門(14)
15. 【現在、表示中】≫ Netduinoでロボットコントロール(前編) ― PLEN.Dを直接動かす

組み立て式のロボット「PLEN.D」に使われているサーボモーターを、NetduinoのPWM出力で制御してみよう。

.NET対応組み込みデバイス「Netduino」入門(14)
16. Netduinoでロボットコントロール(後編) ― 16個のサーボモーターを一度に制御する

連載最終回。前回に引き続き、Netduinoを使ってPLEN.Dを制御してみる。今回は16個のサーボモーターを制御できるボードを使って複雑なロボットの動きを実現する。

サイトからのお知らせ

Twitterでつぶやこう!