![]()
安い超音波センサと8ピンPICで、距離(長さ)を喋ってくれるメジャーを作ってみました。
喋る仕掛けは、8ピンPICで作る喋る時計と同じで音声再生のDA変換にPWMを使用してます。しかしこれが超音波センサと干渉して正しい測定ができなかったので、測定時にはPWMを止めるようにしたら、PWM開始/停止時にプツッという音がでてイマイチでした。この対策ができたので、ケースに入れてみました。
![]()
超音波センサ HC-SR04
写真上が秋月で購入したもの、下はAmazonで購入したもの。
秋月のものは、注意としてECHO出力がHighにロックすることがある、となっていた。対策は電源オフとのこと。
ネットで調べたら基板の穴が四隅にある(旧い?)タイプは大丈夫らしいとのことでAmazonで購入してみた。送料込み\220と超安価だったので届くか心配だったが10日ほどで届いた。
![]()
超音波センサ
センサ基板の裏側、上が秋月、下がAmazonで購入したもの。
![]()
回路図
8ピンPICで作る喋る時計と同じ8ピンのPIC12F615を使用する(回路図拡大図)。超音波センサからの距離情報はECHO出力のパルス幅で判るため、Timer1をT1Gでゲートしてパルス幅の時間を測定する。
ECHOパルスのモニタ用にLEDが光るようにして、ECHOパルスがHighにロックするか確認してみたが、秋月版/Amazon版共に大丈夫のようだった。ケースに収めるときにLEDは省略しました。
プログラム(距離測定)
パルス幅のカウントにはTimer1を使用し、超音波センサのECHO出力でT1Gゲートをオンする。測定したカウント数から超音波の往復時間が判るので片道の1/2にして、音速340m/sを掛けて、距離を求める。
PICのクロックは8MHz、Timer1プリスケーラを1:2にしたので、Timer1は1usで1カウントとなる。
距離cm = Timer1(us) / 2 x 34,000cm / 1,000,000us = Timer1 x 17 / 1,000 ≒ Timer1 x 35 / 2,0481,000で割るのは面倒なので、35倍して2,048で割る(11bit右シフト)。35/2048=0.01709なので誤差は0.5%程度。
ECHOのHighロック対策として、長時間ECHOがLowにならない場合には、Timer0での割り込みでECHOのLow待ちを抜けるようにした。32.8msで割り込みが入るので、距離にすると約5.5m分。センサは4m程度しか測定できないので、5.5mのリミッタで十分。
プログラム(音声発声)
8ピンPICで作る喋る時計と同じ仕掛けで、wav音声をPWMでDA変換する。
距離はcm(センチメートル)で算出し、BCD変換で3桁の数字にする。それぞれの位毎に音声発声していく。 例えば、123cmは、[1メートル]、[20]、[3センチ]の3つの音声を順に発声する。
20cmなどキリのよい数字は、[20]、[センチ]の2つの組み合わせとしていたが、イントネーションがおかしいので、[にじゅっせんち]1つの音声にした。フレーズが多くなり、1Mbitに収まらなかったので発声速度を上げている。
下記の音声テキストファイルをsoftalkで発声させ、音声WAVを8ビットモノラルに変換して、自作プログラムwavchopでフレーズ毎のwavに切ってindexを作る。
・発声した音声のテキストファイル
・wavchopで作ったEEPROM書き込み用バイナリファイル
当初、PWMの周波数が超音波センサと干渉して正しい測定ができなかったので、測定時にはPWMを止めるようにしたら、PWM開始/停止時にプツッという音がでてイマイチ。
プツッという音を消すために、音声再生の開始/停止時のPWMの幅をフェイドイン/フェイドアウトするようにしたら何とか収まった。
プログラムソース・HEX
・アセンブラソースコード、 HEXコード
バグがあるかもしれません、無保証です。著作権は留保しますが、改変などご自由にどうぞ。
![]()
EEPROM
音声データはPICKIT2で書き込み。
![]()
ブレッドボード
ブレッドボードでテスト。
![]()
内蔵発振の精度確認
モニタ用LEDを繋いだGP1ポートをON/OFFして周波数を測定してみた。内蔵発振8MHzで500KHzが理論値なので、0.5%程度速い。このためパルス幅(距離)を長く認識する。前述のパルス時間から距離に換算するときにも0.5%大きくなるので、両方で1%位距離を長く認識する。
それよりも気温による音の速度の変化のほうが大きい。
周波数カウンタは自作のコレ。
![]()
ケース
ケースはタカチのLCS型シリコンカバー付きハンドタイプケース【LCS135-9V-WG】にした。今回、ケースが一番高価な部品。
レイアウトを考え、ユニバーサル基板をカットする。基板中央の穴にはプッシュスイッチが収まる。
![]()
ケース加工
スピーカ用に小さな穴を開けるために、方眼紙にレイアウトし、ケガキで穴の位置を写し取る。
穴はφ2.5mm、8mm間隔。
![]()
ケース加工
スイッチ穴、スピーカ穴が開いたところ。
![]()
スピーカ
スピーカはブレッドボードでの試験時とは別の小型(直径5mm)のもの。
ホットボンドで取り付けた。
![]()
組み立て
超音波センサを付けた基板を取り付け、電源、スイッチの配線を行う。
![]()
バッテリー収納部
006P電池はケース裏側に収める。
![]()
前景
超音波センサのための大きな穴を開けるのに少し苦労した。φ10mmのドリルで開けたあと、リーマで少しづつ大きくしたが、素材が柔らかいので力加減で穴の位置がずれていってしまう。
予定より大きめの穴となったが、まあよしとする。
![]()
完成
ネームランドでラベルを貼り付け、シリコンカバーをつけて完成。
![]()
完成
シリコンカバーの側面短辺の一箇所は、写真のように切り取られているので丁度良い。
![]()
使い方
プッシュスイッチが電源スイッチなので、押し続けると距離を喋ってくれる。
(課題?)ケースに入れたためか、電源を3端子レギュレータにした(ブレッドボード時はUSB 5V)ためか、電源投入時の最初の測定が正しくない(5センチとか8センチになる)ことが起こる。常に起きるわけではないのでノイズか電源周りか?
動画
ブレッドボード版の動画