お問い合わせ
トップ » SORACOM IoT DIY レシピ » Raspberry Piで、近づくと自動応答する店番ロボット

SORACOM IoT レシピ:Raspberry Piで、近づくと自動応答する店番ロボット

Raspberry Piで、近づくと自動応答する店番ロボット

レシピ難易度:★★☆☆☆

イベントに出展の困りごとが「スタッフのシフト」。応対を欠かすことが無いように人数や休憩時間に気を配る必要があります。本レシピはIoTを活用してお客様が近づいたら音声で展示物を紹介しつつ、応答した実績をチャット等で共有する「自動店番ロボット」で、そのお悩みを解決します。

全体構成

使用する SORACOM サービス

動画でも紹介しています

本レシピを行うのに必要な時間、概算費用

本レシピは以下の通りです。

  • 必要な時間: 約60分
  • 概算費用: 約23,300円

※ 概算費用: ハードウェアや SORACOM を始めとした各種サービスの概ねの費用 (送料などの付帯費用や無料枠適用は考慮しないものとしています)

このコンテンツの進め方

上から内容を読み進みながら作業を行なっていきます。また左サイドに追従する目次からページ内の移動が可能です。

本コンテンツは現状のままで提供され、株式会社ソラコムは、誤りがないことの保証を含め、明示であると黙示であるとを問わず、本コンテンツの記載内容につき、いかなる種類の表明も保証も行いません。

掲載情報の閲覧及び利用により、利用者自身、もしくは第三者が被った損害に対して、直接的、間接的を問わず、株式会社ソラコムは責任を負いかねます。

本コンテンツを実践する中で用意された機器、利用されたサービスについてのご質問は、それぞれの機器やサービスの提供元にお問い合わせをお願いします。機器やサービスの仕様は、本コンテンツ作成当時のものです。

株式会社ソラコムが提供する機器・サービスについてのご質問はフォームで受け付けております。機器・サービスご利用前の導入相談は https://soracom.jp/contact/ に、機器・サービスご利用開始後のサポートは、SORACOMユーザーコンソール内のサポートサイトから「リクエストを送信」(要ログイン)にてお問い合わせください。

Copyright (c) 2023 SORACOM, INC.

準備

本レシピを行うためには以下のものをご用意ください。

ハードウェア

品名数量価格備考
IoT 体験キット 〜距離測定センサー〜115,580円キットの中には以下のものが含まれています。それぞれを個別に準備しても構いません。
・Raspberry Pi 3 Model B+ 本体 x 1台
・Raspberry Pi 3 用電源アダプタ x 1個
・microSD (16GB以上) x 1枚
AK-020 (USB ドングル型モデム) x 1個
SORACOM 特定地域向け IoT SIM (plan-D 標準サイズ) x 1枚
・超音波距離センサー (3.3V対応) x 1
・ジャンパワイヤ (オス – メス) x 4
・ブレッドボード x 1
microSD カードリーダー1約1,600円Raspberry Pi OS をmicroSD に書き込む際に使用します。
有線 LAN アダプタ (USB 型のアダプタ等形状問わず)1約1,600円パソコンと Raspberry Pi の通信に使用します。
有線 LAN ケーブル1約500円パソコンと Raspberry Pi の通信に使用します。
スピーカー1約5,000円音声を流すために利用します。
オーディオケーブル1約700円スピーカーと Raspberry Pi の接続に使用します。Raspberry Pi 側は 3.5mm サイズです。
パソコン1インターネット接続が可能でサイトへの接続が自由であること。Google Chrome 等の最新ブラウザーが利用可能な事。

※ 金額はレシピ作成時となります。金額は税込み・送料別です。その他は参考価格となります。

準備するものについて
Raspberry Piは4でも動作します。その場合は4GB以上で、ACアダプタも対応するものをご用意ください。
IoT体験キット内に同梱されている超音波距離センサーはUS-100を利用しています。冒頭の動画ではブレッドボードを使わずに超音波距離センサーとRaspberry Piを接続しています。その場合は別途「メス―メス型ジャンパワイヤ」を4本ご用意ください。

ご購入について

ハードウェアは以下よりご購入いただけます。

ご購入先にはSORACOM IoT ストア以外のショッピングサイトも含まれています。ご購入先や在庫、動作保証をするものではありませんのでご留意ください。

その他必要なもの

必要なもの費用作成方法など
SORACOM アカウント無料※SORACOM アカウントの作成 (JP)
WiFi環境Raspberry Piにソフトウェアをダウンロードする際に利用します。ログインポータル(Webによる認証)が無いWiFiをご用意ください。※セットアップが終わった後はSORACOM Airでインターネットにつながるため不要となります。

※ アカウント作成・維持の費用の料金です。

AWS の手順について

当レシピでは AWS の設定をします。これらの利用経験があるとスムーズです。なお、わかりやすさのため当社で検証した当時の内容をスクリーンショット付きで掲載しておりますが、公式な手順は各社のドキュメントをご確認ください。

すでに AWS アカウントを持っている場合の確認事項

  • ルートアカウントを利用する場合:
    • 特に確認すべき事項はありません。先に進んでください。
  • IAM アカウントを利用する場合:
    • AWS Lambda の関数作成および実行権限、Amazon Pollyの利用権限、およびAWS IAMのポリシー設定権限を確認してください。
      必要権限の解説およびサポートは致しかねますが、AdministratorAccess ポリシーが割り当てられていれば当レシピは完遂可能です (同ポリシーを割り当てたことによる影響については IAM アカウント管理者にご相談ください)

設置に利用したもの

本レシピで設置時に利用した部材です。必須ではありませんがご参考にお使いください。

品名数量備考
スマートフォンホルダー1超音波距離センサーの取り付けに利用。
両面テープ等の固定用部材1超音波距離センサーをスマートフォンホルダーに固定する際に利用。

IoT 体験キット 〜距離測定センサー〜 が届いたら

IoT 体験キット 〜距離測定カメラ〜(以下、IoT 体験キット) に同梱されている SIM は、SORACOM に登録することで通信が出来るようになります。そのため、まず IoT 体験キットに同梱されている SIM を SORACOM へ登録をしましょう。
※ すでに登録済み、もしくは登録済みの別の SIM を利用する場合は次へお進みください。

登録の方法は発注済みの SIM を登録するをご覧ください。約5分で完了します。

登録が完了すると SIM 管理の一覧に表示されますので、確認ください。

SORACOM の便利な使い方: SIM の「名前」機能
SIM には「名前」を付けることができ、これで整理が可能です。特に複数の SIM (ボタン含む) をお持ちの際には、名前を付けることを強くお勧めいたします。
名前の付け方は IoT SIM の名前を設定するをご覧ください。

Raspberry Pi OS を microSD に書き込む

Raspberry Piを動かすためにはOSが必要です。ここでは Raspberry Pi に最適化されたOS「Raspberry Pi OS」をmicroSDに書き込みます。

Raspberry Pi Imager をダウンロードします。

Raspberry Pi のダウンロードページを開き、Raspberry Pi Imager をダウンロードします。
以下の画面はWindowsで開いた時のダウンロード画面で、Windowsが強調表示されています。OS に合ったRaspberry Pi Imager を選びましょう。

Raspberry Pi Imager をインストールします。

Windows の場合

ダウンロードした imager.exe を実行し、インストーラーの指示に従ってインストールを完了します。

インストール完了時の “Run Raspberry Pi Imager” はチェックを外した状態で[Finish]をクリックします。また、インストール後における imager.exe は不要となるため、削除できます。

macOS の場合

ダウンロードした imager.dmg を実行し、 Raspberry Pi Imager を Applications (アプリケーション) フォルダへコピーします。

インストールが完了したら、Finder のデバイスに表示されている Raspberry Pi Imager は不要となります。取出しをしてください。

Raspberry Pi Imager を利用して microSD カードに書き込む

以下の場所にダウンロードされている”Raspberry Pi Imager”を起動します。

Windows[スタートメニュー]> “Raspberry Pi Imager”
macOS[Finder]>[アプリケーション フォルダ]> “Raspberry Pi Imager”

macOS で初回起動時に「インターネットからダウンロードされたアプリケーションです」のダイアログが表示された場合は[OK]をクリックして進めてください。

[OSを選ぶ]をクリックし[Raspberry Pi OS (other)]>[Raspberry Pi OS Lite (64-bit)]を選択します。

次に[ストレージを選ぶ]をクリックし[Generic MassStorageClass Media]を選択します。

次に右下の歯車マークをクリックし各種設定を行います。

macOSでは「Wifiのパスワードをシステムのキーチェーンから読み取って設定しますか?」というダイアログが出てくる場合があります。[Yes]から情報を入力すると、現在使用しているWi-Fiのパスワードが自動で入力されます。

はじめに[ホスト名][SSHを有効化する][ユーザー名とパスワードを設定する][Wi-Fiを設定する][ロケール設定をする]の5項目にチェックをつけます。

その後、以下のように入力してください。

項目入力する内容
ホスト名初期設定の通り raspberrypi とします。
SSHを有効化する「パスワード認証を使う」にチェックを入れます。
ユーザー名とパスワードを設定する[ユーザー名]を pi とします。
[パスワード]はこちらから安全なパスワードを生成し入力します。
※ユーザー名は自由に設定可能です。パスワードは忘れないようにしてください。
Wi-Fiを設定する[SSID]には Raspberry Pi から接続したいWi-FiのSSIDを入力します。
[パスワード]には、SSIDに対応するパスワードを入力してください。
[Wifiを使う国]は「JP」を選択してください。
※SSIDの初期値には、パソコンで接続中のWi-FiのSSIDが表示されています。そのまま利用する場合には変更不要です。
ロケール設定をする[タイムゾーン]に自分のお住まいの場所(日本の場合「Asia/Tokyo」)
[キーボードレイアウト]に「us」が表示されていることを確認してください。

特に職場の Wi-Fi を利用する際には、ネットワーク管理者の了解を取るようにしてください。また、Wi-Fi 接続時に Web ブラウザ等による認証が必要なネットワークは利用できません。

以上の設定が終わったら[保存]をクリックし内容を保存します。

[書き込む]から書き込みを行い、完了したら microSD カードを取り出してください。

Raspberry Pi の起動から SSH ログイン、OS の最新化まで

microSD を Raspberry Pi に取り付けます

少し残りますが奥までしっかりと刺さっていれば問題ありません。

有線 LAN で Raspberry Pi とパソコンを接続

Raspberry Pi の有線 LAN ポートと、パソコンの有線 LAN ポートをケーブルで接続します。

Raspberry Pi に microUSB (電源ケーブル) を接続

ケーブルを挿すと、電源 ON となります。(電源スイッチのようなものがありません)

しばらく経過(約1~2分)すると macOS もしくは Windows 10 (または Windows 11) から Raspberry Pi へリモートログイン出来るようになります。

SSH リモートログインの方法

Windows の場合

スタートメニューから「コマンドプロンプト」を起動します。

コマンドプロンプトで以下のように入力して実行します。

ssh pi@raspberrypi.local
  • Are you sure you want to continue connecting (yes/no)? との問いには yes と入力します。
  • 初期パスワードはRaspberry Pi Imagerを使って設定したものを用います。

Windows 10 で接続ができない場合は?
Windows 10の以前の場合(Windows 10 の最新版でない場合も同様)は、 Windows 用 Apple iTunes をインストールしないと Host not found となり、接続ができない場合があります。 (mDNS(Bonjour) を導入する必要があります)
また、Raspberry Pi の電源が ON になる前にパソコンと有線 LAN で接続しないと、SSH リモートログインできない場合があります。

macOS の場合

[Finder]>[アプリケーション]>[ユーティリティ]>[ターミナル]を起動します。

Spotlight (検索) から “Terminal.app” を探して起動する方法もあります。

Terminal.app で以下のように入力して実行します。

ssh pi@raspberrypi.local
  • Are you sure you want to continue connecting (yes/no)? との問いには yes と入力します。
  • 初期パスワードはRaspberry Pi Imagerを使って設定したものを用います。

OS の最新化

以降は Windows、macOS 共通の作業です。

Raspberry Pi へ SSH リモートログインしたあと、Raspberry Pi 側で以下を1行ずつ実行します。

sudo timedatectl set-timezone Asia/Tokyo
sudo apt update
sudo apt upgrade -y
sudo systemctl reboot

最後の1行で再起動となります。

SSH リモートログイン終了の方法
Raspberry Pi 側で以下を実行します。
exit
これで終了となります。コマンドプロンプト、もしくは Terminal.app を閉じることができます。

Raspberry Pi の 電源 を OFF

OS の最新化を行った後、再起動で Raspberry Pi の起動が確認出来たら、この後行うセンサーの取り付けのために電源を OFF とします。

電源を OFF にする場合は SSH リモートログインした後、Raspberry Pi 側で以下を実行します。

sudo systemctl poweroff

この後 1分ほど経過して緑色 LED の点滅が止んだら microUSB ケーブルを抜きます。これで OFF にできます。

超音波距離センサーを取り付ける

パーツを準備する

以下のパーツを準備してください。

  • ジャンパワイヤ (オス – メス) x 4 ※ 画像上部ケーブル
  • 超音波距離センサー (3.3V対応) x 1 ※画像左下のスピーカのような形の緑色の基板
  • ブレッドボード x 1 ※画像右下の穴あき板

超音波距離センサーのジャンパプラグを抜き取る

超音波距離センサーの裏面を確認してください。その時、ジャンパプラグ(白、もしくは黒の部品)がついていれば抜き取ってください。

抜き取ったジャンパプラグは本レシピでは使用しませんが、保管しておいてください。(無くした場合でも別途購入は可能です)

ジャンパプラグの役割
今回利用している超音波距離センサー(US-100)は、計測した距離データを2つの方法(UARTモード、HC-SR04モード)で取得することができます。ジャンパプラグがついている状態はUARTモードです。今回はHC-SR04モードによる動作をさせるため、ジャンパプラグを抜いています。詳しくはスイッチサイエンスの商品ページをご覧ください。

配線をする

超音波距離センサーをブレッドボードに刺します。

端から1列目に挿します。ブレッドボードの向きに気をつけてください。

ブレッドボードとは?
表面に開いている穴にジャンパワイヤなどを挿すだけで電子回路を組み上げることができる配線用のパーツです。抜き挿しだけで回路の組み換えが可能であるため、試験時に用いられます。内部的には右図のオレンジの線でつながってます。

ブレッドボードを使わずに配線する
冒頭の動画では、ブレッドボードを経由せず超音波距離センサーとRaspberry Piを直接接続する方法をご紹介しています。この場合は別途「メス―メス型のジャンパワイヤ」を4本ご用意ください。接続場所自体は本レシピで紹介している通りです。

ジャンパーワイヤをブレッドボードに挿します。

センサーのピンは5つありますが、そのうち右側4つを使用します(一番左のピンは利用しません)ジャンパワイヤはセンサーの一番右から赤、青、黄、黒と挿します。

ジャンパワイヤをRaspberry Piにつなげる

Raspberry Pi の電源は OFF の状態で行ってください。

また、接続するピンを間違えると故障の原因になるので、十分気をつけてください。取り付け順序としては、黒、黄、青、赤と、電源である赤を最後にしていただくと比較的安全です。

動作テストを行う

全ての接続が確認出来たら、Raspberry Pi の電源を ON にしてから、Raspberry Pi 上で以下を一行ずつ実行します。

curl -O https://gist.githubusercontent.com/ma2shita/0569ab4717c49349889c9fbe1af25386/raw/bda9390e8792045d3dd73d5db1f800f6dca8de34/sensor_test.py
python2 sensor_test.py

ファイルがダウンロードできない場合は?
curl の後の -O はゼロでは無く大文字のオーです。

以下は、sensor_test.py の実行の様子です。センサの前に手をかざしてみて、距離が変化する事を確認してください。

pi@raspberrypi:~ $ python2 sensor_test.py
距離: 8.2 cm
距離: 8.3 cm
距離: 8.3 cm
距離: 8.2 cm
距離: 8.2 cm
距離: 12.2 cm
距離: 335.4 cm
距離: 337.5 cm
距離: 335.6 cm

プログラムの終了は Ctrl + C です。

プログラムを実行しても距離が表示されない場合は?

2つの原因が考えられます。1つ目はセンサー前に「何も存在しない」場合です。確認用プログラムでは “距離が500cmと判定された場合には、何も表示しない” としています。そのため、センサー前に手をかざしてみてください。

2つめは配線間違いです。センサーの前に手をかざしてみても動かない場合はこのケースになります。速やかに確認用プログラムを停止したあと、Raspberry Piの電源をOFFにしてから、配線を再度確認してください。

【参考】sensor_test.py

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

import time
# 距離を読む関数
def read_distance():
    # 必要なライブラリのインポート・設定
    import RPi.GPIO as GPIO

    # 使用するピンの設定
    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)

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

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

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

    # GPIO を初期化しておく
    GPIO.cleanup()

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

    # 500cm 以上の場合はノイズと判断する
    if distance <= 500:
        return distance
    else:
        return None

def main():
    while True:
        distance = read_distance()
        if distance:
            print "距離: %.1f cm" % distance

        time.sleep(1)

if __name__ == "__main__":
    main()

スピーカーを接続する

スピーカーとオーディオケーブルを準備し、Raspberry Piとスピーカーをつなげます。

接続が確認出来たら、Raspberry Pi 上で以下を実行します。成功すると「フロント・センター」と英語で再生されます。音量にはご注意ください。また、聞こえない場合はスピーカーの音量を調整してください。

aplay -D plughw:CARD=0,DEV=0 /usr/share/sounds/alsa/Front_Center.wav

SORACOM Air によるインターネット接続

ここからはUSBドングル型モデム(AK-020)とSORACOM IoT SIMを利用してセルラー通信経由でインターネット接続が行えるようにします。

setup_air.sh の実行

USB ドングル型モデムで SORACOM Air によるインターネット接続の一連の設定を自動化する setup_air.sh を実行します。

以下をRaspberry Piで1行ずつ実行してください。

curl -O https://soracom-files.s3.amazonaws.com/setup_air.sh
sudo bash setup_air.sh

USB ドングル型モデム (AK-020) に SIM を取り付け、Raspberry Pi に接続する

以下の図を参考に取り付けてください。

Raspberry Pi の USB ポートはどこでも構いませんが、この後に接続する USB カメラとの位置で競合しないようにしてください。USB ドングル型モデム、USB カメラ共に Raspberry Pi の電源が ON 状態でもいつでも抜き挿し可能です。

接続を確認する

USB ドングル型モデムの LED を見ながら接続状態になったのを見計らって、以下をRaspberry Piで実行します。

ping -c 4 pong.soracom.io

この時、期待される出力は以下の通りです。

PING pong.soracom.io (100.127.100.127) 56(84) bytes of data.
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=1 ttl=64 time=75.6 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=2 ttl=64 time=58.8 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=3 ttl=64 time=55.4 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=4 ttl=64 time=43.4 ms

これで Raspberry Pi から SORACOM Air を通じてインターネット接続が可能になりました。

AWS Lambda で Lambda 関数を作成する

ここからはAWS LambdaでLambda関数を作成します。

AWS マネジメントコンソールを開き、AWS Lambdaの関数作成画面へと進みます。

AWSは数多くのサービスがあるため、トップページで「lambda」と探すと素早く移動できます。

AWS Lambdaの管理画面で[関数の作成]をクリックします。

関数の作成画面では[一から作成]をクリックした後、以下のように入力をして[関数の作成]をクリックします。

関数名storebot任意の名前が利用できます。
ランタイムPython3.8

しばらくすると関数の管理画面に移動します。まず[アクセス権限]タブをクリックし、その後 “ロール名” の部分 (図中では storebot-role-... となっている部分)をクリックします。するとAWS IAM(Identity and Access Management)の管理画面に移動します。

AWS IAMの管理画面でポリシー名の “AWSLambdaBasic…” から始まるリンクをクリックします。

続いて表示された画面で[ポリシーの編集]をクリックします。

続いての画面では[さらにアクセス許可を追加する]をクリックします。

次の画面では “サービス” 等を以下のように設定したら[ポリシーの確認]をクリックします。

サービスPolly検索窓に polly と入力すると素早く見つけることができます。
アクションSynthesizeSpeedh検索窓に synthe と入力すると素早く見つけることができます。
リソース全てのリソース
リクエスト条件(設定不要)

確認画面では[変更の保存]をクリックします。

ここまでの作業が終了したら、AWS IAMの画面は閉じて問題ありません。
続いてはAWS Lambdaの管理画面に戻り、[設定]タブをクリックします。

下にスクロールすると “関数コード” が出てきます。この中のプログラムを後述する “storebot (Lambda 関数)” の内容と入れ替えます。

storebot (Lambda 関数)

from boto3 import Session
from boto3 import resource
from contextlib import closing
import base64

def lambda_handler(event, context):
    text = "こんにちは、このメッセージは店番ロボット君です。お店の前に立ち止まった人に展示物を解説します。実際はテキストを動的に作ったり、Amazon Sスリーを経由して受け渡すのが良いでしょう。"

    polly = Session().client("polly")
    response = polly.synthesize_speech(Text=text, OutputFormat="mp3", VoiceId="Mizuki")
    with closing(response["AudioStream"]) as stream:
        r = {'encode': 'base64', 'format': "mp3", 'data': base64.b64encode(stream.read()).decode('utf-8')}
        return r

入れ替えたら、AWS Lambda 管理画面上部の[テストイベントの選択]をクリックし、その後[テストイベントの設定]をクリックします。

ダイアログでは以下のように設定した後、[作成]をクリックします。

イベント名test名前は任意です。

※イベントの中身自体は変更しません。

AWS Lambdaの管理画面で[保存]をクリックした後に[テスト]をクリックします。

テスト実行後に “関数コード” で “Status: Succeeded” となっていれば成功です。

Succeededにならない場合は?
主に2つの原因が考えられます。
1つ目はAWS IAM設定です。今回は Amazon Pollyというサービスに音声データを作成させています。その時の権限が SynthesizeSpeedh です。Lambda 関数にこの権限が割り当てられていないとAmazon Pollyは動作拒否をします。AWS IAMの設定まで戻って確認してください。
2つ目はプログラムの入れ替えミスです。既存のプログラムが残っていたりすると失敗します。再度入れ替えをしてみてください。

“関数コード” の[Deploy]をクリックします。ボタンが白くなったら完了です。

ARNを入手する

ここまでの動作が確認出来たら、最後にLambda 関数の ARN(Amazon Resource Name) を入手します。このARNは後ほど SORACOM Funk で使用するため必ず入手してください。
Lambda 関数管理画面の上部にある ARN をメモしてください。(書類マークでコピーできます)

以上で AWS Lambda の設定は終了です。

AWS IAM で SORACOM Funk 用の認証情報を作成する

SORACOM Funk から先ほど作成した Lambda 関数を呼び出せるように、専用の認証情報をAWSで作成します。

AWS マネジメントコンソールを開き、AWS IAM管理画面へと進みます。

AWSは数多くのサービスがあるため、トップページで「iam」と探すと素早く移動できます。

AWS IAM管理画面で[ユーザー]をクリックした後、[ユーザーを追加]をクリックします。
※すでに “ユーザー” 画面であれば [ユーザーを追加]のクリックのみとなります。

ユーザーを追加の画面では以下のように設定してから[次のステップ:アクセス権限]をクリックします。

ユーザー名storebot-invoker-by-soracomユーザー名は任意です。後で見返したときにわかりやすい名前が良いでしょう。
プログラムによるアクセスチェックを付ける

アクセス許可の設定画面では[既存のポリシーを直接アタッチ]をクリックした後、 “AWSLambdaRole” にチェックを付け、[次のステップ:タグ]をクリックします。
※数が多いためフィルタに lambdarole と入力すると素早く見つけることができるでしょう。

タグの追加画面では特に作業はありません。[次のステップ:確認]をクリックします。

確認画面で今までの内容をチェックします。特にアクセス権限に AWSLambdaRole が設定されていることを確認してください。その後[ユーザーの作成]をクリックします。

ユーザーの作成直後に表示される “アクセスキー ID” と “シークレットアクセスキー” をメモしておいてください。シークレットアクセスキー[表示]をクリックすると現れます。また、これ以降で確認することが出来ないため、確実にメモしておきましょう。(.csv のダウンロードも良い選択です)

以上で AWS IAM の設定は終了です。

SORACOM Funk を設定する

これまで設定してきた情報を使い SORACOM Funk を設定して Lambda 関数を呼び出せるようにします。

SORACOM ユーザーコンソールにログインした後[Menu]>[SIM 管理]とクリックして SIM 管理画面を開きます。

USB ドングル型モデムに取り付けた SIM にチェックを付け、[操作]>[所属グループ変更]とクリックします。

SORACOM の便利な使い方: 複数の SIM を同時に扱う
チェックをつける対象を複数にすれば、一度の複数の SIM を対象に操作が可能です。

「新しい所属グループ」のプルダウンボックスをクリックした後、[新しいグループを作成…]をクリックします。

「グループ作成」のグループ名を入力して[グループ作成]をクリックします。

項目備考
グループ名storebot自由に入力可能です。日本語も設定可能です。

新しい所属グループが先ほど作成したグループになっていることを確認したら[グループ変更]をクリックします。

自動的に SIM 管理画面に戻ります。
SIM の「グループ」に先ほど作ったグループが設定されていることを確認してください。

以上で、グループの作成と所属の作業は完了です。

SORACOM Funk の設定

先ほど作成したグループをクリックします。

グループの設定画面で “SORACOM Funk” を探し、クリックします。すると SORACOM Funk の設定画面が開きます。

SORACOM Funk の設定では、まず “OFF” となっている部分をクリックします。すると “ON” に切り替わり、設定ができるようになります。

その後 “サービス” と “送信データ形式” は変更せずに、 “認証情報” の[認証情報を指定しない]をクリックします。表示される一覧の中から[認証情報を新規作成する…]をクリックします。

認証情報を登録する画面では以下の通りに設定した後、[登録]をクリックします。

認証情報 IDstorebot-invoker任意です。後で見返した時にわかりやすくしておくと良いでしょう。
AWS Access Key IDAWS IAMで設定した時にメモをした「アクセスキー ID」を入力します
AWS Secret Access KeyAWS IAMで設定した時にメモをした「シークレットアクセスキー」を入力します

SORACOM Funk 設定画面に戻ってきたら追加で以下の設定を行い、その後[保存]をクリックします。

関数の ARNAWS Lambda管理画面でメモをした ARN を入力します。

SORACOM Funk と AWS Lambda の連携設定をテストする

ここまでの設定を実際に動作させてみてテストします。

以下をRaspberry Piで1行ずつ実行してください。

sudo install mpg123
curl -O https://gist.githubusercontent.com/ma2shita/a7f2a0acf9b1a7f43c360e1371aadaed/raw/b07e0ad0b386177eb22ad9734a0f2c1a12c1bb15/soracom_funk_test.py
python2 soracom_funk_test.py

ファイルがダウンロードできない場合は?
curl の後の -O はゼロでは無く大文字のオーです。

以下は soracom_funk_test.py の実行の様子です。スピーカーから「こんにちは、このメッセージは店番ロボット君です….」と再生されるでしょう。

pi@raspberrypi:~ $ python2 soracom_funk_test.py
200
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.25.10; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes

Playing MPEG stream 1 of 1: - ...

MPEG 2.0 L III cbr48 22050 mono


[0:15] Decoding of - finished.

【参考】soracom_funk_test.py

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

import urllib2
import json
import base64
from subprocess import Popen, PIPE
def main():
    headers = {'Content-Type': 'application/json'}
    payload = json.dumps({})
    response = urllib2.urlopen(urllib2.Request('http://uni.soracom.io', payload, headers))
    print(response.getcode())
    body = json.loads(response.read())
    mp3data = base64.b64decode(body['data'])
    cp = Popen(['mpg123', '-'], stdin=PIPE)
    cp.communicate(input=mp3data)

if __name__ == "__main__":
    main()

これで全ての設定が完了しました。

センサーと組み合わせて動かす

超音波距離センサーと組み合わせてしゃべることができるか確認します。

以下をRaspberry Piで1行ずつ実行してください。

curl -O https://gist.githubusercontent.com/ma2shita/e7f5d72c7592e8eb09adf92dcdf4310c/raw/2cd2a5eeb7af3ac144671c8bf5e967438c683e3e/storebot.py
python2 storebot.py

ファイルがダウンロードできない場合は?
curl の後の -O はゼロでは無く大文字のオーです。

以下は storebot.py の実行の様子です。超音波距離センサーに手をかざしてみて、5秒経過すると音声が再生されます。

pi@raspberrypi:~ $ python2 storebot.py
距離: 336.2 cm
0
距離: 336.6 cm
0
距離: 334.9 cm
0
距離: 19.6 cm
0
距離: 20.6 cm
1
距離: 20.5 cm
2
距離: 20.6 cm
3
距離: 20.5 cm
4
距離: 20.6 cm
200
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.25.10; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes

Playing MPEG stream 1 of 1: - ...

MPEG 2.0 L III cbr48 22050 mono


[0:15] Decoding of - finished.
0
距離: 335.4 cm
0
距離: 335.9 cm
0
距離: 335.7 cm

【参考】storebot.py

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

MIN_DISTANCE_CM = 20
MAX_DISTANCE_CM = 100
STAY_COUNT = 5

import time
# 距離を読む関数
def read_distance():
    # 必要なライブラリのインポート・設定
    import RPi.GPIO as GPIO

    # 使用するピンの設定
    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)

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

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

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

    # GPIO を初期化しておく
    GPIO.cleanup()

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

    # 500cm 以上の場合はノイズと判断する
    if distance <= 500:
        return distance
    else:
        return None

import urllib2
import json
import base64
from subprocess import Popen, PIPE
def main():
    cnt = 0
    while True:
        distance = read_distance()
        if distance:
            print "距離: %.1f cm" % distance
    
        if MIN_DISTANCE_CM <= distance and distance <= MAX_DISTANCE_CM:
            cnt += 1
        else:
            cnt = 0
    
        if cnt > STAY_COUNT - 1:
            cnt = 0
            headers = {'Content-Type': 'application/json'}
            payload = json.dumps({})
            response = urllib2.urlopen(urllib2.Request('http://uni.soracom.io', payload, headers))
            print(response.getcode())
            body = json.loads(response.read())
            mp3data = base64.b64decode(body['data'])
            cp = Popen(['mpg123', '-'], stdin=PIPE)
            cp.communicate(input=mp3data)

        print(cnt)
        time.sleep(1)

if __name__ == "__main__":
    main()

これで全て動作は完了です。

設置をする加工

例えばですが、スマートフォンスタンドを利用して超音波距離センサーを立てかけるようにできると、立ち止まった人の検知がより確実にできるでしょう。

※この例ではブレッドボードを利用せず、直接Raspberry Piとセンサーを接続しています。

「電源 ON 時にスタートする」設定を行う

現在の状態では、Raspberry Piに電源がONになった後、storebot.py を手で起動する必要があります。実際の運用に向けて「電源がONになったら自動的に storebot.py が動き出す」ようにしてみます。

以下をRaspberry Piで1行ずつ実行してください。

curl -O https://gist.githubusercontent.com/ma2shita/4dfe0f4da1ecec963190be6e8e474990/raw/a9d640ae1797eb642bc96e23cc47340a0c983f97/storebot.service
sudo loginctl enable-linger $USER
systemctl --user enable $PWD/storebot.service
systemctl --user start storebot.service
journalctl -n 10

ファイルがダウンロードできない場合は?
curl の後の -O はゼロでは無く大文字のオーです。

最後の journalctl で期待される出力は以下の通りです。

Aug 31 04:56:50 raspberrypi systemd[575]: Started Storebot.py auto start.
Aug 31 04:56:50 raspberrypi python2[5269]: 0
Aug 31 04:56:51 raspberrypi python2[5269]: 距離: 338.2 cm
Aug 31 04:56:51 raspberrypi python2[5269]: 0
Aug 31 04:56:52 raspberrypi python2[5269]: 距離: 337.0 cm
Aug 31 04:56:52 raspberrypi python2[5269]: 0
Aug 31 04:56:54 raspberrypi python2[5269]: 距離: 337.8 cm
Aug 31 04:56:54 raspberrypi python2[5269]: 0

これで次回以降、電源ON時に自動的にstorebot.pyが動くようになりました。

自動起動の仕組み
自動起動は systemd という Linux (Raspberry Pi OS)に標準搭載されているミドルウェアを利用して実現しています。 systemctl コマンドで制御しています。journalctl コマンドでログを確認できます。

起動前の注意点
起動前にセンサーやUSBドングル型モデム、スピーカー全てが接続されている状態にして、それから起動するようにしてください。

WiFi が無くても動作します
USBドングル型モデムが接続されていれば、IoTデータ通信サービス「SORACOM Air」でインターネット接続ができるため、WiFiが無くとも動作します。
Raspberry Piへのアクセスをしたい場合は本レシピでも紹介した有線LANを利用する方法の他、オンデマンドリモートアクセスサービス「SORACOM Napter」を利用すればSORACOM Airを通じてクラウド側からアクセスも可能です。SORACOM Napterによるリモートアクセスの詳細はSORACOM Napter を利用してIoTデバイスにSSHログインするをご覧ください。

あとかたづけと注意事項

本レシピでは費用がかかるサービスを利用しています。
本項をよく読み、必要な操作や解除作業を行うようにして、想定外の費用が掛からないようにしてください。

Raspberry Pi の 電源 を OFF

電源を OFF にする場合は SSH リモートログインした後、Raspberry Pi 側で以下を実行します。

sudo systemctl poweroff

この後 1分ほど経過して緑色 LED の点滅が止んだら microUSB ケーブルを抜きます。これで OFF にできます。

費用について

ここで記載している金額は全て税込み、送料別となります。

SORACOM プラットフォームの利用料金

サービス/機能料金
SORACOM Air (plan-D)基本料: 11円/日通信料: 0.22円~/MB(今回の利用であれば 100MB 以内で収まる範囲)
SORACOM Funk50000リクエスト/月を超えた分は0.00198円/リクエスト

※ 費用詳細はリンク先をご確認ください。

無料利用枠について
SORACOM サービスでは一部サービスにおいて無料枠が設定されています。たとえば SORACOM Air for セルラーであればアカウント毎で30円/月の通信分などです。料金詳細に「無料利用枠」として掲載されていますので、ご確認ください。

グループ解除

SORACOM Funk はリクエスト回数に応じて費用が発生する従量課金サービスです。そのため、通信が発生しなければ費用も発生しませんが、「機能を OFF にする」することで確実に費用の発生を抑えることができます。またもう1つの方法として「グループからSIMのの所属を解除する」事でも同様の効果が得られます。

グループ解除や削除の方法はグループからの解除 (JP)をご覧ください。

SORACOM IoT DIY レシピ »

レシピの達成、おめでとうございます!

達成したことをTwitterで呟く

普段の生活やビジネスに役立つ #IoTレシピ 「Raspberry Piで、近づくと自動応答する店番ロボット」 を達成しました!
@SORACOM_PR https://soracom.jp/recipes_index/7243


ご質問などはこちらよりお問い合わせください。