Mindstorms EV3をRubyで動かす方法（ev3dev OS）

LEGO Mindstorms EV3にDebian Linuxベースの[ev3dev OS](http://www.ev3dev.org)を載せて、[ev3dev_ruby](https://github.com/noanoa07/ev3dev_ruby) gemを使ってRuby（CRuby）でEV3を制御することができます。

[ev3dev](http://www.ev3dev.org)は、microSDカードから起動して、LEGO社のEV3標準ファームウェア（OS）には一切変更を加えずに動作します。
リアルタイムOSではありませんが、RubyでライントレースのPID制御ができる程度の応答性は充分ありました。

他のリアルタイムOSのTOPPERS [EV3RT](http://dev.toppers.jp/trac_user/ev3pf/wiki/WhatsEV3RT)を載せて、mrubyで動かす方法についてはこちらを
→・[Mindstorms EV3をmrubyで動かす方法（Macで環境構築編） - noanoa07 - Qiita](http://qiita.com/noanoa07/items/dd5c5230b577a3622f08)
→・[来年のETロボコンにmrubyで参加しようと思ってるひとへ(2015年版) - yamanekko -Qiita](http://qiita.com/yamanekko/items/f280345ad7545c7f14d3) 

####環境

- Mindstorms EV3；ev3dev（ev3dev-jessie-2015-12-30）
- PC；OS X 10.11.2 El Catitan

#1．ev3dev のインストール、起動、ネットワーク設定
下記を参照；
→・（公式ページ）[Getting Started with ev3dev - ev3dev.org](http://www.ev3dev.org/docs/getting-started/)
→・[LEGO Mindstorms EV3 活用事例 - OpenRTM-aist](http://openrtm.org/openrtm/ja/casestudy/lego_mindstorm_ev3)
→・[EV3 および ev3dev の初期設定 - OpenRTM-aist](http://openrtm.org/openrtm/ja/node/5861)
→・[EV3-Pythonプログラミング（ev3dev）環境　wifi接続手順 - アフレル](http://www.afrel.co.jp/archives/16530)


ネットワークの接続方法；

- USB接続LANアダプターで有線LANに接続
- USB接続WiFiアダプターで無線LANに接続
- [BluetoothでPCに接続](http://www.ev3dev.org/docs/tutorials/connecting-to-the-internet-via-bluetooth/)（必要ならPCからインターネットに）
- [USBケーブル（Type A-mini B）でPCに接続](http://www.ev3dev.org/docs/tutorials/connecting-to-the-internet-via-usb/)（必要ならPCからインターネットに）


#2．ev3devにリモートログイン
PC（Mac、Linux）のターミナル（WindowsではPuTTY、Tera Termなど）から、 EV3（ev3dev OS）にリモートログイン。

```
$ ssh robot@ev3dev.local
（または、EV3の液晶画面に表示されたIPアドレスが 192.168.1.76 だとすると；
$ ssh robot@192.168.1.76）
 
The authenticity of host 'ev3dev.local (192.168.1.76)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
```

初回のログインの警告には、 **yes**を入力。

```
Warning: Permanently added 'ev3dev.local,192.168.1.76' (ECDSA) to the list of known hosts.
robot@ev3dev.local's password: 
```

パスワード **maker**を入力。
※ デフォルトのユーザー名とパスワードは、2015-12-30版から robot と makerに。（それ以前は、root と r00tme）

```
            _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/

Debian jessie on LEGO MINDSTORMS EV3!

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

robot@ev3dev:~$ 
```

※ コマンドプロンプトの表示;

- $ は PC（Macや Windows、Linux OS）の操作
- robot@ev3dev:~$ は EV3（ev3dev OS）のPCからのリモート操作


#3．ev3devのアップデート

```
robot@ev3dev:~$ sudo apt-get update
```
　
※ ev3dev OSのカーネルアップデートでモータークラスに非互換の変更があったようなので、以下のコマンドの実行は現時点（2016.6.17）ではおすすめしません。

```
robot@ev3dev:~$ sudo apt-get upgrade
robot@ev3dev:~$ sudo apt-get dist-upgrade
robot@ev3dev:~$ sudo reboot
```

#4．ev3dev_ruby gemのインストール
[ev3dev_ruby gem](https://rubygems.org/gems/ev3dev_ruby)を（PCにではなく、EV3のev3dev OSに）インストール。

```
robot@ev3dev:~$ sudo gem install ev3dev_ruby
```


#5．サンプルプログラム
→・[ev3dev_rubyのexamplesフォルダ](https://github.com/noanoa07/ev3dev_ruby/tree/master/examples)を参照

License; [unlicense](http://choosealicense.com/licenses/unlicense/)（public domain）

- （EV3のポートAにMモーターを接続）

```midiummotor.rb
#!/usr/bin/ruby

# LEGO EV3 Medium Servo Motor (45503)
# http://www.ev3dev.org/docs/motors/
# http://www.ev3dev.org/docs/motors/lego-ev3-medium-servo-motor/
# http://www.ev3dev.org/docs/drivers/tacho-motor-class/

require 'ev3dev'

mm = Ev3dev::Motor.new 'A'

p mm.device_path    #=> "/sys/class/tacho-motor/motor0"
p mm.driver_name    #=> "lego-ev3-m-motor"
p mm.address        #=> "outA"
p mm.commands       #=> "run-forever run-to-abs-pos run-to-rel-pos run-timed run-direct stop reset"
p mm.stop_commands  #=> "coast brake hold"
p mm.stop_command   #=> "coast"


mm.duty_cycle_sp 100
mm.command 'run-forever'
sleep 3
mm.command 'stop'

mm.duty_cycle_sp -100
mm.command 'run-forever'
sleep 3
mm.command 'stop'
```

実行するとモーターが3秒間回り、続いて3秒間逆回転。
　

- （EV3のポート3にカラーセンサーを接続）

```color_reflect.rb
#!/usr/bin/ruby

# LEGO EV3 Color Sensor (45506)
# http://www.ev3dev.org/docs/sensors/
# http://www.ev3dev.org/docs/sensors/lego-ev3-color-sensor/
# http://www.ev3dev.org/docs/drivers/lego-sensor-class/

require 'ev3dev'

col = Ev3dev::Sensor.new 3

p col.device_path  #=> "/sys/class/lego-sensor/sensor2"
p col.driver_name  #=> "lego-ev3-color"
p col.address      #=> "in3"
p col.modes        #=> "COL-REFLECT COL-AMBIENT COL-COLOR REF-RAW RGB-RAW COL-CAL"
p col.mode         #=> "COL-REFLECT"

col.mode 'COL-REFLECT'

p col.mode         #=> "COL-REFLECT"
p col.num_values   #=> "1"
p col.value0.to_i  #=> 93


50.times do
  puts col.value0.to_i
  sleep 0.1
end
```

実行するとカラーセンサーが読み取った反射光の明るさを50回表示。


#6．サンプルプログラムの実行
下記を参照；
→・[noanoa07/ev3dev_ruby/README.md - GitHub](https://github.com/noanoa07/ev3dev_ruby/blob/master/README.md)

参考）
→・[EV3 デバイスの利用 - OpenRTM-aist](http://openrtm.org/openrtm/ja/node/5813)
→・[python-ev3dev の利用 - OpenRTM-aist](http://openrtm.org/openrtm/ja/node/5806)
→・[ev3dev C++ バインディングの利用 - OpenRTM-aist](http://openrtm.org/openrtm/ja/node/5805)


##6-1）サンプルプログラムのダウンロード
[noanoa07/ev3dev_ruby - GitHub](https://github.com/noanoa07/ev3dev_ruby)のページ右上の「Clone or download」ボタンを押し、「Download ZIP」で PC にサンプルプログラムをダウンロードし、展開。
（展開先は /Users/xxx/Downloads/ev3dev_ruby-master/examples/ とする）


##6-2）EV3へコピー
EV3の液晶画面にFile Browserが表示するディレクトリは /home/robot なので、このディレクトリにコピーする。

- scpやrsyncを使う（Mac、Linux）

```
$ scp -r /Users/xxx/Downloads/ev3dev_ruby-master/examples  robot@ev3dev.local:/home/robot
（改行せずに一行で） 
```

- WinSCPを使う（Windows）


##6-3）サンプルプログラムの実行
※ 実行方法は2通り。
（プログラム名を midiummotor.rbとする）

###6-3-A）PCからリモートで実行

```
robot@ev3dev:~$ cd /home/robot
robot@ev3dev:~$ ls
LICENSE.txt	button		led		screen		sound
battery		image		motor
robot@ev3dev:~$ cd motor
robot@ev3dev:~$ ls
autonomous.rb	largemotor.rb	linetrace.rb	linetrace_2.rb	midiummotor.rb
color_reflect.rb  linetrace_2.rb  midiummotor.rb
robot@ev3dev:~$ ruby midiummotor.rb
```

###6-3-B）EV3単独で実行
####6-3-B-1）プログラムにshebangを書く
プログラムの一行目にshebangと呼ばれる、起動させるRubyインタプリタを指定する行を付ける。

```
robot@ev3dev:~$ ruby -v
ruby 2.1.5p273 (2014-11-13) [arm-linux-gnueabi]
robot@ev3dev:~$ which ruby
/usr/bin/ruby
```

Rubyインタプリタのある場所は /usr/bin/ruby なので、
プログラムの一行目に
```#!/usr/bin/ruby```
と書いておく。（サンプルプログラムには記載済み。）


####6-3-B-2）プログラムに実行権限を付ける
ファイルの実行権限の確認。


```
robot@ev3dev:~$ cd /home/robot
robot@ev3dev:~$ cd motor
robot@ev3dev:~$ ls -l
...
-rw-r--r-- 1 robot robot  474 Jan 18 16:18 midiummotor.rb
...
```

midiummotor.rb に、実行権限 x が表示されていないので、アクセス権限を変更。

```
robot@ev3dev:~$ chmod +x midiummotor.rb
robot@ev3dev:~$ ls -l
...
-rwxr-xr-x 1 robot robot  474 Jan 18 16:18 midiummotor.rb
...
```

実行権限 x が付与。


####6-3-B-3）File Browserで実行
EV3の液晶画面のFile Browserで、/home/robot ディレクトリを表示させる。上下ボタンまたは中央ボタンでディレクトリやプログラムを選択していき、中央ボタンを押すと実行される。


#7．irbでのプログラムの実行
EV3（ev3dev）の irb でもプログラムを実行できる。
（EV3のポートAにMモーターを接続）

```
robot@ev3dev:~$ irb
irb(main):001:0> require 'ev3dev'
=> true
irb(main):002:0> mm = Ev3dev::Motor.new 'B'
=> #<Ev3dev::Motor:0x193890 @device_path="/sys/class/tacho-motor/motor0">
irb(main):003:0> mm.device_path
=> "/sys/class/tacho-motor/motor0"
irb(main):004:0> mm.driver_name
=> "lego-ev3-l-motor"
irb(main):005:0> mm.address
=> "outB"
irb(main):006:0> mm.commands
=> "run-forever run-to-abs-pos run-to-rel-pos run-timed run-direct stop reset"
irb(main):007:0> mm.stop_commands
=> "coast brake hold"
irb(main):008:0> mm.duty_cycle_sp 100
=> #<Ev3dev::Motor:0x193890 @device_path="/sys/class/tacho-motor/motor0">
irb(main):009:0> mm.command 'run-forever'
=> #<Ev3dev::Motor:0x193890 @device_path="/sys/class/tacho-motor/motor0">
irb(main):010:0> sleep 3

=> 3
irb(main):011:0> mm.command 'stop'
=> #<Ev3dev::Motor:0x193890 @device_path="/sys/class/tacho-motor/motor0">
irb(main):012:0> exit
robot@ev3dev:~$ 
```

#8．ev3dev API
[ev3dev_ruby](https://github.com/noanoa07/ev3dev_ruby) gemはev3dev OSの薄いラッパーなので、使い方はev3dev APIとほぼ同じ。

##モーター

- [対応モーター](http://www.ev3dev.org/docs/motors/)
- [EV3 Mモーター](http://www.ev3dev.org/docs/motors/lego-ev3-medium-servo-motor/)
- [EV3 Lモーター](http://www.ev3dev.org/docs/motors/lego-ev3-large-servo-motor/)
- [モータークラス API](http://www.ev3dev.org/docs/drivers/tacho-motor-class/)
- [モータークラス チュートリアル](http://www.ev3dev.org/docs/tutorials/tacho-motors/)
 
##センサー

- [対応センサー](http://www.ev3dev.org/docs/sensors/) 
- [EV3 タッチセンサー](http://www.ev3dev.org/docs/sensors/lego-ev3-touch-sensor/)
- [EV3 カラーセンサー](http://www.ev3dev.org/docs/sensors/lego-ev3-color-sensor/)
- [EV3 ジャイロセンサー](http://www.ev3dev.org/docs/sensors/lego-ev3-gyro-sensor/)
- [EV3 超音波センサー](http://www.ev3dev.org/docs/sensors/lego-ev3-ultrasonic-sensor/)
- [センサークラス API](http://www.ev3dev.org/docs/drivers/lego-sensor-class/)
 
##内蔵ハードウェア

- [バッテリー](https://github.com/ev3dev/ev3dev/issues/68)
- [サウンド](https://github.com/ev3dev/ev3dev/wiki/Using-Sound)
- [LED](https://github.com/ev3dev/ev3dev/wiki/Using-the-LEDs)
- [ボタン](http://www.ev3dev.org/docs/tutorials/using-ev3-buttons/)
- [液晶（LCD）](http://www.ev3dev.org/docs/tutorials/using-ev3-lcd/)
 

#9．Ev3dev::Motor クラスAPI
→・[モータークラス API](http://www.ev3dev.org/docs/drivers/tacho-motor-class/)
 
※ sysfs
モーターはev3dev OSの仮想的ファイルシステムの /sys/class/tacho-motor/motor\<N>
として扱われる。（\<N> は接続された時に振られる数字で、ポート番号とは違う。）

- device_path（読み取り専用） 
/sys/class/ のパスを表示

- address（読み取り専用） ※ 2015-9版までは、port_name
ポート名を表示

- driver_name（読み取り専用）
モーター名の表示

- command（書き込み専用）
以下のサブコマンドを伴って、モーター動作を指定する（例；command 'run-forever'）
・run-forever
　別のコマンドが来るまでずっと回る
・run-to-abs-pos
　position_sp で指定したモーター位置（絶対値）まで回り、stop_command で指定されたモードで止まる
・run-to-rel-pos
　position_sp で指定したモーター位置（相対値）分だけ、現在の位置から回り（現在位置 +  position_sp）、stop_command で指定されたモードで止まる
・run-timed
　time_sp で指定した時間だけ回り、stop_command で指定されたモードで止まる
・run-direct
　duty_cycle_sp で指定したスピードで回る。 他と違い、duty_cycle_sp が変わると直ちにスピードが変わる
・stop
stop_command で指定されたモードで止まる
・reset
　モーターの動作モード、停止モードを初期値に戻し、モーターも止める

- commands（読み取り専用）
command のリスト

- stop_command（読み取り/書き込み）
停止モードの表示及び設定。
・coast: 惰性で止まる
・brake: ブレーキをかけて止まる
・hold: 現在位置を保持（外力がかかったら元に戻そうとする）

- stop_commands（読み取り専用）
 停止モードの一覧表示

- duty_cycle（読み取り専用）
現在のモータースピードの表示（-100～100 %）。負の値は逆回転。

- duty_cycle_sp（読み取り/書き込み）
モータースピードのセット値の表示（デューティー比(出力率) -100 ～ 100 %）。数字を付けるとセット値の設定。（speed_regulationが offの場合に使われる。）
負の値は逆回転。（run-to-abs-pos とrun-to-rel-pos では負の値は無視。）

- time_sp（読み取り/書き込み）
モーター駆動時間の表示及び設定。 run-timed で使用される。

- position（読み取り/書き込み）
モーターの現在位置の表示（ロータリーエンコーダーの値） 、及び設定。
時計回りで増加、反時計回りで減少。（-2,147,483,648～+2,147,483,647 の32-bit signed integer)

- position_sp（読み取り/書き込み）
run-to-abs-pos とrun-to-rel-pos コマンドの設定モーター位置の表示及び設定。（-2,147,483,648～+2,147,483,647 の32-bit signed integer)
 
- speed（読み取り専用）
現在のモータースピードの表示。
数字はカウント/秒で、度（°）ではないので、 必要ならcount_per_rot を使って変換すること。 

- speed_sp（読み取り/書き込み）
目標スピードの表示及び設定。 数字を付けるとセット値の設定。（speed_regulationが onの場合に使われる。）
負の値は逆回転。（run-to-abs-pos とrun-to-rel-pos では負の値は無視。）
数字はカウント/秒で、度（°）ではないので、 必要ならcount_per_rot を使って変換すること。 

- count_per_rot（読み取り専用）
一回転あたりのモーターカウント 

- speed_regulation（読み取り/書き込み）
スピード調整モードの表示及び設定
・on: speed_sp で設定されたスピードにしようと自動調整する
・off: duty_cycle_sp で設定されたスピードで動く

- state（読み取り専用）
状態表示
・ramping: 加速 / 減速途中
・holding: モーターは回転していないが、その位置を保持している
・stalled: モーターは回転していない

- ramp_up_sp（読み取り/書き込み）
徐々に加速するセット値の表示及び設定（ミリ秒）。正の値で徐々に加速して、0％から100%になるまでの時間で表す。duty_cycle_spや speedで最大値が設定されていれば、加速は途中で止む。

- ramp_down_sp（読み取り/書き込み）
徐々に減速するセット値の表示及び設定（ミリ秒）。正の値で徐々に減速して、100％から0%になるまでの時間で表す。最初が100％以下なら、減速する時間はこれより短くなる。

- encoder_polarity（読み取り/書き込み）
モーターのロータリーエンコーダの極性の表示（normal またはinversed）、及び設定

- polarity（読み取り/書き込み）
モーターの極性の表示、及び設定
・normal: 時計回り
・inversed: 反時計回り


#10．Ev3dev::Sensor クラスAPI
→・[センサークラス API](http://www.ev3dev.org/docs/drivers/lego-sensor-class/)

※ sysfs
センサーはev3dev OSの仮想的ファイルシステムの /sys/class/lego-sensor/sensor\<N>
として扱われる。（\<N> は接続された時に振られる数字で、ポート番号とは違う。）

- device_path（読み取り専用） 
/sys/class/ のパスを表示

- address（読み取り専用） ※ 2015-9版までは、port_name
ポート名を表示

- driver_name（読み取り専用）
センサー名の表示

- modes（読み取り専用）
センサーのモード一覧
 
- mode（読み取り/書き込み）
センサーのモードの表示、及び設定

- num_values（読み取り専用）
センサーから返ってくるデータの数

- value<N>（読み取り専用）
センサーからのデータが、それぞれ value0、value1、value2、…で取得できる。
返ってくる値は文字列なので、整数にしたい場合は value0.to_i のようにする


#11．Ev3dev::Battery クラスAPI
→・[Battery status? - Issue #68 - ev3dev/ev3dev - GitHub](https://github.com/ev3dev/ev3dev/issues/68)

※ sysfs
バッテリーはev3dev OSの仮想的ファイルシステムの /sys/class/power_supply/legoev3-battery
として扱われる。

- device_path（読み取り専用） 
/sys/class/ のパスを表示

- voltage_now（読み取り専用）
バッテリーの現在の電圧（マイクロボルト）を表示。
返ってくる値は文字列なので、整数にしたい場合は value0.to_i のようにする。

- uevent（読み取り専用）
バッテリーの各種情報を表示


#12．Ev3dev::Sound クラスAPIの解説
→・[Using Sound - ev3dev/ev3dev - GitHub](https://github.com/ev3dev/ev3dev/wiki/Using-Sound)

※ sysfs
サウンドはev3dev OSの仮想的ファイルシステムの /sys/devices/platform/snd-legoev3/
として扱われる。

- device_path（読み取り専用） 
/sys/devices/ のパスを表示

- mode（読み取り専用） 
再生モード（idle、tone、pcm）を表示

- volume（読み取り/書き込み）
音量（0～100）の表示、及び設定

- beep
→・[beep man page - debian.org](https://manpages.debian.org/cgi-bin/man.cgi?query=BEEP&sektion=1&apropos=0&manpath=Debian+7.0+wheezy&locale=)
ビープ音を鳴らす
・引数なし 
　440Hz 200ms で鳴らす
・beep '-f 200 -l 500'
　-f 周波数（Hz）の指定
　-l 長さ（ms） の指定
・sound.beep "-f 262 -l 180 -d 20 -r 2 \
-n -f 392 -l 180"
　-r 繰り返し回数
　-d 繰り返しの時の間隔（ms）
　-n 前の指定をクリアする

- tone
ビープ音を鳴らす
・引数なし
　現在の周波数を返す（鳴っていない時は 0を返す）
・tone 440, 1000
　第1引数；周波数（Hz）の指定 （例；440Hz）
　第2引数；時間（ms）の指定（例；1000ms）
・tone 500
　周波数（Hz）の指定（例；500Hz）
　ずっと鳴る
・tone 0
　鳴るのを停止

- aplay
→・[aplay(1) - Linux man page](http://linux.die.net/man/1/aplay)
.wav ファイルを再生
・aplay 'my_file.wav'
　my_file.wav ファイルを再生
・aplay '-d 1 my_file.wav'
　-d 再生時間を指定（秒）（例；1秒）

- mpg123
.mp3 ファイルを再生
ただし、あらかじめ mpg123 player のインストールが必要
`robot@ev3dev:~$ sudo apt-get install mpg123`
・mpg123 'sample.mp3'
　sample.mp3 ファイルを再生
・mpg123 '-2 sample.mp3'
　-2 サンプリングレートを1/2（22 kHz）に

- espeak
→・[eSpeak Speech Synthesizer](http://espeak.sourceforge.net/commands.html)
テキストをしゃべらせる
・espeak "'I can speak.'"
　文字列 'I can speak.' をしゃべらせる（' 'の外側を " "で囲む）
・espeak "'#{text}'"
　文字列オブジェクト text を展開してしゃべらせる（' 'の外側を " "で囲む）
・espeak "-f sample.txt"
　sample.txt ファイルをしゃべらせる
・-f ファイルを指定
　-p ピッチを指定（0～90、標準 50）
　-s スピードを指定（ワード/分 80～500、標準 175、早口 260）


#13．Ev3dev::Led クラスAPIの解説
→・[Using the LEDs - ev3dev/ev3dev - GitHub](https://github.com/ev3dev/ev3dev/wiki/Using-the-LEDs)

※ sysfs
LEDはev3dev OSの仮想的ファイルシステムの /sys/class/leds
として扱われる。

※ LED は4つ；
・左緑（left_green）、左赤（left_red）、右緑（right_green）、右赤（right_red）
・明るさの設定値 0～255（最大輝度）
・LEDを指定しないと、全LEDの操作となる

- paths
設定されている LEDのパスを表示

- Ev3dev::Led::GREEN
緑 255、赤 0

- Ev3dev::Led::RED
緑 0、赤 255

- Ev3dev::Led::AMBER
緑 255、赤 255

- left_green
左緑LED を指定

- left_red
左赤LED を指定

- right_green
右緑LED を指定

- right_red
右赤LED を指定

- left
左緑と左赤LED を指定

- right
右緑と右赤LED を指定
 
- on
・on（引数なし）；最大輝度で点灯
・on 100 ；輝度 100 で点灯
・on 100, 200 ；緑 100、赤 200 で点灯（緑と赤LED を指定時） 

- off
全 LED を消灯

- blink
・blink（引数なし）；点灯 500ms、消灯 500ms、最大輝度 で繰り返す
・blink 255, 0, 1000, 150 ；緑 255、赤 0、点灯 1000ms、消灯 150ms で繰り返す（緑と赤LED を指定時）
・blink 100, 750, 250 ；輝度 100、点灯 750ms、消灯 250ms で繰り返す（単色LED を指定時）
・blink 255, 0 ；緑 250、赤 0、点灯 500ms、消灯 500ms で繰り返す（緑と赤LED を指定時）
・blink 10 ；輝度 10、点灯 500ms、消灯 500ms で繰り返す（単色LED を指定時）

- set_flash
・set_flash（引数なし）；フラッシュ時間 0.1s に設定
・set_flash 20 ；フラッシュ時間 0.2s に設定

- flash
　フラッシュ点灯

以下、単独のLED を指定時；

- max_brightness（読み取り専用）
最大輝度を表示

- brightness（読み取り/書き込み）
設定されている輝度の表示、及び設定

- trigger（読み取り/書き込み）
設定されている Trigger の表示、及び設定
・timer（書き込み専用）（例；trigger 'timer'）
　点灯・消灯繰り返しモードに設定
　- delay_on（読み取り/書き込み）
　　点灯時間の表示、及び設定（ms）
　- delay_off（読み取り/書き込み）
　　消灯時間の表示、及び設定（ms）
・none（書き込み専用）（例；trigger 'none'）
　初期状態に戻す（消灯する）
・heartbeat（書き込み専用）
　CPUの使用に応じて点滅
・mmc0（書き込み専用）
　microSDカードのアクセスに応じて点滅
・transient（書き込み専用）
　フラッシュ点灯（上記）


#14．Ev3dev::Button クラスAPIの解説
→・[Using the EV3 Buttons  - ev3dev/ev3dev - GitHub](http://www.ev3dev.org/docs/tutorials/using-ev3-buttons/)


※ EV3のボタンは 5つ；
上（up）、下（down）、左（left）、右（right）、中央（enter）、左上（back）

- up?
上ボタンが押されている／押されていない；返り値 true/ false

- down?
下ボタンが押されている／押されていない；返り値 true/ false

- left?
左ボタンが押されている／押されていない；返り値 true/ false

- right?
右ボタンが押されている／押されていない；返り値 true/ false

- enter?
中央ボタンが押されている／押されていない；返り値 true/ false 

- back?
左上ボタンが押されている／押されていない；返り値 true/ false

- pressed
押されているボタンを配列で返す


#15．液晶（LCD）APIの解説
→・[Using the EV3 LCD - ev3dev/ev3dev - GitHub](http://www.ev3dev.org/docs/tutorials/using-ev3-lcd/)
→・[Display_API.md - noanoa07/ev3dev_ruby - GitHub](https://github.com/noanoa07/ev3dev_ruby/blob/master/Display_API.md)

- 液晶のスペック


|Mode                  |178 x 128 pixel            |
|----------------------|---------------------------|
|LineLength            |24 bytes (192 bits)        |
|Geometry              |1 (1 bit per pixel)        |
|Type                  |PACKED PIXELS              |
|Visual                |MONO01 (0: white, 1: black)|
|Frame Buffer directory|/dev/fb0                   |
|Frame Buffer size     |24 * 128 = 3072 bytes      |

※ 横幅は 192ビットの内の 178ビット、縦幅は 128ビットが実際に表示される

※ 対応する画像フォーマット
　モノクロ 192 x 128 ピクセル .mono フォーマット（LSB）
→・[ImageMagick: Supported Image Formats](http://www.imagemagick.org/script/formats.php)


## Ev3dev::Screen クラスAPI

- インスタンス変数 ＠imgs（配列）に画像データが入る

- load(image_file)
image_fileファイルを読み込み、＠imgs の配列に追加

- load_blank
空白画像を ＠imgs の配列に追加

- show
＠imgs の配列の最初の画像をディスプレイに表示
配列が2つ以上の時は、表示した画像は削除

- show_blank
＠imgs に関係なく、空白画像をディスプレイに表示

## Ev3dev::Image クラスAPI

- 任意の画像フォーマットを「モノクロ 192 x 128 ピクセル .mono フォーマット」に変換
- テキスト画像を作成
- [RMagick](https://github.com/rmagick/rmagick) gem ([ImageMagick](http://www.imagemagick.org/script/index.php) Ruby binding) のインストールが必要

```
robot@ev3dev:~$ sudo apt-get update
robot@ev3dev:~$ sudo apt-get install ruby-rmagick
(または ~$ sudo gem install rmagick -N -V)
```

・initialize(image_file)
　image_fileファイルを読み込んで、「モノクロ 192 x 128 ピクセル .mono フォーマット」に変換、あるいはファイルを指定しないと空白の画像を作成

・save(output_file)
　output_fileファイルを保存（ファイル名には .mono が必要）

・text(x, y, size, string)
　テキスト画像を作成
　・x; テキストの x 座標
　・y; テキストの y 座標
　・size; フォントサイズ
　・string; 文字

## PC上での対応画像（モノクロ 192 x 128 ピクセル .mono フォーマット）の作り方
### ImageMagick での作り方
1. ImageMagick のインストール
→・[ImageMagickサイト](http://www.imagemagick.org/script/index.php)参照 

2. ターミナル（コマンドプロンプト）で実行

```
$ convert -resize 192x128! original_file.jpg converted_file.mono
　（出力ファイル名には .mono が必要）
```

3\. PC上で .monoファイルの表示
（X Window System、Macでは[XQuartz](https://www.xquartz.org)が必要）

```
$ display -size 192x128 converted_file.mono
```

### RMagick（ImageMagick のRuby binding）での作り方

1. ImageMagick のインストール
→・[ImageMagickサイト](http://www.imagemagick.org/script/index.php)参照

2. RMagick のインストール
→・[RMagickサイト参照](https://github.com/rmagick/rmagick)

3. Rubyプログラムで実行

```Ruby
require 'RMagick'
target_image =  Magick::Image.read('original_file.jpg').first
target_image.resize_to_fill!(192, 128)
target_image.write('converted_file.mono')  #出力ファイル名は .mono にすること
target_image.destroy!
```

4\. PC上で .monoファイルの表示
（X Window System、Macでは[XQuartz](https://www.xquartz.org)が必要）
　Rubyプログラム

```Ruby
require 'RMagick'
mono_image = Magick::Image.read('converted_file.mono') { self.size = "192x128" }.first
mono_image.display
```

　
（→・[元記事](http://blog.livedoor.jp/noanoa07/archives/2072102.html)）