Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
ラズパイxソラコム 超音波距離ハンズオンをやってみた

ラズパイxソラコム 超音波距離ハンズオンをやってみた

2016年5月25日

広島版IoT縛りの勉強会! IoTLT広島 vol.1

http://iotlt.connpass.com/event/29984/

@24motz

準備状況

  • Raspberry Pi 3 (Raspbian)
  • 電源 2.5A
  • SORACOM Air SIM = Software Desgin 2016年5月号
  • SIM 認証サービス SORACOM Endorse でクーポン取得 done (モバイルルーター使用)

SORACOM コンソール

https://console.soracom.io/#/login

API と CLI

https://dev.soracom.io/jp/tools/

https://github.com/soracom/soracom-cli/releases

$ soracom subscribers list
$ soracom orders list

ラズパイxソラコムキャンペーン

2016年4月25日から4月28日までやっていた

https://soracom.jp/raspi_campaign/

ハンズオン資料と同じことをやってみるために 同じ型番の USB 3G ドングルと超音波センサーを入手した。

http://soracom-files.s3.amazonaws.com/handson20160427.pdf

コマンド入力用テキスト http://soracom-files.s3.amazonaws.com/handson20160427.txt

材料

  • 3G USB ドングル FS01BU (SORACOM キャンペーン 8,424円 送料込)
  • Nano SIM から標準 SIM への変換アダプタ
  • 超音波距離センサー HG-SR04(400円 送料別)
  • ブレッドボード、ケーブルなど
  • Raspberry Pi 3 は自宅 WiFi に接続設定して起動
  • Mac のターミナルから Raspbian に ssh して作業

amazon.co.jp 3G USB ドングル (FS01BU)

配線のようす

https://twitter.com/24motz/status/727730908766318593

ダイアルアップ接続

接続スクリプトのレポジトリ https://gist.github.com/j3tm0t0/65367f971c3d770557f3

下記を実行すると Setting up wvdial でハングアップする。

$ sudo apt-get install -y usb-modeswitch wvdial

USB 3G 未接続で下記を実行した。 Setting up wvdial でハングアップ。 やり直しながら資料を読み返す。 どちらにしても /etc/wvdial.conf はこの段階では作成失敗するらしい。

$ sudo apt-get install -y usb-modeswitch wvdial

待っても終了しないとはどこにも書かれていない。

別のコンソールで下記を実行して apt-get を強制終了する。 パッケージそのものはちゃんと入ったことになっている。

$ sudo su
# killall wvdialconf

参考記事:

http://www.1ft-seabass.jp/memo/2015/11/16/soracom-air-raspberry-pi-firststep/

スクリプトをダウンロードして実行。手順通り。

$ sudo /usr/local/sbin/connect_air.sh

AWS を経由していることの確認

pi@raspberrypi:~ $ curl ifconfig.io
52.xxx.53.xxx
pi@raspberrypi:~ $ host 52.xxx.53.xxx
xxx.53.xxx.52.in-addr.arpa domain name pointer ec2-52-xxx-53-xxx.ap-northeast1.compute.amazonaws.com.

通信量の通知テスト

速度クラス s1.minimum にしてある場合で、 1MB ダウンロードに4分37秒かかる。

$ wget http://soracom-files.s3.amazonaws.com/1MB
--2016-05-04 03:27:13--  http://soracom-files.s3.amazonaws.com/1MB
Resolving soracom-files.s3.amazonaws.com (soracom-files.s3.amazonaws.com)... 54.231.228.21
Connecting to soracom-files.s3.amazonaws.com (soracom-files.s3.amazonaws.com)|54.231.228.21|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1048576 (1.0M) [binary/octet-stream]
Saving to: ‘1MB’

1MB                                      100%[==================================================================================>]   1.00M  3.76KB/s   in 4m 37s 

2016-05-04 03:31:51 (3.69 KB/s) - ‘1MB’ saved [1048576/1048576]

下記のメールを受信

SIMの日次通信量が1MiBを超えています

From no-reply@soracom.jp

対象SIM 4401xxxx002xxxx 利用状況を確認してください。

通信を止める方法

sudo /usr/local/sbin/connect_air.sh が実行中状態なので、 Ctrl+C で止めると通信終了。

念のため、AWS ではなく自宅プロバイダ経由になっていることの確認。

pi@raspberrypi:~ $ curl ifconfig.io
220.xxx.xxx.xxx
pi@raspberrypi:~ $ host 220.xxx.xxx.xxx
xxx.xxx.xxx.220.in-addr.arpa domain name pointer FL1-220-xxx-xxx-xxx.hrs.mesh.ad.jp.

超音波距離センサーの動作確認

$ python sensor_test.py 
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.8 cm
距離: 6.9 cm
距離: 6.8 cm
距離: 11.0 cm
距離: 18.7 cm
距離: 59.7 cm
距離: 60.2 cm

配布されているソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 距離を読む関数  
def read_distance():
    # 必要なライブラリのインポート・設定 
    import time
    import RPi.GPIO as GPIO
    GPIO.setwarnings(False)
    
    # 使用するピンの設定
    GPIO.setmode(GPIO.BOARD)
    TRIG = 11 # ボード上の11番ピン(GPIO17)
    ECHO = 13 # ボード上の13番ピン(GPIO27)
    
    # ピンのモードをそれぞれ出力用と入力用に設定 
    GPIO.setup(TRIG,GPIO.OUT)
    GPIO.setup(ECHO,GPIO.IN)
    GPIO.output(TRIG, GPIO.LOW)
    time.sleep(0.3)
    
    # TRIGに短いパルスを送る
    GPIO.output(TRIG, GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(TRIG, GPIO.LOW)

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

    # 時刻の差から、物体までの往復の時間を求め、距離を計算する 
    timepassed = signalon - signaloff
    distance = timepassed * 17000
    return distance
    GPIO.cleanup()
         
while True:
  print "距離: %.1f cm" % (read_distance())

物体検知イベントをアップロード

SORACOM Beam で認証された接続を使って物体検知イベントをアップロード

$ python send_to_cloud.py 
- メタデータサービスにアクセスして IMSI を確認中 ... 4401xxxx002xxxx
- 条件設定
障害物を 10 cm 以内に 3 回検知したらクラウドにデータを送信します
センサーを手で遮ったり、何か物を置いてみたりしてみましょう
- 準備完了
距離(cm): 5.6 <= 10 , 回数: 1 / 3
距離(cm): 5.6 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.2 <= 10 , 回数: 1 / 3
距離(cm): 5.3 <= 10 , 回数: 1 / 3
距離(cm): 7.6 <= 10 , 回数: 1 / 3
距離(cm): 7.6 <= 10 , 回数: 2 / 3
距離(cm): 6.1 <= 10 , 回数: 3 / 3
- ステータスが 'in'(何か物体がある) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVR6ILa7IfRhQRmTxxxx', u'created': True, u'_version': 1, u'_index': u'sensor'}
距離(cm): 51.4 > 10 , 回数: 1 / 3
距離(cm): 49.9 > 10 , 回数: 2 / 3
距離(cm): 48.7 > 10 , 回数: 3 / 3
- ステータスが 'out'(何も物体がない) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVR6IMCQIfRhQRmTxxxx', u'created': True, u'_version': 1, u'_index': u'sensor'}
^CTraceback (most recent call last):
  File "send_to_cloud.py", line 71, in <module>
    distance = read_distance() # 距離の取得
  File "send_to_cloud.py", line 20, in read_distance
    time.sleep(0.3)
KeyboardInterrupt

アップロードされた情報は公開されている(いた):

ttps://search-handson-xxxxx.ap-northeast-1.es.amazonaws.com/_plugin/kibana/

IMSI 4401xxxx002xxxx のイベントが確認できた。

30分くらい前に他の人のイベントが上がっていた。

ソースコードの確認

# IMSIの取得
import requests
import json

print "- メタデータサービスにアクセスして IMSI を確認中 ...",
subscriber=json.loads(requests.get('http://metadata.soracom.io/v1/subscriber').text)
imsi = subscriber['imsi']
print imsi

Amazon Elasticsearch は Google BigQuery みたいなサービスと理解。

from elasticsearch import Elasticsearch
es = Elasticsearch('beam.soracom.io:18080')

beam.soracom.io:18080 につなぐと SORACOM 側の設定により

ttps://search-handson-xxxxx.ap-northeast-1.es.amazonaws.com

に転送される:

    if count >= threshold_count:
        status = 'out' if status == 'in' else 'in'
        duration = time.time() - status_changed_at
        status_changed_at = time.time()
        print "- ステータスが '%s'(%s) に変化しました" % (status, '何か物体がある' if status == 'in' else '何も物体がない')
        print "- Beam 経由でデータを送信します"
        print es.index(index="sensor", doc_type="event", body={"imsi":imsi, "status":status, "timestamp":datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'), "duration":duration})

IFTTT の実験

Maker Channel

https://ifttt.com/maker

If Maker Event "sensor", then post a tweet to @24motz

https://ifttt.com/myrecipes/personal

https://twitter.com/search?f=tweets&vertical=default&q=%23soracomhandson%20%4024motz&src=typd

IFTTT で maker チャンネルを作ると API キーが生成される。 その API キーをデバイスに書き込まずに、 SORACOM Beam の設定の中に書けばよい。

なのでデバイスに鍵を持たせる必要がない、という理屈。

まとめ

  • デバイスに必要な認証情報は SIM だけ
  • AWS や IFTTT のトークンは SORACOM のサーバーに
  • HTTP で SORACOM まで通信、AWS や IFTTT には HTTPS で通信
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment