2025年2月27日木曜日

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

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

*** Start Training.
*** Trained Max Range R:176 F:89 L:52

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

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

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

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

 (続く)

 

2025年2月25日火曜日

モニタースピーカ(MS101 II)の修理

 小型の外部スピーカが必要になったのでアンプ内蔵のスピーカをヤフオクやメルカリで検索するとヤマハのMS101シリーズの出品が多く、人気商品のようだ。新品の市場価格は\20K前後するようであるが、\2K以下で欲しい。そこで格安の物を探すとジャンク扱いの故障品が時々出品される。目標を定め値下げ交渉+初回限定クーポンを利用して MS101 II を\1Kで入手した。

受け取ってテストすると、電源ランプは点灯するが音は全く出ない。耳を近づけても何にも音がしない。何が死んでるんだ?電源?スピーカ?とYouTubeの修理動画を参考に分解し、スピーカーの抵抗を測ると導通は無く、ボイスコイルが切れているようだ。代わりに手持ちのスピーカを接続すると音はちゃんと出る。回路の方は動いているようだ。

YouTubeで見つけた修理動画もボイスコイルが切れていた。このタイプの持病なんだろうか。アンプの出力にスピーカーが負けているのだろう。音楽のモニターだと目一杯ボリュームを上げて鳴らし続ける事もありそうだしスピーカの負荷は高そうだ。

とりあえずスピーカーの交換が必要だ。 外形的には秋月で売ってる10cmのスピーカがぴったりだった。コーンの形もそっくりだ。だた、オリジナルのスピーカ(JA1061)のインピーダンスが4Ωなのに対し秋月のは8Ωだ。これが音にどういう影響を与えるかは分からない。(加わる電圧が同じなら電流が半分なると)単純に考えて音量が半分になるのか。音のヤマハ製だから4Ωに最適化した設計になっていると思うので8Ωだと特性が変わるかもしれない。秋月で600円のスピーカを入手し交換して修理は終わった。元の MS101 II の音を知らないのでどの程度音が変化したかは分からないが私の目的には全く影響はない。

改めてオークションを覗くと、電源が入る事は確認したが動作は未確認という商品説明の安目の出品が多い。きっとこのタイプの故障をしているのだろうと推測する。

調子に乗って捨て値で出品されていたヤマハのKS10というモニタースピーカ(キーボードスピーカト言うらしい)にも手を出した。

こちらは動作品ということで、音を出してみると確かに音は出るが、少しこもった感じの音で、あまり好きになれない。構造はMS101がバスレフ型なのに対しKS10は密閉型であり、KS10は低音が弱いはずだが逆に高音が伸びてないのが気になる。発売から40年ほど経過しているのでへたりが出ているのかもしれない。中を開けてみると電解コンデンサが10個ほど使われているので交換してみよう。

 


 

2025年2月21日金曜日

AsIO.sysを退治

 最近Win11の更新後に出始めた「ドライバーを読み込めません」という警告。

これをネットで検索し、対応を試みるも要領を得ない。どうもASUSのマザーボードに添付のユーティリティ(Al Suite 3)の一部のファイル(ドライバー)が問題になっているようだ。しかしこのユーティリティをアンインストールしても立ち上げ時の警告は無くならず駄目。しかし害も無さそうなので暫く放っておいた。最近、Win11の月例更新毎にセキュリティが厳しくなっていくような気がする。10年以上前のメールがある日掘り起こされて引っかかった事もある。

こういう警告が出るのはWindows立ち上げ時にAsIO.sysを読み込むような指示がリソースの何処か、あるいはその先に書かれているからである。本日思い立ってリソースエディタでAsIO.sysを検索した。その結果・・・。

つまり、Wn11から嫌われているのは、

C:\Windows\SysWOW64\Drivers\AsIO.sys

というファイルだ。最初はこのファイルが無いのでエラーになったかと思った。その場合はリソースからこの指示を削除する事になる。しかし実際にはこのファイルは存在し、それがブラックリストに載っているためエラーとなったようだ。そこでこのファイルを削除し、その結果警告は出なくなった(ついでに隣にあったAsUpIO.sysも削除した)。

本当は手動でリソースも削除すべきだと思うが下手に弄ってシステムにダメージを与えたくないので、それは別の機会に考えることとした。

ソフトをアンインストールすると対応するリソースも削除されると思っていたが、実際にはリソースは残っているようだ。或いはアンインストールの途中で何らかのエラーが起き、削除されなかったのかもしれない。

このPCのC:ドライブは何世代にも渡ってクローニング&Windowsをアップグレードしているのでリソースにはゴミがたくさん溜まっているはずだ。そのうちWindowsをクリーンインストールしてスッキリさせたい。

余談だが、以前はリソースエディタはDOS窓(コマンドプロンプト)を立ち上げてコマンドを打ち込むか自分でショートカットを作らないと起動できなかったが、いつの間にかアイコンがスタートメニューのWindowsツールの中に組み入れられれている。 ユーザに開放したのだろうか?

 

2025年2月12日水曜日

出入り検知器をPCB化する(その22) インテグレーション1

 インテグレーションの最初のステップとして、新しいサーボ・コントローラ基板を発注した。これはトルクの大きいサーボに電流を流せるよう部品を見直したのと、基板ごとに違っていた電源電圧を1つの電源から供給できるように統一する為である。おまけで、前に作った2チャンネルのコントローラを3チャネルに増やし、操作方法を少し変更している。

3チャネル化に当たってPIC内のペリフェラルの使い方を少し変更した。

これまでの2チャンネルでは周期20msのパルスを10msずらして発生させていたが、これを5msずらし3チャネル目を挟み込みたい。そのためには100Hzの方形波が必要だがTMR0が方形波を出力できないため、最終段で2分周して方形波を出力出来るNCO1に変更した。但しNCO1からCLCへは直接のルートが無く信号を渡せないため、間にDSMを挟んで渡してる。この方式では4チャネルまで対応できるが残念な事にPIC内には4チャネル迄拡張するためのTMR1&CCPリソースが無い。

基板を発注した時期がたまたま春節の休暇に被ったため予想以上に時間がかかって、通常だと1週間程度で届くはずが2週間ほどかかった。基板が届いて早速組み立てた。

基板上にはACアダプタ用電源コネクタ、分岐用2P電源コネクタ、サーボモータ用コネクタ×3、ホスト接続用コネクタ、電源SW、ロータリーSW、プッシュSW、レバーSW、赤色LED、緑色LED×3等を搭載している。3つの緑色LEDはそのチャネルのサーボが動作中に点灯する。

幾つかのバグ取りを経て5msずれたパルスを出力することが出来た。なおこのパルスを与えるとサーボの消費電流が増えるので、サーボが目標点に到達した約1秒後にパルスを止めるようにしている。

このコントローラはリモート制御で使う事が前提であるが、ローカルテストのため基板上のスイッチでも操作できる。基板上のChSelスイッチを押す毎にCh1、Ch2、Ch3、ChAll、ChOffと移行する。このとき選択されたチャネルのLEDが点灯しロータリースイッチで回転速度を、レバースイッチで動きを制御できる。サーボが動作中にはLEDは点滅する。ChOff、或いは無操作で数秒経過するとリモート状態に戻る。ローカルテストで設定した回転速度はリモート制御には反映されない。別の言い方をすれば、リモート制御の回転速度はローカルテスト後も維持される。

(続く)


 

 

 

 

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

(続く)

 

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社以外のサーボについては機会があれば試したい)。サーボモータを使う側から見ると、制御信号の統一規格は無く、使うサーボモータの仕様に合わせて制御信号のパラメータを変える必要があるという事である。

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

 (続く)