Actcast開発ブログ

Actcastを用いたアプリケーション開発に関する情報を発信します。

Actcastでフォトインタラプタを使って、物体を検知し通知する。

概要

Actcastを用いて、Raspberry Pi Zero WHに接続したフォトインタラプタからの情報をもとに、物体を検知した際にhttpで通知するシステムを構築します。
(本記事では、フォトインタラプタを使った実用的なシステム構築というよりも、actcastでGPIOを使ったシンプルなActの作り方に重点を置いています。)

Raspberry Piとフォトインタラプタを接続後、以下のようになります。

f:id:actcast-sa-1:20210720190225j:plain

フォトインタラプタの詳細な仕様は割愛しますが、以下のようなセンサになります。
www.rohm.co.jp



準備

(この記事を作成するにあたって、ブレッドボードとフォトインタラプタは
https://www.amazon.co.jp/gp/product/B089LZPP3D/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1
の一部を使用しております。)

環境

  • 開発用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をインストール後、フォトインタラプタに物体を検出させると、以下のように通知が飛んでいることが確認できます。

f:id:actcast-sa-1:20210726154352p:plain

HTTPで通知する

最後に、HTTPで通知する方法です。
Actcastブラウザのホーム画面のAct一覧から、アップロードしたActを選んでCastsを選択してください。
f:id:actcast-sa-1:20210726161224p:plain

webhookに以下のような設定をすることで、1秒に1回HTTPで通知を飛ばすことが出来ます。
f:id:actcast-sa-1:20210726161606p:plain

hookbinを使って通知を受けた場合、以下のような情報を取得します。
f:id:actcast-sa-1:20210726161710p:plain