パーツライブラリ - UnitV AI Camera
2021/4/25公開
概要
UnitV AI Cameraのパーツライブラリを作りましたのでこちらでご紹介します。本パーツライブラリはobniz用パーツライブラリとカメラ用プログラム(boot.py)の2つで構成されています。
カメラの初期設定(ボーレート、解像度など)はboot.pyで行ってください。
準備
- カメラにファームウェアを書き込む boot.pyを動作させるためには最初にカメラにファームウェアを書き込む必要がありますので、
- カメラ用プログラム(boot.py)の設定を行う テキストエディタでboot.pyを開き、説明に従って設定してください。
- obnizに接続する Grove⇒ジャンパ変換ケーブルを使う場合は白い線がRx、黄色い線がTxとなります。
- obniz用プログラムを作る こちらの例に従ってプログラムを作ります。
公式の手順を参考に書き込んでください。
次にboot.pyをMicroSDに書き込んでカードスロットに差し込んでください。
カメラにはSDカードの相性問題がありますのでご注意ください。
M5StickCのようにGrove端子がある場合はGroveケーブルで接続します。(ただし動作未検証です。)
また、カメラは消費電力が大きいため別途USB TypeCでの外部電源供給を推奨します。
クラス名は"Grove_UnitVAICamera"です。
外部パーツライブラリの使用方法は公式ドキュメント「外部のパーツライブラリを取り込む」を参照してください。
注意事項
工場出荷状態でピントが合っていない可能性があります。(手元の個体は完全にピンボケでした)レンズ外側のプラスチックの枠部分を爪楊枝などでつまんで回すと調整できましたので必要に応じて調整してください。
どっちにどれだけ回せばいいかは被写体とレンズの状態によりケースバイケースなのでクッキリした状態に持っていくのはなかなか難しいですが…。
boot.pyの設定
設定項目は冒頭部にまとめてあります。下記は設定例です。
##### User settings section Begin #####
# Baud rate(should be matched with obniz.)
BAUD_RATE = 115200
# Shooting mode
# When SHOOTING_MODE_ONE_TIME is True, Wait for "take a picture" instruction from obniz.
SHOOTING_MODE_ONE_TIME = False
# JPEG Compression Quality(0-100)
JPEG_COMP_QUALITY = 50
# Camera Resolution(sensor.VGA, QVGA, QQVGA ...)
CAMERA_RESOLUTION = sensor.VGA
# Use LED indicator
USE_LED = True
##### User settings section End #####
設定の内容は下記のとおりです。
- BAUD_RATE ボーレートを設定します。通常は115200を設定してください。
- SHOOTING_MODE_ONE_TIME 撮影モードを設定します。
- JPEG_COMP_QUALITY JPEG圧縮の画質設定です。0-100で指定してください。
- CAMERA_RESOLUTION 解像度を設定します。sensor.VGA, sensor.QVGA, sensor.QQVGAなどが設定可能です。
- USE_LED 動作状態を示すLEDの点灯を行うかどうか設定します。
手元の環境では230400、460800でも動作しましたがobniz側の定格オーバーなので安定しないかもしれません。(921600は無理でした)
この値はobniz側のボーレート設定と合わせてください。
True:単発撮影モード(obnizから撮影要求を送った時だけ撮影を行います。)
False:連続撮影モード(カメラの負荷が高いので長時間の動作には向かないかもしれません。)
数値が低いほど速く転送できますがその分画質が落ちます。
画質重視の場合は最大でも85程度が無難です。
OV2640センサー仕様であってもK210チップの制約により最大解像度はVGAまでとなっています。(それ以上はエラー)
True:行う(起動時に青で3回点滅⇒点灯、以後は処理中は赤で点灯します。)
False:行わない(使用中は一切光りません)
パーツライブラリ仕様
[await] takeContinuousWait()
連続的にカメラで撮影し、JPEGデータを取得します。
あらかじめboot.pyを連続撮影モードに設定する必要があります。(SHOOTING_MODE_ONE_TIMEをFalse)
<script src="https://unpkg.com/obniz@3.x/obniz.js"></script>
<script src="Grove_UnitVAICamera.js"></script>
<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
// パーツライブラリの登録
Obniz.PartsRegistrate(Grove_UnitVAICamera);
var cam = obniz.wired("Grove_UnitVAICamera", { gnd:0, vcc:1, cam_rx:2, cam_tx:3, baud:115200 });
// var cam = obniz.wired("Grove_UnitVAICamera", { grove: obniz.grove0, baud:115200 }); // Groveの場合(未検証)
while (true) {
const jpegData = await cam.takeContinuousWait();
// <img id="image">に表示
document.getElementById("image").src = "data:image/jpeg;base64," + cam.arrayToBase64(jpegData);
}
}
</script>
~(中略)~
<img id="image">
[await] takeOneTimeWait()
カメラで一度だけ撮影し、JPEGデータを取得します。
あらかじめboot.pyを単発撮影モードに設定する必要があります。(SHOOTING_MODE_ONE_TIMEをTrue)
<script src="https://unpkg.com/obniz@3.x/obniz.js"></script>
<script src="Grove_UnitVAICamera.js"></script>
<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
var cam = null;
obniz.onconnect = async function () {
// パーツライブラリの登録
Obniz.PartsRegistrate(Grove_UnitVAICamera);
cam = obniz.wired("Grove_UnitVAICamera", { gnd:0, vcc:1, cam_rx:2, cam_tx:3, baud:115200 });
// cam = obniz.wired("Grove_UnitVAICamera", { grove: obniz.grove0, baud:115200 }); // Groveの場合(未検証)
}
async function takePic() {
console.log("take!");
const jpegData = await cam.takeOneTimeWait();
document.getElementById("image").src = "data:image/jpeg;base64," + cam.arrayToBase64(jpegData);
}
</script>
~(中略)~
<input type="button" id="take" value="撮影" onclick="takePic();"><br>
<img id="image">
arrayToBase64(bytearray)
引数のByte配列をBASE64にエンコードします。
これによりJPEGのBASE64データを取得できます。
HTMLでは<img>タグのsrcにBASE64のJPEGを渡すと画像として見ることが出来ます。
実装例1:連続撮影
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Camera</title>
<script src="https://unpkg.com/obniz@3.x.0/obniz.js"></script>
<script src="Grove_UnitVAICamera.js"></script>
<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
// パーツライブラリの登録
Obniz.PartsRegistrate(Grove_UnitVAICamera);
var cam = obniz.wired("Grove_UnitVAICamera", { gnd:0, vcc:1, cam_rx:2, cam_tx:3, baud:115200 });
while (true) {
const jpegData = await cam.takeContinuousWait();
document.getElementById("image").src = "data:image/jpeg;base64," + cam.arrayToBase64(jpegData);
}
}
</script>
</head>
<body>
<img id="image">
</body>
</html>
実装例2:単発撮影
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Camera</title>
<script src="https://unpkg.com/obniz@3.x.0/obniz.js"></script>
<script src="Grove_UnitVAICamera.js"></script>
<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
var cam = null;
obniz.onconnect = async function () {
// パーツライブラリの登録
Obniz.PartsRegistrate(Grove_UnitVAICamera);
cam = obniz.wired("Grove_UnitVAICamera", { gnd:0, vcc:1, cam_rx:2, cam_tx:3, baud:115200 });
}
async function takePic() {
console.log("take!");
const jpegData = await cam.takeOneTimeWait();
document.getElementById("image").src = "data:image/jpeg;base64," + cam.arrayToBase64(jpegData);
}
</script>
</head>
<body>
<input type="button" id="take" value="撮影" onclick="takePic();"><br>
<img id="image">
</body>
</html>
撮影画像例(VGAサイズ)
ダウンロード
Grove_UnitVAICamera.jsboot.py
戻る