「SORACOM x RaspberryPi ハンズオン 〜超音波センサー編〜」を実際にやってみた #soracom

2016.08.09

先々月の6月下旬、SORACOMから『ラズパイxソラコムキャンペーン』と称して電子工作とIoTが体験出来るキットが数量限定で販売されていました。個人的にはこれまで足を踏み入れていなかった領域だったのですが、これはちょっとやってみたいな、これを機にIoTの世界にも足を踏み入れてみたいなと思い、(キャンペーンの個数も限られていたので)割と即決で発注致しました。

実際届いたのは申し込み後間もなくの時期だったのですが、業務都合等もあって何やかんやでハンズオンを完遂出来ておりませんでした。昨晩ようやく既定のハンズオンを全て実践し終えたので、その実践記録について後学も兼ねて当エントリに内容を残しておこうと思います。

ちなみに私個人、現時点ではIoT機器周りの知識はほぼ無い状態です。なのでハンズオンを進めるにあたって『そんな初歩的なところも?』というような部分に言及してたりもしますがその辺は生暖かく読み進めて頂ければと思います。

目次


 

1章 ユーザーコンソールを使用してAir SIMを管理する

この部分については実際にブツが届いた後、ドキュメントに従って進める形で滞り無く進められたので割愛します。

 

2章 Raspberry Piのセットアップ

次いで、今回のハンズオンで稼働するプログラムを動かすOSとなるRaspberry PIの環境構築を行います。

 

micro SDカードのフォーマット

まずはじめに、ラズパイ(Raspberry Pi 3 Model B)をインストールするmicro SDカードをフォーマットする作業を行う必要があります。Macの場合、コマンド実施によるものとツール操作によるものがある様ですが、今回は後者(ツール操作)でフォーマットを実施したいと思います。

作業実施を行う上でベースとなる個人環境端末はMacで行いました。キャンペーンキットに含まれているmicro SDカードを以下の形でMacに差し込んでおき、

soracom-raspi_campaign_201606_01

一方でMacに以下のソフトをインストール。

format-microsd-01

ソフトを起動すると差し込んだmicro SDカードを認識するので所定の設定内容でフォーマット。(※暫く時間が掛かります)

format-microsd-02

以下の様にメッセージが表示されればフォーマット完了です

format-microsd-03

 

micro SDカードにOS(Raspbian)をインストール

続いて、フォーマットしたmicro SDカードに稼働するOSとなる『Raspbian』をインストールします。Raspbian及びRaspberry Piの解説については以下リンクなどをご参照ください。

install-raspi3-01

インストール作業前の仕込みとして、インストーラ各種ファイルをmicro SDカード内に事前に配備しておきます。下記ダウンロードページから『RASPBIAN JESSIE LITE』のzipファイルをダウンロードし、解凍。

install-raspi3-02

解凍フォルダ配下の内容を全コピーし、

install-raspi3-03

micro SDカード配下に全ペーストしておきます。

install-raspi3-04

さぁ、いよいよインストールだ!と思ったのですが、手元には外部ディスプレイモニタを含めRaspberry Piの環境を整えるのに必要な諸環境が無い事に気付きました。(キャンペーンキットだけではハンズオンを進める事は出来ない、という事です)という訳で『せっかくだから俺はこの機会に環境を揃えるぜ!』と電化製品店にちょっくら足を運んでディスプレイモニタ等を新調してきました。

install-raspi3-05

必要な環境及び手順については以下の情報を参考にしました。以降実際に行った手順について順を追って説明して行きたいと思います。

基板にLANケーブル(ネットワーク利用可能なルータに連携)、USBマウス及びキーボードを接続。

raspi_101_2

上記作業でフォーマット及びインストーラをデプロイしたmicro SDカードを裏面の差込口にイン。

raspi_002

HDMIケーブルを外部ディスプレイと繋げておき、キットに含まれるUSB ACアダプター&ケーブルを繋ぎます。繋ぎ口近くのライトが着いたら電源が入った形になります。

raspi_003

程無くしてディスプレイに以下のような画面が表示されますので、一番上の『Raspbian(RECOMMENDED)』を選択。

raspi_101

『Yes』を選択、インストールを実施します。

raspi_102

インストール作業が始まります。この作業も結構な時間が掛かります...。

raspi_103

インストールが完了するとダイアログが表示されますので『OK』押下。

raspi_104

以下の画面に切り替わりOSが起動し始めます。

raspi_105

OSインストール完了です。

raspi_106

ターミナルを開き、端末のアクセス先情報を確認してみます。以下の様な形でIPアドレスの形で確認する事が出来ました。

raspi_107

 

キーボード設定の変更

各種手順自体はこのままでも操作出来ますが、キーボードが日本語対応になっていないので若干面倒です。なのでまずはこの設定を進めます。sudo su - でrootにユーザー変更した後、raspi-configコマンドを実行。

raspi_108

設定画面に遷移します。[Internationalisation Options]を選択。

raspi_109

[Change Keyboard Layout]を選択。

raspi_110

[Geneirc 105-key (intl) PC]を選択。

raspi_111

[Other]を選択。

raspi_112

[Japanese]を選択。

raspi_113

[Japanese]を選択。

raspi_114

[The default for the keyboard layout]を選択。

raspi_115

[No compose key]を選択。

raspi_116

[Yes]を選択。

raspi_117

[Finish]を選択。

raspi_118

設定が完了しました。キーボードでコロン(『:』)を入力出来ていれば正しく設定変更出来ています。

raspi_119

 

ログインパスワードの設定

ラズパイ端末へは、上記手順で確認したIPアドレスの他にもraspberrypi.localでアクセスする事が可能です。

$ ping 192.168.11.4
PING 192.168.11.4 (192.168.11.4): 56 data bytes
64 bytes from 192.168.11.4: icmp_seq=0 ttl=64 time=0.374 ms
64 bytes from 192.168.11.4: icmp_seq=1 ttl=64 time=0.493 ms
64 bytes from 192.168.11.4: icmp_seq=2 ttl=64 time=0.452 ms
64 bytes from 192.168.11.4: icmp_seq=3 ttl=64 time=0.450 ms
^C
--- 192.168.11.4 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.374/0.442/0.493/0.043 ms
HL00113-2:~ abeshinya$ 

$ ping raspberrypi.local
PING raspberrypi.local (192.168.11.4): 56 data bytes
64 bytes from 192.168.11.4: icmp_seq=0 ttl=64 time=0.442 ms
64 bytes from 192.168.11.4: icmp_seq=1 ttl=64 time=0.423 ms
64 bytes from 192.168.11.4: icmp_seq=2 ttl=64 time=0.487 ms
64 bytes from 192.168.11.4: icmp_seq=3 ttl=64 time=0.431 ms
^C
--- raspberrypi.local ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.423/0.446/0.487/0.025 ms

初期状態ではユーザー/パスワード=pi/raspberryでアクセスする事が可能ですが、パスワードを変更しておきたいと思います。raspi-configコマンドを実行。

raspi_120

[Change User Password]を選択。

raspi_121

パスワード入力を求められるので、任意のパスワード情報を2回、設定します。

raspi_122

ラズパイ端末へのSSHログインを試みてみます。無事ログインする事が出来ました。

$ ssh pi@raspberrypi.local
Warning: Permanently added the RSA host key for IP address '192.168.11.4' to the list of known hosts.
pi@raspberrypi.local's password: (設定したパスワードを入力後、Enter押下)

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.
Last login: Sat Jul 23 XX:XX:XX 2016
pi@raspberrypi:~ $

 

3章 Air SIMを使って、インターネットに接続する

同梱されているSIMを使ってインターネット接続の確認を行います。とその前に、管理コンソールにログインし、対応するSIMのステータスを変更しておきましょう。SIMを選択して[使用開始]を選択。

connect-by-sim_05

確認ダイアログが表示されるので、[ステータスを変更する]を押下。

connect-by-sim_06-1

ステータスが『使用中』に変わりました。

connect-by-sim_06-2

キャンペーンキットに含まれているSIMを以下の形でセッティングし、

connect-by-sim_01

ケースを開けて3G USBドングルに以下の様な形で差し込みます。

connect-by-sim_02

ケースを閉じてUSB差込口に差し込みます。本体のランプが以下の様な形で緑に光っていればOK。向きなどが間違っていると以下の様に赤く点灯しますので注意。

connect-by-sim_03 connect-by-sim_04

OSを再起動し、ハンズオン手順に従い以下のコマンドで環境を整えます。

$ sudo apt-get -y install usb-modeswitch wvdial
$ curl -O http://soracom-files.s3.amazonaws.com/connect_air.sh
$ chmod +x connect_air.sh
$ sudo mv connect_air.sh /usr/local/sbin/

プログラム実行。上手く接続出来ているようです。

$ sudo /usr/local/sbin/connect_air.sh
Found AK-020
waiting for modem device
--> WvDial: Internet dialer version 1.61
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1,"IP","soracom.io"
AT+CGDCONT=1,"IP","soracom.io"
OK
--> Modem initialized.
--> Sending: ATD*99***1#
--> Waiting for carrier.
ATD*99***1#
OK
CONNECT 21000000
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Sun Jul xx xx:xx:xx 2016
--> Pid of pppd: 1188
--> Using interface ppp0
--> pppd: ?[01]?v???[01]蚒[01]
--> pppd: ?[01]?v???[01]蚒[01]
--> pppd: ?[01]?v???[01]蚒[01]
--> pppd: ?[01]?v???[01]蚒[01]
--> pppd: ?[01]?v???[01]蚒[01]
--> local  IP address xx.xxx.xxx.xxx
--> pppd: ?[01]?v???[01]蚒[01]
--> remote IP address xx.xxx.xxx.xxx
--> pppd: ?[01]?v???[01]蚒[01]
--> primary   DNS address xx.xxx.xxx.xxx
--> pppd: ?[01]?v???[01]蚒[01]
--> secondary DNS address xx.xxx.xxx.xxx
--> pppd: ?[01]?v???[01]蚒[01]

別ウインドウでのAWSへの接続設定も上手く行きました。

pi@raspberrypi:~ $ curl ifconfig.io
54.250.xxxx.xxx
$ host 54.250.xxx.xxx
xxxx.xxx.xxx.xx.in-addr.arpa domain name pointer ec2-xx.xxx.xxx.xxx.ap-northeast-1.compute.amazonaws.com.
pi@raspberrypi:~ $

 

4章 ユーザーコンソールによる通信の確認

データ通信量と利用料金の確認をしてみます。SIMのセッション状態が『オンライン』に切り替っている事を確認。

connect-by-sim_07

各種状況が変わってグラフも表示されている事が確認出来ました。

connect-by-sim_08 connect-by-sim_09

 

5章 超音波センサーを使って距離を計測する

この辺からぼちぼちIoTっぽさが出て来ます。ハンズオンキットに含まれる『超音波センサー』をRaspberry PIに連動させ、実際に稼働させた状態のデータを出力させます。

手順に従って基盤とセンサーを以下の様に接続しておきます。

ultrasonic_sensor_01

実行プログラムをダウンロードし起動。センサーの前に手をかざすと距離が縮まり、話すと距離が大きくなる事が確認出来ました。

$ wget http://soracom-files.s3.amazonaws.com/sensor_test.py
$ python sensor_test.py
距離: 3105.3 cm
距離: 12.4 cm
距離: 3129.4 cm
距離: 9.8 cm
距離: 5.0 cm
距離: 4.9 cm
距離: 5.3 cm
距離: 5.4 cm
距離: 3095.0 cm
距離: 46.8 cm
距離: 47.1 cm
距離: 3092.6 cm
距離: 4.4 cm
距離: 5.2 cm
距離: 5.3 cm
距離: 5.3 cm
距離: 49.6 cm
距離: 50.1 cm
距離: 50.0 cm
距離: 3095.5 cm
距離: 4.2 cm
距離: 5.0 cm
距離: 5.0 cm
距離: 5.0 cm
距離: 5.0 cm

 

6章 クラウドにデータを送る

6章と7章では仕上げとして各種サービスとの連携を行います。まずはAmazon Elasticsearch Serviceとの連携。ハンズオンテキストの手順ではElasticsearch Serviceが『既にあるもの』として進められていますが、ここでは実際に環境を構築してみたいと思います。下記エントリの内容を参考に、必要最低限のスペックでElasticsearch Serviceのクラスタを用意しました。

soracom-handson-es-01

今回はハンズオンという事で、クラスタのIP制限も緩めの全許可としました。(本番環境利用の場合は当然の事ながらこの部分に関しては厳密に制御を行う必要があります)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:XXXXXXXXXXXX:domain/cm-ess-for-soracom/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "0.0.0.0/0"
        }
      }
    }
  ]
}

SORACOM Beamの設定を行い、Elasticsearch Serviceとの連携設定を済ませたらRaspberry PI上でプログラムを実行。以下の様にデータを送信する事に成功し、

$ sudo apt-get install -y python-pip
$ sudo pip install elasticsearch
$ wget http://soracom-files.s3.amazonaws.com/send_to_cloud.py
$ python send_to_cloud.py
- メタデータサービスにアクセスして IMSI を確認中 ... 9999999999999999
- 条件設定
障害物を 10 cm 以内に 3 回検知したらクラウドにデータを送信します
センサーを手で遮ったり、何か物を置いてみたりしてみましょう
- 準備完了
距離(cm): 4.6 <= 10 , 回数: 1 / 3
距離(cm): 3.1 <= 10 , 回数: 2 / 3
距離(cm): 4.0 <= 10 , 回数: 3 / 3
- ステータスが 'in'(何か物体がある) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVZrBKDpsBD3YoMYxVWz', u'created': True, u'_version': 1, u'_index': u'sensor'}
距離(cm): 3207.4 > 10 , 回数: 1 / 3
距離(cm): 31.2 > 10 , 回数: 2 / 3
距離(cm): 30.3 > 10 , 回数: 3 / 3
- ステータスが 'out'(何も物体がない) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVZrBLPHJl15vOmmf6FQ', u'created': True, u'_version': 1, u'_index': u'sensor'}
距離(cm): 7.3 <= 10 , 回数: 1 / 3
距離(cm): 7.8 <= 10 , 回数: 2 / 3
距離(cm): 7.7 <= 10 , 回数: 3 / 3
- ステータスが 'in'(何か物体がある) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVZrCJKdsBD3YoMYxVW0', u'created': True, u'_version': 1, u'_index': u'sensor'}
距離(cm): 3162.8 > 10 , 回数: 1 / 3
距離(cm): 27.7 > 10 , 回数: 2 / 3
距離(cm): 26.1 > 10 , 回数: 3 / 3
- ステータスが 'out'(何も物体がない) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVZrCJsXeEY7GMTN_jdD', u'created': True, u'_version': 1, u'_index': u'sensor'}
距離(cm): 7.5 <= 10 , 回数: 1 / 3
距離(cm): 7.9 <= 10 , 回数: 2 / 3
距離(cm): 8.8 <= 10 , 回数: 3 / 3
- ステータスが 'in'(何か物体がある) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVZrCKnZJl15vOmmf6FR', u'created': True, u'_version': 1, u'_index': u'sensor'}
距離(cm): 28.1 > 10 , 回数: 1 / 3
距離(cm): 32.9 > 10 , 回数: 2 / 3
距離(cm): 33.1 > 10 , 回数: 3 / 3
- ステータスが 'out'(何も物体がない) に変化しました
- Beam 経由でデータを送信します
{u'_type': u'event', u'_id': u'AVZrCLRovcFCDJe36rn3', u'created': True, u'_version': 1, u'_index': u'sensor'}

用意したElasticSearchのKibanaでも以下の様な形で登録データを確認する事が出来ました。

soracom-handson-es-02

 

7章 Twitterと連携してみる

ここまでだいぶ長くなってしまいましたが、ようやくの最終章です。ここではIFTTTというサービスを使ってTwitter連携(稼働させた内容をつぶやかせる)という流れを実践しています。

この章については特に難しい部分は無く、手順に従ってIFTTTとTwitterの連携設定を行うだけ。対応プログラムをダウンロード、実行するとこれまで同様超音波センサーと連動してプログラムが起動してデータが生成され、

$ wget http://soracom-files.s3.amazonaws.com/send_to_ifttt.py
$ python send_to_ifttt.py
- 条件設定
障害物を 10 cm 以内に 3 回検知したら IFTTT にデータを送信します
センサーを手で遮ったり、何か物を置いてみたりしてみましょう
- 準備完了
距離(cm): 4.5 <= 10 , 回数: 1 / 3
距離(cm): 3.2 <= 10 , 回数: 2 / 3
距離(cm): 6.0 <= 10 , 回数: 3 / 3
- ステータスが 'in'(何か物体がある) に変化しました
- Beam 経由でデータを送信します
status changed to 'in' : {"value3": "", "value2": "2", "value1": "in"}
<Response [200]>
距離(cm): 28.7 > 10 , 回数: 1 / 3
距離(cm): 3189.6 > 10 , 回数: 2 / 3
距離(cm): 28.7 > 10 , 回数: 3 / 3
- ステータスが 'out'(何も物体がない) に変化しました
- Beam 経由でデータを送信します
status changed to 'out' : {"value3": "", "value2": "6", "value1": "out"}
<Response [200]>

IFTTTを介してTwitterにデータが連携され、以下の様な形で実行結果がツイートされました!

soracom-handson-es-03

まとめ

という訳でハンズオン実践記録、長いエントリとなってしまいましたが一通りの内容を実践し終える事が出来ました。こうやって実機とWebサービスを組み合わせてデータが想定通り可視化出来るようになるとやはり嬉しいものですね。IoT機器や各種Webサービスの組み合わせは様々な組み合わせで色々面白そうな取り組みが実現出来ると思うので、これを機に色々触って行ければな〜と思います。ハンズオンWeb資料から展開されている各種サービスを使い始めてみるというのも良さそうですね。こちらからは以上です。