EV3RTを使ってみる(目次)

2015年度のETロボコンよりLego Mindstorms EV3が使えるようになりました。そこで、この開発プラットフォームの1つであるToppers/EV3RTを使って簡単なプログラムを作成していきます。

あくまで非公式な紹介記事ですので、本番プログラムを開発するときは本家サイトの情報を十分に見るようにしてください。また、この記事を書いている時点でのEV3RTのバージョンはβ3〜β4ですので、リリース版では仕様が変更されているかもしれません。

あと、at own your risk でお願いします。

目次

その1: MacOSX上のEV3RT開発環境構築(version=β3)
その2: 表示するだけのプログラムをスクラッチから作成(version=β3)
その3: プログラムを複数のソースファイルに分割(version=β3)
その3.5: EV3RT-β3の不具合について(version=β3)
その4: 複数タスクの実行と優先度の設定(version=β3)
その5: mutexを使った排他制御(version=β3)
その5.5: mutexを使う場合の注意(version=β3)
その6: イベントフラグを使った同期処理(version=β3)
その7: 周期処理を行うプログラム(version=β3)
その7.5: タスク優先度を考慮した周期処理(version=β3)
その8: bluetoothを介した通信処理(version=β4)
その8.5: bluetoothを介した通信処理のもう1つの書き方(version=β4)

EV3onRules

少しだけEV3wayのアプリケーション開発を簡単にするフレームワーク「EV3onRules」を作りました。各機能を分離して実装するためのシンプルなフレームワークです。
EV3onRules (github)

大きいアプリケーションのためのuImage

1Mbyte以上(6Mbyte以下)の大きさのアプリケーションでも動的ロードが可能なuImageを作りました。

※ これらのuImageはToppers/EV3RTのソースファイルの設定を変更して作成したものです。これらのuImageの使用により発生した損害について、開発者は一切責任を負いません。

EV3RTを使ってみる(8.5)

Toppers/EV3RTを使ってプログラムを作成したときの記事です。
この記事を書いた時のEV3RTのバージョンはβ4です。
目次はこちら

前回の記事でBluetooth経由で通信を行うプログラムを紹介しましたが、EV3RTでは少し違った書き方もできます。前回紹介したプログラムでは関数「ev3_serial_open_file」でファイルポインタを作成して、このファイルポインタを指定することでデータの送受信を行いました。今回紹介するプログラムでは、デバイスに対してデータの送受信を行うと思われる 1関数「serial_rea_dat」と「serial_wri_dat」を使います。

前回紹介したファイルポインタを指定する方式と比べて、今回紹介する「serial_rea_dat」「serial_wri_dat」を使う方式は少し書き方が異なります。まず、ファイルポインタを作成する必要がありません。前準備なしで「serial_rea_dat」や「serial_wri_dat」を呼び出しても問題ありません。また、Bluetooth通信が開始されていない状態で受信関数「serial_rea_dat」を呼び出した場合、Bluetooth経由でデータを受信するまで処理をブロックします。つまり、プログラムによっては「ev3_bluetooth_is_connected」を使ってBluetoothの接続状態を確認する必要はありません。

さて、前回と同じ動作を行うプログラムを「serial_rea_dat」と「serial_wri_dat」を使って作っていきます。

設定ファイル「app.cfg」とヘッダファイル「app.h」は前回と同じです。

INCLUDE("app_common.cfg");

#include "app.h"

DOMAIN(TDOM_APP) {
  CRE_TSK(TASK1, { TA_ACT, 0, task1, TMIN_APP_TPRI + 1, STACK_SIZE, NULL });
}

ATT_MOD("app.o");
void task1(intptr_t exinf);
void display();

ソースファイル「app.c」ではBluetooth通信を行うために関数「serial_rea_dat」と「serial_wri_dat」を呼び出しています。また、これらの関数を使うためにヘッダファイル「syssvc/serial.h」を読み込んでいます。このプログラムでは接続状態を確認する必要がないため「ev3_bluetooth_is_connected」は使っていません。

#include "ev3api.h"
#include "app.h"
#include <syssvc/serial.h>

#define MESSAGE_LEN  8

static char message[MESSAGE_LEN + 1] = {0};

/* タスク */
void task1(intptr_t exinf)
{
  display();

  while(1){
    int size = serial_rea_dat(SIO_PORT_BT, message, MESSAGE_LEN);
    
    if(size > 0){
      serial_wri_dat(SIO_PORT_BT, message, size);
    }

    display();
  }
}

/* 状態を表示する。 */
void display()
{
  ev3_lcd_set_font(EV3_FONT_SMALL);
  ev3_lcd_draw_string("Program is running", 10, 30);
  ev3_lcd_set_font(EV3_FONT_MEDIUM);
  ev3_lcd_draw_string(message, 10, 40);
}

さて、2通りのBluetooth通信プログラムが作成できるわけですが、どちらが良いかは場合によるかと思います。もし、Bluetooth通信を行うだけであれば今回紹介した方式の方がシンプルなプログラムになりそうです。一方、Bluetooth通信とファイル操作が関係している場合は、前回のファイルポインタを使う方式だと処理を共通化できるかもしれません。

とりあえず、「EV3RTを使ってみる」の記事はここまでにしたいと思います。また、何かテクニックみたいなものを見つけたら記事にするかもしれません。あと、現在のEV3RTのバージョンはβ4ですのでリリース版になったときに仕様が変更されるかもしれません。この記事を参考にされる場合はバージョンの違いには注意してください。

Notes:

  1. EV3RTのソースコードは読んでいませんので、これらの関数の正確な動作はわかりません