SOARISTO工房 Logo

人体検知によるドラレコ電源制御回路の製作(3) - パリティビットを用いた誤り検出とリングバッファによる送受信

 前回の続きです。

 「3軸加速度センサモジュール」を用いた衝撃検出と、逆関数を用いたバッテリー電圧の推定ができたところで、いよいよ「ドップラーセンサモジュール」を用いた人体検知の本題に入ります。

K-band Doppler Module JRC NJR4265 J1

 以前に、超小型ドップラーセンサモジュール、「NJR4265 J1」(JRC(新日本無線)製)の動作確認をしましたが、この「NJR4265 J1」の通信方式は、以下のようになっています。

項 目仕 様
ボーレート9,600bps
データビット長8bit
パリティビット奇数
ストップビット1bit
ハンドシェイクなし

 なんと、ややこしいことに、「奇数パリティ」が採用されています。

 ここで、“ややこしい”と書いたのは、PIC(18Fシリーズ)のUSARTは、パリティビットも含めた9ビット通信に、ハード的には対応していますが、パリティビットの生成まではしてくれないため、自分で(ソフト的に)解決しなければならないためです。

注) 本回路で使用する「PIC18F26K22」には、2つの「EUSART」(Enhanced Universal Synchronous and Asynchronous Receiver-Transmitter)が搭載されていますが、ここでは「USART」と記します。

 具体的には、送信の際には、8ビットデータからパリティビットを生成し、9ビット目に付加します。受信の際には、8ビットデータからパリティビットを生成し、9ビット目と比較し、エラー処理(誤り検出)を行います。

 その前に、PICにおけるシリアル通信の復習をします。

Microchip PIC18F26K22 EUSART Parity Bit Generator

 上記に、PIC(18Fシリーズ)における、パリティビットの有効化と、書き込み/読み出しに関連する制御ビットをまとめます。

 パリティビットの生成(Parity Bit Generator)は、奇数パリティの場合には、バリティビットも含め、1が奇数になるよう調整し、偶数パリティの場合には、バリティビットも含め、1が偶数になるよう調整します。

 この、「バリティビットも含め」の部分が、ミソとなります。

 パリティを生成する関数(getParity())をインプリメントすると、上記のようになります。

 単純には、送受信データ(data)を、「1ビットずつ右シフトしながら、1の個数をカウントする方法」が思い付きますが、1バイトにつき8回もループしていたのでは、日が暮れてしまいますので、XORを使ったビット演算によって、パリティ(P)を求めています。(上記の場合は、奇数パリティ)

#ちょっとトリッキーかも。0xF9F8


(「usart-parity.h」)


(「usart-parity.c」)

 パリティビットを用いた一連のシリアル通信の関数をインプリメントすると、上記にようになります。
(Read()やWrite()、puts()など、基本的な関数は、「usart.h」にて定義されているものに準拠させてあります)

Asynchronous Receiver-Transmitter by using Ring-Buffer

 本プログラムでは、データの受信は、USARTの受信割り込みと連携させ、リングバッファを用いて効率的に読み込みができるよう、工夫してあります。

 以下、USART1から読み込む場合について、説明します。

 関数「setRecieveRingBufferUSART1()」は、割り込みルーチンから呼び出され、受信レジスタから1文字読み出し、リングバッファに書き込みます。その文字が、デリミタ(改行コード)であった場合には、1行分読み込まれたとし、フラグ「recieveRingFlag1」をセットします。

 メイン関数では、フラグ「recieveRingFlag1」がセットされていた場合には、関数「getsRecieveRingBufferUSART1()」により、リングバッファから作業バッファに1行分読み込み、内容に応じた各種処理を行います。
(リングバッファから1行分読み出すと、フラグ「recieveRingFlag1」はリセットされます)

 メイン関数では、作業バッファに1行分読み込まれるまでは、別の処理を行えるため、PICの少ない計算リソースを、有効に活用することができます。

Drive Recorder Control Circuit for DataSystem DVR3000

 このような感じで、リングバッファを用いて、ドップラーセンサモジュールとシリアル通信ができました。

 デバッグ用に、USART2をPCに接続していますが、最終的には、2つのドップラーセンサモジュールを、USART1(フロント左用)とUSART2(フロント右用)に接続します。

K-band Doppler Module JRC NJR4265 J1

 本回路では、ドップラーセンサの感度(検知距離)を、ロータリースイッチにより、10段階(OFFと、1m刻みで2mから10mまで)に設定可能としています。

 また、ドアのロック信号(LOCK)とアンロック信号(UNLOCK)とを監視し、ドアが施錠されると、人感センサと衝撃センサが動作し、ドアが解錠されると、センサが停止します。
(センサ停止中は、スリープモードに遷移させ、低消費電力状態としています)

 さらに、アクセサリー電源(ACC)を監視し、駐車中に何らかの異常を検知した場合には、イグニッションキーを挿入した際に、音(圧電サウンダ)と光(赤色LED)とにより、確実に知らせてくれるようにしています。

#まさに、DataSystemの「センサースイッチコントローラー」(SWC295Ⅱ)では十分でなかった部分を、強化してみました。0xF9F8

(つづく)

Trackback(0)

Trackback URL: https://www.soaristo.org/mt/mt-tb.cgi/1148

Post Comment