簡易ドライブレコーダーの製作 PIC32MX695F512H 2013.7.16


    1.はじめに

     ランニングエレクトロニクスさんから縁あって、 PIC32MX695F512Hを搭載した試作基板「REPIC32SD」を譲って頂いた。 この基板は、同社から販売されている「SBDBT32」基板と似たような仕様の基板で、 クロック源の水晶や電源IC、SDカードスロット、USBのAコネクタが搭載されている他、「SBDBT32」とは違って、15ピン2列の外部接続端子が設けられている。 これにより、ICSPのプログラム端子やUART端子だけでなく複数のデジタルI/O端子を外部機器との接続に使うことが出来る。

     この基板を使って、Webカメラからの動画像をカラーグラフィック液晶に表示するとともに、SDカードに動画像を記録する ドライブレコーダー(ビデオレコーダ)もどきを製作したので紹介してみたい。

     主な使用部品は次のとおりだ。

        USBAコネクタとSDカードスロットを搭載した「REPIC32SD」試作基板。 搭載しているマイコンは、PIC32MX695F512H。「SBDBT32」基板と同じマイコンだ。 この基板は、15ピン2列の端子出しがしてある。ちょっとした電子工作に使えそうだ。
        EPSONのディスプレーコントローラー評価基板とTOPWAYのカラーグラフィック液晶モジュールを便利基板を使って接続する。 LogicoolのWebカメラ。結構画質が良いカメラだ。

    2.製作概要

     レコーダーの製作イメージを右図に示す。

    2−1.外観・形状等

     適当なケースに液晶ディスプレーやマイコン基板を収納し、レコーダー本体とする。本体側面には、電源コネクタと、 USBコネクタ、SDカードスロットの3つの穴を設ける。

     Webカメラは、本体のUSBコネクタに接続するだけとする。カメラの固定方法については、本件の検討対象外とする。 SDカードは、SDカードスロットに挿入するだけで良い。

     電源は、+5Vをマイコン基板に供給するものとし、カラーグラフィック液晶モジュールやディスプレイコントローラ基板に 供給する+3.3Vは、マイコン基板上の電源レギュレータから取ることにし、特別な電源回路は作成しない。

     自宅内でビデオレコーダーとして使用する場合には、+5VのACアダプタを接続し、ドライブレコーダーとして車の中で使う 場合には、シガーアダプターから電源を供給する。

     シガーアダプターの出力電圧は、従来、BATT電圧の+12Vや+24Vが、そのまま出力されていたが、最近は、 スマホやタブレットの普及により、+5V2A程度の出力を持つシガーアダプタが容易に入手できるようになったのでこれを 用いることにする。

     ケース上面の液晶ディスプレーの近くには、メニュー操作用のボタンを3つ配置する。液晶画面に表示された操作メニュー の項目を選択するアップキーとダウンキー、さらに選択を決定するためのセットキーの3つだ。

    2−2.操作項目

     操作できる内容は、次の3つが必らず出来るようにする。

    (1) 年月日、時刻の設定

       SDカードに記録する動画ファイルのタイムスタンプに使うためのものである。撮影した現在時刻を記録出来た方が良い のでこの機能を設ける。時刻設定のためのキー操作は、以前に作成したアラームクロックでの時刻設定と同じ操作方法とする。

    (2) 撮影画像のSDカードへの書き込み

       カメラからの動画像を、ひたすらSDカードへ書き込んで行く機能である。MJPEGフォーマット、VGA、30fpsの動画記録を目標とする。 一時停止や再開、強制停止が、ボタン操作で簡単に出来るようにする。

    (3) SDカードの記録画像の再生

       SDカードに記録した動画像は、パソコン上の再生ソフトで見ることを前提としているが、記録後、直ちに手元の液晶ディスプレーで 再生できた方が使い勝手がよい。ただし、記録されている動画は、MJPEGフォーマットであるため、JPEGのデコード機能が必要だ。


     ビデオレコーダーと名乗る以上、撮影画像を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)」を採用し、製作を行った。

     以下に、写真で示す。


    EPSONのディスプレーコントローラー評価基板に便利基板を搭載し、TOPWAYのカラーグラフィック液晶モジュールを接続する。 ユニバーサル基板で、マイコン基板とLCDコントローラ基板を接続するベース基板を作成した。
    上部の右の5ピンはPICkit3を接続する端子で、左の4ピンは、デバッグ用のUART端子だ。
    基板の表側には、タクトスィッチ3個を取り付けている。マイコン基板とLCDコントローラ基板との接続は、0.28mmの単心ケーブルで配線した。


    マイコン基板とLCDコントローラ基板をベース基板に組み込む。 グラフィック液晶モジュールは、ベース基板の表側にスペーサーを挟んで取り付けた。 横から見るとこんな感じだ。左がマイコン基板で右がLCDコントローラ基板。


    組み立て後の動作確認。電源投入直後の起動画面。 起動画面が1秒間表示された後、メニュー画面が表示される。背景には、カメラからの動画が表示される。 メニューを消して動画のみを表示している。


    タカチのプラスティックケース「SW-125S」を加工した。 液晶窓、操作ボタン穴、SDカード、USBコネクタ、電源コネクタの計7個の穴を開けた。
    ケースに組み込んで完成だ。


    秋葉原をうろついて見つけた+5V2A出力のシガーアダプタと、本作用途に正にぴったりな電源ケーブル。 電源コネクタに電源ケーブル(+5V)を接続。 SDカードは、出っ張ることもなくケースの中にうまく納めることが出来た。


    マイコン基板のUSBコネクタにWebカメラを接続。 このケースは、裏蓋が嵌め込み式となっており、ベース基板の4隅のビスを押さえつける構造にしたので、ケース底面に、ビス穴などは無い。 この後、長時間録画テストなど、プログラムの動作確認を行う。


    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カードを挿入すると、エラー表示が消えて、起動画面には、以下の ような機能選択メニューが表示される。

      " Set Date & Time "
      " 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」を押すと、表示時間を待たずに 次の画像を表示する。

     最後の画像ファイルを表示し終わったら、機能選択メニューに戻る。