概要
Actcastを用いて、Raspberry Pi Zero WHに接続したフォトインタラプタからの情報をもとに、物体を検知した際にhttpで通知するシステムを構築します。
(本記事では、フォトインタラプタを使った実用的なシステム構築というよりも、actcastでGPIOを使ったシンプルなActの作り方に重点を置いています。)
Raspberry Piとフォトインタラプタを接続後、以下のようになります。
フォトインタラプタの詳細な仕様は割愛しますが、以下のようなセンサになります。
www.rohm.co.jp
準備
- Raspberry Pi Zero WH (SDカード、電源ケーブル等)
- ブレッドボード
- フォトインタラプタ
(この記事を作成するにあたって、ブレッドボードとフォトインタラプタは
https://www.amazon.co.jp/gp/product/B089LZPP3D/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1
の一部を使用しております。)
- Actcast開発SDK(以下 ActDK) (パートナープログラム に参加する必要があります。)
環境
- 開発用PCとして、ubuntu 18.04
- ActDK, actsim version 1.8.1
開発手順
まず、pythonプログラム単体として動作を確認後、そのスクリプトを元に Actcastアプリケーションを作成していきます。
1. actsimをインストールしたSDカードを準備する
Actsim のセットアップ | Actcast Documents
にしたがって、actsim.imgをSDカードにインストールしてください。
actsim.imgは
事前準備 | Actcast Documents
でダウンロードしたフォルダに含まれています。
2. actsim上で、フォトインタラプタを使う
ActcastのActを作成する前に、通常のpythonスクリプトとしてプログラムを作成していきます。
actsimでは、通常のラズパイ同様キーボード接続orSSH等で操作をすることが出来ます。
(ActcastイメージのSDカードでは直接の操作が不能になっています。)
以下のシンプルなpythonスクリプトを作成し、print結果が0(物体未検出),1(物体検出)となっていることを確認しました。
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN) while True: print(GPIO.input(17)) time.sleep(0.5)
このプログラムに対して、GPIO.input(17)が1(物体検出中)の場合に、httpで通知をするシステムを、Actcastを用いて作成していきます。
3. Actを作成する準備をする
ラズパイ側は引き続きactsimのままでよいです。
アプリケーション開発チュートリアル | Actcast Documents
このチュートリアルの、5.プロジェクト作成 までを完了してください。
開発用PCのディレクトリに、プロジェクトディレクトリが作成されているはずです。
(actdk remote addを設定する際、ラズパイ側のipアドレスを固定にする必要があります。設定方法参照)
4. 設定ファイル作成や、スクリプト修正を行い、Actcastアプリケーションを作成する
healthcheckerファイルを作成
app/healthchecker ファイルを作成します。
内容は下記になります。
#!/bin/bash HEARTBEAT_FILE='/root/heartbeat' [ "$(find "${HEARTBEAT_FILE}" -mmin -1)" == "${HEARTBEAT_FILE}" ]
act_settings.jsonを作成する
今回、Actに設定する項目はないので、空でよいです。
{}
作成後、以下のようなディレクトリ構成になります。
act_settings.json app data_schema.json include manifesto model setting_schema.json
必要なライブラリのインストール設定を書く
import RPi.GPIO as GPIO
をするために必要な設定をしていきます。
.actdk/dependencies.jsonにrpi.gpioをpip installする項目を追加します。
{ "apt": [ "python3", "python3-pil" ], "pip": [], "raspberrypi": { "apt": [ "libraspberrypi0" ], "pip": [ "actfw-raspberrypi", "rpi.gpio" ] } }
スクリプトの修正
1. app/mainとして保存する。
actsim上で、フォトインタラプタを使う
で作成したスクリプトをapp/main として移動します。
この後、ls app/の結果は以下のようになります。
ls app/ healthchecker main
2. heartbeat関数を呼び出す
ループ部分で
actfw_core.heartbeat()
を呼び出してください。
3. shebang #!/usr/bin/python3追加
スクリプトの先頭に、以下の1行を追加します。
#!/usr/bin/python3
4. print関数をnotify関数に変更する
actcastのcastを使うために、notify関数を使用します。
上記2~4を対応後、以下のスクリプトになります。
#!/usr/bin/python3 import RPi.GPIO as GPIO import time import actfw_core GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN) while True: actfw_core.heartbeat() if GPIO.input(17)==1: actfw_core.notify([{"data":"detected!"}]) time.sleep(0.5)
data_schema.jsonを編集する
actfw_notifyで通知する内容を設定するファイルになります。
今回は、"data"という項目を追加します。
追加後、以下のようになります。
{ "$schema": "https://actcast.io/schema/v8/data_schema_schema.json", "type": "array", "items": { "type": "object", "properties": { "data":{ "title":"data", "description":"detected notification", "type":"string" } }, "required": [] } }
manifestoを編集する
まず、今回のアプリはラズパイ0専用にするために、
menifesto/pi4_or_later.jsonを削除してください。
default.jsonのboardsからもRSPiZero以外の項目は削除しましょう。
また、初期設定では、カメラが必須になっているのでこれも削除しましょう。
削除後のdefault.jsonは以下のようになります。
{ "boards": [ "RSPiZero", "RSPiZeroW" ], "devices": [ { "type": "videocore", "device": [ "/dev/vcsm", "/dev/vcio", "/dev/vc-mem", "/dev/vchiq", "/dev/gpiomem" ] }, { "type": "framebuffer", "device": [ "/dev/fb0" ] } ] }
修正内容は以上になります。
actsimを用いて、動作確認をしてみてください。
ローカルデバイス上でのアプリケーションテスト | Actcast Documents
アップロード&完成
動作確認し、問題がなければアップロードしましょう。
Actcast へのアップロードとテスト | Actcast Documents
アップロード後は、actsimではなく、actcastを入れたsdカードに差し替えることで、ブラウザからActのinstallを行うことができます。
Actをインストール後、フォトインタラプタに物体を検出させると、以下のように通知が飛んでいることが確認できます。
HTTPで通知する
最後に、HTTPで通知する方法です。
Actcastブラウザのホーム画面のAct一覧から、アップロードしたActを選んでCastsを選択してください。
webhookに以下のような設定をすることで、1秒に1回HTTPで通知を飛ばすことが出来ます。
hookbinを使って通知を受けた場合、以下のような情報を取得します。