lego mindstorms ev3 api
DESCRIPTION
LEGO MINDSTORMS EV3 APIであるLego.EV3の使い方をわかりやすく説明します!TRANSCRIPT
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/xboxonekinect/
EV3
ハードウェア
インテリジェントブロックEV3
モーター モーター
超音波
カラー
ジャイロ
タッチ
ソフトウェア
EV3とWindows 8.1の接続
接続
EV3ソフトウェア
EV3Windows XP
Windows VistaWindows 7Windows 8
Windows 8.1Mac OS 10.6Mac OS 10.7Mac OS 10.8
USB
WiFi
Bluetooth LE
プログラミング
EV3ソフトウェア
EV3Windows XP
Windows VistaWindows 7Windows 8
Windows 8.1Mac OS 10.6Mac OS 10.7Mac OS 10.8
USB
WiFi
Bluetooth LE
リアルタイム操作
Windowsストアアプリ
EV3
Windows 8.1 WiFi
Bluetooth LE
USB
New API
User interface
Fundamentals
Devices Graphics and media Communications and data Services
Geo-location
Proximity
Direct3D Direct2DDirectWrite
PlayTo
Contracts
Bing
AzureMobile
HTML5/CSS XAMLInput Controls
Authentication
Bluetooth
USB
HID WiFi direct
Point of service
3Dprinting
Scanning
WebGL
HTTP
Contacts
Appoint-ments
Speech synthesis
Diagnostics
Portable
Sensors Playback Capture
Printing
SVGCanvas
Local storage
SMS
StreamsBackground transfer
Syndication
Networking
XML and JSON
Skydrive
Live tiles and toast
Accessibility Data binding
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.EV3private 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.EV3this.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.EV3await this.Connecter.DirectCommand.TurnMotorAtPowerForTimeAsync(
Lego.Ev3.Core.OutputPort.A,50,500,false)
▷Aに接続したモーターに
▷50%のパワーで
▷500msモーターを回す。
▷時間経過後にブレーキかけない。
データ受信- Lego.EV3private 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