ラベル 超音波測距センサー の投稿を表示しています。 すべての投稿を表示
ラベル 超音波測距センサー の投稿を表示しています。 すべての投稿を表示

2025年4月16日水曜日

出入り検知器をPCB化する(その24)・超音波測距4

 前回まで超音波測距センサーを3個使う3チャネルの測距モジュールを作り、使い勝手を良くするためにトレーニング機能を追加した。さらにトレーニングを起動するためにプッシュボタンを追加した。その成果を踏まえ今回新たに超音波測距センサーを5個まで使える5チャネルのモジュールを作った。というのは超音波センサーの半値幅が30度なので3個でカバーできる範囲は90度にしかならたいため、これをもっと広範囲まで拡張したかったからである。超音波測距センサーを5個使うことで150度までカバーできる。3チャネルモジュールのPICには14ピンの18326を使ったが5チャンネルでは信号線(足の数)が足りないため20ピンの18346を使った。

ソフトは3チャネル用の物を少し改造した。トレーニング時にセンサーの付いていないチャネルを検知してOFFにするようにした。

US Ranging346-2.036.48
Copyright(C) 2025 myname.
*** Start Training.
+++ Trained Max Range(raw) -  A:167 B:500 C:41 D:500 E:119
*** US Sensing parameters:
  Ch-A: ON : 010 - 162
  Ch-B: OFF
  Ch-C: ON : 010 - 036
  Ch-D: OFF
  Ch-E: ON : 010 - 114
  MODE = Range Data with Zero Suppress.
_00,--,34,--,00
_00,--,31,--,00
_00,--,30,--,00
_00,--,29,--,00
_00,--,30,--,00
_00,--,29,--,00
_00,--,29,--,00
_00,--,30,--,00
_00,--,30,--,00
_00,--,33,--,00
_00,--,00,--,00
 

ここで1文字目の'_'は表示モード、またOFFのチャネルの測定結果は'--'で、範囲外のデータは'00'で表示している。このモードでは対象物がある時だけ表示する(反射が無くなると反射ゼロを1回だけ表示)。

表示モードにはこのほか、生データ表示モード、

#00b2:0000:0063:0000:001f
#00b2:0000:0063:0000:0021
#00b2:0000:0063:0000:0022
#00b2:0000:0064:0000:001f

連続データ(1秒に2回程度)表示モード、

>00,--,00,--,00
>00,--,00,--,00
>00,--,31,--,00
>00,--,31,--,00
>00,--,28,--,00

最も近い反射物のデータを表示するモード、

=C13
=C15
=E16
=E13
=E12

等が可能で、目的別に使い分けできる。

このほか記号'!'を送ると(改行不要)直ぐにIDを返すようにしている。

$$$346.2036+-+-+

これはホストからの生存確認を簡単にするためであり、最初の3文字で'!'に対するレスポンス'$$$'を、その後バージョン、超音波センサーの稼働状態を表している。

 今後、対象物の大まかな移動ベクトルを算出する事も考えている。

(続く)

 

 

2025年2月27日木曜日

出入り検知器をPCB化する(その23)・超音波測距3

 インテグレーションを目指して実際に超音波測距センサーを使ってみると、特に室内では反射物が多く場所を少し変えるごとに状況が変わり閾値の設定がものすごく面倒で、容易に置き場所や周囲の状況を変更できない。そこで新たにトレーニング・モードを設けた。立ち上げ時に周囲を何回かスキャンし、各方向のセンサー毎にエコーの最近値からマージン(とりあえず5cm)を引いて閾値(最大探知距離)として自動的に設定する。

*** Start Training.
*** Trained Max Range R:178 F:98 L:50
  US Sensing parameters:
        Mode = Range Data with Zero Suppress.
        Ch-R: ON : 010 - 173
        Ch-F: ON : 010 - 093
        Ch-L: ON : 010 - 045

この効果は絶大で、何処でも簡単に設置でき、トレーニングが終われば人などが前を通過したときちゃんと反応する。 

_10,0,0
_10,20,0
_0,20,0
_0,20,0
_0,23,0
_0,0,21
_0,0,23
_0,0,0
 

エコーが無くなった事を表すため最後には 0,0,0 を出力させている。

さらに状況が変化した時はいつでも再度トレーニングを実行できるようボタンを追加した。

これでいつでも再トレーニングできるようになり、室内でも使い勝手が随分良くなった。

超音波センサーモジュール込みの消費電流を測ってみたが、電源電圧5Vで約7mA、3.3Vで5mAであった。

 (続く)

 

2025年1月13日月曜日

出入り検知器をPCB化する(その21)・超音波測距2

 年末年始で手を付けていなかった超音波測距だが、ソフトを作って実際に動かしてみた。PICは14ピンのPIC16F18326を使った。


Timer1に入力するクロック(LFINTOSC=31KHz)をプリスケーラで2分周する事で、計測値1カウント当たり1.1cmの測距距離とした。これで1カウント当たりほぼ1cmと考える事ができる。音波の反射や回り込みによる相互干渉を避けるため Right, Front, Left の3つのセンサーを(同時でなく)100ms毎に順番に起動し測距する。これを連続で行うと3回/秒程度の頻度の測定になる。次図で上のトレースは右(R)のセンサーのトリガーであり、100msずつ遅れて起動する他のセンサーのトリガーは見えていない。下のトレースはTimer1のゲート信号で、順に3つのセンサー(R,F,L)のエコーに対応している。
各エコーのパルス幅が測距距離に対応しており、毛布で覆ってエコーが無いと思われる場合は次のような波形になった。

中央の幅広のパルスを生成しているセンサーがUS-015であり、それ以外はHC-SR04である。それぞれUS-015で75ms、HC-SR04で50ms程度あり最大探知距離相当時間の2倍以上は確保されている。

 測定結果はシリアルインターフェイスを通じてホストへ送信する。

測定したデータの処理には次の3つのモードを設けた。

  1. 生データ表示モード
  2. 測定結果表示モード
  3. 最接近表示モード

1.生データ表示モードはデバッグ用で、測定した3方向の生データを16進表示する。

#0049:0021:001e
#0049:0022:001f
#0049:0022:001f
#0049:0021:001e
#004a:0023:001e

2.測定結果表示モードでは測定した3方向のデータを10進表示するが、この時測定したい距離の閾値(最大距離、最小距離)を適用し、その範囲外のデータは0とする。これは近くにある固定された反射物を避けるとともに、とくに最大探知距離より大きな値(無エコー、誤データ)を排除する為である。

> R:144 F:63 L:32
> R:144 F:63 L:31
> R:73 F:33 L:31
> R:73 F:34 L:32
> R:73 F:32 L:31
> R:144 F:64 L:32
> R:144 F:63 L:31

3.最接近表示モードでは、3方向のうち最も距離の近い対象までの向きとデータ(≒距離)を表示する。3方向とも範囲内に対象物が検知されなかった場合は何も表示しない。

=L23
=L30
=F51
=F53
=F48
=F52
=R71
=R71

基板上の3つのLEDは夫々のセンサーが対象範囲(閾値)内にエコーを捉えていると点灯する。 

3つのセンサーのデータをAI(機械学習)で学習すれば前を通る人の動きを認識出来るかも知れないが、今回はそこまでやらない。

このセンサーユニットを、これまで作った回路と組み合わせることで纏まった動作をさせるよう今後インテグレーションしたい。


(続く)

 

 

2024年12月25日水曜日

出入り検知器をPCB化する(その21)・超音波測距1

 出入り検知器は元々20cm離れた2本の赤外線を人が横切る事を検知するよう考えていた。これは狭いゲートを通過する人を検知するような使い方を前提としていた。一方、目前の歩道を通り過ぎるような人の動きを検知して働くような機能の方がより汎用的に使えるだろうと、そのようなセンシングを考える事とした。

このような動きを捉えるには画像認識以外には次のような幾つかの方法が考えられる。それぞれ対象物との絶対的な距離を測れるものと、距離の変化を捉えるものがある。

  1. 焦電センサー
  2. 赤外測距センサー
  3. 超音波測距センサー
  4. ミリ波センサー 

これらのうち秋月で入手が容易な(比較的安価な)センサーについて特性を調べた。1.焦電センサーは人体から放射される赤外線を捉え、その量の変化が閾値を超えた場合に反応するが屋外では太陽光やその反射光、風が吹いても反応する事があり屋外での特に昼間の利用には不向きである。2.は自ら赤外線を発射し、その反射光を受信するまでの時間から対象物迄の距離を測定する。その例として秋月で売っているVL53L0X使用 レーザー測距モジュールを買ってみた。これは Arduino ではライブラリが使えるようだがモジュール自体の仕様は公開されておらずPICからは容易に使えないので今回は扱わない。3.は超音波を使って2と同様な事を行う。4.はミリ波を使って同様な事を行う。最近は車の人感センサーに応用され比較的入手が容易である。ただ電波法で規制されるため認証されたものを使う必要がある。秋月で売っている手頃なものはドップラー効果を応用しているのか人が近づいたり離れたりする動きのみ取り出せるので焦電センサーと変わりない。


取り合えず安価で最も使い易そうな超音波センサーを使ってみる事とした。秋月では手頃な値段のUS-015とHC-SR04という見かけの似た2つの超音波センサーモジュールを販売している。

値段もあまり違わない。インターフェイスも同じGPIOで4ピンの信号割り当ても同じ。但し(マニュアルは中国語で分かり辛いが)HC-SR04はジャンパーを切り替える事でGPIO(PWM)のほかI2CまたはUARTインターフェイスを選ぶ事が出来るようである。汎用性を考え、とりあえずGPIOインターフェイスで使ってみる事にした。次図はGPIOのタイミングチャートである。


GPIOでは Trig端子に10μsのパルスを加えることで測距がスタートする。先ず40KHzの超音波パルスが8回発射され、それが対象物で反射されて帰ってきたエコーを受けてEcho端子に往復時間に対応する時間幅のパルスが出力される。もしエコーが検知されなかった場合は80msのパルスが出力されるとUS-015のマニュアルにあるが、HC-SR04にはそれに相当する記述はない(実際に測定したところでは50ms強であった)。Trig端子に与えるパルスの繰り返し周期は仕様上はUS-015で85ms程度、HC-SR04では200ms以上必要である。

音速を340m/sとし、最大測距距離4mとして試算すると往復時間(Echo端子への出力パルス幅)は23.5msである。厳密には大気中の音速の温度勾配が0.6m/s/T程度あるようであるが、今回の目的には補正は必要ないだろう。もし補正したいならPICに内蔵の温度センサーを使うと簡易な補正はできる。

測定にPIC16F18326を使う場合、カウンタをゲート制御できるTimer1を使うのが適当である。Echo端子の信号をカウンタのゲートに加える。カウンタに加えるクロックにLFINTOSC(31KHz)を使うと距離を(理論的には)約1.1cm単位で測定する事が出来る(往復だと0.55cm)。また無エコー時の80msパルスのカウント値は24,80カウントでありTimer1の16ビットの範囲に収まる。

・・・てな事を考えながら回路を考え基板を発注した(この回路では将来の拡張を考えてPIC16F18346を使っている)。


この基板では3方向の超音波センサーを使う事を想定している。センサーの指向性は±15度なので各センサーは角度の30度離して取り付けるのが良いと思われるが3つ併せても探知範囲は90度しかない。広い範囲を見るためにあと2個追加して探知範囲を150度としたいものである。

(続く)