組込み向けスクリプト⾔語
mrubyをEV3で動かしてみよう
発表者
ETロボコン関⻄地区実⾏委員 安積 卓也、岡嵜 雄平
ETロボコン関⻄地区独⾃勉強会ONE
セッションD-2(15:00-16:30)
72 PAGES
1
ETロボコン2015関⻄地区独⾃勉強会ONE/ETロボコン関⻄地区実⾏委員会
ET ROBOCON
KANSAI 2015
セッション構成
基本編︓担当 岡嵜(15:00-15:30)
応⽤編︓担当 岡嵜(16:10-16:30)
演習︓担当 安積(15:30-16:10)
Rubyの紹介 mrubyの紹介
mirbやmrdbをEV3で動かすデモ
時間があれば…
2
Rubyの紹介
オブジェクト指向スクリプト⾔語
3
概要 4
# The Greeter class
class Greeter
def initialize(name)
@name = name.capitalize
end
def salute
puts "Hello #{@name}!“
end
end
# Create a new object
g = Greeter.new("world")
# Output "Hello World!“
g.salute
Rubyとは…
オープンソースの動的なプログラミング⾔語
シンプルさと⾼い⽣産性を備える。
エレガントな⽂法、⾃然に読み書きができ
る。
参考︓https://www.ruby-lang.org/ja/
メリット 5
⼀般的に挙げられるRubyのメリット
「Rubyは書くのが楽しい・気持ちいい」
「Rubyはソースが美しい」
具体的に何が「楽しい・気持ちいい」のか︖
“ざっくり”していてわからない( ゚д゚)ポカーン
メリット 6
オブジェクト指向かつ
スクリプト⾔語である
⽂法に⾃由度があり
無駄なものを書かなくて良い
標準クラスライブラリが
⾼機能で使いやすい
⾔語としての機能が充実
コーディングを楽しくする4要素
メリット 7
オブジェクト指向かつ
スクリプト⾔語である
⽂法に⾃由度があり
無駄なものを書かなくて良い
標準クラスライブラリが
⾼機能で使いやすい
⾔語としての機能が充実
コーディングを楽しくする4要素
メリット 8
Rubyはオブジェクト指向⾔語である
=オブジェクト指向モデルを実装しやすい
Motor
-Port : Port
-PWM : Integer
-Count : Integer
+PWM=(Integer): void
+Count() : Integer
+reset() : void
class Motor < Device
def initialize(port)
@Port = port
@PWM = 0
@Count = 0
end
def PWM=(pwm)
end
def Count
end
def reset
end
end
C++, C#, Javaと同様にクラスを定義できる
クラス図
メリット 9
Rubyはスクリプト⾔語である
=コンパイルが不要、インタプリタ形式で実⾏
.c .exe 実⾏
.rb 実⾏
Ruby VM上で
コンパイル・リンク
プログラムしたソースをすぐに実⾏でき
カットアンドトライが容易になる
def aaaaa
(ソース上に存在)
メリット 10
Rubyはスクリプト⾔語である
=クラスやメソッドの動的定義が可能に
def bbbbb
def ccccc
.rb def aaaaa
既存のメソッド定義を上書き
新たに定義
新たに定義
クラスやメソッドをプログラム中で書き換えたり
新たに定義したりすることが可能(メタプログラミング)
メリット 11
デモ1︓メソッドを動的に宣⾔する
メリット 12
オブジェクト指向かつ
スクリプト⾔語である
⽂法に⾃由度があり
無駄なものを書かなくて良い
標準クラスライブラリが
⾼機能で使いやすい
⾔語としての機能が充実
コーディングを楽しくする4要素
メリット 13
クラスライブラリが充実している
=細かい処理をライブラリに任せることにより、
ソフトの振る舞いをシンプルに記述できる
例えば、プログラムでしばしば(︖)登場する
「2つの配列を連結する処理」
1 2 4 5 3+ = 1 2 4 5 3
Rubyであれば
result = [1, 2, 4] + [5, 3]
と書くだけ︕
メリット 14
デモ2︓Time・Hashを使ってみる(irb)
メリット 15
オブジェクト指向かつ
スクリプト⾔語である
⽂法に⾃由度があり、
無駄なものを書かなくて良い
⾔語としての機能が充実
コーディングを楽しくする4要素
標準クラスライブラリが
⾼機能で使いやすい
メリット 16
無駄なものを書かなくて良い
=コード量を少なくすることができる
nums = [8, 6, 3, 7, 1]
nums.sort!
int nums[5] = {8, 6, 3, 7, 1}
int i, j, tmp;
for(i = 0 ; i < 5 ; i++) {
for(j = 4 ; j > i ; j--) {
if(nums[j – 1] > nums[j]) {
tmp = nums[j - 1];
nums[j - 1] = nums[j];
nums[j] = tmp
}
}
}
例︓配列に格納した数値をソートする処理
Rubyでの実装例 C⾔語での実装例
数字を昇順に並べ替えるだけにも
かかわらず、気を遣う点が多すぎる
メリット 17
書き⽅に⾃由度がある
=内部DSLがより⾃然⾔語に近づく
Part.build forward(10).straight(20).tail(:down).balance, distance(20)
例1︓メソッドチェーン
Part.build do
forward(10)
straight(20)
tail(:down)
balance
distance(20)
end
例2︓ブロック
Part.build forward: 10, straight: 20, tail: :down,
balance: :on, distance: 20
例3︓ハッシュ
「モータパワー10で前進、20°の⽅向へ直進、尻尾は下げる、バランス⾛
⾏ 、20センチ⾛⾏するまで」というシナリオをDSL化した例
メリット 18
オブジェクト指向かつ
スクリプト⾔語である
⽂法に⾃由度があり、
無駄なものを書かなくて良い
⾔語としての機能が充実
コーディングを楽しくする4要素
標準クラスライブラリが
⾼機能で使いやすい
メリット 19
リテラルが充実
宣⾔したらそれがObjectとなる。(newは不要)
1 => Integer 1.to_s =>”1”
“abc” => String “abc”.length => 3
[1, 2, 3] => Array [1, 2, 3].sum => 6
{:a => 1, :b => 2, :c => 3} =>Hash
1..3 => Range
:a => Symbol
メリット 20
例外処理ができる
JavaやC#と同様に例外の送受信が可能
begin
# 実⾏する処理
rescue
# 例外が発⽣したときの処理 (省略可)
else
# 例外が発⽣しなかったときに実⾏される処理 (省略可)
ensure
# 例外の発⽣有無に関わらず最後に実⾏する処理 (省略可)
end
メリット 21
ブロック渡しができる
簡易的なコールバックを簡単に実現できる
メソッドA
メソッドB
ブロック
メソッドBにて、メソッドAから
渡されたブロックを実⾏できる。
メリット 22
デモ3︓ブロック渡し
デメリット 23
Rubyにもデメリットはある…
C⾔語に⽐べて処理性能悪すぎ︕使い物にならねーよ︕
既存のC⾔語ソースを全部Rubyで書き換えるなんて、無理
RAMが⾜りねえええええええええええええええ
デメリット 24
そんなあなた⽅にオススメなのが、mruby
before
mrubyに出会う前の⼈たち
after
mrubyに出会った⼈たち
mrubyの紹介
組込み機器上でRubyを実⾏
25
概要 26
mrubyとは…
ISO規格に準拠した軽量実装版のRuby
静的ライブラリをリンクすることによって、
アプリケーションに組込むことが可能
参考︓http://www.mruby.org/
アプリケーション
libmruby.a
.rb 実⾏
概要 27
どうすれば⼊⼿できるのか︖
ソースコードはgithubに公開されている
参考︓https://github.com/mruby/mruby
2014年1⽉
2014年11⽉
mruby-1.0.0がリリース
mruby-1.1.0がリリース(デバッガを同梱)
概要 28
使⽤例
• ⾃動販売機の売上出⼒
• ルータF/W
• 太陽光発電システム
いずれもリアルタイム性を追求しない⽤途で
⽤いられている。(理由は後述)
メリット 29
省リソースでも実⾏できる
C⾔語のメソッドを
呼び出せる
Rubyと⽐較したメリット
多くのコンパイラに対応
ソフトリアルタイム
メリット 30
省リソースでも実⾏できる
C⾔語のメソッドを
呼び出せる
Rubyと⽐較したメリット
多くのコンパイラに対応
ソフトリアルタイム
メリット 31
.rb
アプリケーション
libmruby.a
.mrb 実⾏
.rbファイルを中間ファイル(.mrb)へコンパイル
実⾏時の性能改善、ソースコードの中⾝が流出することを防⽌
メリット 32
省メモリで動作可能
Rubyと⽐較して、省スペックで動作できるよう実装されている
⽂献によると400KBのRAMで動作実績ありとのこと。
参考︓http://www.slideshare.net/kazuakitanaka391/mruby-41869553
構成・プログラムによるが数MB程度あると安⼼。
組込みでもこれくらいならなんとか…
尚、チューニングしてRAM使⽤量を削減した事例もあり
http://www.scsk.jp/fukuoka/services/mruby/nxt01.html
http://qiita.com/yukihiro_matz/items/c4f65288f96340a0808b
メリット 33
省リソースでも実⾏できる
C⾔語のメソッドを
呼び出せる
Rubyと⽐較したメリット
多くのコンパイラに対応
ソフトリアルタイム
メリット 34
mrubyは標準C関数のみで実装されている
多くのクロスコンパイラに対応している。GCC ARMでもビルド可能
設定が同梱されているコンパイラ
GCC ARM⽤の設定は
別途作成済み
GCC Clang
Visual C
メリット 35
省リソースでも実⾏できる
C⾔語のメソッドを
呼び出せる
Rubyと⽐較したメリット
多くのコンパイラに対応
ソフトリアルタイム
メリット 36
性能を担保したい箇所はC⾔語で実装できる
Rubyのソース上からはRubyのクラス、メソッドとして利⽤できる
app.rb
Motor
-Port : Port
-PWM : Integer
-Count : Integer
+PWM=(Integer): void
+Count() : Integer
+reset() : void
クラス図
メソッド内部の処理を
C⾔語で実装可能
.rbから引数として値を取
り出したり、戻り値を返
すことも可能。
メリット 37
省リソースでも実⾏できる
C⾔語のメソッドを
呼び出せる
Rubyと⽐較したメリット
多くのコンパイラに対応
ソフトリアルタイム
メリット 38
ソフトリアルタイムシステムとして動作
⼤抵の場合は⼀定時間内に処理を完了するが、稀に処理時間がかかる
→mruby VM中でガベージコレクションが動作するため。
0
10
20
30
40
50
60
0 1 2 3 4 5 6 7 8
出現回数[回]
処理時間[ms]
事象に対する処理時間分布
※このグラフは実測値ではありません。
⼤抵は、
4[ms]以内に処理できる
時々、処理が⻑引く
デメリット 39
性能⾯でC⾔語と⽐べると不利
EV3での性能測定は未実施。
が、C⾔語より性能⾯で劣るのはやむなし…
リソースもそれなりに必要
Rubyほどではないが、RAMがそれなりに必要。
EV3ではそこまで⼤きな問題ではないか︖
ETロボコン参加者のメリット 40
mrubyをETロボコンで使う場合、
他⾔語と⽐べてどんなメリットが
あるんだろう︖︖
ETロボコン参加者のメリット 41
コード修正〜⾛⾏までの時間が短い
調整→試⾛を繰り返すETロボコンでは⾮常に有利
ソース
修正
コンパイル
する
実機へ
ロード
起動
ソース
修正
起動
起動が⾼速
C, C++
Java
C#
mruby
Java環境は
時間がかかる
C, C++は
時間がかかる
実機へ
ロード
ETロボコン参加者のメリット 42
EV3上でデバッグが可能
デバッガ(mrdb)を起動し、⾛⾏させながらbreakを貼れる
通常時 デバッグ時
EV3RT
mruby
ruby app
EV3RT
mrdb
ruby app
例えばこんな使い⽅が…
• ruby appに対してbreakを貼る
• ruby appの変数値を確認する
• ruby appの変数値を書き換える
標準⼊出⼒先を
Bluetoothとする
ETロボコン参加者のメリット 43
過去のC⾔語資産を活⽤できる
今年はCで実装し、来年はmrubyへ乗り換える、ということが容易
2015年
2016年
EV3RT
⾃⼰位置推定 ⾛⾏制御 検出
⾛⾏計画
mruby
⾃⼰位置推定 ⾛⾏制御 検出
⾛⾏計画
EV3RT
全てCで実装
mruby化(中⾝はC)
mruby
性能を求められる部分はCで、書き換えが多い部分をmrubyで実装
→開発・調整を効率化しつつ、性能は担保
EV3でmrubyを動かしてみる
[演習]実際に使ってみましょう︕
44
資料作成協⼒者
⽯川 拓也(名古屋⼤学)
⻑原 裕希(⽴命館⼤学)
⻑⾕川 涼(⼤阪⼤学)
発表者の紹介
発表者
ETロボコン関⻄地区実⾏委員 安積 卓也
2010 MINDSTORMS NXT⽤TOPPERS/ASP+TECSプラットフォームと教育コンテンツ
ETロボコン認定プラットフォームのひとつ
https://www.toppers.jp/etrobo-asp.html
2015 mruby on ev3rt+tecs︓http://www.toppers.jp/tecs.html#mruby_ev3rt
組込みソフトウェア・プラットフォームの研究・開発を⾏っています。
システムソフトウェア、モデルベース開発、⾃動運転等
45
TOPPERS/ASPカーネルの開発メンバ︓https://www.toppers.jp/asp-kernel.html
TOPPERSカーネル向けシミュレーション環境の開発メンバ︓
https://www.toppers.jp/sim.html
TECS(TOPPERS Embedded Component System)の開発メンバ︓
https://www.toppers.jp/tecs.html
EV3⽤プラットフォーム
TOPPERS/ASP
MINDSTORMS EV3⽤
TOPPERSプラットフォーム
今回の
プラットフォームEV3RT
leJOS
(Java VM)
LMS2012
(LinuxベースのVM)
TOPPERS/HRP2
TECS仕様
• 名古屋⼤学により開発
• デバドラなどを
Linuxなどから移植
MonoBrick
(.Net framework)
ev3dev
(Linux)
その他のOSS...
• TECS WGにより開発
• mrubyの動作環境
46
mruby,TECSを利⽤可能なPF
• mruby on ev3rt+tecs
– http://www.toppers.jp/tecs.html#mruby_ev3rt
– TECSとはTOPPERSプロジェクトで開発しているコン
ポーネントシステム(アプリケーションをコンポーネ
ントベース開発するためのシステム)
– ev3rt+tecsはEV3RT上でのアプリケーションのコン
ポーネントベース開発が可能な環境
• C++APIのようにEV3のモジュールをTECSコンポーネントと
して扱うことができる
– TECSの提供するmrubyブリッジ機能により,mruby
からev3rt+tecsが提供するモジュール機能を利⽤でき
る
• mrubyからCコードを呼ぶためのI/Fを⾃動⽣成
47
最新版を⼊⼿
• パッケージをダウンロードして解凍
– http://www.toppers.jp/tecs.html#mruby_ev3rt
– $ tar xvzf mruby-on-ev3rt+tecs_package-alpha1.0.2.tar.gz
• ダウンロードしたパッケージ名
48
環境の構築
• Windows7、 Windows8、Windows8.1
• Cygwinインストール
– ruby
– GNU Make
– bison
• クロスコンパイラ
– arm-none-eabi-gcc.exe (GNU Tools for ARM Embedded Processors)
https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q3-update/+download/gcc-
arm-none-eabi-4_8-2014q3-20140805-win32.exe
• mkimage
– Windows⽤バイナリはパッケージに同梱
• Cygwin及びクロスコンパイラのインストールはEV3RTの開発環境
構築を参照してください。
– http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvWin
49
パスの通し⽅
• クロスコンパイラをインストールしたディレクト
リにPATHを通す
– C:¥Program Files (x86)¥GNU Tools ARM
Embedded¥4.8 2014q1¥bin
※フォルダ名は、クロスコンパイラのバージョンご
とに変わります。
• arm-none-eabi-gccへパスが通っているかを確認
• コンパイラバージョンが表⽰されない場合︓Path
を確認
50
ディレクトリ構造
• bin
– Windows向け開発環境のバイナリ
– mkimageを含む
• doc
– mrubyリファレンス
– ビルド⼿順
– サンプルプログラムの説明
• hr-tecs
– TOPPERS/HRP2及びEV3プラットフォーム
– サンプルプログラム(hr-
tecs/workspace/mruby_samples)
• mruby
– mruby ver1.1.0
– build_config.rbでEV3⽤のクロスコンパイルを指定
51
コンパイル⼿順
• mrubyのビルド(host⽤コンパイル→ARM⽤クロス
コンパイル)
• パッケージを展開したディレクトリで
– $ cd mruby
– $ make
– mrubyディレクトリでmakeを実⾏すると、mrubyがビル
ドされる。
※ビルドには、ruby及びbisonのインストールが必要
下記の出⼒がされればビルド成功
52
コンパイル⼿順
• EV3RT+TECS・EV3ドライバ・アプリケーションのビ
ルド準備
– SDカードへコピー
• デフォルトでは、cygwinが使⽤されていることを想定の上で、Eドラ
イブにコピーされる。
• ドライブを変更するには、サンプルコードのMakefileを編集。
hr-tecs/workspace/mruby_samples/Makefile
• Makefile内を "SD_DIR" で検索して、変数にSDカードドライブを指定
• SDカードドライブのドライブレターに合わせてください
• ここで指定したディレクトリにEV3⽤イメージファイルがコピーされ
ます
ここの名前をSDカードのドライブ名に変更
53
実⾏したいプログラムを選択
hr-tecs/workspace/mruby_samples/Makefile
実⾏したいアプリアプリケーション
を⼀つ選ぶ
54
コンパイル⼿順
• EV3RT+TECS・EV3ドライバ・アプリケーション
のビルド
– パッケージを展開してディレクトリで
– $ cd hr-tecs/workspace/mruby_samples/
– $ make tecs
• GNU Makeがtecsgenを実⾏してくれます
– $ make depend
• ファイルの依存関係を抽出します
• ヘッダファイルなど、読み込まれるファイルを更新してい
なければ、実⾏する必要ありません。
– $ make
– カレントディレクトリをサンプルアプリケーション
のディレクトリに移動し、makeを⾏うことでコンパ
イルが⾏える。
55
コンパイル⼿順︓①make tecs
tecs.timestampが出⼒されれば成功
56
コンパイル⼿順︓②make depend
touch omit_svc.hが⽣成されてからしばらく待つ
(処理中)︓⻑い場合数分
57
コンパイル⼿順︓③make
このような出⼒が出れば成功
下記のようなエラーになる場合は、SD_DIRの指定が間違っている
もしくは、SDカードを認識していない(ささってない)
58
コンパイル⼿順︓uImage
• ビルドの確認
– mkimageが⽣成され、uImageがコピーされてい
れば、ビルド成功です
– SDカードのルートディレクトリに、uImageとい
うファイルができます
– SDカードをEV3本体に⼊れる
59
本体操作基本操作
OS起動中中央(Enter)ボタンで
電源オン
中央(Enter)ボタンで
mrubyプログラム開始
LEDが⾚
の間はOS
の起動中
戻る(Back)ボタン
⻑押しで電源オフ
LEDが緑になれ
ばOS起動完了
60
コンパイル⼿順︓サンプルプログラムの変更
の場合
サンプルプログラムの変更後はmakeだけで良い
(make tecs, make dependは⼀度だけ)
サンプルプ
ログラムの
変更
make
61
ev3way_sample
• ETロボコン⽤のサンプル
– 倒⽴制御しながら、ライントレースを⾏う
• タッチセンサ(:port_1)
• カラーセンサ(:port_2)
• ジャイロセンサ(:port_3)
• 超⾳波センサ(:port_4)
• しっぽモータ(:port_a)
• 右モータ(:port_b)
• 左モータ(:port_c)
62
ev3way_sample
• 操作⼿順
– 電源を⼊れる
– ⿊⾊のライン上にカラーセンサを移動
– タッチセンサを押す︓⿊⾊の値を取得
– ⽩⾊の上にカラーセンサを移動
– タッチセンサを押す︓⽩⾊の値を取得
︓しっぽを下ろす
– ライン上移動
– タッチセンサを押す︓ライントレーススタート
63
ev3way_sample.rb︓初期化
begin
LCD.puts "ev3way_sample.rb"
LCD.puts "--- mruby version ---"
Speaker.volume = 1
forward = turn = 0
# initialize sensors
$sonar = UltrasonicSensor.new(SONAR_SENSOR)
$color = ColorSensor.new(COLOR_SENSOR)
$color.reflect
$touch = TouchSensor.new(TOUCH_SENSOR)
$gyro = GyroSensor.new(GYRO_SENSOR)
# initialize motors
$motor_l = Motor.new(LEFT_MOTOR)
$motor_r = Motor.new(RIGHT_MOTOR)
$motor_t = Motor.new(TAIL_MOTOR)
$motor_t.reset_count
# Signal calibration
LED.color = :orange
…
ポート番号を指定して初期化
(インスタンス化)
ひとつしかないもの(ポート番号指定不要)は、ひとつしかないもの(ポート番号指定不要)は、
クラスメソッドとして直接呼び出す
64
ev3way_sample.rb︓⿊⾊、⽩⾊の取得
# Calibration
$black_value = color_calibration
LCD.puts "black::#{$black_value}"
$white_value = color_calibration
LCD.puts "white::#{$white_value}"
threshold = (($black_value + $white_value) / 2).round
# wait start
LCD.puts "Ready to start" def color_calibration(n=10)
loop {
break if $touch.pressed?
RTOS.delay(10)
}
col = 0
n.times { col += $color.reflect}
col = (col / n).round
Speaker.tone(:a4, 200)
RTOS.delay(500)
col
end
カラーセンサn回取得し、
平均値を取得
ライントレースの
基準値を計算
タッチセンサが押されるまで待つ
65
ev3way_sample.rb︓スタート準備
# wait start
LCD.puts "Ready to start"
loop {
#initialize tail
tail_control(TAIL_ANGLE_STAND_UP)
RTOS.delay(10)
# Touch sensor start
break if $touch.pressed?
}
# reset motor encoder
$motor_l.reset_count
$motor_r.reset_count
# reset Gyro sensor
$gyro.reset
# Signal start status
LED.color = :green
def tail_control(angle)
pwm = ((angle - $motor_t.count) * P_GAIN).to_i
pwm = (pwm > PWM_ABS_MAX) ? PWM_ABS_MAX :
(pwm < -PWM_ABS_MAX) ? -PWM_ABS_MAX : pwm
$motor_t.power = pwm
$motor_t.stop(true) if pwm == 0
end
しっぽの位置を指定された⾓度に保つ
(フィードバック制御)
⽬標値⽬標値 現在の値現在の値
66
ev3way_sample.rb︓ライントレース
# main loop
forward = turn = 0
loop {
start = RTOS.msec
# up tail
tail_control(TAIL_ANGLE_DRIVE)
if sonar_alert
forward = turn = 0
else
# Line trace
turn = $color.reflect >= threshold ? 20 : -20
forward = 30
end
…
}
def sonar_alert
$sonar_counter += 1
if $sonar_counter == 10
distance = $sonar.distance
$sonar_alert = distance <=
SONAR_ALERT_DISTANCE
&& distance >= 0
$sonar_counter = 0
end
$sonar_alert
end
サンプルでは、30に固定
障害物まで⼀定の距離以下に
なると⽌まる
カラーセンサと閾値と⽐較し
どちらかに曲がる
ここを変更すると、
⾃前のライントレースが可能
67
ev3way_sample.rb︓倒⽴制御
# main loop
loop {
start = RTOS.msec
…
# call balance_control API
pwm_l, pwm_r = Balancer.control(
forward.to_f,
turn.to_f,
-$gyro.rate.to_f,
GYRO_OFFSET,
$motor_l.count.to_f,
$motor_r.count.to_f,
Battery.mV.to_f)
$motor_l.stop(true) if pwm_l == 0
$motor_l.power = pwm_l
$motor_r.stop(true) if pwm_r == 0
$motor_r.power = pwm_r
wait = 4 - (RTOS.msec - start)
RTOS.delay(wait) if wait > 0
}
C⾔語で実装されたバランサを呼び出す
4ミリ秒周期で実⾏
現状1ミリ秒程度で処理完了
mubyでも⼗分制御可能
バランサの返り値が2つ
68
パッケージ内のドキュメント
• doc/EV3RT_mruby_API_Reference.pdf
– 提供しているサンプル
• doc/mruby_on_ev3rt+tecs_build.pdf
– 環境設定
• doc/mruby_sample.pdf
– サンプルプログラムの説明
69
問い合わせ先・リンク
• 質問等は下記のMLに
– users@toppers.jp
• モニタ募集中
• EV3RT
– http://dev.toppers.jp/trac_user/ev3pf/wiki/WhatsEV3RT
70
mirb, mrdbをEV3上で動作
デモンストレーション
71
終わりに 72
ETロボコンをスマートに勝ち抜く⼿段として
mrubyの採⽤を、ぜひご検討ください。
今後もmrubyの動向に要注⽬です。

組込み向けスクリプト言語mrubyをEV3で動かしてみよう