78
LEGO Mindstorms with Java leJOS ハンズオン・ラボ Version 1.0 Yoshio Terada, Java Evangelist http://yoshio3.com, @yoshioterada

LEGO Mindstorms(leJOS) Hands On Lab

Embed Size (px)

DESCRIPTION

This is the Hands on Lab by using leJOS 0.8.1 beta with Java SE 8.

Citation preview

Page 1: LEGO Mindstorms(leJOS) Hands On Lab

LEGO Mindstorms with Java

leJOS ハンズオンラボ

Version 10

Yoshio Terada Java Evangelist

httpyoshio3com yoshioterada

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 213

Table of Contents

はじめに13 13 313

ハンズオンラボの概要13 13 413

演習1 leJOS を使用した LEGO の基本動作確認13 13 613

1 leJOS の起動13 13 613

2 leJOS の停止13 13 813

3 leJOS コンソールの詳細13 13 913

4 leJOS 強制再起動方法13 13 1413

演習2 プロジェクトのビルドとHello World の表示13 13 1513

1 配布プロジェクトの動作確認13 13 1713

2 プログラムのビルドと実行行13 13 1913

3 デプロイしたアプリケーションの実行行13 13 2313

4 コンソールに Hello World の表示13 13 2513

演習3モータの前進後進停止スピード変更更13 13 2813

1 左右のモータの定義13 13 2913

2 前進後進停止スピード変更更13 13 3013

3 回転度度数によるモータ制御13 13 3213

4 ハイレベルな方法で LEGO Mindstorms カーを制御13 13 3813

演習4超音波センサーからの情報取得13 13 4213

演習5モータ超音波センサー連携プログラム13 13 4713 1 並列列処理理タスクの実装13 13 4813

2 メインメソッドの実装13 13 5213

Appendix1 Java SE 8 対応 leJOS 環境構築手順13 13 5513

1 必須ソフトウェアの確認入手13 13 5513

2 環境構築手順13 13 5913

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 313

はじめに LEGO Mindstorms は 1998 年年にリリースされLEGO 社と MIT(マサチュ

ーセッツ工科大学)のメディアラボとの共同プロジェクトの成果による製品

で付属するセンサーやモータ等をプログラム上から制御する事が可能です

本ハンズオンラボは Java SE Embedded 8 を使用して教育版 LEGO

Mindstorms を制御する演習を行行いますJava SE Embedded 8 は Java

SE 8 のサブセットの API を集めた組み込み向けの Java 開発環境で 各種

デバイスの CPU やメモリの容量量に応じてプロファイル(Compact Profile

123)を選択する事でかんたんに利利用する事ができます本ハンズオンラ

ボは教育版 LEGO Mindstorms の基本的な制御方法を理理解しラボ終了了後自

身で LEGO Mindstorms の制御ができるようになる事を目的としています

本ハンズオンが終了了後LEGO ブロックを組み替える事によってご自身の

ロボットを作成し制御してください

LEGO Mindstorms を Java で制御するためにはleJOS を Micro SD カー

ドにインストールしSD カードから LEGO Mindstorms を起動しますこ

れによりLEGO Mindstorms を Java で制御できるようになります仮に

SD カードを未挿入で LEGO Mindstorms を起動すると LEGO Mindstorms

標準の環境が起動します本ハンズオンラボではあらかじめ

「Appendix1 Java SE 8 対応 leJOS 環境構築手順」に記載した環境設定は

行行っていますMicro SD カードが挿入されている事を確認し LEGO

Mindstorms を起動してください

仮に環境設定から行行いたい場合はAppendix をご参照ください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 413

ハンズオンラボの概要 本ハンズオンラボの内容を下記に示します本ハンズオンラボは5つ

の演習から構成されており演習1から順番に実施していく事で LEGO

Mindstorms EV 3 の操作方法から leJOS によるプログラミング方法まで

理理解できるようになります

13 演習1

演習1では基本的な leJOS の操作方法についてご紹介します起動

停止方法だけでなくプログラムが制御不不能になった際の再起動方法など

もご紹介します

13 演習2

演習2では事前に用意されている NetBeans の Maven プロジェクト

を利利用してHello World の表示などかんたんなプログラミングを行行いま

すこれにより leJOS による基本的な開発方法について理理解できます

13 演習3

演習3ではLEGO Mindstorms EV 3 の出力力ポートに対する処理理を行行い

ますLEGO Mindstorms にモータを接続しモータをプログラムから制

御し前進後進停止スピードアップスピードダウンなどの基本

的なモータの制御を行行います

13 演習4

演習4ではLEGO Mindstorms EV 3 の入力力ポートに対する処理理を行行い

ますLEGO Mindstorms に超音波センサーを接続し障害物までの距離離

情報を取得します

13 演習5

演習5では演習2演習3演習4を組み合わせた応用プログラムを行行

いますLEGO Mindstorms から障害物までの距離離をはかりながら車車輪輪を

前進させ一定の距離離よりも短くなった時点でスピードを落落としさらに短

くなったら自動的に LEGO を 90 度度回転させ障害物にぶつかる事を回避す

るプログラムを実装します

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 513

ハンズオンラボの実行行中に困った場合

プログラムが正しく記述されているか確認してください

プログラムを実行行した際何らかの理理由で制御不不能(ボタンを押して

もメニュー操作が不不可等)になった場合はLEGO Mindstorms を強制

的に再起動してくださいもしくはssh コマンドが利利用可能な環境の

場合SSH 経由で LEGO Mindstorms (Linux ARM)にログインし該

当のプロセスを kill してください

お気軽にお問い合わせください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 613

演習1 leJOS を使用した LEGO の基本動作確認

1 leJOS の起動 LEGO Mindstorms を leJOS で起動するためには左側面にMicro SD カー

ドが正しく挿入されている事を確認しLEGO Mindstorms の「中央のボタ

ン」を押下してください

演習 11 LEGO Mindstorms を起動してください

図 13 1LEGO13 Mindstorms13 の起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 713

ボタンを押下すると leJOS が起動しますleJOS が正常に起動すると下記の

画面が LCD(コンソール) に表示されます下記の画面が表示されている

事を確認してください

LEGO Mindstorms には下記①〜~⑥に示すボタンが存在していますこれ

らのボタンを操作する事で LEGO Mindstorms を操作します

ボタン 各ボタンの詳細

① 戻るボタン 動作の取り消し実行行中のプログラムの中止LEGO

Mindstorms 本体の停止など

② 中央ボタン LEGO Mindstorms 本体の起動アプリケーションの実行行

各種設定の決定

③ 上ボタン メニューの選択など

④ 下ボタン メニューの選択など

⑤ 左ボタン メニューの選択など

⑥ 右ボタン メニューの選択など

図 13 2LEGO13 Mindstorms13 の起動完了

113

213

313

413

513 613

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 2: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 213

Table of Contents

はじめに13 13 313

ハンズオンラボの概要13 13 413

演習1 leJOS を使用した LEGO の基本動作確認13 13 613

1 leJOS の起動13 13 613

2 leJOS の停止13 13 813

3 leJOS コンソールの詳細13 13 913

4 leJOS 強制再起動方法13 13 1413

演習2 プロジェクトのビルドとHello World の表示13 13 1513

1 配布プロジェクトの動作確認13 13 1713

2 プログラムのビルドと実行行13 13 1913

3 デプロイしたアプリケーションの実行行13 13 2313

4 コンソールに Hello World の表示13 13 2513

演習3モータの前進後進停止スピード変更更13 13 2813

1 左右のモータの定義13 13 2913

2 前進後進停止スピード変更更13 13 3013

3 回転度度数によるモータ制御13 13 3213

4 ハイレベルな方法で LEGO Mindstorms カーを制御13 13 3813

演習4超音波センサーからの情報取得13 13 4213

演習5モータ超音波センサー連携プログラム13 13 4713 1 並列列処理理タスクの実装13 13 4813

2 メインメソッドの実装13 13 5213

Appendix1 Java SE 8 対応 leJOS 環境構築手順13 13 5513

1 必須ソフトウェアの確認入手13 13 5513

2 環境構築手順13 13 5913

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 313

はじめに LEGO Mindstorms は 1998 年年にリリースされLEGO 社と MIT(マサチュ

ーセッツ工科大学)のメディアラボとの共同プロジェクトの成果による製品

で付属するセンサーやモータ等をプログラム上から制御する事が可能です

本ハンズオンラボは Java SE Embedded 8 を使用して教育版 LEGO

Mindstorms を制御する演習を行行いますJava SE Embedded 8 は Java

SE 8 のサブセットの API を集めた組み込み向けの Java 開発環境で 各種

デバイスの CPU やメモリの容量量に応じてプロファイル(Compact Profile

123)を選択する事でかんたんに利利用する事ができます本ハンズオンラ

ボは教育版 LEGO Mindstorms の基本的な制御方法を理理解しラボ終了了後自

身で LEGO Mindstorms の制御ができるようになる事を目的としています

本ハンズオンが終了了後LEGO ブロックを組み替える事によってご自身の

ロボットを作成し制御してください

LEGO Mindstorms を Java で制御するためにはleJOS を Micro SD カー

ドにインストールしSD カードから LEGO Mindstorms を起動しますこ

れによりLEGO Mindstorms を Java で制御できるようになります仮に

SD カードを未挿入で LEGO Mindstorms を起動すると LEGO Mindstorms

標準の環境が起動します本ハンズオンラボではあらかじめ

「Appendix1 Java SE 8 対応 leJOS 環境構築手順」に記載した環境設定は

行行っていますMicro SD カードが挿入されている事を確認し LEGO

Mindstorms を起動してください

仮に環境設定から行行いたい場合はAppendix をご参照ください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 413

ハンズオンラボの概要 本ハンズオンラボの内容を下記に示します本ハンズオンラボは5つ

の演習から構成されており演習1から順番に実施していく事で LEGO

Mindstorms EV 3 の操作方法から leJOS によるプログラミング方法まで

理理解できるようになります

13 演習1

演習1では基本的な leJOS の操作方法についてご紹介します起動

停止方法だけでなくプログラムが制御不不能になった際の再起動方法など

もご紹介します

13 演習2

演習2では事前に用意されている NetBeans の Maven プロジェクト

を利利用してHello World の表示などかんたんなプログラミングを行行いま

すこれにより leJOS による基本的な開発方法について理理解できます

13 演習3

演習3ではLEGO Mindstorms EV 3 の出力力ポートに対する処理理を行行い

ますLEGO Mindstorms にモータを接続しモータをプログラムから制

御し前進後進停止スピードアップスピードダウンなどの基本

的なモータの制御を行行います

13 演習4

演習4ではLEGO Mindstorms EV 3 の入力力ポートに対する処理理を行行い

ますLEGO Mindstorms に超音波センサーを接続し障害物までの距離離

情報を取得します

13 演習5

演習5では演習2演習3演習4を組み合わせた応用プログラムを行行

いますLEGO Mindstorms から障害物までの距離離をはかりながら車車輪輪を

前進させ一定の距離離よりも短くなった時点でスピードを落落としさらに短

くなったら自動的に LEGO を 90 度度回転させ障害物にぶつかる事を回避す

るプログラムを実装します

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 513

ハンズオンラボの実行行中に困った場合

プログラムが正しく記述されているか確認してください

プログラムを実行行した際何らかの理理由で制御不不能(ボタンを押して

もメニュー操作が不不可等)になった場合はLEGO Mindstorms を強制

的に再起動してくださいもしくはssh コマンドが利利用可能な環境の

場合SSH 経由で LEGO Mindstorms (Linux ARM)にログインし該

当のプロセスを kill してください

お気軽にお問い合わせください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 613

演習1 leJOS を使用した LEGO の基本動作確認

1 leJOS の起動 LEGO Mindstorms を leJOS で起動するためには左側面にMicro SD カー

ドが正しく挿入されている事を確認しLEGO Mindstorms の「中央のボタ

ン」を押下してください

演習 11 LEGO Mindstorms を起動してください

図 13 1LEGO13 Mindstorms13 の起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 713

ボタンを押下すると leJOS が起動しますleJOS が正常に起動すると下記の

画面が LCD(コンソール) に表示されます下記の画面が表示されている

事を確認してください

LEGO Mindstorms には下記①〜~⑥に示すボタンが存在していますこれ

らのボタンを操作する事で LEGO Mindstorms を操作します

ボタン 各ボタンの詳細

① 戻るボタン 動作の取り消し実行行中のプログラムの中止LEGO

Mindstorms 本体の停止など

② 中央ボタン LEGO Mindstorms 本体の起動アプリケーションの実行行

各種設定の決定

③ 上ボタン メニューの選択など

④ 下ボタン メニューの選択など

⑤ 左ボタン メニューの選択など

⑥ 右ボタン メニューの選択など

図 13 2LEGO13 Mindstorms13 の起動完了

113

213

313

413

513 613

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 3: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 313

はじめに LEGO Mindstorms は 1998 年年にリリースされLEGO 社と MIT(マサチュ

ーセッツ工科大学)のメディアラボとの共同プロジェクトの成果による製品

で付属するセンサーやモータ等をプログラム上から制御する事が可能です

本ハンズオンラボは Java SE Embedded 8 を使用して教育版 LEGO

Mindstorms を制御する演習を行行いますJava SE Embedded 8 は Java

SE 8 のサブセットの API を集めた組み込み向けの Java 開発環境で 各種

デバイスの CPU やメモリの容量量に応じてプロファイル(Compact Profile

123)を選択する事でかんたんに利利用する事ができます本ハンズオンラ

ボは教育版 LEGO Mindstorms の基本的な制御方法を理理解しラボ終了了後自

身で LEGO Mindstorms の制御ができるようになる事を目的としています

本ハンズオンが終了了後LEGO ブロックを組み替える事によってご自身の

ロボットを作成し制御してください

LEGO Mindstorms を Java で制御するためにはleJOS を Micro SD カー

ドにインストールしSD カードから LEGO Mindstorms を起動しますこ

れによりLEGO Mindstorms を Java で制御できるようになります仮に

SD カードを未挿入で LEGO Mindstorms を起動すると LEGO Mindstorms

標準の環境が起動します本ハンズオンラボではあらかじめ

「Appendix1 Java SE 8 対応 leJOS 環境構築手順」に記載した環境設定は

行行っていますMicro SD カードが挿入されている事を確認し LEGO

Mindstorms を起動してください

仮に環境設定から行行いたい場合はAppendix をご参照ください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 413

ハンズオンラボの概要 本ハンズオンラボの内容を下記に示します本ハンズオンラボは5つ

の演習から構成されており演習1から順番に実施していく事で LEGO

Mindstorms EV 3 の操作方法から leJOS によるプログラミング方法まで

理理解できるようになります

13 演習1

演習1では基本的な leJOS の操作方法についてご紹介します起動

停止方法だけでなくプログラムが制御不不能になった際の再起動方法など

もご紹介します

13 演習2

演習2では事前に用意されている NetBeans の Maven プロジェクト

を利利用してHello World の表示などかんたんなプログラミングを行行いま

すこれにより leJOS による基本的な開発方法について理理解できます

13 演習3

演習3ではLEGO Mindstorms EV 3 の出力力ポートに対する処理理を行行い

ますLEGO Mindstorms にモータを接続しモータをプログラムから制

御し前進後進停止スピードアップスピードダウンなどの基本

的なモータの制御を行行います

13 演習4

演習4ではLEGO Mindstorms EV 3 の入力力ポートに対する処理理を行行い

ますLEGO Mindstorms に超音波センサーを接続し障害物までの距離離

情報を取得します

13 演習5

演習5では演習2演習3演習4を組み合わせた応用プログラムを行行

いますLEGO Mindstorms から障害物までの距離離をはかりながら車車輪輪を

前進させ一定の距離離よりも短くなった時点でスピードを落落としさらに短

くなったら自動的に LEGO を 90 度度回転させ障害物にぶつかる事を回避す

るプログラムを実装します

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 513

ハンズオンラボの実行行中に困った場合

プログラムが正しく記述されているか確認してください

プログラムを実行行した際何らかの理理由で制御不不能(ボタンを押して

もメニュー操作が不不可等)になった場合はLEGO Mindstorms を強制

的に再起動してくださいもしくはssh コマンドが利利用可能な環境の

場合SSH 経由で LEGO Mindstorms (Linux ARM)にログインし該

当のプロセスを kill してください

お気軽にお問い合わせください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 613

演習1 leJOS を使用した LEGO の基本動作確認

1 leJOS の起動 LEGO Mindstorms を leJOS で起動するためには左側面にMicro SD カー

ドが正しく挿入されている事を確認しLEGO Mindstorms の「中央のボタ

ン」を押下してください

演習 11 LEGO Mindstorms を起動してください

図 13 1LEGO13 Mindstorms13 の起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 713

ボタンを押下すると leJOS が起動しますleJOS が正常に起動すると下記の

画面が LCD(コンソール) に表示されます下記の画面が表示されている

事を確認してください

LEGO Mindstorms には下記①〜~⑥に示すボタンが存在していますこれ

らのボタンを操作する事で LEGO Mindstorms を操作します

ボタン 各ボタンの詳細

① 戻るボタン 動作の取り消し実行行中のプログラムの中止LEGO

Mindstorms 本体の停止など

② 中央ボタン LEGO Mindstorms 本体の起動アプリケーションの実行行

各種設定の決定

③ 上ボタン メニューの選択など

④ 下ボタン メニューの選択など

⑤ 左ボタン メニューの選択など

⑥ 右ボタン メニューの選択など

図 13 2LEGO13 Mindstorms13 の起動完了

113

213

313

413

513 613

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 4: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 413

ハンズオンラボの概要 本ハンズオンラボの内容を下記に示します本ハンズオンラボは5つ

の演習から構成されており演習1から順番に実施していく事で LEGO

Mindstorms EV 3 の操作方法から leJOS によるプログラミング方法まで

理理解できるようになります

13 演習1

演習1では基本的な leJOS の操作方法についてご紹介します起動

停止方法だけでなくプログラムが制御不不能になった際の再起動方法など

もご紹介します

13 演習2

演習2では事前に用意されている NetBeans の Maven プロジェクト

を利利用してHello World の表示などかんたんなプログラミングを行行いま

すこれにより leJOS による基本的な開発方法について理理解できます

13 演習3

演習3ではLEGO Mindstorms EV 3 の出力力ポートに対する処理理を行行い

ますLEGO Mindstorms にモータを接続しモータをプログラムから制

御し前進後進停止スピードアップスピードダウンなどの基本

的なモータの制御を行行います

13 演習4

演習4ではLEGO Mindstorms EV 3 の入力力ポートに対する処理理を行行い

ますLEGO Mindstorms に超音波センサーを接続し障害物までの距離離

情報を取得します

13 演習5

演習5では演習2演習3演習4を組み合わせた応用プログラムを行行

いますLEGO Mindstorms から障害物までの距離離をはかりながら車車輪輪を

前進させ一定の距離離よりも短くなった時点でスピードを落落としさらに短

くなったら自動的に LEGO を 90 度度回転させ障害物にぶつかる事を回避す

るプログラムを実装します

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 513

ハンズオンラボの実行行中に困った場合

プログラムが正しく記述されているか確認してください

プログラムを実行行した際何らかの理理由で制御不不能(ボタンを押して

もメニュー操作が不不可等)になった場合はLEGO Mindstorms を強制

的に再起動してくださいもしくはssh コマンドが利利用可能な環境の

場合SSH 経由で LEGO Mindstorms (Linux ARM)にログインし該

当のプロセスを kill してください

お気軽にお問い合わせください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 613

演習1 leJOS を使用した LEGO の基本動作確認

1 leJOS の起動 LEGO Mindstorms を leJOS で起動するためには左側面にMicro SD カー

ドが正しく挿入されている事を確認しLEGO Mindstorms の「中央のボタ

ン」を押下してください

演習 11 LEGO Mindstorms を起動してください

図 13 1LEGO13 Mindstorms13 の起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 713

ボタンを押下すると leJOS が起動しますleJOS が正常に起動すると下記の

画面が LCD(コンソール) に表示されます下記の画面が表示されている

事を確認してください

LEGO Mindstorms には下記①〜~⑥に示すボタンが存在していますこれ

らのボタンを操作する事で LEGO Mindstorms を操作します

ボタン 各ボタンの詳細

① 戻るボタン 動作の取り消し実行行中のプログラムの中止LEGO

Mindstorms 本体の停止など

② 中央ボタン LEGO Mindstorms 本体の起動アプリケーションの実行行

各種設定の決定

③ 上ボタン メニューの選択など

④ 下ボタン メニューの選択など

⑤ 左ボタン メニューの選択など

⑥ 右ボタン メニューの選択など

図 13 2LEGO13 Mindstorms13 の起動完了

113

213

313

413

513 613

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 5: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 513

ハンズオンラボの実行行中に困った場合

プログラムが正しく記述されているか確認してください

プログラムを実行行した際何らかの理理由で制御不不能(ボタンを押して

もメニュー操作が不不可等)になった場合はLEGO Mindstorms を強制

的に再起動してくださいもしくはssh コマンドが利利用可能な環境の

場合SSH 経由で LEGO Mindstorms (Linux ARM)にログインし該

当のプロセスを kill してください

お気軽にお問い合わせください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 613

演習1 leJOS を使用した LEGO の基本動作確認

1 leJOS の起動 LEGO Mindstorms を leJOS で起動するためには左側面にMicro SD カー

ドが正しく挿入されている事を確認しLEGO Mindstorms の「中央のボタ

ン」を押下してください

演習 11 LEGO Mindstorms を起動してください

図 13 1LEGO13 Mindstorms13 の起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 713

ボタンを押下すると leJOS が起動しますleJOS が正常に起動すると下記の

画面が LCD(コンソール) に表示されます下記の画面が表示されている

事を確認してください

LEGO Mindstorms には下記①〜~⑥に示すボタンが存在していますこれ

らのボタンを操作する事で LEGO Mindstorms を操作します

ボタン 各ボタンの詳細

① 戻るボタン 動作の取り消し実行行中のプログラムの中止LEGO

Mindstorms 本体の停止など

② 中央ボタン LEGO Mindstorms 本体の起動アプリケーションの実行行

各種設定の決定

③ 上ボタン メニューの選択など

④ 下ボタン メニューの選択など

⑤ 左ボタン メニューの選択など

⑥ 右ボタン メニューの選択など

図 13 2LEGO13 Mindstorms13 の起動完了

113

213

313

413

513 613

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 6: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 613

演習1 leJOS を使用した LEGO の基本動作確認

1 leJOS の起動 LEGO Mindstorms を leJOS で起動するためには左側面にMicro SD カー

ドが正しく挿入されている事を確認しLEGO Mindstorms の「中央のボタ

ン」を押下してください

演習 11 LEGO Mindstorms を起動してください

図 13 1LEGO13 Mindstorms13 の起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 713

ボタンを押下すると leJOS が起動しますleJOS が正常に起動すると下記の

画面が LCD(コンソール) に表示されます下記の画面が表示されている

事を確認してください

LEGO Mindstorms には下記①〜~⑥に示すボタンが存在していますこれ

らのボタンを操作する事で LEGO Mindstorms を操作します

ボタン 各ボタンの詳細

① 戻るボタン 動作の取り消し実行行中のプログラムの中止LEGO

Mindstorms 本体の停止など

② 中央ボタン LEGO Mindstorms 本体の起動アプリケーションの実行行

各種設定の決定

③ 上ボタン メニューの選択など

④ 下ボタン メニューの選択など

⑤ 左ボタン メニューの選択など

⑥ 右ボタン メニューの選択など

図 13 2LEGO13 Mindstorms13 の起動完了

113

213

313

413

513 613

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 7: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 713

ボタンを押下すると leJOS が起動しますleJOS が正常に起動すると下記の

画面が LCD(コンソール) に表示されます下記の画面が表示されている

事を確認してください

LEGO Mindstorms には下記①〜~⑥に示すボタンが存在していますこれ

らのボタンを操作する事で LEGO Mindstorms を操作します

ボタン 各ボタンの詳細

① 戻るボタン 動作の取り消し実行行中のプログラムの中止LEGO

Mindstorms 本体の停止など

② 中央ボタン LEGO Mindstorms 本体の起動アプリケーションの実行行

各種設定の決定

③ 上ボタン メニューの選択など

④ 下ボタン メニューの選択など

⑤ 左ボタン メニューの選択など

⑥ 右ボタン メニューの選択など

図 13 2LEGO13 Mindstorms13 の起動完了

113

213

313

413

513 613

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 8: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 813

2 leJOS の停止 LEGO Mindstorms を停止するためにはコンソールメニューから左上に

存在する「戻る」ボタンを押下してください

「戻る」ボタンを押下すると上記の画面が表示されますここで「times」が

選択されていますので「右ボタン」で「レ」が選択された状態にしてくだ

さい最後に「中央ボタン」を押下してくださいボタンを押下すると全て

のプロセスが終了了しLEGO Mindstorms の電源が切切れます

演習 12 LEGO Mindstorms を停止し再起動してください

図 13 3LEGO13 Mindstorms13 の停止

図 13 4LEGO13 Mindstorms13 の停止

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 9: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 913

3 leJOS コンソールの詳細 LEGO Mindstorms の起動停止ができるようになりましたのでここでは

以降降のハンズオンラボを進めていく上で最低限把握しておかなければな

らないコンソールメニューとその操作方法について説明します起動時

には下記の画面が表示されています

起動時にはメニュー内の項目「Run Default」が選択された状態で起動さ

れますそれ以外のメニュー項目を選択する場合「左右ボタン」を押下

する事で他のメニューの項目を選択できます例例えば「右ボタン」を2回

押下すると下記の「Samples」画面が表示されます

図 13 5 leJOS13 のコンソール画面

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 10: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1013

ここで「中央ボタン」を押下してくださいすると上記のようにデフォルト

でインストールされているサンプルアプリケーションの一覧を表示する事

ができます

図 13 6Samples13 ディレクトリの選択

図 13 7サンプルアプリケーションの一覧

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 11: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1113

ここで一番上に表示されている「GraphicsTestjar」を選択し「中央ボ

タン」を押下してください押下すると下記の画面が表示されますそのま

ま再度度「中央ボタン」を押下してください

ボタンを押下すると下記の画面を表示しプログラムを実行行します

図 13 8GraphicsTestjar13 の実行

図 13 9プログラムの実行

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 12: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1213

プログラムが正常に実行行されると下記の画面が表示されます

このように leJOS ではコンソールメニューをボタンで操作しプログラム

を実行行することができますこの演習ではコンソールメニューを操作し

メニューの使い方に慣れてください

演習 13 サンプルアプリケーションの起動 他のメニュー操

作をしてください

図 13 10サンプルプログラムの実行結果

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 13: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1313

ここでプログラムの実行行メニューをもう少し詳しく説明します下記にそれ

ぞれのアイコンの意味を示します

アイコン アイコンの意味

Execute program

コンソールメニューをクリアし選択した jar ファイルを実

行行プログラム終了了後メニューを表示

「中央ボタン+下ボタン」を同時に押下する事で任意のタイ

ミングでプログラムを終了了可能

Debug program

プログラム実行行と同じでデバッグが可能Systemout

Systemerr をコンソールに表示可能

Set as Default

トップレベルのメニューの Run Default として設定頻繁に実

行行するプログラムでメニュー操作を省省略略可能システムメニ

ューから自動起動も設定可能

Delete file

選択した jar ファイルを削除メニューのアプリケーションの

一覧表示からも削除

図 13 11プログラム実行メニューの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 14: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1413

4 leJOS 強制再起動方法 leJOS は ARM 用の Linux が動作していますのでWiFi 等が設定されている

環境ではSSH 経由で ARM Linux にログインしプロセスの監視や制御など

が可能ですしかしSSH が利利用できない環境で leJOS が制御不不能な状態

になった場合は下記の手順に従い強制再起動を行行ってください

leJOS の強制再起動

下記のボタンを同時に数秒押下してください

Oslash 「戻る」ボタン

Oslash 「中央」ボタン

Oslash 「左側」ボタン

演習 14 LEGO Mindstorms を強制再起動してください

図 13 12 leJOS13 の強制再起動

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 15: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1513

演習2 プロジェクトのビルドとHello World の表示 本演習にはNetBeans の雛形プロジェクトが用意されていますそれを利利

用してプロジェクトをビルドしてください

まずNetBeans のメニューから「プロジェクトを開く」を選択してくださ

図 13 13既存プロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 16: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1613

ここで「LEGOMind-‐‑‒HoL」プロジェクトを選択してくださいすると

NetBeans の「プロジェクト」タブにプロジェクトが表示されます

図 13 14LEGOMind-shy‐HoLプロジェクトのオープン

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 17: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1713

1 配布プロジェクトの動作確認 開いた「LEGOMind-‐‑‒HoL」プロジェクトのディレクトリを全て展開てくださ

展開すると「ソースパッケージ」ディレクトリがありますここで

EV3AppMain クラスをダブルクリックしてくださいすると下記のコード

が表示されます

public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 15プロジェクトディレクトリの展開

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 18: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1813

このプロジェクトは本ハンズオンを行行う上で最も基本的なプログラムで

す起動した後任意のキーイベントを待ち受けてキー(LEGO のボタ

ン)が押下された際にプログラムを終了了します

以降降の演習ではこのプログラムにコードを追加する形で進めていきます

演習 21 LEGOMind-‐‑‒Hol プロジェクトを開き EV3AppMain

クラスの内容を確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 19: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 1913

2 プログラムのビルドと実行行 ソースコードの中身を確認した後ビルドをしてくださいNetBeans で

プロジェクトをビルドするためには該当のプロジェクトを右クリックして

「ビルド」を選択してください

プロジェクトをビルドすると下記のように出力力コンソールにビルド中のステ

ータスが表示されます本プロジェクトはビルド時にアプリケーションを

自動的に SSH (scp) 経由でデプロイするようあらかじめ設定されています

図 13 16NetBeansにおけるプロジェクトのビルド

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 20: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2013

-shy‐-shy‐-shy‐13 wagon-shy‐maven-shy‐plugin10-shy‐beta-shy‐5upload13 (upload-shy‐jar)13 13 LEGOMind13 -shy‐-shy‐-shy‐13 The13 authenticity13 of13 host13 192168110113 cant13 be13 established13 RSA13 key13 fingerprint13 is13 6c59d2e4e678fd515dbe85a8eaa1e57c13 Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes

ここではじめて LEGO Mindstorms に scp 経由でアプリケーションをデプ

ロイする場合上記のようなメッセージが表示されます1ここで「yes」を

入力力し「中央ボタン」を押下してくださいすると下記のメッセージが表示

されます下記はビルドの結果成果物である jar ファイル(LEGOMind-shy‐10-shy‐

SNAPSHOTjar)をLEGO Mindstorms(IP アドレス1921691101デ

ィレクトリhomelejosprograms に対して scp コマンドでコピーして

いる事を表しています

Are13 you13 sure13 you13 want13 to13 continue13 connecting13 (yesno)13 yes13 Uploading13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 scp1921681101homelejosprogramsLEGOMind-shy‐10-shy‐SNAPSHOTjar13 13 13 -shy‐-shy‐-shy‐13 maven-shy‐install-shy‐plugin231install13 (default-shy‐install)13 13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1本メッセージは2度度目以降降出力力されません

図 13 17プロジェクトのビルドステータス

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 21: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2113

LEGOMind13 -shy‐-shy‐-shy‐13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLtargetLEGOMind-shy‐10-shy‐SNAPSHOTjar13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTjar13 Installing13 NetBeansProjectsLEGOMind-shy‐HoLpomxml13 to13 Userstyoshio2002m2repositorycomyoshio3LEGOMind10-shy‐SNAPSHOTLEGOMind-shy‐10-shy‐SNAPSHOTpom13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 BUILD13 SUCCESS13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13 Total13 time13 13329s13 Finished13 at13 Sat13 Aug13 2313 18374313 WIT13 201413 Final13 Memory13 9M325M13 -shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐-shy‐13

ビルドの結果「BUILD13 SUCCESS」 と表示されれば成功です

図 13 18ビルド成功時のコンソール出力

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 22: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2213

仮に自分の手元に存在する LEGO Mindstorms の IP アドレスと異異なる IP

アドレスが表示される場合NetBeans の「プロジェクトファイル」から

「pomxml」に記載されている IP アドレスを変更更してください

IP アドレスを変更更するためにはpomxml ファイルを修正します「プロ

ジェクトファイル」ディレクトリ配下にMaven の「pomxml」ファイル

がありますここで該当する IP アドレスに変更更してください

13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 lturlgtscp1921681101lturlgt13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13

13 「BUILD13 FAILURE」と表示された場合は開発環境のマシンの IP アドレ

スとLEGO Mindstorms の IP アドレスが同一のネットワークセグメ

ントか否か確認してくださいまた ping コマンド等で正しく接続可能か

否かを確認してください

演習 22 プロジェクトをビルドしてファイルが自動的にコピー

される事を確認してください

図 13 19pomxml13 ファイルの存在場所

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 23: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2313

3 デプロイしたアプリケーションの実行行 正常にアプリケーションのデプロイが成功した後アプリケーションを実行行

しますアプリケーションの実行行は leJOS のコンソールメニューより左右

のボタンで「P」と記載されたプログラムの保存先ディレクトリを選択し

「中央ボタン」を押下してください

ボタンを押下するとプログラムディレクトリ(homelejosprograms)

に存在するファイルの一覧が表示されます

図 13 20プログラムディレクトリの選択

図 13 21一覧からプログラムの選択

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 24: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2413

ここで実行行する jar ファイル (LEGOMind-‐‑‒10-‐‑‒SNAPSHOTjar) を選択

(複数存在する場合は上下ボタンで選択)し「中央ボタン」を押下してく

ださい押下すると下記の画面が表示されます

ここでは選択した jar ファイルに対する操作メニューが表示されますこ

こで上記 Java プログラムの実行行アイコンを選択し「中央ボタン」を押

下してください押下すると jar ファイルが実行行されます

Java プログラムの実行行アイコン

実行行したプログラムは「中央ボタン+下ボタン」で停止できます

演習 23 アプリケーションを実行行してください

図 13 22プログラムに対する操作

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 25: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2513

4 コンソールにHello World の表示

アプリケーションをビルドデプロイ実行行ができるようになりましたので

実際にプログラムを書いていきましょうはじめに上記の写真にあるように

LEGO Mindstorms のコンソールに文字列列「Hello World」を表示しLED

ボタンを点灯させるプログラムを記載します

図 13 23コンソールへの文字列表示

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 26: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2613

printHelloWorld() メソッドを実装してください

package13 comyoshio3legomind13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 13 public13 class13 EV3AppMain13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainprintHelloWorld()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 printHelloWorld()13 13 13 13 13 13 13 13 13 13 LCDdrawString(ldquoHello13 Worldrdquo13 013 0)13 13 引数(表示文字列列13 x軸13 y軸の表示座標)13

13 13 13 13 13 13 13 13 ButtonLEDPattern(1)13 0-shy‐613 までが有効13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO Mindstorms のコンソール上に表示を行行うために

lejoshardwarelcdLCDクラスを利利用しますLCDクラスに含まれる全メ

ソッドは static メソッドで文字列列を表示させたい場合はdrawString()

メソッドを使用しますこの際表示用の文字列列x軸y軸座標を指定し

ますまたLEGO Mindstorms のボタンを制御するために

lejoshardwareButton クラスを利利用しますButton クラスに含まれるメ

ソッドもまた全て static メソッドですButton クラスの機能を利利用する

事で LED ランプを点灯させたりボタン押下のイベントをハンドリングさせ

たりできますここではボタンの LEDのパターンに1を指定する事でボタン

の LEDに対して緑色を点灯させています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 27: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2713

上記プログラムを実装し実行行してください動作確認後再び drawString

の xy 軸座標の値を変更更したりLEDPattern の引数の値を変えたりしど

のように動作が変わるかを確認してください

演習 24 HelloWorld のプログラムを実装し実行行してください 追加課題橙色が点滅するのは LEDPattern の引数の値がどの数値の時でし

ょうか確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 28: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2813

演習3モータの前進後進停止スピード変更更 LEGO Mindstorms は入力力ポート(1 2 3 4)出力力ポート(A B C D)をそ

れぞれ備えており付属の各種センサーやモータを各ポートに接続する事で

情報を取得したり制御したりできます通常各種センサーは入力力ポート

へモータを出力力ポートへ接続します

図 13 24入力ポート 13 (113 213 313 4)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 29: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 2913

本演習では出力力ポート(B C)にモータに接続するケーブルを指しモータの

制御を行行います

1 左右のモータの定義

まずB C のポートにモータが接続されている事を確認してください次に

このモータを操作するためにそれぞれのモータのインスタンスを生成しま

す下記のボールド(太い文字列列部分)で記載した2行行を追加してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

図 13 25出力ポート 13 (A13 B13 C13 D)

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 30: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3013

2 前進後進停止スピード変更更

次にモータの回転停止スピード変更更を行行います左側のモータを制御

するmanageMotor() メソッドを実装してくださいここでは左側のモータ

を3秒間正の方向へ回転(forward())し一度度停止させます(stop)次にスピ

ードを変更更し(setSpeed())負の方向へ3秒間回転(backward)させ最後

に停止しますこのコードを実装した後コンパイルデプロイしプログラ

ムを実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor()13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 前進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13

13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 スピード変更更13

13 13 13 13 13 13 13 13 leftMotorbackward()13 13 13 13 後進13

13 13 13 13 13 13 13 13 DelaymsDelay(3000)13 13 13 13 13 13 3秒間実施13

13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 停止13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 31: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3113

ここでRegulatedMotor クラスついて補足しますforward()メソッドは前

進backward()メソッドは後進するためのメソッドですこれら2つのメソ

ッドはstop()メソッドもしくはflt()メソッドが呼び出されるまで回転し

つづけますまた setSpeed()でモータのスピードを変更更できます

setSpeed()で指定する値は1秒間辺りの回転角度度数を指定します最大値

はバッテリの電圧times100 です

今回3秒間前進させた後停止しスピードを変更更し3秒間後進させた後

停止する処理理を記載しています

ここで3秒間処理理を継続させるためにlejosutilDelay クラスを利利用して

いますDelay クラスは LEGO Mindstorms が提供するユーティリティク

ラスで作業を中断せずに処理理を待つ事ができますDelay クラスはミリ秒

マイクロ秒ナノ秒の指定ができます上記ではミリ秒を指定し 3000 ミリ

秒(つまり 3秒)処理理を待ちstop() メソッドを呼び出しモータを停止させ

ています

演習 31 32 モータの制御(前進後進スピード変更更)プ

ログラムを実装し実行行してください 追加課題

1 leftMotor だけでなくrightMotor も同様に記載して両方のモータ

を動かせるように実装してください

2 stop() の代わりに flt() を記載して実行行した場合挙動がどのようにか

わるかを確認してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 32: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3213

3 回転度度数によるモータ制御

forward 前進 backward 後進の処理理の他leJOS ではモータの回転度度数

によって制御する事も可能ですモータの回転度度数で制御するためには下

記の rotate() もしくは rotateTo() メソッを使用します

l void rotate(int angle)

l void rotateTo(int limitAngle)

これら2つのメソッドの違いを説明します

まずrotate() メソッドは現在の位置情報とは無関係で引数で与えられた

角度度数(360 を指定した場合 360度度)だけ現在いる場所から回転します例例

えば停止状態から①で示すように rotate(360)を指定するとモータは一回

転します次に②で示すように再び rotate(360)を実行行するとさらにその

場所から一回転しますまた③で示すように角度度 0を与えると回転はしませ

図 13 26rotate()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 33: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3313

上記の動作を確認するために下記のコードを実装してプログラムをビル

ドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor1()13 13 13 13 13 13 13 13 13 13 leftMotor13 を使用し rotate()13 の動作確認13

13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 leftMotorrotate(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 331 rotate() メソッドを使用したプログラムを実装し実

行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 34: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3413

次にrotateTo() メソッドについて説明しますrotateTo() メソッドは内

部的に保持されているタコカウントの値に依存して回転 (モータの回転に

応じて変化) します2

まず始めに停止状態から①rotateTo(360)を指定し実行行しますすると1

回転します次に②で同じ場所で再び rotateTo(360)を実行行しますこの時

既にタコカウントの値が 360の場所にあり目的の場所にいるため回転

はしません最後に③のように rotateTo(0)を指定すると最初にいた場所

に移動しますモータの現在の位置情報はMotorgetTachoCount()メソッ

ドで取得する事ができますこのように現在の位置情報を交えてモータを制

御したい場合にはrotateTo()メソッドを使用します

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 213 rotate()を実行行しても内部的にタコカウントは増減します13

図 13 27rotateTo()13 メソッドの詳細

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 35: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3513

rotateTo() メソッドの動作確認を行行うために下記のコードを実装してプ

ログラムをビルドデプロイ実行行してください

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor2()13 13 13 13 13 13 13 13 13 13 rightMotor13 を使用して13 rotateTo()13 の動作確認13

13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ①の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(360)13 13 ②の確認13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 13 rightMotorrotateTo(0)13 13 13 13 ③の確認13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 332 rotateTo() メソッドを使用したプログラムを実装

し実行行してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 36: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3613

ここまででrotate() rotateTo() メソッドの基本的な利利用方法についてま

なびました

rotate() rotateTo() メソッドは上記で紹介したようにメソッド引数に1

つ指定可能(角度度を指定)なメソッドの他それぞれ引数を2つ指定可能

なメソッドも用意されています

l void rotate(int angle boolean immediateReturn)

l void rotateTo(int limitAngle boolean immediateReturn)

これらのメソッドの2つ目の引数で指定可能な値は真偽値をとる boolean

ですがimmediateReturn の値に true を指定すると回転処理理の命令令を実

行行した直後に別の処理理を行行う事ができるようになります例例えば2つのモー

タが存在し同時に2つのモータを回転させたい場合等に有効ですまた

false を指定するとモータの回転が完了了するまで処理理をブロックして待ちます

同時にではなく一つのモータの回転処理理が終わった後にもう片方のモー

タを制御したい場合やモータの回転が終わるまで他の処理理を行行わせないよ

うな場合に有効です

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanageMotor3()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 manageMotor3()13 13 13 13 13 13 13 13 13 13 2つの引数を持つメソッドの動作確認13

13 13 13 13 13 13 13 13 同時に回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 true)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 37: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3713

13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 rightMotorrotate(36013 false)13 13 13 13 13 13 13 13 13 DelaymsDelay(2000)13 13 13 13 13 13 13 13 13 片車車輪輪ずつ回転13 13 13 13 13 13 13 13 13 leftMotorrotate(360)13 13 13 13 13 13 13 13 13 rightMotorrotate(360)13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

演習 333 引数が2つのメソッドで実装し各設定における振

る舞いについて確認してください 追加課題

113 rotate() を使用してLEGO Mindstorms を 150 cm 移動させて停止

するプログラムを作成してください

ご参考LEGO Mindstorms の Large Mortor の車車輪輪

Oslash 車車輪輪の直径 56cm

Oslash 円周=56 314 = 17584cm

213 150 cm 移動した所で LEGO Mindstorms を 90度度回転させさらに

180 cm移動するプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 38: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3813

4 ハイレベルな方法で LEGO Mindstorms カーを制御

leJOS が提供する API は上記にご紹介した forward backward rotate

rotateTo の他に別の方法でモータを操作可能です実際には LEGO

Mindstorms を車車と見見立立ててその動きを制御する事も可能ですこれを実現

するためにleJOS の API では DifferentialPilot クラスが用意されています

DifferentialPilot クラスはインスタンスを生成する際車車輪輪の直径と車車

輪輪間の距離離を指定する事で前述した車車輪輪の操作ではなくLEGO

Mindstorms 全体に対する制御がより簡単にできるようになります例例えば

DifferentialPilottravel(20) を実行行する事で 20cm 前進し

DifferentialPilotrotate(90) を実行行する事で 90度度回転します

図 13 28車輪の直径

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 39: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 3913

教育版 LEGO Mindstorms に付属する車車輪輪の直径は56 cmですまた車車

輪輪間の距離離は 126 cm(コンストラクタでは 132 を指定)でしたこれら

を元にLEGO Mindstorms で 20cm の正方形を描くような動きを行行わせま

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot1()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13

図 13 29車輪間の距離

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 40: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4013

13 13 13 13 private13 void13 managedByPilot1()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 for13 (int13 i13 =13 013 i13 lt13 413 i++)13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilottravel(20)13 13 13 13 13 13 13 13 13 13 13 13 13 pilotrotate(90)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 pilotstop()13 13 13 13 13 13 13

managedByPilot1()メソッドでは20cm 進んだのち 90 度度回転させる処理理

を4回行行いLEGO Mindstorms で四角形を描くような処理理を行行っています

本来 DifferentialPilot クラスのインスタンスを生成する際コンストラ

クタで56 126 を指定すべきですが126 cm を指定した場合

DifferentialPilotrotate(90) を実行行しても丁度度 90度度回転しなかったため

値を調整しコンストラクタでは126 の代わりに 132 とし 90度度曲がる

ようにしていますこれは個体差があるかと想定します

演習 341 DifferentialPilot を使用し20cm 毎に回転させ

4角形を描く動きのプログラムを作成してください

またより細かいナビゲーション操作を行行いたいためには現在の位置座標

の情報を取得しながらLEGO Mindstorms をナビゲートするための便便利利な

Navigation クラスも用意されています座標軸の x軸y軸に移動したい場

所を指定する事でその座標に向かって LEGO Mindstorms が移動します例例

えばNavigation として navigatorgoTo(20 20)のみを記載し実行行した場

合起動直後に斜め 45度度回転し (2020) の場所へ直接移動します

public13 class13 EV3AppMain13 13 13 13 13 13 13 モータ(車車輪輪)13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 41: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4113

13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainmanagedByPilot2()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13 13 13 13 13 private13 void13 managedByPilot2()13 13 13 13 13 13 13 13 13 13 DifferentialPilot13 pilot13 =13 13 13 13 13 13 13 13 13 13 13 new13 DifferentialPilot(56f13 132f13 MotorB13 MotorC)13 13 13 13 13 13 13 13 13 OdometryPoseProvider13 opProvider13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 OdometryPoseProvider(pilot)13 13 13 13 13 13 13 13 13 Navigator13 navigator13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 new13 Navigator(pilot13 opProvider)13 13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 0)13 13 13 13 13 13 13 13 13 navigatorgoTo(2013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 20)13 13 13 13 13 13 13 13 13 navigatorgoTo(013 0)13 13 13 13 13 13 13 13 13 navigatorfollowPath()13 13 13 13 13 13 13 13 13 navigatorwaitForStop()13 13 13 13 13 13 13

演習 342 Navigation を使用し20cm 毎に回転させ4角形

を描く動きのプログラムを作成してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 42: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4213

演習4超音波センサーからの情報取得 前章でモータの制御ができるようになりましたここでは入力力ポート(1 2

3 4) に接続されているセンサー(超音波センサー)から情報を取得します超

音波センサーは左側から音波を発信し右側で音波を受信します

LEGO Mindstorms に付属する超音波センサーは下記2つのモードを搭載し

ています

l 距離離計測モード(Distance)センサーから障害物までの距離離を計測

l 他者検知モード(Listen)他の超音波センサーが近くに存在するか否か

検知

ここで本ハンズオンラボでは距離離計測モードを使用してLEGO

Mindstorms から障害物までの距離離を計測するプログラミングを行行います

付属する超音波センサーは 3cm 〜~ 250 cm までの距離離を計測できますこ

こではまず障害物までの距離離をコンソール上に表示させます次に障害

物までの距離離が 20 cm 以上 250 cm までの場合LED に緑色を点灯さっせ

20 cm より短い距離離になった場合LEDに橙色を点灯させますさらに 10

cm より短い距離離になった場合LED に赤色を点灯させるプログラムを作っ

ていきます

下記のコードを実装しアプリケーションをビルドデプロイ後アプリケ

ーションを実行行してくださいプログラムを停止する際は「中央ボタン+

下ボタン」を同時に押下してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 43: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4313

public13 class13 EV3AppMain13 13 13 13 超音波センサー13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 maintestSensor()13 13 13 13 13 13 13 13 13 13 超音波センサーを利利用して障害物までの距離離を計測13 13 13 13 13 13 13 13 private13 void13 testSensor()13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 ursensorgetDistanceMode()13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 超音波センサーの場合 distanceModesampleSize()は必ず 113 13 13 13 13 while13 (true)13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 if13 (centimeter13 gt13 313 ampamp13 centimeter13 lt=13 10)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (213 centimeter)13 13 赤色点灯13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 1013 ampamp13 centimeter13 lt=13 20)13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (313 centimeter)13 橙色点灯13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 centimeter13 lt=13 250)13 13 13 13 13 13 13 13 13 13 executeIndividualOperation13 (113 centimeter)13 緑色点灯13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 44: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4413

超音波センサーから情報を取得するためには EV3UltrasonicSensor クラスを

利利用します入力力ポート 4 に超音波センサーを接続している場合

SensorPortS4 を指定しEV3UltrasonicSensor クラスのインスタンスを

生成しますEV3UltrasonicSensor には計測や検知等を行行うための機能が提

供されていないため別途計測や検知を行行う為にモードを使用して行行いま

すEV3UltrasonicSensor センサーでは前述したように2つのモードが利利用

可能です今回は距離離計測を行行うためgetDistanceMode()で使用しまず

各モードの実装は必ず SampleProvider インタフェースを実装したクラスと

して提供されていますそこでgetDistanceMode() メソッドを実行行する事

で SampleProvider を実装したクラスのインスタンスを取得できます

13 下記のソースコードを確認するとgetDistanceMode() の実行行結果

DistanceMode クラスのインスタンスが返されます

public13 class13 EV3UltrasonicSensor13 extends13 UARTSensor13 13 hellip 中略略 13 13 SampleProvider13 getDistanceMode()13 13 13 13 13 13 if13 (distanceMode==null)13 13 13 13 13 13 13 13 distanceMode=new13 DistanceMode()13 13 13 13 13 13 13 13 13 13 13 return13 distanceMode13 13 13 13 13 13 13 13 private13 class13 DistanceMode13 implements13 SampleProvider13 13 13 13 private13 static13 final13 int13 MODE=013 13 13 private13 static13 final13 float13 toSI=0001f13 13 13 13 Override13 13 13 public13 int13 sampleSize()13 13 13 13 13 13 return13 113 13 13 13 13 13 13 Override13 13 13 public13 void13 fetchSample(float[]13 sample13 int13 offset)13 13 13 13 13 13 if13 (currentMode13 ==13 DISABLED)13 return13 13 13 13 13 13 13 switchMode(MODESWITCHDELAY)13 13 13 13 13 13 13 int13 raw=portgetShort()13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 45: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4513

13 13 13 13 13 13 sample[offset]=13 (raw==2550)13 13 FloatPOSITIVE_INFINITY13 13 (float)rawtoSI13 13 13 13 13 13 13 13 13

上記よりSampleProvider を実装したクラスのインスタンスを取得したの

でfetchSample() メソッドを使用してセンサーの情報を取得します

13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13

fetchSample(float[] sample int offset) メソッドの引数にはセンサーか

ら受け取った情報を格納する float[] の配列列と配列列の何番目にデータを保持

するかのオフセットを指定しますそこでvalue[] 配列列として

DistanceModesampleSize() の長さを持つ float[] 配列列を用意しその要

素の0番目にセンサーからの情報を格納する事とします

13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)

センサーから取得した情報はvalue[] 配列列の 0番目に格納されています

格納される情報はfloat 型 (浮動小数) の値で1 メータが 100000 とし

て格納されていますこれをセンチメートルで int 型 (整数) として表示す

るため 100倍した後int 型にキャストします

private13 void13 executeIndividualOperation(int13 pattern13 13 int13 centimeter)13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13

最後に条件に応じてLED ボタンの色を変更更し結果を表示させます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 46: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4613

演習 41 超音波センサーから情報を取得するプログラムを実装

し実行行してください 追加課題

1 このプログラムをマルチスレッド(ExecutorService Executors

Runnable を利利用)で実装してください

Oslash 上記では距離離情報を取得するためmain() メソッドでwhile 文

を記述し無限ループで 100 ミリ秒毎に距離離情報を取得しています

そのためこのプログラムを実行行すると距離離の計測以外の操作が一切切

できなくなってしまいます複数の操作を同時に行行うためには別

途スレッドを作成し別スレッドで監視を行行う必要があります

Java のマルチスレッドの実装方法が分からない場合はそのまま演習

5へお進みください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 47: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4713

演習5モータ超音波センサー連携プログラム ここまででモータや超音波センサーを使用して入出力力ポートからの情報を

取得制御ができるようになりました本章では入出力力の情報を組み合わ

せて LEGO Mindstorms を制御するプログラムを作成します具体的には

超音波センサーを使用して LEGO Mindstorms から障害物までの距離離を測定

し障害物までの距離離が 30 cm 以下になった場合にスピードを低下させ

警告として LED に橙色の点滅表示を行行いますさらに障害物までの距離離が

10 cm 以下になった場合衝突をさけるために自動的に LEGO Mindstomrs

を停止させ 90度度回転させますこれによりお掃除ロボットのような振る

舞いをする LEGO Mindstorms を作る事ができます

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 48: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4813

1 並列列処理理タスクの実装

前章の演習4で追加課題をクリアされた方はRunnable インタフェースを

実装したクラスを作成しているかと想定します作成した Runnable インタ

フェースを下記のように修正してくださいまた追加課題をされていない

場合新たに下記のクラスを作成してコードを実装してください

package13 comyoshio3legomindsensorImpl13 13 import13 lejoshardwareButton13 import13 lejoshardwarelcdLCD13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 import13 lejosroboticsSampleProvider13 import13 lejosutilityDelay13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 UltrSensorImpl13 implements13 Runnable13 13 13 13 13 13 13 センサーモータ13 13 13 13 13 private13 final13 EV3UltrasonicSensor13 ursensor13 13 13 13 13 private13 final13 RegulatedMotor13 leftMotor13 13 13 13 13 private13 final13 RegulatedMotor13 rightMotor13 13 13 13 13 障害物までの距離離のしきい値13 13 13 13 13 private13 final13 static13 int13 MAX_LENGTH13 =13 25013 13 13 13 13 private13 final13 static13 int13 CRITICAL_LENGTH13 =13 1013 13 13 13 13 private13 final13 static13 int13 WARN_LENGTH13 =13 2013 13 13 13 13 13 警告レベル(LED13 の点灯色と同一)13

13 13 13 13 private13 final13 static13 int13 DEFAULT_LEVEL13 =13 413 13 緑色の点滅13

13 13 13 13 private13 final13 static13 int13 CRITICAL_LEVEL13 =13 513 赤色の点滅13

13 13 13 13 private13 final13 static13 int13 WARNING_LEVEL13 =13 613 13 橙色の点滅13 13 13 13 13 13 スレッドの停止フラグ13 13 13 13 13 private13 volatile13 boolean13 shutDownFlag13 13 13 13 13 13 以前の状態13 13 13 13 13 private13 volatile13 int13 previousStatus13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 49: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 4913

13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 UltrSensorImpl(EV3UltrasonicSensor13 ursensor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 leftMotor13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 RegulatedMotor13 rightMotor)13 13 13 13 13 13 13 13 13 13 thisleftMotor13 =13 leftMotor13 13 13 13 13 13 13 13 13 thisrightMotor13 =13 rightMotor13 13 13 13 13 13 13 13 13 thisursensor13 =13 ursensor13 13 13 13 13 13 13 13 13 thisshutDownFlag13 =13 false13 13 13 13 13 13 13 13 13 previousStatus13 =13 013 13 13 13 13 13 13 13 13 13 13 タスク処理理の実装13 13 13 13 13 Override13 13 13 13 13 public13 void13 run()13 13 13 13 13 13 13 13 13 13 SampleProvider13 distanceMode13 =13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ursensorgetDistanceMode()13 13 13 13 13 13 13 13 13 float13 value[]13 =13 new13 float[distanceModesampleSize()]13 13 13 13 13 13 13 13 13 13 while13 (shutDownFlag)13 13 13 13 13 13 13 13 13 13 13 13 13 13 distanceModefetchSample(value13 0)13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter13 =13 (int)13 (value[0]13 13 100)13 13 13 13 13 13 13 13 13 13 13 13 13 1mが 100013 (MIN3cm13 MAX250cm)13 13 13 13 13 13 13 13 13 13 13 13 13 13 if13 (centimeter13 lt=13 CRITICAL_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(CRITICAL_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 危険(回避)13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (centimeter13 gt13 CRITICAL_LENGTH13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 WARN_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(WARNING_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 ワーニング13 13 13 13 13 13 13 13 13 13 13 13 13 13 else13 if13 (IntegerMAX_VALUE13 =13 centimeter13 ampamp13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter13 lt=13 MAX_LENGTH)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 executeIndividualOperation(DEFAULT_LEVEL13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 centimeter)13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 DelaymsDelay(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 50: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5013

13 13 13 13 各しきい値に対する処理理13 13 13 13 13 private13 void13 executeIndividualOperation(int13 pattern13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 int13 centimeter)13 13 13 13 13 13 13 13 13 13 LCDclearDisplay()13 13 13 13 13 13 13 13 13 LCDdrawString(Distance13 13 13 +13 centimeter13 013 0)13 13 13 13 13 13 13 13 13 13 前回の処理理を行行った時と同じステータスの場合は距離離を表示13 13 13 13 13 13 13 13 13 if13 (previousStatus13 ==13 pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 return13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 前回の処理理と違うステータスの場合下記を実行行13 13 13 13 13 13 13 13 13 ButtonLEDPattern(pattern)13 13 13 13 13 13 13 13 13 switch13 (pattern)13 13 13 13 13 13 13 13 13 13 13 13 13 13 case13 DEFAULT_LEVEL13 13 正常13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 CRITICAL_LEVEL13 13 危険で LEGOを回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorrotate(36013 +13 7913 false)13 90度度左回転13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorwaitComplete()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 case13 WARNING_LEVEL13 警告スピードを低下13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(100)13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 default13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 break13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 previousStatus13 =13 pattern13 13 13 13 13 13 13 13 13 13 13 スレッド処理理を停止13 13 13 13 13 public13 void13 stop()13 13 13 13 13 13 13 13 13 13 shutDownFlag13 =13 true13 13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 51: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5113

このクラスはマルチスレッドで動作する並列列処理理タスクです通常並

列列処理理用のタスクはRunnable インタフェースもしくは Callable インタ

フェースを実装したクラスで表します今回ここでは Runnable インタフ

ェースを実装したクラスとして並列列処理理タスクを実装しています

Runnable インタフェースには13 public13 void13 run()13 メソッドが定義されて

おりこの13 run()13 メソッド中に並列列処理理内容を記述しますここでは前

章で実装した超音波センサーからの情報取得用のコードをメソッド内に記載

し障害物からの距離離に応じて executeIndividualOperation()メソッド

へ処理理を委譲しています 13 executeIndividualOperation()メソッドでは正常時警告時危険時の

3つの状態を持ちそれぞれでスピード変更更回転スピード低下処理理等を

実装しますこのメソッドを実装する上で注意しなければならない事は本

メソッドは前述した13 public13 void13 run()メソッドの while文中から 100ミ

リ秒毎に定期的に呼び出されていますしかし呼び出される度度に毎回上記

のようなスピード変更更処理理をくり返し呼び出したいわけではありません現

在の LEGO13 Mindstormsの状況(正常時警告時危険時)と以前の LEGO13

Mindstormsの状況を比較し変わった場合のみ処理理を継続させたいと考え

ますこれを実現するために新たにインスタンス変数 previousStatusを

定義し現在の状況と一つ前の状況が同じ状態か否かを判定し異異なる状態

に変化した場合のみ処理理を継続させるように実装します13 13

演習 51 並列列処理理タスクを実装してください13

13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 52: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5213

2 メインメソッドの実装

次にメインメソッド内から作成した並列列処理理タスクを実行行するための実装

を行行います

package13 comyoshio3legomind13 13 import13 comyoshio3legomindsensorImplUltrSensorImpl13 import13 javautilconcurrentExecutorService13 import13 javautilconcurrentExecutors13 import13 lejoshardwareBrickFinder13 import13 lejoshardwareKeys13 import13 lejoshardwareev3EV313 import13 lejoshardwaremotorMotor13 import13 lejoshardwareportSensorPort13 import13 lejoshardwaresensorEV3UltrasonicSensor13 import13 lejosroboticsRegulatedMotor13 13 13 13 13 13 13 author13 Yoshio13 Terada13 13 13 public13 class13 EV3AppMain13 13 13 13 13 13 13 超音波センサー13 13 13 13 13 private13 static13 final13 EV3UltrasonicSensor13 ursensor13 =13 13 new13 EV3UltrasonicSensor(SensorPortS4)13 13 13 13 13 車車輪輪モータ13 13 13 13 13 private13 static13 final13 RegulatedMotor13 leftMotor13 13 =13 MotorB13 13 13 13 13 private13 static13 final13 RegulatedMotor13 rightMotor13 =13 MotorC13 13 13 13 13 13 並列列処理理用のサービス13 13 13 13 13 private13 ExecutorService13 exec13 13 13 13 13 private13 UltrSensorImpl13 ulsensor13 13 13 13 13 13 コンストラクタ13 13 13 13 13 public13 EV3AppMain()13 13 13 13 13 13 13 13 13 13 leftMotorresetTachoCount()13 13 13 13 13 13 13 13 13 rightMotorresetTachoCount()13 13 13 13 13 13 13 13 13 leftMotorsetSpeed(400)13 13 13 13 13 13 13 13 13 rightMotorsetSpeed(400)13 13 13 13 13 13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 53: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5313

13 13 13 13 13 メインメソッド13 13 13 13 13 public13 static13 void13 main(String13 argv)13 13 13 13 13 13 13 13 13 13 EV3AppMain13 main13 =13 new13 EV3AppMain()13 13 13 13 13 13 13 13 13 mainexecuteConcurrentTask()13 13 13 13 13 13 13 13 13 mainonKeyTouchExit()13 13 13 13 13 13 13 13 13 13 マルチスレッドでタスクを実行行13 13 13 13 13 private13 void13 executeConcurrentTask13 ()13 13 13 13 13 13 13 13 13 13 exec13 =13 ExecutorsnewSingleThreadExecutor()13 13 13 13 13 13 13 13 13 ulsensor13 =13 13 13 13 13 13 13 13 13 13 13 13 new13 UltrSensorImpl(ursensor13 leftMotor13 rightMotor)13 13 13 13 13 13 13 13 13 execsubmit(ulsensor)13 13 13 13 13 13 13 13 13 leftMotorforward()13 13 13 13 13 13 13 13 13 rightMotorforward()13 13 13 13 13 13 13 13 13 13 停止処理理13 13 13 13 13 private13 void13 onKeyTouchExit()13 13 13 13 13 13 13 13 13 13 EV313 ev313 =13 (EV3)13 BrickFindergetLocal()13 13 13 13 13 13 13 13 13 Keys13 keys13 =13 ev3getKeys()13 13 13 13 13 13 13 13 13 keyswaitForAnyPress()13 13 13 13 13 13 13 13 13 13 leftMotorstop()13 13 13 13 13 13 13 13 13 rightMotorstop()13 13 13 13 13 13 13 13 13 ursensordisable()13 13 13 13 13 13 13 13 13 ulsensorstop()13 13 13 13 13 13 13 13 13 execshutdownNow()13 13 13 13 13 13 13 13 13 Systemexit(0)13 13 13 13 13 13 13

作成した並列列処理理タスクを実行行している箇所は

executeConcurrentTask()メソッドの部分ですここでは新しくスレッドを

シングルスレッドとして作成しRunnable インタフェースの実装クラスで

ある UltrSensorImpl クラスのインスタンスを submit() し実行行しています

実行行することで超音波センサーから取得した障害物までの距離離数に応じてモ

ータに対する処理理内容を変更更しますスレッドを起動した後に両モータを回

転させますまたキーが押された際にスレッド処理理を停止するために

onKeyTouchExit() メソッドにスレッド停止処理理を追記しています

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 54: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5413

演習 52 メインメソッドから並列列処理理タスクを呼び出すコー

ドを実装し実行行してください13

以上でleJOS を使用した LEGO Mindstorms の演習は終了了ですここでご

紹介した演習内容をヒントにご自身のプログラムを作成してください

leJOS の API

httpwwwlejosorgev3docs

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 55: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5513

Appendix1 Java SE 8 対応 leJOS 環境構築手順 ここではleJOS 環境の構築手順の詳細を紹介します

1 必須ソフトウェアの確認入手

本ハンズオンラボを行行うためには下記のソフトウェアが必要です

デスクトップ環境

13 Java SE 78 の入手

httpwwworaclecomtechnetworkjavajavasedownloadsin

dexhtml

図 13 30 Java13 SEの入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 56: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5613

13 統合開発環境

本ハンズオンラボでは NetBeans 80 を使用しますしかし

Maven をサポートする統合開発環境であれば任意の IDE 上で本ハン

ズオンラボを行行う事が可能と想定されます NetBeans 80 は下記

よりダウロードしてください

httpsnetbeansorgdownloads

図 13 31NetBeans13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 57: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5713

LEGO Mindstorms EV3 の環境

13 leJOS(ファームウェア)

leJOS は LEGO Mindstorms EV3 を Java で制御する事が可能なフ

ァームウェアで下記より入手可能です本ハンズオンラボでは

執筆時の最新バージョンである 081-‐‑‒beta のバージョンを使用しま

すhttpsourceforgenetprojectslejosfileslejos-‐‑‒EV3

図 13 32最新版 13 13 leJOS13 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 58: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5813

l LEGO Minstorms 用の JRE(Java 実行行環境)

leJOS 用の JRE を下記より入手してください本ハンズオンラボ

では Java SE Embedded 8 を使用します

httpwwworaclecomtechnetworkjavaembeddeddownloa

dsjavasejavaseemeddedev3-‐‑‒1982511html

図 13 33 Java13 SE13 Embedded13 813 の入手先

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 59: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 5913

2 環境構築手順

leJOS の環境構築は下記の手順に従います

113 ブート可能な FAT32のマイクロ SDカードの作成(デスクトップ環境)

213 マイクロ SD カードへ leJOS のインストール(デスクトップ環境)

313 マイクロ SD カードから起動 (LEGO Mindstorms)

413 leJOS で WiFi 設定 (LEGO Mindstorms)

513 ローカル Maven レポジトリに必要ライブラリをインストール(デスク

トップ環境)

613 Maven プロジェクトの作成

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 60: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6013

1 ブート可能な FAT32のマイクロ SD カードを作成 (デスクトップ環境)

FAT 32 でフォーマットしたブート可能なマイクロ SD カードを作成してく

ださいFAT 32 でフォーマットをしていない場合起動できないなどの問

題が発生する可能性もあります

Mac OSX の場合「アプリケーション」rarr「ユーティリティ」rarr「ディス

クユーティリティ」を実行行して作成できます「パーティションのレイアウ

ト」から「1パーティション」を選択し「パーティション情報」に「名前」

を記入してください

次に「オプションhellip」ボタンを押下してくださいすると下記のウィンドウ

が表示されますここで「マスターブートレコード」にチェックされ

ている事を確認し「OK」ボタンを押下してください最後に「適用」ボタン

を押下してください押下すると下記の画面が表示されます

図 13 34Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 61: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6113

ここで「パーティション」ボタンを押下してください押下すると FAT 32

フォーマットに対応した Micro SD カードができます

図 13 35Mac13 OSX13 のディスクユーティリティ 13

図 13 36Mac13 OSX13 のディスクユーティリティ 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 62: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6213

2 マイクロ SD カードへ leJOS のインストール (デスクトップ環境)

Micro SD カードができましたのでSD カードに leJOS をインストールしま

すまずはデスクトップ環境上で事前に入手した leJOS_EV3_081-‐‑‒

betatargz を展開してください

gt13 tar13 xvf13 leJOS_EV3_081-shy‐betatargz13 gt13 ls13 COPYING13 READMEmd13 bin13 lejosimagezip13 lib13 sampleszip13 sd500zip13

展開すると lejosimagezip が存在しますのでこのファイルを SD にコピ

ーしてくださいここでは先ほど作成した SD カードが VolumesLEGO-‐‑‒

PART にマウントされている事としますファイルをコピーした後SD カ

ード内で lejosimagezip を展開してください

gt13 cp13 lejosimagezip13 VolumesLEGO-shy‐PART13 gt13 cd13 VolumesLEGO-shy‐PART13 gt13 unzip13 lejosimagezip13 Archive13 lejosimagezip13 creating13 lejos13 creating13 lejosbin13 inflating13 lejosbinpartitionsh13 inflating13 lejosbinpartfuncssh13 inflating13 lejosbininstallsh13 inflating13 lejosbinfuncssh13 inflating13 lejosbinspinnersh13 inflating13 lejosbinchecksh13 creating13 lejosimages13 inflating13 lejosimageslejoslogoev3i13 inflating13 lejosimagebz213 inflating13 uImage13 inflating13 uImageStandard13 extracting13 version13 13 13 展開した後の13 SD13 カードのディレクトリ構成13 13 ls13 -shy‐F13 lejos13 lejosimagebz213 lejosimagezip13 uImage13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 63: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6313

uImageStandard13 version13

次に Java SE 8 で LEGO Mindstorms を稼働させるためにJava SE

Embedded 8 を入手しLEGO Mindstorms 用の JRE を jrecreatesh コマ

ンドを利利用して作成してください3

gt13 tar13 xvfz13 ejdk-shy‐8-shy‐fcs-shy‐b132-shy‐linux-shy‐arm-shy‐sflt-shy‐03_mar_2014targz13 gt13 cd13 ejdk18013 gt13 ls13 bin13 lib13 linux_arm_sflt13 gt13 cd13 bin13 gt13 jrecreatesh13 -shy‐vm13 all13 -shy‐d13 tmpejre18013 Options13 13 ejdk-shy‐home13 UsersUSER_NAMEDownloadsejdk18013 dest13 tmpejre18013 target13 linux_arm_sflt13 vm13 all13 runtime13 jre13 debug13 false13 keep-shy‐debug-shy‐info13 false13 no-shy‐compression13 false13 dry-shy‐run13 false13 verbose13 false13 extension13 []13 13 を使用して JREを作成しています13 13 ターゲット JREサイズは 4552313 KBです(ディスクの使用量量はこれより多い

ことがあります)13

埋込み JREが正常に作成されました13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 313 Java SE Embedded 7 までは LEGO Mindstorms 用に専用の JRE を提供

していましたがJava SE Embedded 8 からは JRECreate コマンドを利利用

して自身で JRE を作成しなければならなくなりました13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 64: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6413

LEGO Mindstorms 用の Java SE 8 用の JRE を作成しましたのでこれを

Micro SD カードへコピーしますコピーをする前にtargz のアーカイブ

を作成しアーカイブをコピーしてください

gt13 cd13 tmp13 gt13 ls13 ejre18013 gt13 tar13 cvf13 ejre180tar13 ejre18013 a13 ejre18013 a13 ejre180bin13 a13 ejre180bom13 a13 ejre180lib13 a13 ejre180release13 a13 ejre180libarm13 helliphelliphellip省省略略13 gt13 gzip13 -shy‐c13 ejre180tar13 gt13 ejre180targz13 gt13 cp13 ejre180targz13 VolumesLEGO-shy‐PART13

以上で準備は完了了ですマイクロ SD カードをアンマウントしてシステム

から取り出してください

取り出した後LEGO Mindstorms EV3 にマイクロ SD カードを挿入してく

ださいまたその際WiFi の USB アダプタも USB ポートに挿入してくだ

さい

13 13 13 13 13

図 13 37Micro13 SD13 カードと WiFi13 アダプタの挿入 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 65: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6513

3 マイクロ SD カードから起動 (LEGO Mindstorms EV 3 で実施)13

LEGO MindStorm に SD カードが挿入されている事を確認しLEGO

Mindstorms の中央ボタンを押して起動してくださいすると自動的に

Linux 環境の構築(ファイルシステム構築等も含む)や Java 環境の構築を実施

します (作業終了了まで約 8 分)

LEGO Mindstorms はインストールや設定が完了了すると自動的に再起動しま

す正常に起動が完了了すると大きなブザー音が鳴った後leJOS のメニュー

画面が表示されます

図 13 38 leJOS13 の起動時のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 66: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6613

正常に起動すると下記の画面が表示されます

図 13 39 leJOS13 起動直後のコンソール表示 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 67: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6713

4 leJOS で WiFi 設定

WiFi の設定はleJOS のコンソールメニューより左右のボタンを押下し

WiFi の設定マークを選択して行行います選択すると接続可能なアクセスポ

イントの一覧が表示されます

WiFi の設定アイコン

接続可能な SSID の一覧より自身の適切切なアクセスポイントを選択してく

ださい

図 13 40WiFi13 の設定 13 -shy‐13 SSID13 13 一覧 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 68: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6813

選択すると下記のパスワード入力力画面が出てきます

ここでアクセスポイントに接続するため WEP のパスワードを入力力しま

す基本的にはキーボード配列列と同様にローマ字が並んでいますので適切切

なパスワード文字を入力力してください

画面の一番最下行行に特別な命令令用の文字 (UlxD) が記載されていますそ

れぞれの意味は下記の通りです

Oslash U 大文字に変換 (Upper)

Oslash l 小文字に変換 (lower)

Oslash x 1 文字消去

Oslash D 設定終了了 (Done)

パスワードを正しく入力力した後D を押下するとアクセスポイントへ接続が

できますメニュー画面でIP アドレス 10011 と記載された行行の下側に

割り当てられた IP アドレス(ここでは 1921681100)が記載されています

のでこの IP アドレスで接続できるようになります接続できるようにな

っているかどうかを確認するためにTELNET でログインをして確認してく

ださい

図 13 41パスワード入力画面 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 69: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 6913

gt13 telnet13 192168110013 Trying13 1921681100hellip13 Connected13 to13 192168110013 Escape13 character13 is13 lsquo^]rsquo13 13 _____13 _13 _13 ___13 |13 _13 |_13 _13 _|13 |___|13 |13 __|13 |13 _|13 |13 |13 13 |13 13 |13 |13 _|13 |__|__|___|___|___|_|_|13 13 Rudolf13 20110113 EV313 13 login13 root13 rootEV3~13

正常にWiFi 設定ができている場合上記のようなログインプロンプトが

表示されますここで login 名に root を入力力しパスワードは未入力力(ノ

ンパスワード)でエンターキーを押下してくださいすると LEGO

Mindstorms にログインができるようになります

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 70: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7013

5 ローカル Maven レポジトリに必要ライブラリをインストール (デスクト

ップ環境)

今回デスクトップでアプリケーションを開発する際統合開発環境として

NetBeans を使用しMaven プロジェクトとしてアプリケーション開発を行行

います

LEGO Mindstorms を制御する Java アプリケーション開発を行行うためには

ev3classesjar と dbusjavajar が必要ですが現在 leJOS 用の Maven レ

ポジトリが存在していないようですそこでこれら2つのファイルをロー

カルの Maven レポジトリに手動でインストールしてください

2つのファイルは leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ

内に含まれています

Oslash ev3classesjar

Oslash dbusjavajar

leJOS_EV3_081-‐‑‒betatargz を展開したディレクトリ配下(libev3)に上

記ファイルが存在するか否か確認してください

gt13 cd13 leJOS_EV3_081-shy‐betalibev313 gt13 ls13 dbusjava-shy‐srczip13 dbusjavajar13 ev3classes-shy‐srczip13 ev3classesjar13

ファイルが存在している場合2つのファイルを mvn コマンドでローカ

ルレポジトリにインストールします

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 71: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7113

下記の 2 つの mvn コマンドを実行行してください仮に mvn コマンドが自

身の実行行パス内に見見つからない場合はNetBeans 付属のmvn コマンドを

ご利利用ください4

gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=ev3classesjar13 13 13 13 -shy‐DgroupId=ev3classes13 -shy‐DartifactId=ev3classes13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0623s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20225713 WIT13 201413 [INFO]13 Final13 Memory13 5M245M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 13 gt13 mvn13 installinstall-shy‐file13 -shy‐Dfile=dbusjavajar13 13 13 13 -shy‐DgroupId=ev3dbus13 -shy‐DartifactId=dbusjava13 -shy‐Dversion=08113 13 13 13 13 -shy‐Dpackaging=jar13 [INFO]13 Scanning13 for13 projectshellip13 [INFO]13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Building13 Maven13 Stub13 Project13 (No13 POM)13 113 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 helliphellip13 中略略13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 BUILD13 SUCCESS13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13 [INFO]13 Total13 time13 0597s13 [INFO]13 Finished13 at13 Tue13 Apr13 2213 20250413 WIT13 201413 [INFO]13 Final13 Memory13 6M310M13 [INFO]13 mdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdashmdash13

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 4例例Windows のデフォルトrdquoCProgram FilesNetBeans 80javamavenbinmvnrdquo

Mac OSX のデフォルト ldquoApplicationsNetBeansNetBeans

80appContentsResourcesNetBeansjavamavenbinmvnrdquo

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 72: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7213

6 Maven プロジェクトの作成 (デスクトップ)

上記でデスクトップ環境でアプリケーションの開発の準備ができましたの

でNetBeans を使用して実際にアプリケーションの開発を始めますアプ

リケーションの開発を行行うために下記の手順に従ってNetBeans のプロジ

ェクトを作成してください

NetBeans のメニューからプロジェクトを作成してくださいまず「ファ

イル(F)」rarr「新規プロジェクト(W)hellip」を選択してください

図 13 42NetBeans13 新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 73: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7313

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます

ここで「カテゴリ (C) 」から「Maven」を選択し「プロジェクト (P) 」

から「Java アプリケーション」を選択し「次へ」ボタンを押下してください

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表

示されますここで「プロジェクト名 (N) 」「プロジェクトの場所

(L) 」「グループ ID (G) 」「バージョン (V) 」「パッケージ

(P) 」に適切切な値を入力力した後最後に「終了了 (F)」ボタンを押下してくだ

さい

図 13 43新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 74: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7413

プロジェクトが正常に作成されるとプロジェクトタブに上記のようなプロ

ジェクトが作成されます

図 13 44新規 13 Java13 アプリケーション 13

図 13 45新規プロジェクトの作成 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 75: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7513

プロジェクトを作成した後「プロジェクトファイル」ディレクトリ配下

に存在するpomxml ファイルを選択して下記の内容を記載してください

ltxml13 version=1013 encoding=UTF-shy‐8gt13 ltproject13 xmlns=httpmavenapacheorgPOM40013 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 xsischemaLocation=httpmavenapacheorgPOM40013 httpmavenapacheorgxsdmaven-shy‐400xsdgt13 13 13 13 13 13 13 13 13 13 ltmodelVersiongt400ltmodelVersiongt13 13 13 13 13 ltgroupIdgtcomyoshio3ltgroupIdgt13 13 13 13 13 ltartifactIdgtLEGOMindltartifactIdgt13 13 13 13 13 ltversiongt10-shy‐SNAPSHOTltversiongt13 13 13 13 13 ltpackaginggtjarltpackaginggt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 13 13 13 ltprojectbuildsourceEncodinggtUTF-shy‐8ltprojectbuildsourceEncodinggt13 13 13 13 13 13 13 13 13 ltmavencompilersourcegt18ltmavencompilersourcegt13 13 13 13 13 13 13 13 13 ltmavencompilertargetgt18ltmavencompilertargetgt13 13 13 13 13 ltpropertiesgt13 13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenwagonltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐sshltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 ltextensiongt13 13 13 13 13 13 13 13 13 ltextensionsgt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 MANIFEST13 ファイルを作成するプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgapachemavenpluginsltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtmaven-shy‐jar-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt24ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmainClassgtcomyoshio3legomindEV3AppMainltmainClassgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltClass-shy‐Pathgthomerootlejoslibev3classesjar13 homerootlejoslibjnausrsharejavajnajarltClass-shy‐Pathgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltmanifestEntriesgt13 13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 76: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7613

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltarchivegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐-shy‐13 scp13 でリモートにコピーするためのプラグイン13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtorgcodehausmojoltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtwagon-shy‐maven-shy‐pluginltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt10-shy‐beta-shy‐5ltversiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtupload-shy‐jarltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltphasegtpackageltphasegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalgtuploadltgoalgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltgoalsgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ~m2settingsxml13 ファイルに

記述したログイン IDパスワードの参照13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltserverIdgtev3-shy‐rootltserverIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lturlgtscp1921681102lturlgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltfromDirgt$projectbasedirtargetltfromDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltincludesgtjarltincludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexcludesgt-shy‐sourcesjarltexcludesgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 lttoDirgthomelejosprogramslttoDirgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltconfigurationgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutiongt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltexecutionsgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltplugingt13 13 13 13 13 13 13 13 13 ltpluginsgt13 13 13 13 13 ltbuildgt13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=ev3classesjar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=ev3classes13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3classesltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtev3classesltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 77: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7713

13 13 13 13 13 13 13 13 13 13 13 13 13 lt-shy‐-shy‐13 ローカルレポジトリにインストールしたファイルへの参照13 13 13 13 13 mvn13 installinstall-shy‐file13 13 13 13 13 13 13 13 13 13 -shy‐Dfile=dbusjavajar13 13 13 13 13 13 13 13 13 13 -shy‐DgroupId=ev3dbus13 13 13 13 13 13 13 13 13 13 -shy‐DartifactId=dbusjava13 13 13 13 13 13 13 13 13 13 -shy‐Dversion=08113 13 13 13 13 13 13 13 13 13 -shy‐Dpackaging=jar13 13 13 13 13 -shy‐-shy‐gt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 13 13 13 13 13 13 13 13 ltgroupIdgtev3dbusltgroupIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltartifactIdgtdbusjavaltartifactIdgt13 13 13 13 13 13 13 13 13 13 13 13 13 ltversiongt081ltversiongt13 13 13 13 13 13 13 13 13 ltdependencygt13 13 13 13 13 ltdependenciesgt13 13 13 13 13 ltnamegtLEGOMind-shy‐MotorWithSensor-shy‐HoLltnamegt13 ltprojectgt13

pomxml の設定ファイルの内ボールド(太字)で示した箇所は変更更可能

ですパッケージ名を変更更したい場合接続する IP アドレスを変更更したい

場合に該当箇所を変更更してください

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213

Page 78: LEGO Mindstorms(leJOS) Hands On Lab

LEGO13 Mindstorms13 (leJOS)13 Hands-shy‐on13 Lab13

13 7813

最後にMaven の設定ファイル (settingsxml) を新規作成し5 下記の内容

を記載してください

ltsettings13 xmlns=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 xmlnsxsi=httpwwww3org2001XMLSchema-shy‐instance13 13 13 13 13 13 13 13 13 13 13 xsischemaLocation=httpmavenapacheorgSETTINGS10013 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 httpmavenapacheorgxsdsettings-shy‐100xsdgt13 13 13 13 13 ltserversgt13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltidgtev3-shy‐rootltidgt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltusernamegtrootltusernamegt13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 ltpasswordgtpasswordltpasswordgt13 13 13 13 13 13 13 13 13 13 13 ltservergt13 13 13 13 13 ltserversgt13 ltsettingsgt13

以上

13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 513 Windows の場合 CUsersUSER_NAMEm2

Mac OSX の場合 ~simm213