はじめに
EV3をC#で制御したいと思ったとき、昔できていたらしい方法はしばらく開発が止まっていて2020年12月時点ではできなそうな感じでした。
普通なら「じゃあJavaとかPythonで書けば?」ということになりますが、あえて記事の少ないVisual StudioとC#にこだわりその方法を模索しました。
結果的に従来の「組み込み方式」はあきらめ、既存のオープンソースを活用した「通信方式」で実現しましたのでご紹介したいと思います。
ただし、まだ実験的な段階のため本格的なプログラミングにはコマンドや動作検証が足りていませんのであらかじめご了承ください。
準備物/動作環境
- Windows10 64bit
- pleiades2020 (eclipse)
- MicroSDカード/アダプタ/リーダライタ
- EV3※
- USBケーブル(PCとEV3の接続用)
- Visual Studio 2019
※本記事では、EV3は車の基本モデルになった状態を前提としています。
ソフトウェアの準備
7-Zipのインストール
次項でpleiadesのインストールの際に必要になります。
https://sevenzip.osdn.jp/
から64bit版をダウンロード、インストールしておきます。
EclipseとJava言語で開発するための諸々
ETrobocon様のWiki leJOS EV3開発環境構築ガイドの
「1.準備」から「6.Eclipseのインストール」までを行ってください。
なお、pleiadesは2020 64bitをインストールしました。
Visual Studio 2019のインストール
この記事を読んでいる方には説明不要だと思うので割愛します。ただし.NET Core3.1を使えるようにしてください。
lejos-server
lejos-serverとは
lejos-serverは、EV3上でコマンド受信サーバーとして動作するTCPサーバーです。
crunchinessさんの https://github.com/crunchiness/lejos-server
が元です。 Forkして対応コマンドを追加したブランチがこちらです。
20201/01/13追記:crunchinessさんにプルリクをマージしていただきましたのでURLを変更しました。
2020年12月末現在開発中ですので、すべての動作を網羅しているわけではありません。
lejos-serverをビルドする
eclipse初心者が試行錯誤してやっとのことできた手順が以下のとおりです。
ダウンロード
GitHubにある上記 https://github.com/crunchiness/lejos-server を開き、[Code] -> [Download ZIP]を選択し、任意のフォルダに保存してください。
eclipseにインポート
Eclipse IDEのパッケージエクスプローラーで[プロジェクトのインポート…]を選択します。
[一般] -> [フォルダーまたはアーカイブからプロジェクト]を選択して[次へ]
[アーカイブ]から、ダウンロードしたzipファイルを選択してください。
[完了]をクリックすると、インポートが始まります。
インポートが完了した時点では図のようにエラーが表示されます。
エラーを解除するには次の手順を実施します。
まず、パッケージ・エクスプローラーのRootノードを右クリックして、
[leJOS EV3] -> [leJOS EV3 プロジェクトへ変換]を選択してください。
この時点でエラーはすべて解除されます。
次に、警告の一部を解除するためJREのバージョンを変更します。
パッケージエクスプローラーのツリーから[JREシステム・ライブラリー(java11)]を右クリックし、[プロパティー]を選択してください。
システム・ライブラリーで[実行環境]を選択し、プルダウンから[JavaSE-1.7 (java7)]を選択し、[適用]してください。
図のように「警告(2項目)」となればOKです。(この警告はソースの不備によるものですので無視してください)
ビルド&EV3に転送
EV3とUSBなりで接続し、プログラムを転送できる状態にしてください。
パッケージ・エクスプローラーの最上部ノードを右クリックし、
[実行] -> [leJOS EV3 Program]を選択します。
EV3の液晶に「READY」と表示されれば成功(lejos-serverが動作中)です。
lejos-serverの中身を変更しない限り、Eclipse IDEを使用するのは初回限りとなります。
lejos-client
lejos-clientとは
lejos-clientは、lejos-serverのコマンド仕様に合わせて.NET Coreで作成したライブラリです。JSON形式でコマンドを作成し、TCPクライアントとしてEV3にコマンドを送信します。
.NET Coreとすることで、Windows/Mac両方でNuGetから使用できるようにしました。
lejos-clientを使ったコンソールアプリケーション
プロジェクトの作成
- Visual Studio 2019を起動し、[新しいプロジェクトの作成]を選択
- テンプレートの選択で、[コンソールアプリ(.NET Core)]を選択し、[次へ]
- 任意のプロジェクト名を入力
NuGetパッケージのインストール
パッケージ マネージャー コンソールで次のように入力し、Enter
PM> Install-Package lejos-client
コーディング
パッケージをインストールしたら、次のようにコーディングします。
using lejos_client;
namespace lejosWinConsole
{
class Program
{
static void Main(string[] args)
{
// EV3に接続 (EV3上で'lejos-server'が動作している前提)
var ev3 = new EV3("10.0.1.1", 6789);
ev3.Brick.LED((int)eLEDPatterns.GreenBrink2);
// ポートB/Cに接続されたLargeモーターを同時にスピード100で360度回転させる
ev3.Wheels.GoForward(100, 360);
}
}
}
【補足】
下図のようにev3オブジェクトからインテリセンスで何となく何ができるかわかると思います。
ev3オブジェクトのインスタンスはアドレス毎に作成するため、複数のEV3を同時に制御することも可能です。
実行
あとは通常通りVisual Studioからデバッグ実行します。
EV3がコマンドを受信し、緑のLEDを点滅させながらゆっくりと前進するはずです。
このような表示状態でもコマンド受信状態ですので、連続して実行できます。
まとめ
- EV3のOSとしてleJOSを使用する
- Visual StudioとC#でEV3のプログラミングができる(実験段階)
- 組み込み方式ではなく「通信方式」
- 通信方式の利点として複数のEV3を同時に制御するのが比較的容易
- Macでも同じコードで書ける
参考サイト
https://github.com/ETrobocon/etroboEV3/wiki/lejosev3_win
https://afrel.co.jp/archives/25914