obnizでTTLシリアルJPEGカメラでハマって解消したメモ


だいぶ前にAdafruitのJpegカメラを秋月電子通商で購入してobnizで試したんですが「あれ全然撮れないぞ?」となって以来ずっとパーツを眠らせていたところ、先日のIoTLTでの発表資料を拝見させていただいて解決法が判ったので自分でも忘れないうちにメモしておくことにしました。

参考にした資料: ピンのピッチ幅で苦しんだ #obniz や #gwhack の話 #iotlt

パーツは発表の中でも出てきたobnizのパーツライブラリJpegSerialCamで紹介されている製品で、秋月電子通商の小型TTLシリアルJPEGカメラ(NTSCビデオ出力付)から購入できます。

基本的な使い方

以下は、ほぼパーツライブラリの先頭にある基本的な使い方のコード例と同じです。

違いは、このカメラは「電源は別途用意する方がおすすめ」とあるので、obniz BoardであればJ1端子、obniz Board 1YであればAdditional Power Pinから電源を供給する前提で、vccgndは省略してTXとRXを0と1に割り当ててみました。

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@latest/obniz.js"></script>
</head>
<body>

<div id="obniz-debug"></div>
<img id="image">

<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  var cam = obniz.wired("JpegSerialCam", {cam_tx:0, cam_rx:1});
  await cam.startWait({baud: 38400}); // パーツのデフォルトのボー・レートは38400
  await cam.setSizeWait("640x480");
  const jpegData = await cam.takeWait();
  document.getElementById("image").src = "data:image/jpeg;base64," + cam.arrayToBase64(jpegData);
}
</script>
</body>
</html>

J1ピンを使用した場合の配線図

ちょっとわかりにくいですが実際に配線したところ

この実装で上記のコードを実行すると、撮影した写真が以下のように表示されます。
モジュールのピンがある方が上なので、写真が逆向きに撮られてしまっています。

ハマりポイント

本題のハマりポイントですが、ボー・レートを意図せず変更してしまった場合、次回以降は設定したボー・レートを指定してstartWaitを呼ばないと動かなくなるという点です。
あまり考えずにパーツライブラリやブログのコードをコピペして試していたりすると普通にハマると思います。

前述のスライドでは、26ページにobnizの中の人(木戸さん)からの回答が紹介されています。これを読んだ後、setBaudWaitにセットするボー・レートを変えて試したところ無事動くようになりました!(ちょっと感動)

そして、実はパーツライブラリのsetBaudWaitの説明にはちゃんと書いてあります。。

この設定は電源を消してもカメラ側に保存されますので、変えた場合は次回のstartWait()では変えた方の速度を指定する必要があります。

しかし、初心者にはこの説明は結構流してしまいますよねえ。。

例えば、説明されている以下のコードを実行した後

var cam = obniz.wired("JpegSerialCam", {vcc:0, cam_tx:1, cam_rx:2, gnd:3});
await cam.startWait({baud: 38400});
await cam.setBaudWait(115200);
await cam.takeWait(); // baud is already changed to 115200.

次に実行するときは以下のようにbaudは「115200」を指定してstartWaitする必要があります。

var cam = obniz.wired("JpegSerialCam", {vcc:0, cam_tx:1, cam_rx:2, gnd:3});
await cam.startWait({baud: 115200});
await cam.takeWait();

後、実際にはsetBaudWaitに続けてsetSizeWaittakeWaitを呼んでも応答が返ってこない問題もあるやなしや?ネットワークなどの問題かもしれないですが。ちゃんとデバッグして調べたいところです。
しかし止まってしまった場合もボー・レートは変更されているようで、次回以降は変更した値を使用できます。

カメラモジュールのピッチが2.0mm規格問題について

普通のブレッドボードのピッチは2.54mmですが、このカメラモジュールのピッチ幅は2.0mmです。。

はじめに紹介した発表資料ではジャンパワイヤーを挿して使っていました。

私はなんとか2.54mmピッチのピンヘッダを無理やり曲げてはんだ付けしました。割とすんなりできた記憶が。

参考

Adafruitの公式チュートリアル: Overview | TTL Serial Camera | Adafruit Learning System
Arduino用ライブラリのGithubリポジトリ: adafruit / Adafruit-VC0706-Serial-Camera-Library