後輩たちのためのEV3rt講座④(センサーを使う-②)

前回に引き続きセンサーの紹介をしていきます。
今回紹介するセンサーは正直使ったことが無いので、詳しいことは説明できませんのであしからず。
詳しいことは↓を見るか、各自ググりましょう。
[EV3RT C API Reference 各種センサ](http://www.toppers.jp/ev3pf/EV3RT_C_API_Reference/group__ev3sensor.html)
#(ⅲ)超音波センサー#
![31CW7E8ILJL._SX355_.jpg](https://qiita-image-store.s3.amazonaws.com/0/183170/0e736b66-7690-f369-6ac9-1db522e03dc4.jpeg)
二つ目玉がついた比較的大きなセンサーですね。英訳するとultrasonic sensorです。
センサーから超音波を出し、帰ってくるまでの時間で距離を測ったりします。
超音波センサーの値の取得方法は2つあります。
##①存在を確認する##
超音波センサーの感知圏内に物体、障害物などが`ある`か`ない`かを判断します。
bool型で返しますのであればtrue、なければfalseです。
以下、軽く例を示します。

```app.c
void main_task(intptr_t unused)
{
    /* コンフィグゾーン　*/
    ev3_sensor_config (0,ULTRASONIC_SENSOR);
    if(ev3_ultrasonic_sensor_listen(0)==true){
        //処理
    }
```
教育版ソフトウェアだとこんな感じ。
![スクリーンショット 2018-09-27 21.55.52.png](https://qiita-image-store.s3.amazonaws.com/0/183170/b5c55daa-ba0f-1170-939f-9ca9e78b822d.png)
このようにすればなにかオブジェクトを発見した際に処理を行うといったことができます。
##②距離をはかる##
教育版ソフトウェアでいうところのこれ↓
![スクリーンショット 2018-09-27 21.57.31.png](https://qiita-image-store.s3.amazonaws.com/0/183170/1457a7ca-21a2-626d-e54c-39947c0ca05c.png)
冒頭説明したとおり、超音波センサーは超音波が帰ってくるまでの時間を測ることにより、対象物までの距離を調べることができます。以下例ではint変数に格納するようにします。

```app.c
void main_task(intptr_t unused)
{
    /* コンフィグゾーン　*/
    ev3_sensor_config (0,ULTRASONIC_SENSOR);
    int distance=ev3_ultrasonic_sensor_get_distance(0);
```
これでint型で値を使用することができます。ちなみに単位はcmです。
超音波はこの2つだけなのでシンプルでいいですね。

#(ⅳ)ジャイロセンサー#
![0000000002672.png](https://qiita-image-store.s3.amazonaws.com/0/183170/dcb17874-84da-2126-d7bd-92cd48892884.png)
倒立振子(通称:ジャイロボーイ)にはかかせないセンサーで、回転した角度と、一秒あたりの角速度を取得することができます。
ジャイロセンサーには向きがあり、下の図のようにセンサー矢印方向に動かすことで、値が増減するようになっています。よくわからなければ、実際に教育版ソフトウェアで値の変化を見てみると良いでしょう。
![lyout.png](https://qiita-image-store.s3.amazonaws.com/0/183170/edd0b99a-3b2c-f141-9fe3-28d32c819f59.png)
さて、それではプログラム方法を紹介していきます。
##①角度を取得##
教育版ソフトウェアでいうところのこれ↓
![スクリーンショット 2018-09-27 21.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/183170/f8f1d6ae-f4fa-d45f-4650-716af090d5c5.png)
まずは基本となる角度の取得です。プログラム開始後、自動的に角度は0にリセットされ、そこからどれだけ回転したかを見ることができます。

```app.c
void main_task(intptr_t unused)
{
    /* コンフィグゾーン　*/
    ev3_sensor_config (0,ULTRASONIC_SENSOR);
    int angle=ev3_gyro_sensor_get_angle(0);
```
これでint変数angleに角位置が代入されました。この機能を利用すれば、90°回転も正確性を向上させることができるかもしれません。

##②角速度を取得する##
教育版ソフトウェアでいうところのこれ↓
![スクリーンショット 2018-09-27 21.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/183170/30fb813c-a082-d5fe-4a92-124a94022512.png)

一秒間にどれだけ回転したかを取得するモードです。『回転した』という事実が欲しいだけであればこっちのほうが良いですね。

```app.c
void main_task(intptr_t unused)
{
    /* コンフィグゾーン　*/
    ev3_sensor_config (0,ULTRASONIC_SENSOR);
    int rate=ev3_gyro_sensor_get_rate(0);
```

これでint変数rateに角速度が代入されました。if文などで条件式を書けば回転を検知することもできるでしょう。

##③各位置をリセット##
教育版ソフトウェアでいうところのこれ↓
![スクリーンショット 2018-09-27 22.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/183170/e56f1e64-e8ad-7628-05c7-86c8942cd7c2.png)
競技の途中で回転角をリセットしたい場合等があると思います。その時は以下を実行すると各位置が0にリセットされます。

```app.c
void main_task(intptr_t unused)
{
    /* コンフィグゾーン　*/
    ev3_sensor_config (0,ULTRASONIC_SENSOR);
    ev3_gyro_sensor_reset(0);
```

#残念なお知らせ#
さて、ここまで4種類のセンサーを紹介してきましたが、僕が紹介できるのはここまでです。
この他にもAPIには

- EV3 IRセンサー
- HiTechnic 加速度センサー
- NXT温度センサー

の３つの記載があります。ですが、これは標準・拡張キットのどちらにも入っていません。(間違っていたらすみません。(要は使ったことが無いのです…))
ですので、今回は紹介しないこととします。

また、HiTechnic Color Sensorですが、これについては別の記事でかなり詳しく記載しております。そちらを御覧ください。
[後輩たちのためのEV3rt講座番外編(HiTechnicカラーセンサーについて)](https://qiita.com/koushiro/items/058c1f18a5f5282e2817)

さて、次回はインテリジェントブロック関係のプログラム方法を紹介していきます。

次回:[第5回](https://qiita.com/koushiro/items/1845f60c26573db3a9a8)
前回:[第3回](https://qiita.com/koushiro/items/97d08cf3d863d6f81f2e)