今回は、USBカメラと接続してみます。
RaspberryPiとUSBカメラの接続
USBカメラはLogicoolのものを使用しました。
何かしら特別なことは必要なく、USBに挿し込むだけの接続です。
※写真ではSORACOMのUSBドングルが映っていますが、特にWi-Fiが使用できる場所では必要ありません。Wi-Fiがない環境であれば、SORACOM SIMを利用することによって接続が可能です。
クラウドと通信するための情報
用意するのは次のとおりです。SensingApp のアカウントを用意したら、センサーを登録した後、次の情報をご確認下さい。
- USER ID
- 写真送信先URL
以上の情報をご用意いただければ、USBカメラの画像をSensingAppに送信して閲覧することが可能です。
SensingApp画面のユーザー情報で、①と②のUSER IDと写真送信先URLを確認できます。
RaspberryPiの必要パッケージ
コードを書く前に、次のように必要なパッケージをインストールしておきます。
(事前にupdate&upgradeを終えておきます)
$ pip3 install opencv-python
$ pip3 install opencv-contrib-python
$ pip3 install Pillow
サンプルコード(Python)
RaspberryPiで動作させるサンプルコードを示します。
データ送信先のURLとUSER_IDは各自の情報に変更ください。
# -*- coding: utf-8 -*-
# USBカメラの画像送信のサンプルプログラム
#
import base64
import json
import urllib.request
from datetime import datetime
import time
import cv2
from io import BytesIO
from PIL import Image
# データ送信先
URL = "https://beta.sensingapp.io/api/image/"
USER_ID = "4bf7ee7c-be3f-43f6-a732-02b14de660be"
file_name = "sample.png"
image_section = "事務所"
while True:
try:
## 画像取得処理(USBカメラから)
capture = cv2.VideoCapture(0)
time.sleep(2) # 画像が暗くならないように間を取る
ret, frame = capture.read()
cv2.imwrite(file_name, frame)
img = Image.open(file_name)
capture.release()
## 送信処理
# PillowImageをbytesに変換してさらにbase64に変換
buffered = BytesIO()
img.save(buffered, format="JPEG")
img_byte = buffered.getvalue() # bytes
img_base64 = base64.b64encode(img_byte)
img_str = img_base64.decode('utf-8')
obj = {
"user_id": USER_ID,
"image_section": image_section,
"uploaded_at": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"image_file": img_str,
}
json_data = json.dumps(obj).encode("utf-8")
# httpリクエストを準備してPOST
request = urllib.request.Request(
URL, data=json_data, method="POST",
headers={"Content-Type": "application/json", }
)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode("utf-8")
if "Error" in response_body:
print("response_body Error") # for debug
else:
# インターバルをクラウドから取得した数値を入れる
interval_time = int(response_body)
print(interval_time) # for debug
time.sleep(interval_time)
# キーボード例外を検出
except KeyboardInterrupt:
print("Stopped by Ctrl+C")
break
except Exception as e:
print(e)
pass
自動起動設定
RaspberryPiにプログラムを置いたら、それを自動起動にします。ファイル名、ディレクトリー名はご自身の環境に合わせて下さい。
画像送信のプログラム(post_image.py)を実行するために、sensingapp.shを用意します。
#!/bin/sh
sleep 30
cd /home/pi
/usr/bin/python3 /home/pi/post_image.py
実行できるようにしておきます。
$ chmod 755 sensingapp.sh
次に、自動起動するためのサービスを用意します。
[Unit]
Description=SensingApp
After=syslog.target
[Service]
Type=simple
WorkingDirectory=/home/pi
ExecStart=/home/pi/sensingapp.sh
User=pi
Group=pi
[Install]
WantedBy=multi-user.target
自動起動の設定を行います。
$ sudo systemctl daemon-reload
$ sudo systemctl start sensingapp
$ sudo systemctl enable sensingapp
起動しているか確認します。
$ systemctl status sensingapp
● sensingapp.service – SensingApp
Loaded: loaded (/etc/systemd/system/sensingapp.service; enabled; vendor preset: enabled)
Active: active (running)
一旦、RaspberryPiを再起動して、自動起動を行います。
画像一覧表示
自動起動がうまくいけば、次のように画像一覧で写真が表示されます。
計測間隔の変更
計測間隔はヘッダーメニュー(黒いところ)のデバイス設定で行えます。初期値は600秒(10分)ですが、サンプルプログラムでは次のように60秒で設定しています。60秒以上、自由に変更ができます。
画像が表示されなかったら
ダッシュボードでデータが表示されない場合は次の理由が考えられます。
① IoTデバイスがインターネットに接続されていない。
② IoTデバイスで送信するプログラムのパラメーターが正しくない。
- IoTデバイス設定の通信パラメーターをご覧ください。
③ システム全体が不具合を起こしている。
- この場合には画面も見られなくなっている可能性がありますので、弊社にご相談ください。