LEGO MindStorms EV3でJava(その2)

前回までで開発環境はできたので、実際に簡単なロボットを作ってプログラミングしてみることにした。

Picture 5

ということで、今回作ってみたのが「色読み上げロボット」!!

EV3の作例にも似たようなロボットがあるのだが、残念なことに色は手で読ませるようになっている。センサをフィーダーに設置して1個ずつ色を確認し、その色を読み上げるようにしてみた。作例ではソーターがついていたが、今回はとりあえず色を読み上げることに専念することにする。外観は次の通り。

IMG_4112

プログラムはleJOSのJava言語で作成する。カラーセンサの値を読んで、その値に応じたWAVファイルを再生しながら色ブロックを放出するプログラムとなっている。あとで紹介する動画でもわかるが、コマンドを打って実際に動作を開始するまで結構時間がかかっている。leJOSのソースコードも追いかけてみて、どこが遅いのか調べてみたが、標準出力への文字送出(ターミナルへもどされるのだが)が入ると極端に遅いみたいなので、そのあたりのところがネックになっている可能性もある。とはいえ、まだまだアルファ版なので今後に期待である。その他の部分についてはそこまで遅いとは感じなかったので、スタンドアロンで動作させればそこまで問題はないと思う。

リファレンスマニュアルがまだまだ整備されていないので、NXT時代のリファレンスとleJOSのソースコードを照らし合わせながらの作業となった。色読み上げ用音声データのWAVファイルの出力はCeVIO Creative Studio FREEで行っているのだが、このソフトウエアが出力するWAVデータはそのままEV3で読ませることはできず、ソースコードを見て、サンプルレート8kHz、8ビットのデータであることが確認できた。最近では16bit/48kHzなどといったクリアかつリアルな音声データが多いので、EV3音声データを作るには、変換用のソフトウエアが必須となる。

カラーセンサの使い方は、leJOSのサンプルを参考にしている。本来、EV3のカラーセンサは0(色なし)~7(茶)の色を検出するのだが、サンプルでは6までとなっていたので7までサポートするようにしてある。ちなみに色番7は本来は茶色であるが、本プログラムではnone扱いになっている。理由はヒミツw

モータは角度を決めて出力できるのでブロックの放出できるように90度の往復を行っている。

EV3用のleJOSのサンプルはいくつか公開されているが、EV3GraphicsTestが一番情報量が多く参考になると思う。まだまだ、サポートされていない部分が多いみたいで、leJOSのソースコードを読んでいるとその苦労が垣間見える。

ということで、今回作成したソースは次のとおり。

import java.io.File;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.nxt.Sound;
import lejos.nxt.UARTPort;
import lejos.util.Delay;
import lejos.nxt.Button;

public class EV3ColorReader {

    public static void main(String[] args) {
        LCD.clear();    // LCDは18文字x8行
        LCD.drawString(" Karakuri Studio  ", 0, 1);
        LCD.drawString("     Presents     ", 0, 2);
        LCD.drawString("        on        ", 0, 3);
        LCD.drawString("  MindStorms EV3  ", 0, 4);
        Delay.msDelay(2000);
        LCD.clear();
        LCD.drawString(" EV3 Color Reader ", 0, 3);
        LCD.drawString("  Press Any Key   ", 0, 6);
        Button.waitForAnyPress();

        Motor.A.resetTachoCount();
        UARTPort u = new UARTPort();
        if (!u.open(3, 2)){
            System.out.println("Open failed");
            return;
            }
         //u.setMode(2);
        Graphics g = new Graphics();
        final int SW = LCD.SCREEN_WIDTH;
        final int SH = LCD.SCREEN_HEIGHT;
        String []colorNames = {"None", "Black", "Blue", "Green", "Yellow", "Red", "White", "none"};
        File colorSounds[] = new File[colorNames.length];
        for(int i = 1; i < colorSounds.length; i++)
            colorSounds[i] = new File(colorNames[i].toLowerCase()+".wav");
        g.clear();
        g.setFont(Font.getLargeFont());
        while (true) {
            byte newColor = u.getByte();
            if (newColor > 7 ) newColor = 7;
            if (newColor > 1){
                g.clear();
                g.drawString(colorNames[newColor], SW/2, SH/2, Graphics.BASELINE|Graphics.HCENTER);
                Motor.A.rotate(90);
                Delay.msDelay(500);
                Motor.A.rotate(-90);
                int ret = Sound.playSample(colorSounds[newColor], 100);
                if (ret != 0) System.out.println("play returns " + ret);
            }
            Delay.msDelay(500);
        }
    }

}

実行するに当たっては各色のWAVファイルをEV3に転送することをお忘れなく!!

動画も作ってみた。

    • 木下
    • 2015年 6月 2日

    wavファイルの転送はどのようにしたのでしょうか?

  1. 現在はLejosのバージョンも上がってかなり簡単にプログラム開発ができるようになっていますので、ファイルの転送も簡単になっているみたいです。このブログを作成した当時は他のドキュメントにも書いてあると思いますが、TFTPとかNFSとかでファイルを転送していたと記憶しています。いずれにせよ、最新バージョンでの開発をお勧めします。
    時間が取れれば最新バージョンでの記事を書こうと思いながら数ヶ月が経過していますw

  1. トラックバックはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。