IoTもくもく会（SORACOMとラズパイ編）に行ってみた

## 目的

先日、SORACOMさんが主催するイベントIoTもくもく会（SORACOMとラズパイ編）に行ってきました。
参加してみたのは主に以下のような理由からです。

- 今知り合いの会社のお手伝いでカカオ豆農家向けのIoTデバイスを作っているが、それを作るために必要な知識を得たい
- Raspberry Piと電子回路について理解を深める
- SORACOMの方と話してみたかった
- SORACOMのオフィスに行ってみたかった


## 流れ

会の流れとしては、[チュートリアル](https://github.com/soracom/handson/blob/master/ultrasonic-sensor/seminar.md)に従って、黙々と(イベント名の通り)作業を進めていく感じでした。
SORACOMの方が近くにいるため、分からないことは聞けばすぐ教えてもらえます。

実施した内容は以下のような感じです。

- SORACOMコンソールでの設定や操作
- USBドングル&SORACOM Air SIMを使ってのインターネット接続
- 超音波センサーを使った簡単な電子回路の作成
- SORACOMの各種サービスを使ってクラウドと連携し、センサーの値を送る


## 実際にやってみて

実際にやってみたら、驚くほどスムーズに進みました。チュートリアル通りに進めていくと何もはまらずに最後まで行き、コンプリートできました。
スムーズに行き過ぎて、逆におかしいんじゃないかと思ったり..

以下が実際に超音波センサとRaspberry PIをつなげた完成品です。


<img src="https://qiita-image-store.s3.amazonaws.com/0/10393/e188e3e8-ba46-3052-2886-3dff979bcd8b.jpeg" width="400" />



SORACOMの方もおっしゃっていたのが、実はこのチュートリアルで最大の難関はUSBドングルにSIMカードを入れる箇所だということです。実は以前にUSBドングルAK-020とSIMカードを購入して装着したんですが、その時はうまくいかず、1時間くらいはまりました。。ただその時の経験が活きたのか、この会では問題なくスムーズに装着することができました。

CloudやSNSとの連携も、既にpythonのプログラムが用意されているため、チュートリアルに従ってプログラムをダウンロードして実行すればOKです。

## 超音波センサとRaspberry Piのやりとり詳細

せっかくなので理解を深めるため、今回作った仕組みで、超音波センサとRaspberry Piがどのようにやりとりしているかをもう少し深掘りしてみます。

超音波センサは、外部からトリガーパルスを入力すると超音波パルスを送信し、物に当って跳ね返ってくるまでの時間を元に距離を測るという仕組みになっているそうです。
[handson/seminar.md at master · soracom/handson](https://github.com/soracom/handson/blob/master/ultrasonic-sensor/seminar.md#%E8%B6%85%E9%9F%B3%E6%B3%A2%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%81%AE%E5%8B%95%E4%BD%9C%E5%8E%9F%E7%90%86)


また、今回作成したものの配線図を見ると
![5-6.png](https://qiita-image-store.s3.amazonaws.com/0/10393/c193ac73-b44d-c491-0671-9e3a627bd6bc.png)

以下のようになっていることがわかります。


1. Raspberry PiのPower(5V) ----赤線---- 超音波センサのVcc
2. Raspberry PiのGPIO27(13ピン) ----黄線---- 超音波センサのEcho
3. Raspberry PiのGPIO17(11ピン) ----青線---- 超音波センサのTrig
4. Raspberry PiのGPIO20(GROUND) ----黒線---- 超音波センサのGND

これを見た感じ、Raspberry Piから11番ピンを通してトリガパルスを送り、跳ね返ってきた超音波を13番ピンで受け取る仕組みになっているのではないかと推測できます。


[サンプルコード](http://soracom-files.s3.amazonaws.com/sensor_test.py)の超音波センサから距離を取得する部分を読んで、実際にどうなっているか確認します。サンプルプログラム内にはread_distanceという関数があり、この部分が実際に超音波センサから物体との距離を取得している部分です。この関数のロジックを追ってみます。


### [1]セットアップ

まず以下の部分で、11番ピンを出力用に、13番ピンを入力用に設定しているのがわかります。
`GPIO.output(TRIG, GPIO.LOW)` の部分は、ピンの出力を0Vにしている、つまりデジタルで0の値を出力してます。

```py
TRIG = 11 # ボード上の11番ピン(GPIO17)
ECHO = 13 # ボード上の13番ピン(GPIO27)

# ピンのモードをそれぞれ出力用と入力用に設定
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.output(TRIG, GPIO.LOW)
```

### [2]トリガパルス送信

次の部分では、11番ピンを通してトリガパルス(デジタルの1の値)を送っていることがわかります。スリープを一瞬いれた後にまた値を0に戻してます。

```py
# TRIG に短いパルスを送る
GPIO.output(TRIG, GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(TRIG, GPIO.LOW)
```

### [3]HIGHになった時間の取得

次の箇所ではwhileでループし、13番ピンの入力値がHIGH(デジタル値1)になるまで待っています。
変数signaloffにはHIGHになった時点での時間が入ります。このHIGHになるタイミングが、超音波送信開始のタイミングと思われます。

```py
# ECHO ピンがHIGHになるのを待つ
signaloff = time.time()
while GPIO.input(ECHO) == GPIO.LOW:
    signaloff = time.time()
```

### [4]LOWになった時間の取得

次の箇所では13番ピンの値がLOW(0)になるまで待ちます。
変数signalonには、LOWになった時点での時間が入ります。このLOWになるタイミングが、超音波が反射して返ってきたタイミングと思われます。
(ここで+0.1秒しているのは、おそらく精度の問題で調整しているため)

```py
# ECHO ピンがLOWになるのを待つ
signalon = signaloff
while time.time() < signaloff + 0.1:
    if GPIO.input(ECHO) == GPIO.LOW:
        signalon = time.time()
        break
```

### [5] 距離の計算

HIGHになった時間とLOWになった時間の差により、超音波の往復時間(timepassed)を取得し、更にそれに17000をかけて距離(cm)を計算しています。音速は秒速340m (34000cm)なので、片道は秒速17000cmで、往復時間(秒)にそれをかけることより距離が計算できます。

```py
# 時刻の差から、物体までの往復の時間を求め、距離を計算する
timepassed = signalon - signaloff
distance = timepassed * 17000
```

コードを追ってみて、どんな仕組みでRaspberry Piと超音波センサーがやり取りされているのか、なんとなくイメージをつかむことが出来ました。

## 感想

SORACOMの方がとても親切に教えてくれるため、あまり電子回路やRaspberry Piを触ったことのない人でも入りやすいのではないかと思いました。普段触っていてもまた理解を深めるのにとてもよいと思います。その他、今回の内容以外についても質問したら丁寧に教えていただきました。

また、SONYさんが出している[MESH](http://meshprj.com/jp/) というセンサーブロックがあることを教えてもらいました。無線(Bluetooth)でつなげられ、アプリを使って制御をコントロールしたりできるそうです。