1.はじめに ランニングエレクトロニクスさんから縁あって、 PIC32MX695F512Hを搭載した試作基板「REPIC32SD」を譲って頂いた。 この基板は、同社から販売されている「SBDBT32」基板と似たような仕様の基板で、 クロック源の水晶や電源IC、SDカードスロット、USBのAコネクタが搭載されている他、「SBDBT32」とは違って、15ピン2列の外部接続端子が設けられている。 これにより、ICSPのプログラム端子やUART端子だけでなく複数のデジタルI/O端子を外部機器との接続に使うことが出来る。 この基板を使って、Webカメラからの動画像をカラーグラフィック液晶に表示するとともに、SDカードに動画像を記録する ドライブレコーダー(ビデオレコーダ)もどきを製作したので紹介してみたい。 主な使用部品は次のとおりだ。
2.製作概要 レコーダーの製作イメージを右図に示す。 2−1.外観・形状等
Webカメラは、本体のUSBコネクタに接続するだけとする。カメラの固定方法については、本件の検討対象外とする。 SDカードは、SDカードスロットに挿入するだけで良い。 電源は、+5Vをマイコン基板に供給するものとし、カラーグラフィック液晶モジュールやディスプレイコントローラ基板に 供給する+3.3Vは、マイコン基板上の電源レギュレータから取ることにし、特別な電源回路は作成しない。 自宅内でビデオレコーダーとして使用する場合には、+5VのACアダプタを接続し、ドライブレコーダーとして車の中で使う 場合には、シガーアダプターから電源を供給する。 シガーアダプターの出力電圧は、従来、BATT電圧の+12Vや+24Vが、そのまま出力されていたが、最近は、 スマホやタブレットの普及により、+5V2A程度の出力を持つシガーアダプタが容易に入手できるようになったのでこれを 用いることにする。 ケース上面の液晶ディスプレーの近くには、メニュー操作用のボタンを3つ配置する。液晶画面に表示された操作メニュー の項目を選択するアップキーとダウンキー、さらに選択を決定するためのセットキーの3つだ。 2−2.操作項目操作できる内容は、次の3つが必らず出来るようにする。
(1) 年月日、時刻の設定
(2) 撮影画像のSDカードへの書き込み
(3) SDカードの記録画像の再生
ビデオレコーダーと名乗る以上、撮影画像をSDに書き込む際には、書き込み中の画像を液晶画面に表示しながら行うのが 当り前であるが、実は、これがちょっと難しい。カメラからUSBインタフェースで30fpsで送られてくる動画像をSDに書き込みながら、 JPEGデコードを行い液晶に表示するのは、PIC32MXであってもまず無理だと思われる。 そこで、取り合えず、SDカードへの書き込み中は、液晶画面には、録画中のメッセージだけを出しておくこととし、カメラの取り付け方向を調整するための 確認画面として、メニュー表示画面の背景に、カメラからの画像(出来れば動画像)を表示するようにしてみようと考えた。 Webカメラ「C525」は、MJPEGの他にYUYVの出力も可能であり、YUYVの出力ならJPEGデコードは不要であり、なんとか液晶に 動画表示が出来ると思われる。 以上が、当初に考えた製作概要である。 3.液晶ディスプレーへの動画表示 3−1.C525の仕様確認 使用するWebカメラ「C525」では、YUYVの非圧縮フォーマットとMJPEGの圧縮フォーマットの2種類の出力フォーマットが選択できる。 YUYVの出力フォーマットでは、320x240のQVGAサイズは、5fpsであり、160x120のQQVGAサイズでは、15fpsとなっており、 これ以上の表示速度の出力はない。 一方、MJPEGの出力フォーマットでは、640x480のVGAも320x240のQVGAも、QQVGAも共に30fpsでの出力が可能である。 使用するカラーグラフィック液晶モジュールがQVGAサイズのものなので、MJPEGフォーマット、QVGA、30fpsで出力させるのが適当かと 思われるが、MJPEGフォーマットというのは、JPEGの画像を集めたものであり、カラーグラフィック液晶にリアルタイム表示するには、JPEG 画像を高速にデコードする必要がある。 クロック速度がギガオーダーのCPUを持つパソコンなら、JPEGの画像表示など一瞬に出来てしまうが、ことPICとなると、そう簡単に JPEGのデコードなど出来るものではない。 果たしてPICでは、JPEGのデコードを一体どの程度の速度で出来るものなのだろうか。 3−2.PICによるJPEGデコードPICによるJPEGデコードの動作を一度確認して見たいと思うのだが、手元には、JPEGデコードのプログラムがない。 自分で作るか、どこかから入手する必要がある。 色々とネットで検索をして見た所、参考となるソフトや開発記事が幾つか見つかったが、いずれもPICではメモリ不足で、そのまま使うには難しい。 更にネットを調べて見ると、組み込み向けのFATシステムとして、FatFsを公開されているChan氏が、これまた組み込み向けに 「tjpgd」という名前のJPEGデコーダを、既に開発、公開されており、それを有り難く拝借させて頂くことにした。 「tjpgd」の使用説明の中のインプリメントの指示に従い、画像データの入力部分と液晶ディスプレーへの出力部分の関数を作成し、 以前に「C525」から取得しておいたMJPEGのフレーム画像(JPEG)を使ってデコードのテストを行ってみた。 「C525」が出力するMJPEGの画像データには、DHTの情報が含まれておらず、またリスタートマーカーの仕様にややくせがあるようで、 「tjpgd」に少し手を入れる必要があったが、JPEG画像をうまくデコードすることが出来た。 PIC32MXを80MHzのクロックで動作させて、デコード時間を測定して見た所、おおむね、1フレームあたり300数十msecであった。 つまり、MJPEGフォーマットの出力を表示させるには、3fps程度がやっとということになる。 この結果から、SDの記録画像の再生処理では、この3fpsという再生速度に合わせて、適宜、再生するフレームを間引きするなどの工夫が必要となりそうだ。 3−3.YUYVフォーマットによる動画表示一方、YUYVフォーマットならJPEGデコードのような重い処理は不要であり、メニュー表示画面の背景に動画を表示できる可能性は高い。 そこで、QVGAの5fps、QQVGAの15fpsについて表示テストを行って見たところ、どちらも、問題なく液晶にコマ落ちすることなく表示することができた。 ただし、QVGAの5fpsでは、画面更新に、200msecを要するために、被写体の動きについていけないので、QQVGA、15fpsでの出力を使うことにした。 グラフィック液晶モジュールの解像度に合わせて、QQVGAの画像を4倍にスケールアップして表示したために表示画質が若干劣ることになったのは残念である。 4.製作・組み立て 製作イメージに沿って、マイコン基板やLCDコントローラ基板をベース基板の上に組み立て、本体ケースには、現物合わせで、タカチのプラケース 「SW−125S(70x40x125)」を採用し、製作を行った。 以下に、写真で示す。
5.プログラムの作成
プログラムは、Microchip社から無償で提供されるMPLABとC32コンパイラーを使って開発を行った。
Webカメラ「C525」は、UVCクラスのカメラであり、この制御には、既に作成したUVCクラスのドライバーを使った。 なお、カメラからの画像データの受信処理は、イソクロナス通信の完了割込み処理の中で行うように一部修正をしている。 SDカードへの動画像の記録については、類似基板の「SBDBT32」のサポートページに公開されている「UVCカメラ録画サンプルプログラム」を参考にさせて頂いた。 ディスプレイ液晶コントローラS1D13781評価基板を使ったTFTカラーグラフィック液晶モジュールへの画像表示は、既に開発済みのドライバーモジュールを使った。 このモジュールは、「UVCクラスのドライバー」の公開サンプルプログラムの中で紹介したものであるが、前回では、コントローラのS1D13781とPICとの インタフェースは、SPIを使用したが、今回は、より高速処理を目指して、パラレル接続によるインダイレクト8ビットモードで行った。PICの高速クロックが有効に活かせる結果となった。 JPEGのデコードには、先述したように「tjpegd」を使わせて頂いた。JPEGのデコードソフトをインプリメントしたので、お遊びの機能としてSDカードに あらかじめ保存されているJPEG画像をスライドショー表示するフォトフレーム機能を追加した。 プログラムの開発を進めて行きながら試行を重ね、SDへの書き込み中にも、JPEGデコードによる動画(3fpsと遅いが)を表示できるようにした。 本体で使う限りにおいては、録画時も再生時も同じような動画を見ることが出来ることとなった。 30fpsの動画再生を行う場合には、これもまた「SBDBT」のサポートページ で紹介されているWindows用プレイヤー「MJPEGPlayerForUVC.exe」を使えば、パソコン上で確認できる。 6.使い方
■ 起 動 本体に電源を接続すると、LCDに起動画面が表示される。続いて、カメラの接続や SDカードの挿入状況、カードの書き込みプロテクトの状況が調査され、カメラが未接続や、 SDカードが未挿入である時は、起動画面上に、「No Camera」や「No Card」などのエ ラーメッセージがブリンクで表示される。 ■ 機能選択メニューカメラを接続し、SDカードを挿入すると、エラー表示が消えて、起動画面には、以下の ような機能選択メニューが表示される。
" Video Monitor " " SD Record " " SD Play " " Photo Frame " 上記メニューは、「UP」、「DOWN」ボタンで選択し、「SET」ボタンを押して決定する。 メニュー表示の背景は、起動画面表示から、カメラのモニター表示に自動的に変わる。 これにより、カメラがどこを向いているかなどを知ることが出来る。 メニューの「Video Monitor」は、モニター表示を見やすくするためだけの機能で、 メニュー表示が消えるだけである。いずれかのボタンを押すと、メニューが再び表示される。 ビデオモニターは、カメラからYUYVフォーマット、QQVGA(160x120)、15fpsのデータを受信して 表示される。15fpsだから、ほぼスムースな動画となっているが、 QQVGAからQVGAへ拡大表示されている関係から画質は少しシャープさに欠ける。 ■ 時刻設定メニュー表示の画面上部には、日時が表示され、リアルタイムに時間表示が更新 されている。 この時刻設定を行うのが、「Set Date & Time」である。年の設定から、 月、日、時、分、秒、の順に、「SET」で項目を移動し、「UP」「DOWN」で値を 選択し、「SET」で確定する。秒の設定を終えると、機能選択のメニュー表示 に戻る。 ■ 録 画「SD Record」は、カメラからの画像をSDカードに記録するものである。 QVGAの320x240の画像が録画される。 QVGA,MJPEGフォーマット,30fpsで録画設定されているが、実力は、20〜25fps 程度の録画となる。 録画中は、約3fps程度の速度で、録画中の画像がLCD画面に表示される。 録画処理中に、いずれかのボタンを押すと、録画を一時停止して、「Pause」 状態になる。「SET」で再開、その他のボタンで録画停止し、機能選択 メニューに戻る。 録画データは、「CAPxxxxx.AVI」のファイル名で、SDカードのルートディレクトリに作成され、保存される。 拡張子が AVI となっているがファイルの中身は、カメラから取得した MJPEG のデータそのものであり、 ファイルのヘッダ一情報などが含まれていないので一般的な動画のプレーヤーソフトでは、再生出来ない。 パソコン上で再生するには、専用の「MJPEGPlayerForUVC.exe」を使用する。 ■ 再 生「SD Play」は、SDカードのルートディレクトリに作成された「CAPxxxxx.AVI」 ファイルを順次読み込んで動画像を再生するものである。 3fps程度の速度になるよう、フレームの間引き処理が行われる。 再生中に、「UP」ボタンを押すと、間引きするフレームが大きくなって早送り となり、「DOWN」ボタンを押すと、間引きするフレームが少なくなり、スロー再生 となる。 再生中に「SET」ボタンを押すと「Pause」になり、「SET」で再開、いずれかの ボタンを押すと再生処理を終了して、次のファイルの再生を行う。 最後のファイルまで表示し終わったら、機能選択メニューに戻る。 ■ フォトフレーム「Photo Frame」は、SDカードの中の「PHOTO」という名前のサブディレクトリの 中にある、IMGxxxxx.JPG という名前のJPEGファイルをスライド表示する。 メニューからこの機能を選択すると、スライドの表示時間を、10秒、30秒、 1分、3分、5分、10分から選ぶ選択メニューが表示される。表示したい時間を 「UP」、「DOWN」ボタンで選択し「SET」を押すと、スライドショーを開始する。 表示中に、「SET」を押すと、「Pause」状態になり、「SET」で再開、その他の ボタンで、スライドショーを終了する。表示中に「UP」を押すと、表示時間を待たずに 次の画像を表示する。 最後の画像ファイルを表示し終わったら、機能選択メニューに戻る。 |