Upload
oracle-fusion-middleware
View
1.184
Download
1
Embed Size (px)
DESCRIPTION
This is the Hands on Lab by using leJOS 0.8.1 beta with Java SE 8.
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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