Archive for 4月, 2014

【若い方向け】Java Fan Meeting 2014 のご案内


今日は、若い方(20-30歳)向けの Java イベントのご案内を差し上げます。

5月22日(木)に「Java Day Tokyo 2014」を開催しますが、これに先駆けて、「Java Fan Meeting 2014」を5月16日(金)に開催します。

「Java Fan Meeting 2014」の登録サイト
https://fansfans.jp/campaigns/detail/1332

※ 本イベントへの参加は抽選による受付となります。
 また、本イベントは「ブログ」「Twitter」「Facebook」のうち
 1つ以上をお持ちの方が対象になります。
 応募時のアンケートに必ずご記入ください。

本イベントの趣旨は、若い Java エンジニアの方々と交流を持つ事ですので、若い方を優先とさせて頂きたいと思います。20 – 30代(学生、社会人何れも可)の若手の方の中で、Java に関する情報発信を行っている方、これから情報発信を行いたいと考えている方は是非、お気軽にご登録頂けないでしょうか。

また、JJUG 会員の皆様(ベテランの皆様)の身近にいらっしゃる新人や若手のエンジニアで、これから Java に関する情報発信をしたいと考えている方、新人 Javaエンジニアをご存知な方は是非、本情報をご案内頂けないでしょうか。

参加者には「Java Day Tokyo 2014」の見どころをいち早く紹介します。また、プログラミングロボット教材「教育版レゴ®マインドストー ム」や、子供向け Java教育のためのゲーム開発ツール「Greenfoot」を使った小中学生向けJava教育の取り組みについてもご紹介します。

イベントの最後には軽食と飲物をご用意しておりますので、どうぞお楽しみください。是非奮ってのご応募、お待ちしております!

————————————————
【イベント概要】
■タイトル:「Java Fan Meeting 2014」
■日時:2014年5月16日(金)19:00開場 19:30開始~21:00終了を予定
■会場:日本オラクル株式会社 本社
■住所:東京都港区北青山2-5-8 オラクル青山センター (13階の受付にお越しください)
■地図(URL):http://www.oracle.com/jp/corporate/branch/aoyama-078891-ja.html

■交通案内:地下鉄銀座線 外苑前駅 4B出口より接続 
      地下鉄銀座線・半蔵門線・大江戸線 青山一丁目駅より 徒歩9分
      地下鉄銀座線・半蔵門線・千代田線 表参道駅より 徒歩10分

■参加費用:無料(ソーシャルメディアアカウントをお持ちの方が応募対象になります。)
■募集定員:20名

■参加条件:
※ブログをお持ちの方はイベント内容についての率直なご感想を【2週間程度】で
 ご自身のブログに1記事以上書いていただける方、また当日の様子をTwitterやFacebookで
 投稿してくれる方を募集しています。

 ・ブログ記事について:
  【日本オラクル】のイベントに参加したということが読者にわかるように記載してください。
  (表記の仕方は自由)
  (例)【日本オラクル】のイベントに参加しました。

■注意事項:
※当落にかかわらず、5月9日(金)までにメールにてご連絡いたします。
※当日はお飲み物と軽食をご用意しております。
※当日は、メディア用の撮影が入る場合がございます。予めご了承ください。

※本イベントの注意事項については、Fans:Fansキャンペーンポリシーページをご参照ください。
 http://fansfans.jp/policy/

【主催】 日本オラクル株式会社

2014年4月30日 at 6:45 午後

leJOS + NetBeans 8.0 (Maven) + Java SE Embedded (7 or 8) で LEGO Mindstorms EV3のアプリケーション開発

今日は Java の開発者の皆様に、LEGO Mindstorms EV3 の制御を Java で行うために、環境構築から NetBeans を使用した Java のアプリケーションの開発方法までをご紹介します。LEGO 社は、幅広い年代の子供達に向けて LEGO ブロックを提供しています。最近では私の2歳になる子供も LEGO duplo という幼児向けのレゴで遊んでいます。

今日、ご紹介する「教育版レゴ マインドストームEV3」 は、LEGO Mindstorms を教育目的で使うために開発された製品で、これを使用するとブロックでロボットを作成した後、Java でそのロボットを制御する事もできるようになります。今回、Java でロボット制御を試すために、「教育版レゴ マインドストームEV3 / LEGO Mindstorms Eduation EV3 」の日本の正規代理店である(株)アフレル様のご協力を得て、LEGO Mindstorm を1台お借りし、実際に教育版レゴ マインドストームEV3 用の Java アプリケーションを書いてみました。

● アプリケーションの動作イメージ:

今回、作成した LEGO Mindstorms EV3 のサンプル・アプリケーションのソースコードは GitHub にアップしていますので、ご興味のある方はどうぞご覧ください。
https://github.com/yoshioterada/Java-Sample-app-for-LEGO-Mindstorms

本エントリでは、上記のサンプル・アプリケーションの実装に対する詳細の説明ではなく、Java でプログラムを書く事ができるように環境構築から最初のプログラム作成の部分までをご紹介します。

事前準備:

(1) レゴマインドストーム EV3 の入手

LEGO Mindstorms は 教育版と玩具版があり含まれる内容が異なります。
参考:教育版と玩具版の比較 (アフレル)

教育版
「教育版レゴ マインドストームEV3」の入手 (本エントリではこちらを使用)
販売先情報 :アフレル(株)


玩具版: Amazon 等から
レゴ マインドストーム EV3 31313(¥51,000)
レゴ マインドストーム EV3 31313 LEGO Mindstorms EV3 並行輸入品(¥ 44,320)
LEGO Mindstorms EV3 31313($349.95)

玩具版の レゴも Amazon で $350 〜 ¥51,000と少々高価な商品ですが、対象年齢は 10 歳以上のれっきとした LEGO です。機能的にこれは本当に子供向けなのか?!と思う程、自分でロボットを組み立てたり、そのロボットを制御するプログラムを書けたりと、子供よりも大人が熱中しそうな商品です。今回のエントリは玩具版でもご参考いただけるかと思います。

(2) USB WiFi アダプタの入手

USB の WiFi アダプタは EV3 に標準で付属していませんがあった方がとても便利です。開発時、開発環境から EV3 へネットワークを通じてアプリケーションをデプロイしたり、リモートから EV3 を制御したい場合、WiFi アダプタが必要です。今回、(株)アフレル様のご好意で「Roland Wireless USB Adapter WNA1100-RL」も借りる事ができたため、私はこの WiFi アダプタを使用します。Amazon から WNA1100-RL を購入していただく事も可能です。

その他、EV3 では下記の WiFi の USB アダプタが動作確認されています。特に EDIMAX EW-7811Un は EV3 からあまり突出しないのでオススメです。
動作確認済みの WiFi アダプタ

(3) leJOS 0.8.1 beta の入手


leJOS は LEGO Mindstorms EV3 のファームウェアを変更した OS で、この環境上で Java SE 7 Embedded 7 が稼働し、Java のアプリケーションを動かす事ができるようになります。
leJOS EV3 0.8.1 beta release より leJOS_EV3_0.8.1-beta.tar.gz を入手してください。

(4) Oracle Java SE Embedded の入手

Java for LEGO® Mindstorms® EV3 のサイト(オリジナルJRE入手先)から、Oracle Java SE Embedded を入手してください。
Java SE Embedded 7 の場合:
● ejre-7u55-fcs-b13-linux-arm-sflt-headless-17_mar_2014.tar.gz

Java SE Embedded 8 のインストール方法は、本エントリの最後に記載しています。

(5) 開発環境用 (Mac/Linux/Windows環境) に統合開発環境、Java SE をインストール

デスクトップの開発環境に NetBeans 8 と Java SE 7 をインストールしてください。(今回は各インストール方法の詳細は割愛)

NetBeans の入手はこちらから
Java SE 7 の入手はこちらから

leJOS 環境構築から開発までの手順

LEGO Mindstorms EV3 で Java アプリケーションを動作させるためには、下記の手順に従って行います。


  1. ブート可能なマイクロ SD カードへ leJOS のインストール
  2. ブート可能なマイクロ SD カードから起動
  3. leJOS で WiFi 設定
  4. ローカル Maven レポジトリに必要ライブラリをインストール
  5. Maven プロジェクトの作成
  6. アプリケーションの開発
  7. アプリケーションのビルド/デプロイ
  8. アプリケーションの実行

(0)ブート可能なマイクロ SD カードを作成

ブート可能で FAT 32 でフォーマットしたマイクロ SD カードを作成してください。Mac OS/X の場合、「アプリケーション」→「ユーティリティ」→「ディスクユーティリティ」を実行して作成できます。「パーティションのレイアウト」から「1パーティション」を選択し、「パーティション情報」に「名前」を記入してください。

次に「オプション…」ボタンを押下してください、すると下記のウィンドウが表示されます。ここで、「マスター・ブート・レコード」にチェックされている事を確認し「OK」ボタンを押下してください。

最後に「適用」ボタンを押下してください、押下すると下記の画面が表示されます。ここで「パーティション」ボタンを押下してください。

(1) SD カードへファイルのコピーと展開 (Mac/Linux/Windows 環境で実施)

事前準備の (3) でダウンロードした leJOS_EV3_0.8.1-beta.tar.gz を展開してください。

> tar xvf leJOS_EV3_0.8.1-beta.tar.gz
> ls

COPYING README.md bin lejosimage.zip lib samples.zip sd500.zip

展開すると lejosimage.zip が存在しますので、このファイルと JRE7 を SD にコピーしてください。ファイルをコピーした後、SD カード内で lejosimage.zip を展開してください (※ JRE の展開は不要です)。

> cp ejre-7u55-fcs-b13-linux-arm-sflt-headless-17_mar_2014.tar.gz lejosimage.zip /Volumes/LEGO-PART/
> cd /Volumes/LEGO-PART/
> unzip lejosimage.zip

Archive: lejosimage.zip
creating: lejos/
creating: lejos/bin/
inflating: lejos/bin/partition.sh
inflating: lejos/bin/partfuncs.sh
inflating: lejos/bin/install.sh
inflating: lejos/bin/funcs.sh
inflating: lejos/bin/spinner.sh
inflating: lejos/bin/check.sh
creating: lejos/images/
inflating: lejos/images/lejoslogo.ev3i
inflating: lejosimage.bz2
inflating: uImage
inflating: uImageStandard
extracting: version

# 展開した後の SD カードのディレクトリ構成
# ls -F
ejre-7u55-fcs-b13-linux-arm-sflt-headless-17_mar_2014.tar.gz*
lejos/
lejosimage.bz2*
lejosimage.zip*
uImage*
uImageStandard*
version*

以上で準備は完了です。マイクロ SD カードをアンマウントして、システムから取り出してください。

取り出した後、EV3 にマイクロ SD カードを挿入してください。またその際、WiFi の USB アダプタも USB ポートに挿入してください。

(2)ブート可能なマイクロ SD カードから起動(EV3 で実施)

LEGO MindStorm に SD カードが挿入されている事を確認し、EV3 のボタンを押して起動してください。すると自動的に Linux 環境の構築(ファイルシステム構築等も含む)やJava 環境の構築を実施します。 (作業終了まで:約 8 分)

内部的には下記の処理等が行われています。
1. Resize FAT32 fs
2. Resize Complete
3. Create Linux fs
4. Expand Image
5. Prepare Install
6. Deleting old files
7. Expand Image
8. Start Install
9. Installing rootfs
10. Installing modules
11. Installing leJOS
12. Configure network
13. Install links
14. Install lib jna
15. Copy config files
16. Install jre
17. Extracting jre
18. Optimize java
19. Remove temp files
20. Installing kernel
21. Sync disks
22. Unmount disks
23. Rebooting

EV 3 はインストールや設定が完了すると自動的に再起動します。正常に起動が完了すると大きなブザー音が鳴った後、leJOS のメニュー画面が表示されます。


(3) leJOS で WiFi 設定(EV3 で実施)

WiFi の設定は、WiFi の設定マークを選択して行います。選択すると接続可能なアクセス・ポイントの一覧が表示されます。

自身の適切なアクセス・ポイントを選択してください。選択すると下記の画面が出てきます。

ここで、アクセス・ポイントに接続するため WEP のパスワードを入力します。基本的にはキーボード配列と同様にローマ字が並んでいますので、適切なパスワード文字を入力してください。ここで画面の一番最下行に特別な命令用の文字 (U,l,x,D) が記載されています、それぞれの意味は下記の通りです。大文字のローマ字を入力したい場合は、U を押す等してパスワードを正しく入力してください。

U : 大文字に変換 (Upper)
l : 小文字に変換 (lower)
x : 1文字消去
D : 設定終了 (Done)

パスワードを正しく入力した後、D を押下すると WiFi での接続ができるようになります。EV3 のメニュー画面で、IP アドレス: 10.0.1.1 と記載された行の下側に、割り当てられた IP アドレス(ここでは 192.168.1.100)が記載されていますので、この IP アドレスで EV 3 に接続できるようになります。EV3 に接続できるようになっているかどうかを確認するために、TELNET でログインをして確認してください。

> telnet 192.168.1.100
Trying 192.168.1.100…
Connected to 192.168.1.100.
Escape character is ‘^]’.

_____ _ _ ___
| _ |_ _ _| |___| | __|
| _| | | . | . | | _|
|__|__|___|___|___|_|_|

Rudolf 2011.01 EV3

login: root
root@EV3:~#

正常に、WiFi の設定ができている場合、上記のようなログイン・プロンプトが表示されます。ここで login: 名に root を、パスワードは未入力(ノンパスワード)でエンター・キーを押下してください。すると EV3 にログインができるようになります。

(4) ローカル Maven レポジトリに必要ライブラリをインストール (Mac/Linux/Windows 環境で実施)

今回、統合開発環境には NetBeans を使用し、Maven プロジェクトとしてアプリケーション開発を行います。EV3 を制御する Java アプリケーション開発を行うためには、ev3classes.jar と dbusjava.jar が必要ですが、現在 leJOS 用の Maven レポジトリが存在していないようです。そこで、これら2つのファイルをローカルの Maven レポジトリにインストールしてください。2つのファイルは leJOS_EV3_0.8.1-beta.tar.gz を展開したディレクトリ内に含まれています。

> cd leJOS_EV3_0.8.1-beta/lib/ev3
> ls

dbusjava-src.zip dbusjava.jar ev3classes-src.zip ev3classes.jar

次に、2つのファイルを mvn コマンドでローカル・レポジトリにインストールします。下記の 2 つのコマンドを実行してください。仮に mvn コマンドが自身の実行パス内に見つからない場合は、NetBeans 付属のmvn コマンドをご利用ください。

例:Mac OS/X (Linux) の場合 mvn はデフォルトで下記に存在します。
“/Applications/NetBeans/NetBeans 8.0.app/Contents/Resources/NetBeans/java/maven/bin/mvn”

> mvn install:install-file -Dfile=ev3classes.jar -DgroupId=ev3.classes -DartifactId=ev3classes -Dversion=0.8.1 -Dpackaging=jar
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-pom —
[INFO] Installing /Users/USER_NAME/Downloads/leJOS_EV3_0.8.1-beta/lib/ev3/ev3classes.jar to /Users/USER_NAME/.m2/repository/ev3/classes/ev3classes/0.8.1/ev3classes-0.8.1.jar
[INFO] Installing /var/folders/5x/qqvk50_50xl7jvfhyf9_tdd40000gn/T/mvninstall6910985062740456417.pom to /Users/USER_NAME/.m2/repository/ev3/classes/ev3classes/0.8.1/ev3classes-0.8.1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.623s
[INFO] Finished at: Tue Apr 22 20:22:57 WIT 2014
[INFO] Final Memory: 5M/245M
[INFO] ————————————————————————

> mvn install:install-file -Dfile=dbusjava.jar -DgroupId=ev3.dbus -DartifactId=dbusjava -Dversion=0.8.1 -Dpackaging=jar
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-pom —
[INFO] Installing /Users/USER_NAME/Downloads/leJOS_EV3_0.8.1-beta/lib/ev3/dbusjava.jar to /Users/USER_NAME/.m2/repository/ev3/dbus/dbusjava/0.8.1/dbusjava-0.8.1.jar
[INFO] Installing /var/folders/5x/qqvk50_50xl7jvfhyf9_tdd40000gn/T/mvninstall6420442918254641308.pom to /Users/USER_NAME/.m2/repository/ev3/dbus/dbusjava/0.8.1/dbusjava-0.8.1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.597s
[INFO] Finished at: Tue Apr 22 20:25:04 WIT 2014
[INFO] Final Memory: 6M/310M
[INFO] ————————————————————————

例:Windows の場合 mvn はデフォルトで下記に存在します。
 C:\Program Files\NetBeans 8.0\java\maven\bin

Windows で mvn コマンドをターミナルから実行するために、下記2つの環境変数の設定を行ってください。
● JAVA_HOME を新規追加 : JDK をインストールした場所
● PATH へ追加 : maven コマンドへのパスの追加

上記、環境変数の設定を行った後、lib\ev3 ディレクトリに移動し下記のコマンドを実行してください。※ 大文字、小文字の打ち間違いにご注意ください。

C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3 > mvn install:install-file -Dfile=dbusjava.jar -DgroupId=ev3.dbus -DartifactId=dbusjava -Dversion=0.8.1 -Dpackaging=jar
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-po
m —
[INFO] Installing C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3\db
usjava.jar to C:\Users\USER_NAME\.m2\repository\ev3\dbus\dbusjava.8.1\dbusjava-0
.8.1.jar
[INFO] Installing C:\Users\USER_NAME\AppData\Local\Temp\mvninstall1908329777283214
622.pom to C:\Users\USER_NAME\.m2\repository\ev3\dbus\dbusjava.8.1\dbusjava-0.8.
1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.760s
[INFO] Finished at: Thu Apr 24 19:29:44 JST 2014
[INFO] Final Memory: 5M/155M
[INFO] ————————————————————————
C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3> mvn install:install-
file -Dfile=ev3classes.jar -DgroupId=ev3.classes -DartifactId=ev3classes -Dversion=0.8.1 -Dpackaging=jar

[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-po
m —
[INFO] Installing C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3\ev
3classes.jar to C:\Users\USER_NAME\.m2\repository\ev3\classes\ev3classes.8.1\ev3
classes-0.8.1.jar
[INFO] Installing C:\Users\USER_NAME\AppData\Local\Temp\mvninstall2687157046215461
183.pom to C:\Users\USER_NAME\.m2\repository\ev3\classes\ev3classes.8.1\ev3class
es-0.8.1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.712s
[INFO] Finished at: Thu Apr 24 19:31:49 JST 2014
[INFO] Final Memory: 5M/158M
[INFO] ————————————————————————

(5) Maven プロジェクトの作成 (Mac/Linux/Windows 環境で実施)

NetBeans のメニューからプロジェクトを作成してください。まず、「ファイル(F)」→「新規プロジェクト(W)…」を選択してください。

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます。ここで、「カテゴリ (C) :」から「Maven」を選択し、「プロジェクト (P) :」から「Javaアプリケーション」を選択し「次へ」ボタンを押下してください。

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表示されます。ここで「プロジェクト名 (N) :」、「プロジェクトの場所 (L) :」、「グループ ID (G) :」、「バージョン (V) :」、「パッケージ (P) :」に適切な値を入力した後、最後に「終了 (F)」ボタンを押下してください。

プロジェクトが正常に作成されるとプロジェクト・タブに下記のようなプロジェクトが作成されます。

プロジェクトを作成した後、pom.xml ファイルに下記を記載してください。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yoshio3</groupId>
    <artifactId>LEGOMind</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <build>
        <extensions>
            <extension>
                <groupId>org.apache.maven.wagon</groupId>
                <artifactId>wagon-ssh</artifactId>
                <version>1.0</version>
            </extension>
        </extensions>
        <plugins>
            <!--- MANIFEST ファイルを作成するプラグイン -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.yoshio3.legomind.EV3AppMain</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>/home/root/lejos/lib/ev3classes.jar /home/root/lejos/libjna/usr/share/java/jna.jar</Class-Path>
                        </manifestEntries> 
                    </archive>
                </configuration>
            </plugin>
            <!--- デスクトップからネット経由で jar ファイルをコピーするためのプラグイン -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>wagon-maven-plugin</artifactId>
                <version>1.0-beta-5</version>
                <executions>
                    <execution>
                        <id>upload-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>upload</goal>
                        </goals>
                        <configuration>
                            <!-- ~/.m2/settings.xml ファイルに記述したログインID、パスワードの参照 --> 
                            <serverId>ev3-root</serverId>
                            <!-- EV3 に割り当てられている IP アドレス --> 
                            <url>scp://192.168.1.100/</url>  
                            <fromDir>${project.basedir}/target</fromDir>  
                            <includes>*.jar</includes>  
                            <excludes>*-sources.jar</excludes>
                            <!-- EV3 のコピー先ディレクトリ --> 
                            <toDir>/home/lejos/programs</toDir>  
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>    

    <!-- ローカル・レポジトリにインストールしたファイルへの参照
    mvn install:install-file 
        -Dfile=ev3classes.jar 
        -DgroupId=ev3.classes 
        -DartifactId=ev3classes 
        -Dversion=0.8.1 -Dpackaging=jar
    -->
    <dependencies>
        <dependency>
            <groupId>ev3.classes</groupId>
            <artifactId>ev3classes</artifactId>
            <version>0.8.1</version>
        </dependency>
        
    <!-- ローカル・レポジトリにインストールしたファイルへの参照
    mvn install:install-file 
        -Dfile=dbusjava.jar 
        -DgroupId=ev3.dbus 
        -DartifactId=dbusjava 
        -Dversion=0.8.1
        -Dpackaging=jar
    -->
        <dependency>
            <groupId>ev3.dbus</groupId>
            <artifactId>dbusjava</artifactId>
            <version>0.8.1</version>
        </dependency>
    </dependencies>
</project>

また、Maven の設定ファイル ( ~/.m2/settings.xml (Windows では C:\Users\USER_NAME\.m2)) に下記を記載してください。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                     http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>  
            <id>ev3-root</id>  
            <!---- EV3 の root ログイン ID -->
            <username>root</username>  
            <!---- EV3 の root ログイン パスワード -->
            <password>password</password>
        </server>
    </servers>
</settings>

※ ご注意
pom.xml ファイルを設定、保存後に wagon のライブラリが存在しないため、下記のようにプロジェクトが「ロード不可能」と表示されます。

この場合、プロジェクトを右クリックし、「プロジェクトの問題を解決…」を選択してください(Maven のセントラルレポジトリよりライブラリを入手)。

選択すると下記のウィンドウが表示されます。ここで「解決 (R) …」ボタンを押下してください。

(6) アプリケーションの開発(Mac/Linux/Windows 環境で実施)

Maven プロジェクトを作成したので実際にプログラムを初めてみましょう。今回は上記 pom.xml の MANIFEST ファイルの定義 <manifest> の <mainClass> タグ内でメイン・クラスとしてcom.yoshio3.legomind.EV3AppMain を定義しましたので、このクラスを作成します。また、初めての LEGO Mindstorms のアプリケーション開発ということで、やはり Hello World から初めてみましょう。プロジェクトの中に含まれる「com.yoshio3.legomind」パッケージを右クリックし「新規」→「Java クラス …」を選択してください。

選択すると下記のウィンドウが表示されます。ここで「クラス名 (N) :」に「EV3AppMain」と入力し「終了 (F)」ボタンを押下してください。

クラスを作成すると下記の画面が表示されます。

ここで、「EV3AppMain」クラスに対して、EV 3 のパネルに文字列を表示させ、3 秒程緑色の LED を点滅させるプログラムを下記のように記載します。

package com.yoshio3.legomind;

import lejos.hardware.Button;
import lejos.hardware.lcd.LCD;
import lejos.utility.Delay;

/**
 *
 * @author Yoshio Terada
 */
public class EV3AppMain {

    public static void main(String... argv) {
        //パネルに文字列を表示
        LCD.drawString("Hello World", 0, 0);
        //緑の点滅ボタンを3秒間光らせる(有効値: 0 - 9)
        Button.LEDPattern(4);
        Delay.msDelay(3000);
    }
}

(7) アプリケーションのビルド/デプロイ(Mac/Linux/Windows 環境で実施)

コードを実装した後、プロジェクトをビルドしてください。プロジェクト・タブから「LEGOMind-Sample」プロジェクトを右クリックし「ビルド」を選択してください。

ビルドを行うと下記のメッセージが表示され、org.codehaus.mojo の wagon-maven-plugin を通じて、WiFi のネットワーク経由で自動的に /home/lejos/programs ディレクトリ配下に LEGOMind-1.0-SNAPSHOT.jar ファイルが配備されます。

cd /Users/USER_NAME/NetBeansProjects/LEGOMind; JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home "/Applications/NetBeans/NetBeans 8.0.app/Contents/Resources/NetBeans/java/maven/bin/mvn" install
Scanning for projects...
------------------------------------------------------------------------
Building LEGOMind 1.0-SNAPSHOT
------------------------------------------------------------------------
--- maven-resources-plugin:2.5:resources (default-resources) @ LEGOMind ---
[debug] execute contextualize
Using 'UTF-8' encoding to copy filtered resources.
skip non existing resourceDirectory /Users/USER_NAME/NetBeansProjects/LEGOMind/src/main/resources
--- maven-compiler-plugin:2.3.2:compile (default-compile) @ LEGOMind ---
Nothing to compile - all classes are up to date
--- maven-resources-plugin:2.5:testResources (default-testResources) @ LEGOMind ---
[debug] execute contextualize
Using 'UTF-8' encoding to copy filtered resources.
skip non existing resourceDirectory /Users/USER_NAME/NetBeansProjects/LEGOMind/src/test/resources
--- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ LEGOMind ---
No sources to compile
--- maven-surefire-plugin:2.10:test (default-test) @ LEGOMind ---
Surefire report directory: /Users/USER_NAME/NetBeansProjects/LEGOMind/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
--- maven-jar-plugin:2.4:jar (default-jar) @ LEGOMind ---
Building jar: /Users/USER_NAME/NetBeansProjects/LEGOMind/target/LEGOMind-1.0-SNAPSHOT.jar
--- wagon-maven-plugin:1.0-beta-5:upload (upload-jar) @ LEGOMind ---
Uploading /Users/USER_NAME/NetBeansProjects/LEGOMind/target/LEGOMind-1.0-SNAPSHOT.jar to scp://192.168.1.100///home/lejos/programs/LEGOMind-1.0-SNAPSHOT.jar ...
--- maven-install-plugin:2.3.1:install (default-install) @ LEGOMind ---
Installing /Users/USER_NAME/NetBeansProjects/LEGOMind/target/LEGOMind-1.0-SNAPSHOT.jar to /Users/USER_NAME/.m2/repository/com/yoshio3/LEGOMind/1.0-SNAPSHOT/LEGOMind-1.0-SNAPSHOT.jar
Installing /Users/USER_NAME/NetBeansProjects/LEGOMind/pom.xml to /Users/USER_NAME/.m2/repository/com/yoshio3/LEGOMind/1.0-SNAPSHOT/LEGOMind-1.0-SNAPSHOT.pom
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 4.837s
Finished at: Tue Apr 22 21:09:27 WIT 2014
Final Memory: 11M/312M
------------------------------------------------------------------------

8. アプリケーションの実行(EV3 で実施)

leJOS のメニュー画面より Programs (/home/lejos/programs ディレクトリ)を選択してください。

選択するとデプロイされているファイル一覧が表示されますので、LEGOMind-1.0-SNAPSHOT.jar を選択してください。

選択すると下記の画面が表示されます。そのままエンター・キー(真ん中のボタン)を押下してください。


押下すると下記の Duke が手を振っている画面 (しばらくお待ちください) が表示されます。アプリケーションをロードするまで数秒かかりますのでそのままお待ちください。

アプリケーションがロードされると下記のように実行され、メニューに「Hello World」が表示され、ボタンの LED が緑色に点滅する事を確認できます。

9. LEGO を組み立てて、超音波センサー、タッチ・センサー、モータ(車輪)を取り付けます。

上記で、Java を使って LEGO Mindstorms を制御できる事がわかりました。後は EV3 に LEGO のパーツを組み立てて、超音波センサーやタッチ・センサー、モータ(車輪)などを取り付けて自分オリジナルのロボットを組み立ててみてください。

その後で、下記 GitHub にアップロードしているコード例をご参照いただき実装すると、センサーから受け取った情報を元に EV3 を制御できるようになります。

GitHub にアップしたサンプルは、タッチセンサーに何かがぶつかると車輪が逆方向に回転し、超音波センサーに物を近づけると車輪の回転スピードが遅くなります。最後に EV3 の何らかのボタンを押すとアプリケーションを終了します。
https://github.com/yoshioterada/Java-Sample-app-for-LEGO-Mindstorms

今回私の上記実装では、車輪毎にリスナーを登録しセンサーからの情報に応じて車輪を制御する方法で実装しましたが、leJOS で提供されているサンプルを確認すると、様々な方法で実装ができるようです。是非色々お試しください。

また、調べていてちょっとおもしろかったのが、上記のようにデプロイしなくても、デスクトップの Java アプリケーションからWiFi 経由 (RMI) でリモートのEV3 を制御する事ができるので、これと JavaFX や WebSocket と組み合わせて応用すればスマートフォンや他のデバイスからリアルタイムに EV3 を制御できるようになるのではないかと想定します。

package com.yoshio3.legomind;

import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import lejos.remote.ev3.RMIRegulatedMotor;
import lejos.remote.ev3.RMISampleProvider;
import lejos.remote.ev3.RemoteEV3;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;

/**
 *
 * @author Yoshio Terada
 */
public class RemoteOperation {

    public static void main(String... argv) {
        RemoteEV3 ev3;
        try {
            ev3 = new RemoteEV3("192.168.1.100");
            RMISampleProvider sampleProv = ev3.createSampleProvider("S1", "lejos.hardware.sensor.EV3TouchSensor", "sensor");

            // 車輪の制御 
            RMIRegulatedMotor right = ev3.createRegulatedMotor("B", 'L');
            RMIRegulatedMotor left = ev3.createRegulatedMotor("C", 'L');
            right.resetTachoCount();
            left.resetTachoCount();

            ExecutorService execSvc = Executors.newFixedThreadPool(3);
            execSvc.submit(new RunMotor(right));
            execSvc.submit(new RunMotor(left));

            Future<Float> res = execSvc.submit(new MonitoringTouch(sampleProv));
            if (res.get() == 1.0f) {
                right.stop(true);
                left.stop(true);
            }
        } catch (RemoteException | MalformedURLException | NotBoundException | InterruptedException | ExecutionException ex) {
            Logger.getLogger(RemoteOperation.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

class RunMotor implements Runnable {

    RMIRegulatedMotor motor;

    RunMotor(RMIRegulatedMotor motor) {
        this.motor = motor;
    }

    @Override
    public void run() {
        try {
            motor.setSpeed(400);
            motor.rotate(360 * 20);
            motor.close();
        } catch (RemoteException ex) {
            Logger.getLogger(RunMotor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
...

最後に

leJOS のオリジナルのサイトでは Eclipse でプラグインをインストールし ant を用いて開発する方法が紹介されていました。Eclipse ユーザの方はオリジナル・サイトをご参照いただければ幸いです。一応、私も Eclipse で試しましたが、上記オリジナルサイトの記載内容に従い設定を行う事で Eclipse で開発からデプロイまで行う事ができる所までは確認しました。

普段、私は NetBeans を使用しているため、今回 NetBeans で同様に開発ができないか?!と考え、上記環境設定を行いました。一旦、上記 1 〜 4 までの設定を行うと、以降の開発は 5 〜 8 までを繰り返し行うだけで NetBeans でも簡単に開発ができるようになります。また Eclipse と同様に、ビルドを行った時点で自動的に WiFi 経由でデプロイができるようになるためとても便利です。

どうぞ、Java で LEGO Mindstorms をお楽しみください。

PS.
Java SE 8 のローンチ・イベントで発表された Java SE Embedded で LEGO Mindstorms の説明資料も参考として紹介します。

また、Java Champion の Adam Bien もRun Java 7u40 Embedded on Lego Mindstormsのエントリで leJOS を使用した LEGO Mindstorms の制御のデモも公開していますので併せてご紹介します。

追記メモ2.
Java SE Embedded 8 を使う場合の手順。

1. Oracle Java SE Embedded version 8 の DownLoad

Oracle Java SE Embedded version 8のダウンロード

上記のページ内に下記の記述があります。
Java SE Embedded 8 enables developers to create customized JREs using the JRECreate tool. Starting with Java SE Embedded 8, individual JRE downloads for embedded platforms are no longer provided. To get started, download the bundle below and follow instructions to create a JRE that suits your application’s needs.

これは、Java SE Embedded 8 以降では、Java SE 7 のように個別の JRE を提供しないため、自分専用の JRE を、JRECreate ツールを使って作成する必要がある事が書かれています。

2. Create a Custom JRE with jrecreate

jrecreate コマンドを使用してカスタムの JRE を作成してください。

※ jrecreate コマンドの引数の詳細は下記をご参照ください。
jrecreate Options

上記、説明内容に従って、カスタムの JRE を作成してください。

> tar xvfz ejdk-8-fcs-b132-linux-arm-sflt-03_mar_2014.tar.gz
> cd ejdk1.8.0/
> ls
bin lib linux_arm_sflt
> cd bin
> ./jrecreate.sh -vm all -d /tmp/ejre1.8.0
Options {
ejdk-home: /Users/USER_NAME/Downloads/ejdk1.8.0
dest: /tmp/ejre1.8.0
target: linux_arm_sflt
vm: all
runtime: jre
debug: false
keep-debug-info: false
no-compression: false
dry-run: false
verbose: false
extension: []
}
を使用してJREを作成しています

ターゲットJREサイズは45,523 KBです(ディスクの使用量はこれより多いことがあります)。
埋込みJREが正常に作成されました
> cd /tmp/
> ls
ejre1.8.0
> tar cvf ejre1.8.0.tar ejre1.8.0
a ejre1.8.0
a ejre1.8.0/bin
a ejre1.8.0/bom
a ejre1.8.0/lib
a ejre1.8.0/release
a ejre1.8.0/lib/arm
a ejre1.8.0/lib/calendars.properties
a ejre1.8.0/lib/classlist
a ejre1.8.0/lib/content-types.properties
a ejre1.8.0/lib/currency.data
a ejre1.8.0/lib/ext
a ejre1.8.0/lib/hijrah-config-umalqura.properties
a ejre1.8.0/lib/jce.jar
a ejre1.8.0/lib/jsse.jar
a ejre1.8.0/lib/logging.properties
a ejre1.8.0/lib/meta-index
a ejre1.8.0/lib/net.properties
a ejre1.8.0/lib/resources.jar
a ejre1.8.0/lib/rt.jar
a ejre1.8.0/lib/security
a ejre1.8.0/lib/tzdb.dat
a ejre1.8.0/lib/security/blacklist
a ejre1.8.0/lib/security/cacerts
a ejre1.8.0/lib/security/java.policy
a ejre1.8.0/lib/security/java.security
a ejre1.8.0/lib/security/local_policy.jar
a ejre1.8.0/lib/security/trusted.libraries
a ejre1.8.0/lib/security/US_export_policy.jar
a ejre1.8.0/lib/ext/meta-index
a ejre1.8.0/lib/ext/sunjce_provider.jar
a ejre1.8.0/lib/arm/client
a ejre1.8.0/lib/arm/jli
a ejre1.8.0/lib/arm/jvm.cfg
a ejre1.8.0/lib/arm/libjava.so
a ejre1.8.0/lib/arm/libjsig.so
a ejre1.8.0/lib/arm/libnet.so
a ejre1.8.0/lib/arm/libnio.so
a ejre1.8.0/lib/arm/libverify.so
a ejre1.8.0/lib/arm/libzip.so
a ejre1.8.0/lib/arm/minimal
a ejre1.8.0/lib/arm/minimal/libjsig.so
a ejre1.8.0/lib/arm/minimal/libjvm.so
a ejre1.8.0/lib/arm/minimal/Xusage.txt
a ejre1.8.0/lib/arm/jli/libjli.so
a ejre1.8.0/lib/arm/client/libjsig.so
a ejre1.8.0/lib/arm/client/libjvm.so
a ejre1.8.0/lib/arm/client/Xusage.txt
a ejre1.8.0/bin/java
a ejre1.8.0/bin/keytool
a ejre1.8.0/bin/rmid
a ejre1.8.0/bin/rmiregistry
> gzip -c ejre1.8.0.tar > ejre1.8.0.tar.gz
> cp ejre1.8.0.tar.gz /Volumes/LEGO-PART/
> cp lejosimage.zip /Volumes/LEGO-PART/
> cd /Volumes/LEGO-PART/
> unzip lejosimage.zip
Archive: lejosimage.zip
creating: lejos/
creating: lejos/bin/
inflating: lejos/bin/partition.sh
inflating: lejos/bin/partfuncs.sh
inflating: lejos/bin/install.sh
inflating: lejos/bin/funcs.sh
inflating: lejos/bin/spinner.sh
inflating: lejos/bin/check.sh
creating: lejos/images/
inflating: lejos/images/lejoslogo.ev3i
inflating: lejosimage.bz2
inflating: uImage
inflating: uImageStandard
extracting: version

SD カードにファイルをコピーして展開した後、SD ディスクをアンマウントしてください。後は、上記 (2)ブート可能なマイクロ SD カードから起動(EV3 で実施)と同様に、作成した SD から EV3 を起動して(2)以降の処理を行ってください。
上記で、Java SE Embedded 8 で制御できるようになります。

Java SE 8 Embedded のコードを実装するためには、Maven の pom.xml の下記の行 (コンパイラのソース、ターゲット) をそれぞれ 1.7 → 1.8 に修正して実装してください。

  
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

備考:本来であれば、LEGO Mindstorms は Java SE Embedded 8 の “Compact Profile 2” で動作するようなのですが、現在 Compact Profile 2 で JRE を作成した場合は現時点で動作しません。本件は、leJOS のチームと Oracle の Embedded チームが現在調査中です。
上記は現時点(2014年4月28日時点)でのワークアラウンドとしてご利用ください。

2014年4月23日 at 6:05 午後 13件のコメント

Java Day Tokyo 2014 開催のご案内


本日、Java Day Tokyo 2014 のイベントの登録が正式に開始いたしました。

昨年は、Java EE 7 のローンチの直前という事もあり、Java EE のお祭りでしたが、今年の、Java Day Tokyo は日本オラクルによる Java SE 8 のローンチ・イベントとしての位置づけておりまして、Java SE 8 に関する多数のセッションをご用意しています。

また本社からも多数のエンジニアを招いております。中でも注目なのは、Stuart Marks さんですが、彼は Java SE 8 の Lambda の実装に深く携わり、Lambda が導入されるまでの経緯から、実際の内部実装まで深くしる人間です。このビデオで一番右にいる方が Stuart Marks さんです。

また、一番右側に映っているのは JavaOne のチェアマンでもあり、Java エバンジェリストのStepen Chin さんです。彼もまた今年の Java Day Tokyo に参加してくださいます。

JavaOne Rock Star
http://www.oracle.com/javaone/rock-stars/index.html

本場 JavaOne ではすばらしい発表者に JavaOne RockStar という称号が与えられます。彼らは共に RockStar の称号を頂いており、すばらしい発表が期待できます。

JavaVM から Lambda, JavaFX, Nashorn まで Java SE 8 に関連したセッションを多数ご用意いたしました。もちろん Java EE 7 も去年の正式発表を元に、今年はより現実的でHTML 5 との組み合わせや将来的な内容も含まれるセッションをご用意いたしました。

是非、今年最大の Java イベントである Java Day Tokyo 2014 にお越しください。皆様のご参加を心より楽しみに致しております。

PS.
過去の経験上、人気セッションは早々に満席になる可能性もございます。是非、お早いうちに希望のセッションをご選択いただけますよう宜しくお願いします。

2014年4月2日 at 12:02 午後


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2014年4月
 123456
78910111213
14151617181920
21222324252627
282930  

カテゴリー

clustermap

ブログ統計情報

  • 1,288,422 hits

Feeds

アーカイブ