※注意:1234567890. BACK

Ev3:BricxCCのインストール、設定とプログラム

このページはBricxCC test releases 版を使用します。プログラム動作に不具合などが発生する場合も考えられます。また WindowsのPATH設定も行いますので、設定・ご使用は自己責任にて十分注意願います。

必要な手順は下記の通りです。

  1. 必要なファイルのダウンロード
  2. インストール
  3. 環境変数(PATH)の設定
  4. EV3のファームウェアアップデート

です。

必要なファイルのダウンロード

統合環境BricxCCとそのほかに必要なファイルをダウンロードします。
必要なファイルは下記の6つになります。

  • BricxCC通常版(W)/ BricxCC test releases版(W)
  • linux tool(W)
  • lms api(W)(M)(U)
  • CodeSourcery Lite cross compiler for arm-linux(クロスコンパイラ環境)(W)
  • EV3のソースコードの一部(lms2012)(W)(M)(U)
  • EV3最新ファームウェア(W)(M)(U)

NXCを使ったEV3プログラミングは、Windows、Mac、Linux(ubuntu)環境で動作確認しています。 上記のダウンロードで必要なものを省略記号で表しています(W:Windows、M:Mac、U:ubuntu)。

BricxCC 通常版
Bricx Command Center(SOURCE FORGE)

BricxCC テストリリース版、linux tool、lms api
Bricx Command Center

G++ クロスコンパイラ環境 for ARMプロセッサ(EV3)
CodeSourcery Lite cross compiler for arm-linux

EV3ソースコード
GitHub EV3 sources

EV3最新ファームウェア
www.mindstorms.com

Bricx Command Center

ここでは、BricxCCの通常版、テストリリース版、linux tool、lms apiの4つのパッケージをダウンロードします。 BricxCCの通常版は、「Downloading」の「BricxCC latest version」から最新のものをダウンロードします(著者が ダウンロードしたときはbricxcc 3.3.8.9が最新バージョンでした)。 リンクが切れていますので、通常版はSOURCE FORGEからダウンロードします。また、その他3つのパッケージは「Downloading」の「test releases」からダウンロードします。

test releaseをクリックすると様々なファイルが出てきます。 詳しい内容は、readme_1st.txtに書いてあります(英語)。 「test_release2013????.zip」がBricxCCのテストリリース版になります。ファイル名の????の部分がバージョン(日付)を 示しているので最新のバージョンをダウンロードしてください。 あわせて、「linux_tools.zip」と「lms_api.zip」もダウンロードしておいてください。

G++ クロスコンパイラ環境 for ARMプロセッサ(EV3)

最新のMindstorms EV3 はCPUにARMプロセッサを使用しています。 クロスコンパイル環境を使用する事によってARM(EV3)用の実行ファイルを 作成することが可能となります。上記の アドレス をクリックしてCodeSourcery Liteをダウンロードします。

EV3ソースコード(lms2012)

GitHubのEV3ソースコードから一部(lms2012)をダウンロードします。「ev3sources/lms2012/lms2012/source」内のすべてのファイルを「lms2012」というフォルダを作成して保存します。(個別にファイルをダウンロードすると、時間と手間がかかりますのでev3sourcesすべてをダウンロードして必要な部分だけ利用しても良いと思います)

EV3最新ファームウェア

レゴ・マインドストーム(日本語)のページから最新のEV3ファームウェアをダウンロードします。 項目「ダウンロード」から「ダウンロードアーカイブ」「ファームウェアのダウンロード」を選択して 最新のファームウェアをダウンロードします。

LAN経由でプログラムを転送・実行する場合は、ファームウェアが1.08である必要があります。

インストール

BricxCC通常版のインストール

テストリリース版をインストールする前に通常版をインストールします。 後からテストリリース版を上書きしてしまいますので、もし通常版をインストール済みの場合は インストールディレクトリを変更してインストールします。 ダウンロードしたファイル bricxcc_setup_XXXX.exe をダブルクリックしてBricxCCをインストールします。 インストール中にインストールフォルダを指定する下記のような画面が出ます。 ここでインストール場所をデフォルトではなく、 後でパスの通しやすいフォルダ、例えば C:\BricxCCにBrowseを押して変更します。

あとはNextをクリックしてBricxCCのインストールが完了します。

G++ クロスコンパイラ環境のインストール

ダウンロードしたarm-2009q1-203-arm-none-linux-gnueabi.exe をダブルクリックしてCodeSourcery Liteのインストールを行います。 CodeSourcery Liteのインストールに関しては、特に変更点はありません。 デフォルトの設定のままインストールします。


BricxCCテストリリース版のインストール

ダウンロードした test_release2013????.zip ファイルを右クリック→「すべて展開」を選択して ファイルを解凍します。解凍されたフォルダにはいくつかのファイルがありますが、これをすべて 先ほどインストールしたBricxCC通常版のフォルダ( C:\BricxCC )に上書きします。

linux_tools.zip、lms_api.zipの解凍

上記と同様にダウンロードしたlinux_tools.zip、lms_api.zipの解凍を行います。 linux_tools.zipは解凍すると「make.exe」と「rm.exe」の2つのファイルができます。 この2つのファイルをBricxCCのフォルダ(C:\BricxCC)の中に移動します。 lms_api.zipは解凍後、フォルダ(lms_api)ごとBricxCCのフォルダに移動します。

lms2012フォルダの移動

GitHubからダウンロードしたev3sourcesの一部(lms2012フォルダ)をBricxCCフォルダの中に移動します。 場所は、「C:BricxCC\lms2012」です。

環境変数(PATH)の設定

先ほどインストールしたBricxCC、lms_apiフォルダにPATH(パス)の設定を行います。

・Windows10の場合

一部 Windows7 と同じ設定画面となります。下記Windows7の場合も参考にしてください。

スタートメニューをクリックして「コントロールパネル」と入力します(もしくは「Windowsシステムツール」→「コントロールパネル」を選択)。「コントロールパネル」→「システム」を選択します。

パスの追加はシステム起動にとって重要な部分です。 自己責任にて慎重に行ってください。

「新規」ボタンをクリックして、変数値に C:\BricxCC と C:\BricxCC\lms_api の2つを追記してください。

 

追記後「OK」をクリックします。

・Windows7の場合

「コントロールパネル」→「システムとセキュリティ」→「システム」→「システムの詳細設定」をクリックします。

「システムのプロパティ」ウインドウの「詳細設定」タブの「環境変数(N)」をクリックします。

環境変数ウインドウの「システム環境変数(S)」の「Path」を選択し「編集」をクリックします。

「変数値(V)」にBricxCCとlms_apiのパスを追加します。

パスの追加はシステム起動にとって重要な部分です。 自己責任にて慎重に行ってください。

変数値の最初に C:\BricxCC;C:\BricxCC\lms_api;追記してください。

EV3のファームウェアアップデート

ファームウェアをアップデートするときは、 フル充電の状態で行ってください。ファームウェアのアップデート中に電源が切れると 起動しなくなる恐れがあります。また、アップデート中は絶対に電源を切らないように してください。

BricxCCを使用してプログラミングを行うには、EV3のファームウェアを最新にする 必要があります。ファームウェアをアップデートする方法は、

  1. LEGO社が提供するEV3ソフトウェアを使用する。
  2. BricxCCを使用する。

の2通りがあります。どちらでアップデートを行ってもかまいません。

バージョンの確認方法は、EV3本体の「設定(スパナのマーク)」→「Brick Info」から 「Brick FW」で確認できます。V1.03H以降であれば動作の確認ができています(下記の注意を参照)。

BricxCC以外でLAN経由でプログラムを転送・実行する場合、 ファームウェアは1.08にしておく必要があります(2017.8.10 追記)。

EV3ソフトウェアを使用してファームウェアをアップデートする場合は、「ツール」→「ファームウェア更新」を 選択します。「参照」から最新のファームウェアファイルを選択後、「ダウンロード」をクリックします。

BricxCCでファームウェアをアップデートする場合は、 BricxCC起動後(Port:USB、Brick Type:EV3、Firmware:Linuxを選択後OKをクリック)、 「Tools」→「Download Firmware」を選択します。その後ダウンロードしたファームウェアを 選択するとファームウェアのアップデートが始まります。

次は、ヘッダファイルの変更を行います。

準備1

センサを使用するためのヘッダファイルとEV3 BricxCCプログラムランチャーをダウンロードします。

ヘッダファイル(JissenPBL.h)、EV3 BricxCCプログラムランチャー(run.rbf)
九州工業大学 花沢研究室 File Download

JissenPBL.h は、プログラムを作成するフォルダに保存します。

準備2

(ヘッダファイルの変更)
ヘッダファイル(~.h)内の宣言の重複を修正したり、パスの追加など数カ所の変更を行います。(それぞれのファイルの著作権はファイルの制作者にあります)
本書では、lms2012フォルダはBricxCCの中にありますので、JissennPBL.hの中のパスを変更する必要があります。 また、ヘッダファイルの追加を行います。「メモ帳」などのアプリケーションを使用してJissennPBL.hを開きます。

#include の部分に

#include <sys/types.h> //追加
#include <sys/stat.h> //追加
#include <pthread.h> //追加
#include “C:\BricxCC\lms2012\lms2012.h”

#include “C:\BricxCC\lms_api\ev3_output.h”
#include “C:\BricxCC\lms_api\ev3_command.h”
#include “C:\BricxCC\lms_api\ev3_lcd.h”
#include “C:\BricxCC\lms_api\ev3_sound.h” //追加
#include “C:\BricxCC\lms_api\ev3_button.h” //追加
#include “C:\BricxCC\lms_api\ev3_constants.h” //追加
#include “C:\BricxCC\lms_api\ev3_timer.h” //追加

を追加します。

次にヘッダファイル間で2重宣言が発生しているため、このままコンパイルすると 通常ではエラーが発生してしまいます(エラーの根本的な解決方法は調査中です)。 少し無理矢理ですが、この2重定義のままオブジェクトファイルの生成を行います。 この状態で一度、コンパイルを行います(コンパイルエラーが表示されます)。

(使用するプログラムは、”Motor.c“もしくは”Sound.c“どちらでもかまいません。 ~.cファイルと~.prjを作成してコンパイルしてください)

コンパイルエラーが発生しますが、C:\BricxCC\lms_api内にオブジェクトファイル(~.o)が生成されているのを確認します。

次に2重宣言のエラーとwarning表示を消します。C:\BricxCC\lms_api内にある ev3_lcd.h と ev3_constants.h の内容を変更します。
ev3_lcd.h の52、54、55行目をコメント「//」にします。

#define LCD_BUFFER_SIZE (LCD_BYTE_WIDTH * LCD_HEIGHT)
→ // #define LCD_BUFFER_SIZE (LCD_BYTE_WIDTH * LCD_HEIGHT)

typedef byte IMGDATA; //!< Image base type
typedef IMGDATA* IP; //!< Instruction pointer type

// typedef byte IMGDATA; //!< Image base type
// typedef IMGDATA* IP; //!< Instruction pointer typeev3_constants.h

ev3_constants.h も同じように52、53、54、330行をコメント「//」にします。

#define LCD_WIDTH 178 /*!< LCD horizontal pixels */
#define LCD_HEIGHT 128 /*!< LCD vertical pixels */
#define TOPLINE_HEIGHT 10 /*!< Top line vertical pixels */

#define FILENAME_SIZE 120 //!< Max filename size including path, name…

// #define LCD_WIDTH 178 /*!< LCD horizontal pixels */
// #define LCD_HEIGHT 128 /*!< LCD vertical pixels */
// #define TOPLINE_HEIGHT 10 /*!< Top line vertical pixels */

// #define FILENAME_SIZE 120 //!< Max filename size including path, name…

これで設定は終わりです。次は、モータを回転させてみます。

モータの回転

EV3をUSBポートに接続して電源を入れます。その後、BricxCCを起動します。 設定は、Port:USB、Brick Type:EV3、Firmware:Linuxを選択して OKをクリックします。
BricxCC起動後、ファイルを新しく作成するため「File」→「New」を選択します。

下記のサンプルプログラムを入力します。

// Sample Program “Motor.c”
#include < stdio.h >
#include < unistd.h >
#include “C:\BricxCC\lms_api\ev3_output.h”
#include “C:\BricxCC\lms_api\ev3_command.h”
int main()
{
if (!OutputInit())
{
return -1;
}
OnFwdEx(OUT_AB,70,0);
Wait(10000);
Off(OUT_AB);
}

ファイル名は「Motor.c」とします。
次にプロジェクトマネージャーを起動します。
「View」→「Project Manager」をクリックします。
「Files」内で右クリックして「Add」を選択して
C:\BricxCC\lms_api\ev3_button.c
C:\BricxCC\lms_api\ev3_command.c
C:\BricxCC\lms_api\ev3_lcd.c
C:\BricxCC\lms_api\ev3_output.c
C:\BricxCC\lms_api\ev3_sound.c
C:\BricxCC\lms_api\ev3_timer.c
を選択します。

これでは完全なパスが通っていないため、「File」→「Open」から 今作成したプロジェクトファイル「Motor.prj」を開きます。

ファイルの種類は「All Files」にしてください。

開いたプロジェクトファイルに、パス「C:\BricxCC\lms_api\」を書き加えます。

設定は以上で終了です。
コンパイルと実行をしてみましょう。
「Compile」→「Compile and Run」を選択します。

ポートAとポートBのモータは10秒回転して止まります。

音を鳴らしてみよう

「モータを回転させよう」では、簡単なモータを動作するプログラムを例として説明しました。次にファイルの読み出しとEV3本体の実行方法について説明したいと思います。

サウンドの再生

周波数を指定して音を鳴らす方法と音のファイルを再生するサンプルプログラムを作ります。
下記のサンプルプログラムを入力します。ファイル名は「Sound.c」とします。

// Sample Program “Sound.c”
#include “jissenPBL.h”

int main()
{
OutputInit();
SoundInit();

PlayTone(440,1000); //frq(Hz),duration
Wait(1000);

PlayToneEx(330,400,100); //frq(Hz),duration,vol(100 only?)
Wait(1000);

PlayFileEx(“/home/root/lms2012/prjs/Bravo.rsf”,100,false); //Filename,vol,loop
Wait(1000);

PlayFile(“/home/root/lms2012/prjs/Boo.rsf”); //Filename only
Wait(1000);

OnFwdEx(OUT_BC,70,0);
Wait(1000);
Off(OUT_BC);
}

前述の「モータを回転させよう」で作成したMotor.prj と同様に、Sound.c 用のプロジェクトファイル(Sound.prj)も作成する必要があります。面倒であればMotor.prj をコピーしてSound.prj と名前を変更したものでもかまいません。
音ファイルBravo.rsf、Boo.rsf は LEGO MINDSTORMS EV3 ソフトウェアの中(C:\Program Files(x86)\LEGO Software\LEGO MINDSTORMS EV3 Home Edition\Resources\BrickResources\Retail\Sounds\files\Communication)にあります(HomeでもEducationでも可)。 LEGO MINDSTORMS EV3 Home Edition は、LEGO MINDSTORMS ページからダウンロード可能です。

あらかじめサウンドファイルをEV3に転送しておく必要があります。BricxCC の「Tools」から「Explorer」を選択します。

コンパイルと実行します。
「Compile」→「Compile and Run」を選択します。音がなったあとサウンドファイル再生、モータが回転します。

EV3本体での実行

今までは、BricxCC の「Compile and Run」を使用してプログラムの実行を行いましたが、EV3本体から直接プログラムを実行する方法を説明します。ここでは、九州工業大学 花沢先生が作成されたEV3 BricxCCプログラムランチャー(run.rbf)を使用します。
BricxCC の「Tools」から「Explorer」を選択してBricxCC Explorerを起動します。 Explorer ウィンドウ左側のEV3内部(デフォルトの位置)に右クリックして「Create folder」を選択し「Run」フォルダを作成します。作成した Run フォルダの中にダウンロードしたプログラムランチャー(run.rbf)をコピーします。

EV3上で実行したいファイル(Sound)の名前を「App」へ変更します(すでにAppがある場合は「右クリック」→「Delete」を選択して削除する)。

EV3本体のRun プロジェクトのRun を実行するとSound プログラムが実行されます。

次はタッチセンサを使ってみましょう。

タッチセンサを使う

直進するロボットが障害物にぶつかると少し後退して方向を変えるというプログラムを作ります。
下記のサンプルプログラムを入力します。ファイル名は「Touch.c」とします。また、前述と同じように「Touch.prj」も作成しておきます。タッチセンサはポート1にモータはポートB、Cに接続します。

// Sample Program “Touch.c”
#include “JissenPBL.h”

int main()
{
int i=0;
OutputInit(); //use Motor
initSensor(); //use Sensor
ButtonLedInit(); //use button

setSensorPort(CH_1,TOUCH,0); //ch,type,mode
startSensor();

while(true){
OnFwd(OUT_BC);
i=getSensor(CH_1);
if(i==1){
OnRev(OUT_BC);
Wait(2000);
OnFwd(OUT_B);
OnRev(OUT_C);
Wait(1200);
}
if(ButtonPressed(BTN1))break; //Program stop
}
Off(OUT_BC);
closeSensor();
}

InitSensor();はセンサの初期化をします。そしてStartSensor();でセンサの使用を開始します。これは、タッチセンサ以外のセンサ(後述)でも同じように使用します。setSensorPort()命令で接続ポート、センサタイプ、モードを設定します。getSensor(CH_1)命令により、タッチセンサの状態(押されていれば1、押されていなければ0)をi に格納します。
while(true)を用いた無限ループプログラムになっていますので、プログラム停止処置として if(ButtonPressed(BTN1))break; が入っています。これにより、キャンセル(バック)ボタンを押すとプログラムが停止します。

次は超音波センサを使ってみましょう。

超音波センサを使う

超音波センサを使用すると、障害物にぶつかる前に回避することができます。直進するロボットが障害物に一定の距離に近づくと方向を変えるというプログラムを作ります。
下記のサンプルプログラムを入力します。ファイル名は「USonic.c」とします。また、前述と同じように「USonic.prj」も作成しておきます。超音波センサはポート4にモータはポートB、Cに接続します。

// Sample Program “USonic.c”
#include “JissenPBL.h”

int main()
{
int i=0;
OutputInit(); //use Motor
initSensor(); //use Sensor
ButtonLedInit(); //use button

setSensorPort(CH_4,USONIC,0); //ch,type,mode
startSensor();

while(true){
OnFwd(OUT_BC);
i=getSensor(CH_4);
if(i < 300){ //30cm (300mm)
OnFwd(OUT_B);
OnRev(OUT_C);
Wait(1200);
}
if(ButtonPressed(BTN1))break; //Stop Program
}
Off(OUT_BC);
closeSensor();
}

setSensorPort()命令で接続ポート、センサタイプ、モードを設定します。getSensor(CH_4)命令により、障害物との距離を調べてi に格納します。iが300(30cm)よりも小さくなると回避行動が実行されます。タッチセンサプログラムと同様にwhile(true)を用いた無限ループプログラムになっていますので、プログラム停止処置として if(ButtonPressed(BTN1))break; が入っています。これにより、キャンセル(バック)ボタンを押すとプログラムが停止します。

次はカラーセンサ(ライントレース)です。

カラーセンサを使う 1

EV3のカラーセンサを使用したライントレースプログラムを作ります。白の部分では右回転、黒の上では左回転するプログラムにすることにより、1つのカラーセンサでも黒の線に沿ってライントレースをすることができます。
下記のサンプルプログラムを入力します。ファイル名は「Color_mono.c」とします。また、前述と同じように「Color_mono.prj」も作成しておきます。カラーセンサはポート3にモータはポートB、Cに接続します。

// Sample Program “Color_mono.c”
#include “JissenPBL.h”

int main()
{
int i=0;
OutputInit(); //use Motor
initSensor(); //use Sensor
ButtonLedInit(); //use button

setSensorPort(CH_3,COLOR,0); //ch,type,mode
startSensor();

while(true){
i=getSensor(CH_3);
if(i > 50){
OnFwd(OUT_B);
Off(OUT_C);
}else{
OnFwd(OUT_C);
Off(OUT_B);
}
if(ButtonPressed(BTN1))break; //Stop Program
}
Off(OUT_BC);
closeSensor();
}

setSensorPort()命令で接続ポート、センサタイプ、モードを設定します。今回はライントレースのセンサとして使用するため、モード0(反射モード)にします。getSensor(CH_3)命令により、カラーセンサの読み取り値をiに格納します。カラーセンサの読み取り値が50よりも大きい(白の部分)場合、ポートB(左モータ)のみ前進してロボットは左回転します。逆にカラーセンサの読み取り値が50以下(黒の部分)の場合、ポートC(右モータ)のみ前進してロボットは左回転します。

次はカラーセンサ(色)を使ってみましょう。

カラーセンサを使う 2

前述では、EV3のカラーセンサを使用したライントレースプログラムを作りました。これは赤色LEDを発光してその反射光の大きさで白か黒を判断するというプログラムでした。次に色を判別するプログラムを作成します。
下記のサンプルプログラムを入力します。ファイル名は「Color_RGB.c」とします。また、前述と同じように「Color_RGB.prj」も作成しておきます。カラーセンサはポート3に接続します。

// Sample Program “Color_RGB.c”
#include “JissenPBL.h”

int main()
{
int i=0;
initSensor(); //use Sensor
ButtonLedInit(); //use button

setSensorPort(CH_3,COLOR,2); //ch,type,mode
startSensor();

while(true){
i=getSensor(CH_3);

switch (i) {
case 1:
SetLedPattern(LED_GREEN);
break;
case 5:
SetLedPattern(LED_RED);
break;
default:
SetLedPattern(LED_BLACK);
break;
}
if(ButtonPressed(BTN1))break; //Stop Program
}
closeSensor();
}

setSensorPort()命令で接続ポート、センサタイプ、モードを設定します。今回は色を読みとるモードとして使用するため、モード2(カラーモード)にします。getSensor(CH_3)命令により、カラーセンサの読み取り値をiに格納します。カラーセンサの読み取り値によりEV3本体のLEDが同色で点灯します。カラーセンサの読み取り値 i=1 の時は緑、i=5 の時は赤色に点灯します。それ以外の時は点灯しません。

次はジャイロセンサを使ってみましょう。

ジャイロセンサを使う

旧 MINDSTORMS(RCXやNXT)では、ロボットを決められた角度に回転する時、モータの回転数や回転時間を制御して何度もトライ・アンド・エラーを繰り返して目的の角度でロボットを停止させる必要がありました。しかし、EV3からはジャイロセンサが標準で含まれているため、決められた角度になるとモータの回転を止めるという方法でロボットの制御が可能です。
下記のサンプルプログラムを入力します。ファイル名は「Gyro.c」とします。また、前述と同じように「Gyro.prj」も作成しておきます。カラーセンサはポート3にモータはポートB、Cに接続します。

// Sample Program “Gyro.c”
#include “JissenPBL.h”

int main()
{
int i=0,j=0;
OutputInit(); //use Motor
initSensor(); //use Sensor
ButtonLedInit(); //use button

setSensorPort(CH_2,GYRO,0); //ch,type,mode
startSensor();

i=getSensor(CH_2);

while(j<=i+90){
j=getSensor(CH_2);
OnFwd(OUT_B);
OnRev(OUT_C);

if(ButtonPressed(BTN1))break; //Stop Program
}
Off(OUT_BC);
closeSensor();
}

setSensorPort()命令で接続ポート、センサタイプ、モードを設定します。ジャイロセンサは回転角度を読みとるため、モード0にします。getSensor(CH_2)命令により、最初のロボットの角度をiに格納します。現在のロボットの角度iに目的の角度(サンプルは90度)を足した角度になるまでwhileループ内でモータの回転が実行されます。

次はディスプレイへ表示してみましょう。

ディスプレイ(液晶)へのテキスト表示

ロボットを制御するときに各種センサの状態を把握することは重要です。センサの状態を液晶に表示することでプログラムのデバッグにも非常に役に立ちます。ここでは、超音波センサの読み取り値をディスプレイに表示するプログラムを作成します。
下記のサンプルプログラムを入力します。ファイル名は「Display_text.c」とします。また、前述と同じように「Display_text.prj」も作成しておきます。超音波センサはポート4に接続します。

// Sample Program “Display_text.c”
#include “jissenPBL.h”

int main()
{

int dist=0;
char sensval[64];

LcdInit();
LcdSelectFont(2);
LcdRefresh();
initSensor();
ButtonLedInit(); //use button

setSensorPort(CH_4,USONIC,0);

startSensor();

while(true){
dist=getSensor(CH_4);
sprintf(sensval,”%4d”,dist);
LcdText(1,50,50,sensval);
LcdText(1,120,50,”mm”);
Wait(100);

if(ButtonPressed(BTN1))break; //Stop Program
}
closeSensor();
}

以下 制作中