戻る


Bluetoothカメラの製作

パソコン接続のUSBカメラでは、パソコン周辺の防犯しかできません。
家の周りなどを監視したい場合は、やはり無線カメラがあると便利ですね。

そこで、手持ちにBluetooth USBアダプタがあるので、これを利用して
無線カメラ作成を試みてみます。
構成図
図1.製作構成図


◎機種選定

表1.機種選定表
マイコン AKI-H83069F
Bluetooth USBアダプタ BT-Mini2EDR
カメラ WCU114WH・BK


 マイコンは、USBホストが使用できる、秋月電子通商のH8/3069F-USBホストボードキットを使用します。USBホストコントローラは、CypressのSL811-HSTが使用されています。
 Bluetoothアダプタは、プラネックスコミュニケーションズのBT-Mini2EDRを2個所有しているのでこれを使用します。パソコン側もこのアダプタを使用します。(後述)
 USBカメラは、量販店で980円で購入したArvelのWEBカメラを使用します。
 USBハブは、何でもよいかと、思われます。
構成写真
構成内容


この構成を動作させるには、高いハードルが幾つもありそうですが、試みを進めてみましょう。因みに、私の電子工作レベルは、初心者レベルだと思います。

◎開発環境

・ハード環境
 H8/3069F-USBホストボードキットには、ACアダプタが付属していませんので準備する必要があります。
 プログラムの書込みなどでパソコンとのシリアルポート通信のため、DSubコネクタと基盤のCOM1を接続します。クリップ付き接続ケーブルなどでもよいですが、私は、已む無くストレートケーブルを切断して作成しました。これは、プログラム書込みツールが頻繁に通信エラーになるため、結線を疑った為ですが、原因は、別にありました。(後述)

・ソフト環境
 コンパイル環境は、キットに付属のwingccを使用します。統合開発環境が付属していますが、使用せずにエディター(Visual Studio)+バッチでのmake(コマンドプロンプト)で行いました。
 ROMへのプログラム書込みは、付属のSendToolを使用しましたが、ここからが厄介でした。
 まず、プログラムの書込みは、基盤のSW設定をモード7の状態にして行いますが、このSWの設定がキットに付属する説明書では、間違っていました。これに気づかずかなり時間を費やしてしまいました。現在は訂正されているようです。
 先に書きましたが、SendTool.exeでプログラム書き込むと頻繁に通信エラーが発生します。通信速度を遅くしたり、作成元HPから最新をダウンロードしたりもしましたが、同様でした。私の環境は、 USB TO SERIALケーブルを使用していますので試しに、シリアル直結のマシンを使用してみると、なんと、まったく通信エラーは起きなくなりました。USB to Serial変換はかなり遅れが生じてエラーを検知しているのでしょう。

 プログラムを修正する度にROMへ書込みを行っては、直ぐに書込み限界となってしまいます。よって、モニタプログラムを利用してRAMへプログラムを流し込みデバッグすることにします。幸い、モニタプログラムは、いくつか利用できるものがあるようです。今回は、宮城県産業技術総合センターからダウンロードできるH8簡易モニターを利用させていただきます。但しこのモニタプログラムは、20MHzでの動作となっています。キットは、25MHzなので変更してコンパイルする必要がありました。

◎Bluetoothプロトコルスタック(簡易版)

 正規のプロトコルスタックを作成するつもりは、毛頭ございません。相手デバイスと接続ができてデータの送受信ができるものを、目標に作成を行います。はじめは、マスター動作を実装して後でスレーブを実装したいと思います。
 まず、Bluetooth USBアダプタのディスクリプタを取得して内容を確認しましょう。

表2.Bluetooth USBアダプタ Discriptor(interface0のみ以降省略)
09 02 B1 00 02 01 00 C0 00 Configuration Discriptor
09 04 00 00 03 E0 01 01 00 Interface Discriptor
07 05 81 03 10 00 01 EndPoint Discriptor
07 05 02 02 40 00 01 EndPoint Discriptor
07 05 82 02 40 00 01 EndPointDiscriptor

Bluetooth SPECを見ると、各エンドポイントを表3のように定義付けされているようです。
表3.USB firmware interface and endpoint settings
Interface
Number
Alternate
Setting
Suggested
Endpoint Address
Endpoint
Type
HCI Commands
0 0 0x00 Control
HCI Events
0 0 0x81 Interrupt(IN)
ACL Data
0 0 0x82 Bulk(IN)
0 0 0x02 Bulk(OUT)

USBアダプタから取得した内容と一致しているようです。
よって、HCI Commandをコントロール転送で送信して、HCI Eventをエンドポイント1から受信して、ACL Dataは、エンドポイント2から送受信を行います。

・コマンド発行概要
@初期化関連Commandを発行する。
AHCIレイヤーを接続する。
BL2Capレイヤーを接続する。
CRfcommレイヤーを接続する。

詳細は、Bluetooth SPECに記載されています。
これで、相手デバイスと接続され、Rfcomm Layerでデータの送受信が可能となりました。

◎カメラ画像の取得

 以前に仕事で、Jpeg画像を吐き出すカメラを制御したことがあるのですが、今回のカメラは、どのような形式で画像が転送されるのかまったくわかりません。そこで、カメラ付属のソフトを動作させてUSBに流れるデータをモニタしてみましょう。USBモニタは、SnoopyProというソフトを使用します。
USBモニタデータ
SnoopyProで採取したWEBカメラ間のデータ

 Down方向へ流れるデータは、設定関連の情報と思われますが、内容は何のことだかさっぱりわかりません。しかし、このVENDER_DEVICEで送信されるデータの後は、ISOCH_TRANSFERでエンドポイント0x85から大量のデータが上がってきています。これが、画像データと思われます。
 BluetoothUSBアダプタと同様にディスクリプタを取得してみましょう。

WEBカメラのディスクリプタ    

右の採取データを見るとやはり、EndPoint0x85がIsochronous転送となっています。よって、はじめの、設定情報さえ転送できれば、画像データが取得できそうです。

右の採取データは、AlternateSettingが02までしか表示していませんが、実際は、08までありました。違いは、EndPoint 0x85の最大パケット長が増えていきます。
Alternate
Setting
00 01 02 03 04 05 06 07 08
最大パケット
長(hex)
0 80 100 180 200 280 300 380 3ff

USBモニタで取得したログは、AlternateSetting:08の最大パケットサイズ3ffを使用しているようです。しかし、H8/3069F-USBホストボードキット搭載USBホストコントローラのSL811-HSTは、バッファが240byteしかありません。Isochronous転送で Ack制御なしにデータを送られて取得できるか不安が残ります。幸いこのカメラは、 0x81のEndPointへバルク転送が設けられていて、ここへ要求すると、画像データが取得できたので、今回はこのEndPointを利用します。
 このカメラから送られてくる画像形式ですが、Jepgのようですが、独自のマーカが使用されているようです。FF FF 00 FF 96ではじまりFF D9で終わります。次のスタートマーカまでデータがありますが、何かは不明です。
データの中にFF FF FF 00/01/02 のマーカが現れますが、次のマーカまでのサイズが指定されているようです。その他FF 00が見られますが、これは、SOSセグメント中の FFデータではないかと思われます。その他にマーカは無い様に思われますので、SOSセグメントのみのデータに思えます。
 画像データ取得は、フレームレートを下げて行いたいのですが、カメラのレジスタ仕様がわからないため出来ませんので適当なサイズのデータを取得してその中でスタートマーカ/ エンドマーカを探しその間のデータをパソコンへ送信するロジックとします。転送レートは、数フレーム/秒です。

◎パソコン側ソフト

PC Viewer Application    

 はじめは、シリアルポートから画像データを受信してJpegデコードを行ってみます。
スタートマーカとエンドマーカを検出してJpegヘッダー等を付加してデコードしてみましたが、うまく表示されません。特殊な圧縮方法なのでしょうか。探してみると、このカメラで使用されているセンサーを制御するソフトを公開している方がいらっしゃいました。このデコーダーを利用させていただきます。
 無事になんとか、デコードされ画像が表示されました。ときどきエッジへ三本線が入りますが、気にせずに進みます。
 次にBluetoothのデータ受信処理を実装します。Imaging Profileの様なものを実装せずに、SPPとしてデータを
受信します。右の画像は、鏡にカメラと単4電池を写した画像です。画質は悪いですが、人の判断はできそうです。



◎焦電赤外線検知器

焦電型赤外線センサキット  

 ACアダプタから電流を得るのであれば、これで完成ですが、やはり、無線カメラであれば、電池で稼動させたいものです。しかし、単3電池4本での連続使用ですと、2時間程で電圧が下がり画像にノイズが出てきます。よって未使用時は、スリープモードにして消費電流を抑えたいと思います。そのために、人体を検知する焦電赤外線検知器を使用します。秋月電子通商の焦電型赤外線センサキットを使用してみましょう。(右の写真)
このキットは、12Vから5Vへ3端子レギュレータで落として使用するようですが、(付属されていませんでした)今回は、5Vをマイコンから直接分電して使用します。リレーも使用せずにLEDのみ使用します。このLEDのカノード側をマイコンのIRQ1へ接続してLOWエッジ割込みで使用します。これで、通常は、スリープモードでセンサーが反応した時に割込みで起動することが出来ます。


◎仕上げ



















 ダミーカメラをドイトで購入(780円)してUSBカメラを基盤だけにして収納してみました。マイコン本体もダミーカメラへ収納したかったのですが、FW書換えなどで不便なので、別のケースにマイコン本体を収納して電池BOXをダミーカメラへ入れました。(左上写真)
はじめの構成説明でBluetoothアダプタは、BT-Mini2EDRを使用すると書きましたが、このアダプタはClass2なので最大10mしか届きません。よって木造住宅2階と1階では、通信できませんでした。そこで、送信側だけでも Class1のBT-01UDE(PLANEX)を使用したところ、見通しが悪い2階と1階でも接続通信ができました。上の写真は、このアダプタを使用しています。

◎終わりに
 最後に、PCで受信した画像を携帯電話などへメール送信するように修正を追加します。これは、本サイトでダウンロードできる、防犯監視ソフトWatchCamと同機能を実装させます。
今回は、C#で画面とメール送信・メール受信(停止・再開指示)を作成してBluetooth通信部分は、VC++でDLLとしました。
 これで完成となりました。最後まで読んでいただいた方、ありがとうございました。ここまで、スイスイハードルを飛び越えたように書きましたが、実は、足は青痣だらけです。今回、個人使用のため、プログラム公開予定はありませんが、パソコン側のJPEGデコード部分は、人様のプログラムを利用させていただいていますので、使用希望のかたは、メールをいただければ、デコード部分のソースをお渡しします。


お問合せ・ご質問・ご依頼などございましたらお気軽にメールしてください。
ご質問を頂く時にその場で作成した様なフリーメールでいただくと、回答もそのような内容となってしまいがちですのでご了承ください。