2014.03.15
初音玲
LEGO MINDSTORMS EV3
API
自己紹介
▷お仕事の略歴
• システム企画
• インフラ構築
• 業務アプリ構築
• DB設計、構築、各種支援
▷お仕事外の略歴
• Microsoft MVP for Developer Tools (2008/04-14/03)
• Oracle ACE (2008/04-:日本で2人目)
はじめてシリーズ
▷はじめての
VC#2012
Kinect本 監修
▷本文
• 日本語訳
▷サンプル
• ローカライズ済
連載中
▷
• 新型Kinect for Windows v2 Developer Preview
プログラミング入門
http://www.buildinsider.net/small/kinect2dp/
• Xbox One速報
http://www.buildinsider.net/consumer/xboxonekine
ct/
EV3
ハードウェア
インテリジェントブロック
EV3
モーター モーター
超音波
カラー
ジャイロ
タッチ
ソフトウェア
EV3とWindows 8.1の接続
接続
EV3
ソフトウェア
EV3
Windows XP
Windows Vista
Windows 7
Windows 8
Windows 8.1
Mac OS 10.6
Mac OS 10.7
Mac OS 10.8
USB
WiFi
Bluetooth LE
プログラミング
EV3
ソフトウェア
EV3
Windows XP
Windows Vista
Windows 7
Windows 8
Windows 8.1
Mac OS 10.6
Mac OS 10.7
Mac OS 10.8
USB
WiFi
Bluetooth LE
リアルタイム操作
Windows
ストアアプリ
EV3
Windows 8.1 WiFi
Bluetooth LE
USB
New API
Userinterface
Fundamentals
Devices Graphicsandmedia Communicationsanddata Services
Geo-
location
Proximity
Direct3D Direct2D
Direct
Write
PlayTo
Contracts
Bing
Azure
Mobile
HTML5/CSS XAMLInput Controls
Authentication
Bluetooth
USB
HID WiFi direct
Point of
service
3D
printing
Scanning
WebGL
HTTP
Contacts
Appoint-
ments
PDF
Speech
synthesis
Diagnostics
Portable
Sensors Playback Capture
Printing
SVGCanvas
Local
storage
SMS
Streams
Backgroun
dtransfer
Syndicatio
n
Networkin
g
XML and
JSON
Skydrive
Live tiles and
toast
Accessibility Databinding
Application
services
Threading
timers
Memory
management
Globalization Cryptography
Xbox Live
NEW
プログラムを作ろう
変数宣言
private RfcommDeviceService DeviceService;
private StreamSocket BTPort;
private DataWriter BTWriter;
private DataReader BTReader;
接続
public async Task Connect(string portName)
{
var servicesInfos = await DeviceInformation.FindAllAsync(
RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));
foreach (var serviceInfo in servicesInfos)
{
if (serviceInfo.Name == "EV3")
{
this.DeviceService = await RfcommDeviceService.FromIdAsync(serviceInfo.Id);
break;
}
}
this.BTPort = new StreamSocket();
await BTPort.ConnectAsync(
DeviceService.ConnectionHostName,
DeviceService.ConnectionServiceName,
SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
this.BTWriter = new DataWriter(BTPort.OutputStream);
this.BTReader = new DataReader(BTPort.InputStream);
}
コマンド送信
Byte[] mergedData = new Byte[header.Length + data.Length];
Array.Copy(header, mergedData, header.Length);
Array.Copy(data, 0, mergedData, header.Length, data.Length);
this.BTWriter.WriteBytes(mergedData);
var sendResult = await this.BTWriter.StoreAsync();
コマンド送信
Byte[] mergedData = new Byte[header.Length + data.Length];
Array.Copy(header, mergedData, header.Length);
Array.Copy(data, 0, mergedData, header.Length, data.Length);
this.BTWriter.WriteBytes(mergedData);
var sendResult = await this.BTWriter.StoreAsync();
headerの形式は?
コマンド送信
Byte[] mergedData = new Byte[header.Length + data.Length];
Array.Copy(header, mergedData, header.Length);
Array.Copy(data, 0, mergedData, header.Length, data.Length);
this.BTWriter.WriteBytes(mergedData);
var sendResult = await this.BTWriter.StoreAsync();
headerの形式は?
dataの形式は?
コマンド送信
Byte[] mergedData = new Byte[header.Length + data.Length];
Array.Copy(header, mergedData, header.Length);
Array.Copy(data, 0, mergedData, header.Length, data.Length);
this.BTWriter.WriteBytes(mergedData);
var sendResult = await this.BTWriter.StoreAsync();
headerの形式は?
dataの形式は?
センサーからの受信は?
プログラムを作ろう
▷Windows 8.1 Windows RumtimeでBT対応
▷RfcommDeviceServiceで接続
▷送受信するデータはバイナリデータ
▷自由にプログラム作るとか正直無理
Lego.EV3の紹介
http://legoev3.codeplex.com/
2013/11/01版
NuGet Lego.EV3
2013/11/06版
お勧めはNuGet
▷プロジェクトフォルダの下にインストール
▷ライブラリの更新通知あり
お勧めはNuGet
NuGetパッケージの復元を有効化
Lego.EV3の構造
Lego.EV3の構造
Windows 8.1
Windows Runtime
Lego.Ev3.WinRT
Lego.Ev3.Core
Windows ストアアプリ
Windows Phone 8
Windows Phone Runtime
Lego.Ev3.Phone
Lego.Ev3.Core
Windows ストアアプリ
Lego.EV3を使ったプログラミング
変数宣言
private RfcommDeviceService DeviceService;
private StreamSocket BTPort;
private DataWriter BTWriter;
private DataReader BTReader;
変数宣言 - Lego.EV3
private Lego.Ev3.Core.Brick Connecter;
接続
public async Task Connect(string portName)
{
var servicesInfos = await DeviceInformation.FindAllAsync(
RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));
foreach (var serviceInfo in servicesInfos)
{
if (serviceInfo.Name == "EV3")
{
this.DeviceService = await RfcommDeviceService.FromIdAsync(serviceInfo.Id);
break;
}
}
this.BTPort = new StreamSocket();
await BTPort.ConnectAsync(
DeviceService.ConnectionHostName,
DeviceService.ConnectionServiceName,
SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
this.BTWriter = new DataWriter(BTPort.OutputStream);
this.BTReader = new DataReader(BTPort.InputStream);
}
接続- Lego.EV3
this.Connecter = new Lego.Ev3.Core.Brick(
new Lego.Ev3.WinRT.BluetoothCommunication(this.DeviceName));
await this.Connecter.ConnectAsync();
▷デバイス名を指定して接続要求し、
▷接続が完了するまで待つ
コマンド送信
Byte[] mergedData = new Byte[header.Length + data.Length];
Array.Copy(header, mergedData, header.Length);
Array.Copy(data, 0, mergedData, header.Length, data.Length);
this.BTWriter.WriteBytes(mergedData);
var sendResult = await this.BTWriter.StoreAsync();
コマンド送信- Lego.EV3
await this.Connecter.DirectCommand.TurnMotorAtPowerForTimeAsync(
Lego.Ev3.Core.OutputPort.A,
50,
500,
false)
▷Aに接続したモーターに
▷50%のパワーで
▷500msモーターを回す。
▷時間経過後にブレーキかけない。
データ受信- Lego.EV3
private void Connecter_BrickChanged(
object sender,
Lego.Ev3.Core.BrickChangedEventArgs e)
{
If (e.Ports[Lego.Ev3.Core.InputPort.One].Type != Lego.Ev3.Core.DeviceType.Empty)
{
this.SenserConnecters(index).Value =
e.Ports[Lego.Ev3.Core.InputPort.One].SIValue;
}
}
▷EV3からのデータ受信イベントで
▷1番ポートからのデータが存在すれば
▷その値を取得する
▷Leap.EV3.Core
• Brick
• BrickButtons
• Back / Down / Enter / Left / Right / Up
• Port
• Mode / Name / PercentValue / RawValue / SIValue / Type
• Command
• StartMotor / StepMotorAtPower / TimeMoterSync / StopMoter /
TurnMotorAtPower / TurnMotorAtPowerForTime /
TurnAtSpeed / TurnAtSpeedforTime
• DirectCommand
• ClearUIAsync
• DrawCircleAsync / DrawDottedLineAsync / …
• PlaySoundAsync / PlayToneAsync
• SystemCommand
• CopyFileAsync / DeleteFileAsync / WriteFileAsync
Lego.EV3を使えば
▷接続が非同期メソッドで簡単になる
▷モーター制御がポート指定で簡単になる
▷センサー値取得がイベントとして簡単になる
▷センサー値取得がポート指定で簡単になる
FIN

LEGO MINDSTORMS EV3 API