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度としたいものである。

(続く)

 

2024年12月21日土曜日

出入り検知器をPCB化する(その20)サーボ・モータを動かす8

 サーボ・コントローラを語るうえで大事な事を忘れていた。

そもそもサーボモータの制御信号(PWM)には統一規格はあるのか、 それはTowerPro社のSG-90と同じで良いのか、或いはどんなものがあるのか、という点である。こういったサーボモータはラジコンで使われているようなので規格は統一されていそうなものである。実際にカタログには制御信号はPWMとだけ書いてある場合も多く、あたかも統一されているようである。そこで秋月で入手できるもの(360度回転の物を除く)を中心に市販品を調べてみた。全てを調べ切った訳ではないが、概要は次の通り。

  1.  TowerPro - このメーカーのサーボモータの制御信号(PWM)のパルス幅は180°回転の場合500μs~2400μsでセンターは1450μsである。
  2.  FEETECH - このメーカーのサーボモータの制御信号は180°回転の場合500μs~2500μsでセンターは1500μsである。回転角が120°の製品もあるがセンターのパルス幅は同じく1500μsである。またシリアルインターフェイス(1Mbps)のものも販売されているようだ。
  3.  GWS - このメーカーのサーボモータの制御信号は180°回転の場合800μs~2200μsでセンターは1500μsであり、120°回転の場合900μs~2100μsでセンターは同じく1500μsである。
  4. SAVOX - 製品の数が少ないが、回転角が164°のものの制御信号は800μs~2200μsでセンターは1500μsである。

 これらの値をもとに回転角1度当たりのパルス幅変化量を計算すると11μs前後の製品が多いが、中には6.7μsの製品もあった。

これらのメーカのパルス周期はいずれも20ms(50Hz)である。一方Amazonで売っている高トルクのサーボでは高パルス周期(50Hz~333Hz~800Hz)のものもあるようだ。ただ800Hzのパルスを出すとすればパルス幅はせいぜい1ms(1000μs)程度なので、これを使うつもりなら仕様を具体的に検討してみる必要がある。

さて、制御信号の時間的な仕様が分かったので今回作ったサーボ・コントローラで実際にこれが動くのか電気的特性を試してみた。テストに使ったのでは TowerPro の MG996Rである。

このサーボを選んだのはトルクが11Kg/cmもあるので(SG-90は1.8Kg/cm)大喰らいであり、その分だけ制御信号にもある程度パワーが必要かもしれないと考えたからである。つまり(データシートに明示されていない)サーボモータの制御信号の入力インピーダンスや閾値がPICで駆動できる範囲にあるかという事である。

結論から言うと問題なく動いた。最初は電源の電流を500mAに制限して動かしてみたらサーボはかすかに唸るが全く動いてくれなかった、そこで制限を1.5Aくらいに上げると普通に動いた。無負荷のSG-90なら100mAでも動くがMG996Rは無負荷でも1Aは必要である。仕様上は無負荷の電流は170mAとなっているが実際には突入電流が大きく最大電流1400mAの電源を用意しておく必要があるのだろう。やはり大喰らいである。

 以上の事から少なくともTowerPro社のサーボはPICで駆動できる事、またサーボ・コントローラで様々なサーボモータに対応させるためには少なくともPWMの細かい設定が必要な事が分かった(TowerPro社以外のサーボについては機会があれば試したい)。サーボモータを使う側から見ると、制御信号の統一規格は無く、使うサーボモータの仕様に合わせて制御信号のパラメータを変える必要があるという事である。

幸いこの程度の事ならプログラムの簡単な変更で済むのでサーボの仕様に合わせてパラメータを切り替えられようにする予定である。

 (続く)


2024年12月2日月曜日

出入り検知器をPCB化する(その19)サーボ・モータを動かす7

 サーボモータに与えている制御信号を測定してみると、周期が1%ほど短い。また一定している筈の制御パルスの幅にも若干の揺らぎが見られる。これらの原因を考えると、周期の元となっているLFINTOSCの周波数が若干ずれている事と、LFINTOSCとパルス幅を決める元となっているFosc/4(=HFINTOSC/8)の周波数の間に一種の唸り(エイリアシング)が発生して揺らぎが発生しているようだ。

このPICではLFINTOSCの周波数は固定で補正できないが、HFINTOSCのそれは±1%以上補正できるので LFINTOSCの使用を止め、ソースをHFINTOSCに一本化する事で唸りを防ぐ事とした。幸いFosc/4の2MHzから100Hzを取り出す事はこれまで通りTMR0で分周する事で可能だ。結局、次の回路に落ち着いた。また周波数の補正パラメータの値(OSCTUNE)はPIC内部のEEPROMに書き込み保存されるようにした。


これで、この回路を1つの周波数源で駆動する事となり、動作が安定するだろう。また周波数を補正する事でパルス周期をほぼ20msに追い込むことが出来たが発信器には温度特性(次図)もあるのでどこかで妥協が必要である。

電圧依存性は少ないようである。

サーボ・コントローラについては一先ずこれで終わりたい。

(続く)