mindstorm-EV3 ev3devでコマンドラインからモーター制御、センサー値取得する方法まとめ

# 概要
ev3devを用いてコマンドラインからmindstorm-EV3のモーターを制御したり、センサー値を取得することができます。
ev3devの環境構築についてはこちらを参考にして下さい。
> [mindstorm-EV3をLinuxで制御しよう! ev3dev OSのインストールととSSH接続](http://qiita.com/murotani/private/46f905bec33b1673c41a)

# モーターの制御
モーターはインテリジェントブロックのA～Dポートに接続することができます。
LモーターをAポートに、MモーターBポートにそれぞれ接続します。
![P_20161214_183727_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/149019/f3e273ad-5354-c1cf-81b6-fbd44e68f4e1.jpeg)

接続されているモーターのファイルパスと接続ポート、モーターデバイス名を次のコマンドで確認できます。
<pre><code>robot@ev3dev:~$ for f in /sys/class/tacho-motor/*; do echo -n "$f: "; cat $f/address $f/driver_name;echo $""; done
</code></pre>
実行結果(＊モーターを接続したポートによって変わります)
<pre><code>/sys/class/tacho-motor/motor0: outA
lego-ev3-l-motor

/sys/class/tacho-motor/motor1: outB
lego-ev3-m-motor
</code></pre>
それぞれのモーターについて制御方法を解説します。

## Lモーター(lego-ev3-l-motor)
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45502_LargeMotor.jpg)
ファイルパスが長くなるので変数にします。
```robot@ev3dev:~$ export MC=/sys/class/tacho-motor/motor0```
### 使用できるコマンド
<pre><code>robot@ev3dev:~$ cat $MC/commands                       
run-forever run-to-abs-pos run-to-rel-pos run-timed run-direct stop reset
</code></pre>
- run-forever  
回転維持(速度変更が静的に反映)  
速度パラメータは```/sys/class/tacho-motor/motor0/speed_sp```に定義する
- run-to-abs-pos  
絶対位置へ回転  
位置パラメータは```/sys/class/tacho-motor/motor0/position_sp```に定義する
- run-to-rel-pos  
相対位置へ回転  
位置パラメータは```/sys/class/tacho-motor/motor0/position_sp```に定義する
- run-timed  
指定秒数回転  
秒数パラメータは```/sys/class/tacho-motor/motor0/time_sp ```に定義する
- run-direct  
回転維持(スピード変更が動的に反映)  
速度パラメータは``` /sys/class/tacho-motor/motor0/duty_cycle_sp ```に定義する
- stop  
回転停止
- reset  
全てのパラメータをリセットする  

詳しくは下記URLを参照してください。
[http://www.ev3dev.org/docs/tutorials/tacho-motors/](http://www.ev3dev.org/docs/tutorials/tacho-motors/)

### モーターを回転、停止

##### 速度パラメータspeed_spを400に設定し回転維持させる
speed_spには-1050～1050の値を設定できます。数値が大きいほど速度が増します。負の値を設定すると逆回転します。
<pre><code>robot@ev3dev:~$ echo 400 > $MC/speed_sp 
robot@ev3dev:~$ echo run-forever > $MC/command </code></pre>

##### 速度パラメータspeed_spを200に変更する
速度パラメータを変更してもモーターの回転速度には動的に反映されません。もう一度run-foreverコマンドを実行する必要があります。
<pre><code>robot@ev3dev:~$ echo 200 > $MC/speed_sp 
robot@ev3dev:~$ echo run-forever > $MC/command </code></pre>

##### モーターを停止させる
<pre><code>robot@ev3dev:~$ echo stop > $MC/command </code></pre>
## Mモーターの制御
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45503_MediumMotor.jpg)
Lモーターと基本的に同様に制御できるので割愛します。
速度パラメータspeed_spの設定可能範囲が(-1560～1560)になるところがLモーターとは違います。
詳しくは下記URLを参照してください。
[http://www.ev3dev.org/docs/tutorials/tacho-motors/](http://www.ev3dev.org/docs/tutorials/tacho-motors/)

# センサー値の取得
センサーはインテリジェントブロックの1～4番ポートに接続することができます。
ジャイロセンサー、カラーセンサー、タッチセンサー、超音波センサをそれぞれ接続します。(順番は適当で大丈夫です)
![P_20161214_184324_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/149019/243744ad-89db-17ad-ef77-0a7bb5c15aab.jpeg)

接続されているセンサーのファイルパスと接続ポート、センサーデバイス名を次のコマンドで確認できます。
<pre><code>robot@ev3dev:~$ for f in /sys/class/lego-sensor/*; do echo -n "$f: "; cat $f/address $f/driver_name;echo $''; done
</code></pre>
実行結果(＊センサを接続したポートによって変わります)
<pre><code>
/sys/class/lego-sensor/sensor4: in1
lego-ev3-gyro

/sys/class/lego-sensor/sensor5: in2
lego-ev3-us

/sys/class/lego-sensor/sensor6: in3
lego-ev3-touch

/sys/class/lego-sensor/sensor7: in4
lego-ev3-color
</code></pre>
それぞれのセンサーについて値の取得方法を解説します。

## ジャイロセンサー(lego-ev3-gyro)
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45505_GyroSensor.jpg)
### ジャイロセンサーのモード
センサーのモードを設定することで、モードに対応した値を取得できます。
<pre><code>robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor4/modes   
GYRO-ANG GYRO-RATE GYRO-FAS GYRO-G&A GYRO-CAL
</code></pre>

| mode | 説明 | 単位 | ファイル | 値の範囲 |
|:-:|:-:|:-:|:-:|:-:|
| GYRO-ANG | 角度  | deg (degrees)  | value0  | 32768 ～ 32767 |
|  GYRO-RATE | 回転速度  |  d/s (degrees/second) | value0  | -440 ～ 440 |
|  GYRO-FAS |  センサーの生データ | -  | value0  | -1464 ～ 1535 |
|  GYRO-G&A |  角度と回転速度 |  - |  角度:value0、回転速度:value1 |　角度:(32768 ～ 32767)、回転速度(-440 ～ 440)  |
|  GYRO-CAL |  較正値 |  - | value0 value1  value2  value3 |?|
詳しくは下記URLを参照下さい
[http://www.ev3dev.org/docs/sensors/lego-ev3-gyro-sensor/](http://www.ev3dev.org/docs/sensors/lego-ev3-gyro-sensor/)
例えば、角度を取得したい場合は、表より```/sys/class/lego-sensor/sensor4/mode```にGYRO-ANGを書き込み、```/sys/class/lego-sensor/sensor4/value0```をcatすれば良いと分かります。

<pre><code>robot@ev3dev:~$ echo GYRO-ANG >> /sys/class/lego-sensor/sensor4/mode
robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor4/value0
24452
</code></pre>


## 超音波センサー(lego-ev3-us)
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45504_UltrasonicSensor.jpg)
### 超音波センサのモード
<pre><code>robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor5/modes
US-DIST-CM US-DIST-IN US-LISTEN US-SI-CM US-SI-IN US-DC-CM US-DC-IN
</code></pre>

超音波センサーのモードについては下記URLを参照して下さい。
[http://www.ev3dev.org/docs/sensors/lego-ev3-ultrasonic-sensor/](http://www.ev3dev.org/docs/sensors/lego-ev3-ultrasonic-sensor/)

### 障害物までの距離(mm)を取得
<pre><code>robot@ev3dev:~$ echo US-DIST-CM >> /sys/class/lego-sensor/sensor5/mode
robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor5/value0
70
</code></pre>

## タッチセンサー(lego-ev3-touch)
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45507_TouchSensor.jpg)
### タッチセンサーのモード
<pre><code>robot@ev3dev:~$ robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor6/modes
TOUCH
</code></pre>

タッチセンサーのモードについては下記URLを参照して下さい。
[http://www.ev3dev.org/docs/sensors/lego-ev3-touch-sensor/](http://www.ev3dev.org/docs/sensors/lego-ev3-touch-sensor/)

### タッチを検出
タッチされていたら1されていなかったら0を出力します。
<pre><code>robot@ev3dev:~$ echo TOUCH >> /sys/class/lego-sensor/sensor6/mode
robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor6/value0
0 #タッチされていない
</code></pre>

## カラーセンサー(lego-ev3-color)
![](http://www.afrel.co.jp/cms/wp-content/uploads/2013/04/45506_color.jpg)
### カラーセンサーのモード
<pre><code>robot@ev3dev:~$ robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor7/modes
COL-REFLECT COL-AMBIENT COL-COLOR REF-RAW RGB-RAW COL-CAL
</code></pre>

タッチセンサーのモードについては下記URLを参照して下さい。
[http://www.ev3dev.org/docs/sensors/lego-ev3-color-sensor/](http://www.ev3dev.org/docs/sensors/lego-ev3-color-sensor/)

### 色の判定
対象の色を識別します。出力値と色の対応関係は以下のようになっています。

| 出力 | 色 |
|:-:|:-:|
| 0  | 色無し  |
|  1 | 黒  |
|  2 |  青 |
|  3 |  緑 |
|  4 |  黄 |
|  5 |  赤 |
|  6 |  白 |
|  7 |  茶 |


<pre><code>robot@ev3dev:~$ echo TOUCH >> /sys/class/lego-sensor/sensor7/mode
robot@ev3dev:~$ cat /sys/class/lego-sensor/sensor7/value0
1 #黒
</code></pre>

# 参考
[ev3dev 公式ページ](http://www.ev3dev.org/docs/drivers/lego-port-class/)