〒619-0237 京都府相楽郡精華町光台8丁目
TEL. 070-5263-2200
jun@kinet-tv.ne.jp
4チャネル超音波距離センサ制御プログラム仕様<スケッチ仕様>
■ スケッチ概略仕様
* 接続ピン
各チャネルと接続番号の関係<入力部>
PING チャネル番号 AVRピン名 AVRピン番号 PINGピン名
チャネル 0 D2 3 TRG 0
チャネル 0 D3 4 ECHO 0
チャネル 1 D4 5 TRG 1
チャネル 1 D5 6 ECHO 1
チャネル 2 D6 7 ECHO 2
チャネル 2 D7 8 TRG 2
チャネル 3 D8 14 TRG 3
チャネル 3 D9 15 ECHO 3
各チャネルと接続番号の関係<出力部>
DACピン名 AVRピン名 AVRピン番号
DAC0_nCS0 D14 23
DAC0_nCS1 D15 24
SCK D16 25
DI D17 26
nLOAD D18 27
チャネル 0、1 は、DAC0_nCS0 を「L」にしてアクセス。
チャネル 2、3 は、DAC0_nCS1 を「L」にしてアクセス。
チャネルに用意されているレジスタに、情報を転送する為、クロック(SCK)、データ(DI)、ロード(nLOAD)を利用します。
動作確認モニターLEDは、定番のD13(19)に接続しています。
* Loop 処理
120msごとに、イベントトリガーを受け取り、「計測」−「計算」−「電圧出力」を4回繰り返し。
■ スケッチ詳細仕様
* 割り込み
割り込みは、タイマー割り込みだけを使用。
MsTimer2 ライブラリを利用し、「120ms」ごとにトリガーフラグをセットすると同時にLEDを点滅させる。
割り込みハンドラは、関数 update_trigger が担当。
LED点灯消灯は、関数 send_led が担当。
* 計測
超音波距離センサにトリガーを与え、組み込み関数 pulseln で ECHO の時間長を測定。
チャネル間のインターバルは、「23ms」ほど、pulseln で「13ms」、測定後処理に「2ms」、他のチャネルのトリガーによる反射波の
影響を受けなくする為に「8ms」の間隔を開けています。
トリガー出力は、関数 send_trg が担当。
パラメータは、チャネル番号( 0−>3 )とした。
* 計算
エコー測定で、4チャネル分の時間を保存しておき、時間から距離に変換。
時間から距離への変換は、関数 convertv が担当。
物体までの距離が「400mm」のとき、「4000」とする。
「400」としないのは、浮動小数点計算による時間消費とDAC出力の数値変換誤差をすくなくするため。
* 電圧出力
ひとつ前の計測と異なると計算する。
距離から電圧への変換は、関数 calcx が担当。
関数 calcx は、距離を16ビット符号なし整数で入力し、計算結果を16ビット符号なし整数で出力する。
電圧出力は、関数 send_dac が担当。
関数 send_dac は、1つ前の距離と異なれば再計算して、4チャネル分の電圧を出力後、関数 send_dac_primitive
に情報転送を委託。
■ 関数仕様
* update_trigger
タイマー割り込み発生時の処理を記述。
入力パラメータ : なし
出力パラメータ : なし
イベントフラグをセット後、モニターLEDを点滅。
モニターLEDの点滅は、関数 send_led を利用。
イベントフラグには、eflag を利用。
出力パラメータを使えないので、eflag をグローバル変数で定義する。
モニターLEDの点滅は、カウンタ xcnt の最下位ビットの値を利用。
* send_led
モニターLEDの点滅制御。
入力パラメータ : 点灯、消灯指定の1ビット
出力パラメータ : なし
点灯、消灯の判定をし、Arduino のD13ピンに、1 か 0 を出力。
* send_trg
超音波距離センサの TRG のパルスを出力。
入力パラメータ : 超音波距離センサの番号( 0 ~ 3 )
出力パラメータ : なし
対応ピンに 1 を出力後、11μs後に 0 に戻す。
* get_duration
超音波距離センサのECHO パルスの時間長を計測。
入力パラメータ : 超音波距離センサの番号( 0 ~ 3 )
出力パラメータ : 時間長( 32ビット符号なし整数 )
対応ピンの H パルスの時間を計測。
Arduino の組み込み関数に pulseln を利用。
「13ms」でタイムアウトする。
タイムアウトまで、H パルスが到達しないとゼロとする。
* convertv
時間長を距離に換算
入力パラメータ : 時間長( 32ビット符号なし整数 )
出力パラメータ : 距離の10倍( 16ビット符号なし整数 )
デフォルトは、「4000」
時間長が 「2352.7μs」の時、「4000」になる様に計算。
入力が「0μs」より大きく、「2353μs」を下回る時に計算。
* calcx
距離を電圧に換算
入力パラメータ : 距離の10倍( 16ビット符号なし整数 )
出力パラメータ : 換算値( 16ビット符号なし整数 )
係数( 4096/5000 )を乗算
* send_dac
電圧値を出力
入力パラメータ : なし
出力パラメータ : なし
ひとつ前の測定値と異なれば、更新し距離を電圧換算値に変換。
距離電圧値換算は、関数 calcx を利用。
情報転送を転送後、電圧出力を指示。
* send_dac_primitive
DACに情報を転送。
入力パラメータ : DAC番号( 0 ~ 3 )
値1 ( 16ビット符号なし整数 )
値2 ( 16ビット符号なし整数 )
出力パラメータ : なし
DACは、デバイスに 2 レジスタを持つので、値1、値2で指定する。
2レジスタは、A,B となっているので値1はAレジスタに転送、値2はBレジスタに転送する。
仕様が決まった所で、PCに Arduino をインストールします。
解凍後、フォルダー内の arduino.exe を選択します。
Arduino の画面です。
ここまで準備が完了すれば、あとは仕様書に基づき「Arduino」プログラムを作成して行きます。
ここからは、次のページへ移動します。