カメラで屋外ストリーミングIoTを自作する

今回やること

カメラモジュールとobnizを使って、屋外でもストリーミングができるIoTを作ってみます。

用意するもの

  • Jpegシリアルカメラ x 1
  • obniz Board x 1
  • モバイルバッテリー x 1
  • micro usbケーブル x 1
  • ワイヤケーブル x 数本
  • モバイルwifiルーター もしくは テザリングができる携帯電話 (カメラ設置場所にwifi環境があればそれでもOK)

組み立て方

Jpegシリアルカメラのライブラリを参考に、図のようにobnizとカメラモジュールを接続します。
このカメラモジュールはUARTで通信をしますので、GND、VCCの他にUART用のTx、Rxを接続し、合計4本の配線を行います。

ただ、obnizのピン1本からの給電では電源が足りないため、VCCをobniz以外とつなげるか、もしくはobnizのピンを2本使う必要があります。ここでは2本のピンから電源を供給することを選択し、io6とio9もvcc/gnd供給に使用する方法でカメラを動かしています。

電源は以下のように供給してください。

obnizとバッテリーをmicro USB経由で接続したらハードウェアは完成です。

プログラム

  • obnizとカメラをソフトウェア的にも接続する

上記で配線した情報をソフトウェア上にも記述します。
io6/io9は追加電源として使っているので、そちらも記述します。

obniz.com6.output(true);
obniz.com9.output(false);
var cam = obniz.wired("JpegSerialCam", {vcc:0, cam_tx:1, cam_rx:2, gnd:3});
  • カメラの初期設定

カメラの初期設定をします。
baudと取得画像のサイズを指定しています。

ストリーミングをするので、一番小さい画像サイズで、一番早い通信速度を指定しています。

await cam.startWait({baud: 38400});
await cam.setBaudWait(115200); 
await cam.setSizeWait("160x120");
  • 写真を取り続ける

await cam.takeWait();で写真が取れるので、それをwhileループでずっと取り続けます。
HTML上に表示するために、imgタグにbase64エンコードしたデータを入れています。

while(true){ 
const jpegData = await cam.takeWait(); 
document.getElementById("image").src = "data:image/jpeg;base64," + cam.arrayToBase64(jpegData); 
}

完成したプログラム