今回は以前使用した超音波距離センサに不具合があることが判明していたので、その対策をします。不具合の内容は、測定対象物が近すぎるか遠すぎるとEchoからの出力がハイに固定されてしまうということです。不具合が発生した場合、電源を切って入れなおすしか対処方法はないので、不具合が発生したら電源を切り、起動しなおすように改造します。
注:不具合が修正された超音波距離センサが販売されるようになってきました
超音波距離センサの使い方や改造前の詳細は、以下を参照してください。
1.今回使用するPICについて
今回使用するPICは「PIC12F1822」です。
2.回路
2.1 電子回路図
2.2 電子回路の写真
2.3 回路説明
超音波距離センサで不具合が発生した際、超音波距離センサの電源を1度落とし、入れなおす回路を追加します。電源を入れなおすためには何かしらのスイッチが必要になります。そこで今回はP型FET(2SJ681)を使用します。
P型FETにロー信号を送信すると超音波距離センサに電源が供給されます。ハイ信号を送信すると超音波距離センサの電源は切断されます。そこで、PICは通常ロー信号を出力しておき、異常を検知した際、ハイ信号を出力し超音波距離センサの電源を落とします。その後、再びロー信号を出力して起動させます。
2.3.1 P型FET使用時の注意事項
今回使用するP型FET(2SJ681)の場合、0.8[V]以下をロー信号と認識して動作します。PICの場合、ロー信号は0.6[V]以下なので問題なく動作しました。しかしマイコンの種類によってはロー信号の電圧が高めの場合があるようです。例えばArduinoの場合、ロー信号は0.9[V]程度のようです。この場合、今回使用している2SJ681では動作しないと考えられます。(Arduinoはローを出力しているが、FETはハイと考えてしまい、通電しない)その場合、しきい値が高めのP型FETを選定し使用してください。動作確認はしていませんが、2SJ527L-EやIRFU9024NPBFあたりは使えそうだと思いますが、あくまで自己責任でお願いします。
2.3.1 使用するパーツ一覧
パーツ名 | 説明 | 使用数 |
---|---|---|
PIC12F1822 | PIC本体 | 1 |
超音波距離センサ(HC-SR04) | 超音波距離センサ(amazon:HC-SR04 ) | 1 |
Pch パワーMOS FET 2SJ681 | 超音波距離センサ再起動用 | 1 |
抵抗:1[kΩ] | 超音波距離センサ再起動用 | 1 |
抵抗:10[kΩ] | 超音波距離センサ再起動用 | 1 |
2.3.2 PICの配線
PICのピン | 接続 | 補足 |
---|---|---|
VDD | 電源 | 5[V] |
RA0 | シリアル通信(TxD:送信) | 7セグメントディスプレイへデータ転送 |
RA1 | -未使用- | |
RA2 | 超音波センサの電源制御用のFET | 超音波距離センサ再起動用 |
RA3 | -未使用- | |
RA4 | 超音波距離センサ(HC-SR04) | Echo Pulse Output(PICは入力) |
RA5 | 超音波距離センサ(HC-SR04) | Trigger Pulse Input(PICは出力) |
VSS | グランド |
3.プログラム
プログラムの基本的な部分は以下の記事を参考にしてください。
3.1 起動時の遅延追加
// 超音波センサの起動待ち __delay_ms( 100 );
以前作成したプログラムでは、起動時に動作を遅らせるための遅延処理は必要なかったのですが、FETを入れた場合、遅延がないと問題が発生しました。FETが入ったことで、超音波距離センサの起動が遅くなったのが原因だと考えられます。(PICからFETにロー信号出力、FET経由で超音波距離センサに電源供給、超音波距離センサ起動となるため時間がかかる)
そこで、超音波距離センサが起動するまで少し待つ(100[ms])ようにしました。
3.2 不具合認識方法
3.2.1 Echoで固定(今回ターゲットとする不具合)
// time_out 処理を追加 if( time_cnt > TIME_OUT2 ) { err_time_out_flg = true; break; } __delay_us( 100 ); time_cnt++;
超音波距離センサが不具合を起こすと、Echoからの出力がハイ信号に固定されます。そこで、Echoからの応答時(距離測定中)にハイ信号が一定時間(測定可能距離以上の時間)を超えた場合、異常が発生したと認識させます。
補足:PICのタイマ1のゲート機能を使用しているため、100[μs]のウェイトを使用していますが、測定距離の誤差は発生しません。
3.2.2 超音波距離センサ動作開始時のタイムアウト
// time_out 処理を追加 if( time_cnt > TIME_OUT1 ) { err_time_out_flg = true; break; } __delay_us( 100 ); time_cnt++;
ついでと言っては何ですが、前回のプログラムではタイムアウト処理を入れていなかったので、その追加もします。超音波距離センサを使用する際、初めにTrigにハイ信号を送信し、その後超音波距離センサのEhcoからハイ信号が出力されます。しかしそこで何かしらの問題が発生し、ハイ信号が来ないことを想定し、タイムアウトするようにしました。
3.3 超音波距離センサの再起動
// 超音波センサのリセット SONIC_RST = IO_ON; __delay_ms( 10 ); SONIC_RST = IO_OFF; __delay_ms( 990 );
超音波距離センサの異常を認識した場合、超音波距離センサの再起動を行います。PICはP型FET(2SJ681)に対してハイ信号を出力します。少し待ってからロー信号を出力して超音波距離センサを起動します。その後、超音波距離センサが起動するまで待ち、再び通常動作を行います。
3.7 ソースコード
プログラムの全文を掲載します。
<注意>
ファイル名は必要に応じて変更し利用してください。
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。
4.動作確認
超音波距離センサの不具合が発生し、Echoからの信号がハイに固定されると、7セグメントディスプレイに999が表示され再起動するようになっています。
動画では、スポンジを使用して不具合を再現しています。初めに対策なしです。超音波距離センサからの応答がハイに固定されてしまい、動作しなくなります。続いて対策版です。対策版では、7セグメントディスプレイに999が表示されその後再起動し、再び通常の動作を確認することができます。
撮影者(回路設計者)曰く、なかなか再現させるのが難しく、スポンジを使ってもうまくいかないことが多かったそうです。もし自分で確認したい場合、しっかりと再現方法を身に着けてから確認してください。
今回の超音波距離センサの不具合が有名になったせいか、超音波距離センサ(amazon:HC-SR04 )は現在安くなっています。今回の対応で何とか使用することは出来たので、使用してみてはいかがでしょうか。ただFETがそれなりの値段するので、合計すると安くないですが・・・。
不具合があるので、使えなかった方はこれを機に使用してみてはどうでしょうか。
<更新履歴>
日付 | 内容 |
2015年11月5日 | 新規作成 |
2016年10月7日 | フォーマット変更(内容の変更はなし) |