.NET対応組み込みデバイス「Netduino」入門(13)
MESHとNetduinoでiOSデバイスとの連携を実現
SONYのスマートDIYキット「MESH」とは? さまざまな連携が実現可能なMESHを使って、NetduinoとiPadを連携をさせてみよう。
今回は、SONYのスマートDIYキットMESHを使って、NetduinoとiPadを連携させてみたいと思う。
MESHは、2015年1月にクラウドファンディングの「Indiegogo」で資金調達して開発されたドミノ牌に似た「タグ」と呼ばれるブロックを、iPadアプリを使ってBLE(Bluetooth Low Energy)で連携させて動作させることができる新しいタイプのDIYキットだ。MESHの特徴は、タグ間の連携だけではなく、iPad/iPhone上の音声ファイルの再生やカメラでの写真撮影、さらにIFTTTのレシピでWebサービスとも連携できる点だ。
MESHタグについて
MESHは、MESHタグ(図1)とMESHアプリ(旧名称:MESH Canvasアプリ)から構成されている。
MESHタグは、入力用のセンサータグと出力用のアクチュエータータグがある(表1)。
タグ | 用途 |
---|---|
Buttonタグ | ボタン(センサー) |
LEDタグ | フルカラーLED(アクチュエーター) |
Moveタグ | 加速度センサー |
GPIOタグ | デジタルおよびアナログの入出力スイッチ(アクチュエーター) |
Motionタグ | 人感センサー |
Brightnessタグ | 照度センサー |
Temperature & Humidityタグ | 温湿度センサー |
最初の4つは初期発売のタグで、MESH Bundle 4としてセット販売も行われているMESHの基本的なタグになる。
MESH Button タグ
MESH Buttonタグは、ボタンが押されたとき(Pressed)、長押しされたとき(Hold)、ダブルクリックされたときに(Double)、ONの信号が送信されるセンサータグだ。どの操作のときにONになるかは、MESHアプリのCanvas上で設定できる。
MESH LED タグ
MESH LEDタグは、ON信号によりLEDを光らせるアクチュエータータグだ。光らせ方としては、点灯(Light Up)、蛍のような明滅(Firefly)、点滅(Blink)、消灯(Off)がある。
MESH LEDタグのLEDはフルカラーLEDなので、[Color]で13色から光るときの色を選択でき、明るさ(Brightness)、点灯時間(Duration (sec))も設定できる。また、[Firefly]や[Blink]のときは明滅間隔(Cycle)も指定できる。
MESH Move タグ
MESH Moveタグは、加速度センサーが内蔵されていて振ったとき(Shake)、裏返したとき(Flip)、叩いたとき(Tap)、面を変えたときに(Orientation)、ONの信号が送信されるセンサータグだ。どの操作のときにONになるかは、MESHアプリのCanvas上で設定できる(図4)。
操作だけではなく、どれくらいの強さで操作したらON信号を出力するかも[Sensitivity]で指定できる。何度も操作してベストな値を導き出せるかが、MESH Moveタグをうまく使えるかのキーポイントになる。
MESH GPIO タグ
MESH GPIOタグは他のMESHタグと異なり、単体では何もできないMESHタグだ。その代り、3.3V出力(VOut Supply)、デジタル入力(Digital In)、デジタル出力(Digital Out)、アナログ入力(Analog In)、PWM出力(PWM Out)が可能なので(図5)、電子工作との入出力とMESHワールドを橋渡しする万能MESHタグとも言える。本稿のサンプルでも Netduinoとの接続には、このMESH GPIOタグを使用する。
MESH GPIOタグには、次の10ピンが備わっている(図6)。
- 3.3V出力(VOut Supply)×1
- デジタル入力(Digital In)×3
- デジタル出力(Digital Out)×3
- アナログ入力(Analog In)×1
- PWM出力(PWM Out)×1
- GND×1
MESH Motion タグ
MESH Motionタグは、タグの検知エリアで人や動物を検知したとき(Detected)、検知しなかったとき(Undetected)、その両方で(Check Motion)、ONの信号が送信されるセンサータグだ。どの操作のときにONになるかは、MESHアプリのCanvas上で設定できる(図7)。
人や動物の検知は、センサーの前を周囲よりも温度差のある物体が横切ることで行われる。距離は計測していないので、近づいたり遠ざかったりするだけでは検知できない。
MESH Brightness タグ
MESH Brightnessタグは、タグの周囲の明るさが変化したとき(Changed)、物が近づいたとき(Get Near)、近くから物が離れたとき(Get NotNear)、指定した明るさだったとき(Check Brightness)、近くに物があるとき(Check Near)、近くに物がないときに(Check NotNear)、ONの信号が送信されるセンサータグだ。どの操作のときにONになるかは、MESHアプリのCanvas上で設定できる(図8)。
なお、近くに物があるかどうかの判定には、赤外線センサーが使用されている。
MESH Temperature & Humidity タグ
MESH Temperature & Humidityタグは、指定した範囲内の温度になったとき(Temp Changed)、指定した範囲内の湿度になったとき(Humid Changed)、指定した範囲の温度だったとき(Check Temp)、指定した範囲の湿度だったときに(Check Humid)、ONの信号が送信されるセンサータグだ。どの操作のときにONになるかは、MESHアプリのCanvas上で設定できる(図9)。
MESHアプリについて
MESHアプリ(無料)は、Canvas画面(図10)上でMESHタグなどを配置して、そのタグ同士をつなぎ合わせるためのアプリだ。なお、配置・接続したCanvas内容はレシピ(Recipe)と呼ばれる。
Canvas画面を使用するうえでの基礎知識を説明しておこう。
Canvas上に配置するMESHタグは、いったんペアリング(Bluetooth)する必要がある。ペアリングが成功すると、タグリスト(=iPadの場合は画面右上)にそのMESHタグが表示される。
Canvas上でのMESHタグは、センサータグなら右側に半円マークがあって、その部分をドラッグ&ドロップで伸ばしてアクチュエータータグの左側にカチッとはめることができる(図11)。このように接続しておくと、センサータグが設定した操作と条件を満たすときに、接続先のアクチュエータータグへONの信号が出てそのタグが動作する。
また、単純に1本の線でつなぐだけではなく、例えば、1つのセンサータグから2つのアクチュエータータグに接続を分岐して並列動作させたり、2つのセンサータグが同時に条件を満たしたときにONにしたいときは2つのセンサータグから1つのアクチュエータータグにつなげたりと、直感的な関係性を描くことができる(図11)。
Canvas画面で配置できるのはMESHタグだけではない。図11にあるようにiPad*1のマイク/カメラなどをセンサータグ/アクチュエータータグとして配置することもできる。こうすることで、iPadのマイクやカメラと連携が可能になる。
- *1 MESH Canvasアプリが初めて登場した当時は、iOS 8.0以降を搭載したiPad(第3世代)以降またはiPad mini以降が必要であったため、少しだけ敷居が高かった。しかしつい最近の2015年10月22日に公開されたMESHアプリのバージョン1.3.0で、iPhoneやiPod Touchにも対応し、その動作環境の敷居は一気に下がりつつある。
Canvas上のMESHタグは、物理的なタグと1対1には対応していない。そこで複数の動作(以下、タスク)を割り当てたいときは、画面右上から同じMESHタグを何個もドラッグ&ドロップでCanvas上に配置して、それぞれに別の動作を割り当てることも可能だ。例えば、閾値(いきち)を別にしたiPadマイクタグを2つ置いて、小さい音のときと大きな音のときで別々のアクチュエータータグにつないでおけば、音の大小により動作を変えることも可能である。
【動画】音量によりMESH LEDタグの色を変える例
GPIO 3.3V出力(VOut Supply)について
GPIOタグの3.3V出力は、3.3V 100mAの電力供給が可能だ。試しに、Moveタグを振ると3.3Vが供給され、Buttonタグを押すと供給が止まるようにし、テスターにつないでその動作を確認してみよう。
まずは、1枚の新規レシピのCanvas上にGPIOタグを2つ配置して、ONのタスクとOFFのタスクを設定する。電力供給を使うには、GPIOタグの[VOut Supply]を設定する必要があるが、これには図5が参考になるだろう。タグ項目の下の部分をタップすると、図12のようにそのタグの詳細な設定内容を確認・変更できる。
次にMoveタグはONのタスクに、ButtonタグはOFFのタスクにつなぐ(図13)。
レシピが完成したら、GPIOタグの1番
ピンと5番
ピンにコネクター付きコードを差し込み、それぞれテストのプラスとGNDに接続する(図14)。
これでMoveタグをシェイクすると3.3V、Buttonタグをプッシュすると0Vに下がるのが確認できる。
【動画】GPIOタグ VOut Supplyサンプル
GPIOデジタル入力(Digital In)について
GPIOタグの2番
ピン~4番
ピンがデジタル入力ピンだ(図15)。データシートによれば、デジタル入力は、GPIOに入力する電圧がHigh(2.1~3.0V)とLow(0~0.9V)の間で変化することによりGPIOタグからトリガーが発行される。変化の方向がHigh→LowなのかLow→Highなのかも指定できる。
Netduinoのデジタル出力はHigh 3.3V、Low 0Vなので、Highのときに0.3VほどMESH側の入力値仕様をオーバーするが、データシートには注釈として「絶対最大定格 -0.3V~3.3V」とあるので特に対策は不要のようだ。
Digital InとNetduinoの接続(Netduinoデジタル出力→デジタル入力)
Netduinoのデジタル13番
ピンとGPIOタグの2番
ピン、NetduinoのGND
ピンとGPIOタグの5番
ピンを接続する。
Digital Inのレシピ
MESHアプリを立ち上げて、GPIOタグに対してOUTPUTでiPadから音を流すようにレシピを作成する。具体的には図18のようになる。
MESHデジタル入力確認用ソースコード
GPIOタグのデジタル入力に対になるのはNetduinoのデジタル出力だ。GPIOタグにデータを送るためのコードを作成する。
プロジェクトの作成方法は、これまでと同様なので割愛する(第3回などを参考にされたい。本稿の例では、プロジェクト名はVB.NET用は「MeshDigitalInVB」、C#用は「MeshDigitalInCS」とした)。もし、Visual Studio 2015をお使いの場合は番外コラム01も参照にしてほしい。
Imports System.Threading
Imports Microsoft.SPOT.Hardware
Imports SecretLabs.NETMF.Hardware.Netduino
Namespace MeshDigitalInVB
Public Module Module1
Private Digital1 As OutputPort = New OutputPort(Pins.GPIO_PIN_D13, False)
Sub Main()
Dim flag = False
Do While (True)
flag = Not flag
Digital1.Write(flag)
Thread.Sleep(1000)
Loop
End Sub
End Module
End Namespace
|
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System.Threading;
namespace MeshDigitalInCS
{
public class Program
{
private static OutputPort Digital1 = new OutputPort(Pins.GPIO_PIN_D13, false);
public static void Main()
{
var flag = false;
while (true)
{
flag = !flag;
Digital1.Write(flag);
Thread.Sleep(1000);
}
}
}
}
|
準備ができたら動かしてみよう。一定間隔でiPadから音が鳴るはずだ。
【動画】GPIOタグ Digital Inサンプル
GPIOデジタル出力(Digital Out)について
GPIOタグの6番
ピン~8番
ピンがデジタル出力ピンだ(図19)。データシートによれば、デジタル出力は、GPIOタグへのトリガーによりHigh(2.7~3.0V)とLow(0~0.3V)の間で出力電圧が変化する。
Digital OutとNetduinoの接続(デジタル出力→Netduinoデジタル入力)
Netduinoのデジタル13番
ピンはプログラムコードによりデジタル出力とデジタル入力が選択できるので、ここでもデジタル13番
ピンとGPIOタグの6番
ピン、NetduinoのGND
ピンとGPIOタグの5番
ピンを接続する。
Digital Outのレシピ
MESHアプリを立ち上げて、MoveタグのシェイクでGPIOタグのデジタルOutがONになるようにレシピを作成する。また、トグルを挟むことで、ONの状態でシェイクするとOFFになるレシピも加えておく。
MESHデジタル出力確認用ソースコード
GPIOタグのデジタル出力と対になるのはNetduinoのデジタル入力だ。GPIOタグからデータを取得するためのコードを作成する。
本稿の例では、プロジェクト名はVB.NET用は「MeshDigitalOutVB」、C#用は「MeshDigitalOutCS」とした。
Imports System.Threading
Imports Microsoft.SPOT.Hardware
Imports SecretLabs.NETMF.Hardware.Netduino
Namespace MeshDigitalOutVB
Public Module Module1
Private Din As InputPort = New InputPort(Pins.GPIO_PIN_D13, False, Port.ResistorMode.Disabled)
Private Led As OutputPort = New OutputPort(Pins.ONBOARD_LED, False)
Sub Main()
Do While (True)
Dim flag = Din.Read()
Led.Write(flag)
Thread.Sleep(1000)
Loop
End Sub
End Module
End Namespace
|
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System.Threading;
namespace MeshDigitalOutCS
{
public class Program
{
private static InputPort Din = new InputPort(Pins.GPIO_PIN_D13, false, Port.ResistorMode.Disabled);
private static OutputPort Led = new OutputPort(Pins.ONBOARD_LED, false);
public static void Main()
{
while (true)
{
var flag = Din.Read();
Led.Write(flag);
Thread.Sleep(1000);
}
}
}
}
|
準備ができたら動かしてみよう。MoveタグをシェイクするたびにNetduinoボード上のLEDがON/OFFする。
【動画】GPIOタグ Digital Outサンプル
GPIOアナログ入力(Analog In)について
GPIOタグの9番
ピンがアナログ入力ピンだ(図23)。データシートによれば、アナログ入力は0.0~3.0Vを0.05V刻みで閾値を設定できる。すなわち、0.05V単位で指定した閾値を上から下にまたいだのか(Below→Above)/下から上にまたいだのか(Above→Below)によりGPIOタグが次のタグを叩くように指定できる。
Analog InとNetduinoの接続(Netduino I2C→DA変換→アナログ入力)
Netduinoはアナログ出力を持っていない。PWM出力を使って試したところGPIOタグのアナログ入力では3.3Vとして認識され、10msごとにON/OFFを繰り返す入力元になってしまい、延々とトリガーを送出するという事態になってしまった。感心したのは、そのような短い周期でもiPadまでは信号を送れるくらいに遅延しながらも追従しており、しばらくトリガーが発生し続けたことだ。このような使い方で何かできるかもしれないが、素直にアナログ値をGPIOタグに送りたいので、I2C接続でアナログ出力できるMCP4725 12bit D/Aコンバーターを使ってPWMではないアナログ値の電圧(この表現も少し変だが)を作り上げる(※MCP4725の説明は割愛。基板上にピンの内容が記載されている)。
NetduinoのSCL
ピンとMCP4725のSCL
ピン、NetduinoのSDA
ピンとMCP4725のSDA
ピンを接続し、3.3V
ピンはMCP4725の+V(VDD)
ピン、GND
はMCP4725のGND
ピンに接続する。またI2Cアドレスとして0x60を使うので、MCP4725のA0
ピンもGNDに接続する。VDDに5Vではなく3.3VとしたのはMESHの入力上限が3.3Vだからだ。これでMCP4725への入力側の配線は完了だ。
MCP4725出力側は、MCP4725のVOUT
ピンとGPIOタグの9番
ピン、NetduinoのGND
ピンとGPIOタグの5番
ピンを接続する。
以上の配線を行うと、図24・図25のようになる。
Analog Inのレシピ
MESHアプリを立ち上げて、1.0V、2.0V、2.5Vで別の音がなるようにレシピを作成する。
MESHアナログ入力確認用ソースコード
GPIOタグのアナログ入力に対応できるアナログ出力がNetduinoにはないので、I2C接続したD/Aコンバーターと接続する。NetduinoではD/Aコンバーターを制御するためのコードを作成する。
MCP4725はI2C接続でコマンドを投げることにより+V(VDD)
ピンに入力した電圧から指定された電圧を取り出す。
電圧指定は12bitのDAC Register Dataで指定し、0~4096の値を入力すると、次の計算式の電圧が出力される。
出力電圧=VDD×指定値/4096
I2C用クラスについては、第5回で作成したI2C用クラスのWrite
メソッドをPrivate
からPublic
に変更して使用する。
MCP4725用クラスについては、出力をパーセンテージで指定すると、内部的に対4096比に変化して2バイト化して送信する。
本稿の例では、サンプルコードのプロジェクト名は、はVB.NET用は「MeshAnalogInVB」、C#用は「MeshAnalogInCS」とした。
Imports System
Imports System.Threading
Namespace MeshAnalogInVB
Friend Class MCP4725
Inherits I2CLib
Public Sub New()
MyBase.New(&H60, 100, 500)
Thread.Sleep(40) ' 40ms待つ
End Sub
Public Sub FastModeWrite(value As UInteger)
Dim reg = 4096 * value / 100 ' 1
Dim byteReg = BitConverter.GetBytes(reg) ' 2
Me.Write(New Byte() {byteReg(1), byteReg(0)}) ' 3
End Sub
End Class
End Namespace
|
using System;
using System.Threading;
namespace MeshAnalogInCS
{
internal class MCP4725Lib : I2CLib
{
public MCP4725Lib()
: base(0x60, 100, 500)
{
Thread.Sleep(40); // 40ms待つ
}
public void FastModeWrite(uint value)
{
var reg = 4096 * value / 100; // 1
var byteReg = BitConverter.GetBytes(reg); // 2
this.Write(new byte[] { byteReg[1], byteReg[0] }); // 3
}
}
}
|
出力をパーセンテージ(=引数value
)で指定すると、内部的に対4096比に変化して2バイト化して送信する。
- 1対4096比を計算。
- 2数値からバイト配列に変換(最下位バイトが1番目、最上位バイトが4番目になる)。
- 32byte分をI2CでMCP7425へ送信。
これを実行すると、次の動画のように毎秒10%ずつ出力電圧が上がっていき、1.0Vに達すると1つの音、続いて2.0Vで2つの音、2.5Vで3つの音が鳴る。
【動画】GPIOタグ Analog Inサンプル
GPIO PWM出力(PWM Out)について
GPIOタグの10番
ピンがPWM出力ピンだ(図28)。データシートによれば、PWM出力はHighが2.7~3.0V、Lowが0.0~0.3V、パルスの周波数は125Hz=8ミリ秒周期となっている。
MESHアプリの設定画面ではDuty比、つまりパルス周期の中で何パーセントをHighにするかを指定できる。
PWM OutとNetduinoの接続
発光ダイオードのように、PWM出力そのもので電圧を変化させたときと同じように振る舞えるものもある。Netduinoのアナログ入力を確認したところ、PWM出力直結では3V固定値相当のアナログ値固定であった。このような場合、周波数電圧変換いわゆるFV変換回路を使ってPWM出力の変化を電圧に変換すると、パルスではなく中間の電圧としてアナログ入力に入力することも可能だ。
今回もFV変換回路で問題を解決してもよかったが、パルスの変化をNetduinoのアナログ回路で確認してみることにした。とはいえ、そのまま直結では少しつまらないのでGPIOタグにMESH GPIOタグ用モータードライバーを取り付けてアナログ出力を実現して、それをNetduinoのアナログ入力に接続してみた(図29、図30)。
PWM Outのレシピ
MESHアプリを立ち上げて、Moveタグを使って、Moveタグを置く方向に応じてPWM出力のDuty比が変化するレシピを作成する(図31)。MESH GPIOタグ用モータードライバーを使う場合、PWM出力に加えて、VOut出力を常時ONにしておくことも忘れないようにする。
MESHアナログ出力確認用ソースコード
GPIOタグのアナログ出力と対になるのはNetduinoのアナログ入力だ。GPIOタグからデータを取得するためのコードを作成する。
本稿の例では、プロジェクト名はVB.NET用は「MeshAnalogOutVB」、C#用は「MeshAnalogOutCS」とした。
Imports System.Threading
Imports Microsoft.SPOT
Imports SecretLabs.NETMF.Hardware
Imports SecretLabs.NETMF.Hardware.Netduino
Namespace MeshAnalogOutVB
Public Module Module1
Private In1 As New AnalogInput(Pins.GPIO_PIN_A0)
Sub Main()
In1.SetRange(0, 3000)
Do While (True)
Dim value = In1.Read()
Debug.Print(value.ToString())
Thread.Sleep(1000)
Loop
End Sub
End Module
End Namespace
|
using Microsoft.SPOT;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System.Threading;
namespace MeshAnalogOutCS
{
public class Program
{
private static AnalogInput In1 = new AnalogInput(Pins.GPIO_PIN_A0);
public static void Main()
{
In1.SetRange(0, 3000);
while (true)
{
var value = In1.Read();
Debug.Print(value.ToString());
Thread.Sleep(100);
}
}
}
}
|
これで、Moveタグを上向きに置けば常に0、横向きに置けば3000前後の値と0が一定間隔で交互に、縦向きに置けば常に3000前後の値が測定できるようなる。実際の実行結果(上向き→横向き→縦向き→横向き→上向き→横向き→縦向きの順で置いた場合)をグラフ化すると、図32のようになった。
まとめ
こんなに簡単に動きを設定できるMESHと合わせてNetduinoを使うのは魅力的であった。また、今回は触れなかったが、MESH SDKを使用してWebサービスなどをMESHタグとして定義してMESHアプリに登録して使うこともできる。
MESHアプリの稼働環境も今はiPad/iPhone/iPod Touch版のみであるが、日米以外のタブレットシェアを考えると、将来的にはXperiaタブレット版のMESHアプリが出てくる可能性もあるだろう。Androidアプリが出てくれば、Windows Bridge for AndroidでWindowsタブレットでも動くようにもできる。あくまでも想像でしかないが、今のうちから情報を収集しておいて損はないだろう。
次回は、I2C接続で16個のPWM出力ができるAdafruit I2C接続16チャンネル12ビットPWM/サーボシールドを使って複数のサーボモーター制御に挑戦する予定である。目標は稼働関節数(=サーボモーター数)18個のPLEN Dの制御だ。
※以下では、本稿の前後を合わせて5回分(第12回~第16回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
13. littleBitsではんだ付けなしの電子工作を実現
磁石で電子回路をつないで電子工作が行えるlittleBits。Netduinoと組み合わせると、どのような電子工作が実現できるのか? その可能性を探る。
14. 【現在、表示中】≫ MESHとNetduinoでiOSデバイスとの連携を実現
SONYのスマートDIYキット「MESH」とは? さまざまな連携が実現可能なMESHを使って、NetduinoとiPadを連携をさせてみよう。
15. Netduinoでロボットコントロール(前編) ― PLEN.Dを直接動かす
組み立て式のロボット「PLEN.D」に使われているサーボモーターを、NetduinoのPWM出力で制御してみよう。
16. Netduinoでロボットコントロール(後編) ― 16個のサーボモーターを一度に制御する
連載最終回。前回に引き続き、Netduinoを使ってPLEN.Dを制御してみる。今回は16個のサーボモーターを制御できるボードを使って複雑なロボットの動きを実現する。