全体表示

[ リスト | 詳細 ]

記事検索
検索

全41ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]

チャタリング除去回路

マウスのチャタリングで思い出したのですが、
以前開発に関わっていた機器でチャタリングへの対処を行なったことがあります。

その機器にはボールネジをステッピングモータで回転させて高精度に位置決めを行う
X-Y-Z軸のステージで、X軸にはリニアエンコーダが取り付けられていてあり、
移動量に応じてリニアエンコーダから発生するパルスをトリガにしていました。
(ロータリエンコーダが円盤の回転でパルスを発生させて回転角度や回転数を測定するに対し、
リニアエンコーダは直線の動きでパルスを発生させ、移動量や向きなどを測定します)

このリニアエンコーダは金属製のスケールに細かな模様がエッチングされていて、
そこに光を照射して、反射を読み取ってA相、B相のパルスを発生させているのですが、
分解能が0.05μmと高く、1mm移動すると2万回のパルスが発生します。

トリガは0.5μm移動する毎に発生させるので、リニアエンコーダからのパルスを
1/10に分周する必要があり、分周器を外部に取り付けることになりました。
そこで始めてIC工作することになり、74HC390というICで製作しました。
LEDを取り付けて、パルスの発生や、方向などが確認できるようにしました。

ステッピングモータを駆動してリニアエンコーダからパルスが発生し、
分周器で1/10や1/100にに分周できることをオシロで確認しました。
ところが、ステッピングモータが停止している時もパルスが発生することに気づきました。

X軸が移動している間は問題ないのですが、静止時にちょっとした衝撃などで
A相あるいはB相のいずれかからパルスが発生します。
まるで衝撃で振動し始めて、発信する音叉のような挙動でした。
発信の周期が長くなったり、短くなったりしながら、しばらくすると収まりますが、
振動を与えるとまた発信し始めます。

リニアエンコーダの出力は電気的なノイズ対策のために差動駆動になっていたので、
差動ドライバ・レシーバICを取り寄せて取り付けてみたり、
シュミットトリガインバータを取り付けてみても発信は治りません。
周りに電子回路に詳しい人がおらず、相談できる相手もいません。

そこでリニアエンコーダの輸入元である日本の代理店に問い合わせて見たのですが、
そのような現象は聞いたことがないとの返答で、技術的サポートをする気はゼロでした。

オシロで発信時の波形を眺めながら困り果てていると時に、発信時の波形のある特徴を使えば
発信時のパルスを除去できるのではないかと思いつきました。
発信時は必ず、A相あるいはB相のみ発信して、もう他方は静かなままです。

まず、A相とB相から組み合わせ回路でパルスを作りますが、
このままでは発信時の信号がそのまま流れてしまいます。
そこで、A相の立ち上がり/立ち下がりエッジでB相の信号をラッチしする回路と
その逆にB相の立ち上がり/立ち下がりエッジでA相の信号をラッチする順次回路を用意し、
これらの信号で発信した信号を通すか、通さないか決めるようにしました。
一種のノイズフィルタのようなものでしょうか。
この回路のおかげで問題を解決することができました。
(経験豊かな方なら、もっと良い解決方法をご存知かもしれませんが)

この発信の原因ですが、静止したときにスケールに当たる光が模様の境界付近で、
ちょっとした振動でON/OFFを繰り返していたのではないかと考えています。
これも一種のチャタリングと言えるのではないでしょうか。

イメージ 1

開く コメント(0)

開く トラックバック(0)

ここ10年以上、AppleのMighty MouseとそのBluetooth版、
それにMacBook Pro(mid2012, late2013)を使うようになってからは
Magic Mouseを使っています。

特に、Mighty Mouseはスクロールホイールの代わりに
スクロールボールという前後左右にスクロールさせることが可能な
トラックボールの一種を搭載しており、操作性が非常に優れています。
スクロールボールは回転しても本来は来音がしないのですが、
圧電ブザを内蔵してカチカチという音を出すことで、人間にクリック感を錯覚させています。

イメージ 1
写真1. Mighty Mouse(USB), Mighty Mouse WirelessとMagic Mouse

しかしマウスは手垢やホコリが付着するのでメンテナンスが必要です。
このスクロールボールはゴミを巻き込んでしまうために、
使っているうちに回転が悪くなります。
Apple推奨の清掃方法では十分は改善しないので、マウス底面の部品をカッターナイフで切り離し、
マウスを分解して、スクロールボールとその回転を受け止める部品を取り外して清掃しています。

スクロールボールの清掃はこの方法で十分なのですが、Mighty Mouse(USB)の光源はLEDで
ときどきマウスカーソルがあらぬ方向へジャンプすることがあります。
大抵の場合は発光、受光器部分に糸くずなどが付着しているのでブロアで突き飛ばせば解消します。

Mighty Mouse WirelessやMagic Mouseの光源はレーザであるためか、
このマウスカーソルのジャンプは発生しないようです。

他にも不思議な不具合が発生することがあります。

常に発生する訳ではないのですが、発生し始めるとしばらく続きます。
症状は、ファイルなどを掴んで別の場所へ移動させる、
いわゆるドラッグ&ドロップ操作時に起きます。
ファイルをクリックして押し込んだまま、マウスを移動させようとすると、
途中でファイルが意図せぬ場所へ”落ちてしまう”(ドロップ)、
つまりマウスのボタンを押し込んだ状態から離した状態になるという現象です。
マウスボタンを押し込んだ状態でマウスを滑らせて移動し、
その途中でボタンを離すなんて器用な操作をしている訳ではありません。

この症状が発生するようになってもう何年も経つのですが、
しばらくすると症状が治まるので、予備のマウスに取り替えるなどして、凌いできました。

ところが次の記事を見て、ファイルが意図せぬ場所へ”落ちる”症状の原因が見えてきました。


この記事にはマウスボタンのスイッチに使われているマイクロスイッチが
チャタリングを起こすようになったら、業者がマイクロスイッチを
交換して修理するというものを紹介したものです。

確かに押し込んでONになったはずのマイクロスイッチが途中でOFFになったり
チャタリングを起こせばファイルが意図せぬ場所へ”落ちる”症状が起きるでしょう。
そこでマイクロスイッチを交換しようとマウスを分解して型番を確認しました。

イメージ 2
写真2. Mighty Mouse(USB) とMagic Mouseに使われいるマイクロスイッチ

Mighty Mouse(USB)はD2FC-7、Magic MouseはD2FC-7-Hというマイクロスイッチが
使われており、高さが異なるので互換性はなさそうです。

アマゾンでマイクロスイッチを探し出したのですが、カスタマーレビューで
マウスに使われているマイクロスイッチを分解して清掃したら治ったという
投稿がありました。マイクスイッチの分解はそれほそ難しくはないようです。
早速試してみました。

イメージ 3
写真3. マイクロスイッチのカバーを外す

カバーの両脇が突起に引っかかっているだけなので、マイナスの精密ドライバを差し込めば
簡単に外れます。
マイクロスイッチのボタン(白色)は別のプラスチック部品となっており、
その下に青銅で出来た複雑な形状のスイッチが現れます。

スイッチを詳細に観察すると、摺動部分の下に削れたカスが溜まっていました。
また、写真には写せませんでしたが、接点部に糸くずが付着していました。

イメージ 4
写真4. スイッチ構造の詳細と摺動部下に溜まったカス

削れカスをブロアで吹き飛ばして、吹き飛ばなかった糸くずなどをアルコールで拭き取って
カバーを元に戻して、マウスを組み立て直しました。
マウスを清掃してから1週間ほど使っていますが、それ以来症状は出ていません。

イメージ 6
写真5. 接点の詳細

イメージ 5
写真6. スイッチを押し込んだ状態

物理的なスイッチは例外なくチャタリングを起こすはずで、
それは押し込んだり、離したりして接点が接触・非接触を繰り返すことで起きると思われます。
当然、マウスの制御回路にはチャタリングを防止、除去する回路が入っているでしょう。

ボタンを押し込んで接点が接触した状態で通常、チャタリングを起こすとは思えません。
マウスが割れてしまうほどの強い衝撃でも加えない限り、接触した接点が離れるとはないでしょう。

恐らく接点の表面にゴミが付着していて、マウスボタンを押し込むことで
接触はするにはするが不完全で、マウスを移動するときの振動で
非接触や接触状態を繰り返したのでしょう。

調子が悪いなと思ったらスクロールボール周りの清掃だけでなく、
マイクロスイッチの清掃もした方が良さそうです。

これでMighty Mouseを長く使うことが出来そうです。
一方Magic Mouseでボタンのチャタリングと思われる症状はまだありませんが、
マウスを分解するには一部を破壊しなければならないので分解掃除は難しいです。
チャタリングを起こしたら、諦めるしかなさそうです。

マウスのチャタリングで検索すると、様々な解消方法が紹介されているのですが、
その中に接点復活剤を流し込むというのがありました。
マイクロスイッチ内部のスイッチ構造をご覧になれば分かると思いますが、
良い方法とは思えません。
接点復活剤を流し込むのではなく、接点復活剤で接点を拭くのならば問題ないでしょうが、
液体が内部で乾燥して固着したり、ゴミを固めてしまう可能性があります。

マイクロスイッチを分解するとスイッチを壊してしまうリスクがありますが、
ハンダ付けし直すよりも手軽で、お金も掛かりません。
分解不可能なマイクロスイッチなら仕方がないかもしれませんが、
接点復活剤を流し込むより、分解清掃した方が安全で、確実だと思います。

開く コメント(0)

Windowsの不可解な仕様について、もう一つ。

以前、次のような投稿をしました。


これはMac OSでの話しでした。
Windowsではどういう挙動をするでしょうか。

やはりHandbreak(v1.0.7)でH.264でエンコードされた動画を
H.265で再エンコードしている際にまたメモリリークを起こしました。
Windows版でもMac版でも同じ箇所で、同じようにメモリリークします。
Windows版はCPUデコード、QSVエンコード、
Mac版はCPUデコード/エンコードなので
H.264のデコード時にメモリリークを起こしているものと考えられます。

恐らく動画ファイルに問題があるのだと思われますが、
ソフト側も問題のあるファイルに遭遇しても適切に対処して欲しいものです。

メモリリークを起こすと、物理メモリが足りなくなって、
ディスクにスワップファイルを確保してなんとか処理を続けようとします。
記事を投稿した当時のMac OS 10.6 では辛うじて操作可能な状態で、
巻き添えで他のアプリも停止してしまうので、
メモリリークを起こしたアプリを停止させるのも一苦労でしたが、
Mac OS 10.9ではメモリリークを起こしたアプリだけを停止させるように改良されたようで、
メモリリークを起こしたアプリを停止させることは簡単です。

では同じ状況下でWindows 10ではどのような挙動をするかと言うと、
メモリリークが始まって物理メモリを使い果たし、スワップファイルの確保が開始されると
数秒で操作不能な状態に陥ります。
マウルカーソールも無反応で時刻表示も停止し、ハングアップ状態になります。
タスクマネージャを立ち上げて、メモリリークが始まったら即座に
アプリを停止させようと何度か試みましたが、2、3秒で固まるので成功しませんでした。

そのままハングアップしたままの時もありますが、
OSが再起動してログオン画面になっていることもありました。
いわゆる”死のブルースクリーン”も表示されません。

Mac OSだと何らかのメッセージが表示されるのですが、
Windows 10は再起動しても何のメッセージも表示されませんので、
ログオン画面が表示されているのを見て、最初は何が起きたのか分かりませんでした。
その後、Handbreakで未処理の動画ファイルを再処理させ、
メモリリークが原因でハングアップして再起動したのだと判明しました。

Windowsの仮想メモリシステムやメモリリークへの対応はかなりお粗末のようです。

32bitアプリのみなら、メモリリークしても慌てる必要はないかもしれませんが、
64bitアプリが主流になったとき、Windowsは大丈夫なのでしょうか。

また、何かの拍子にHandbreakが強制終了することがあるのですが、
こちらも何のメッセージも表示されません。
”ご不便をお掛けして申し訳ありません”というメッセージは廃止されたのでしょうか。

参考までに、使用したWindows PCは
IntelのNUCで、
OSはWindows 10 Home(1803)、
CPUはCeleron J3455(1.5GHz, 4C/4T)、
C:ドライブは64GBのeMMC、
メモリは6GBに増設、
D:ドライブには2.5インチHDDを増設して使用していいます。

開く コメント(0)

普段はmacOSのコンピュータを使っていますが、
Windowsのコンピュータで作業を行うことがあります。

以前から不可解に思っているいるのが”ごみ箱”の仕様です。

ファイルを捨てたいときには”ごみ箱”に入れ、
その後に”ごみ箱を空にする”で消去します。
この操作はmacOSでもWindowsでも大差ありませんが、
大きく異なる動作があります。

macOSではファイルの大きさに関係なく、ごみ箱に入れることができますが、
Windowsではある大きさを超えると”ごみ箱に入れることができません”
というダイアログが表示されます。
Windows 2000以前の動作はよく覚えていません、
というか当時のPCのハードディスクは数十GBしかなく、
動画のような大きなサイズのファイルを扱うことががありませんでした。
Windows XP、Windows 7、Windows 10では
この”ごみ箱に入れることができません”というダイアログに遭遇したことがあります。

macOSでは数百GBのファイルでも数千個のファイルでも
問題なくゴミ箱に入れることができます。
ファイルサイズやファイル数を理由に”ゴミ箱に入れることができない”という
ダイアログに遭遇したことは一度もありません。
恐らくファイルシステムで扱えるファイルサイズならば
制限なくゴミ箱に入れることができると思われます。

ファイルをごみ箱に入れるという操作はファイルを即座に消去するのではなく、
”ごみ箱”に移動したようにファイル管理情報を書き換えているだけだと思われるので、
ごみ箱に入れられないという理由が分かりません。
GB単位のファイルを扱うことも珍しくなくなった今の時代に、
Windows エクスプローラ(ファイルマネージャ)は大昔と同じ仕様のままです。
いつになったら改善されるのでしょうか?

話しは変わって、Windows エクスプローラでフォルダを”詳細”表示させ、
複数のファイルを選択して"名前"や”更新日時”でソートすると、選択が解除されて
最後に選択した1個のファイルのみを選択した状態になってしまいます。
例えば、"A"で始まるファイルを全て選択して、更新日時やサイズ順などで
並べ替えたいと思っても、選択状態か解除されます。
(私が不勉強なだけで方法があるかもしれませんが)
macOSではリスト表示状態で"名前"タブでソートして、"A"で始まるファイルを複数選択し、
次に"更新日"タブでソートしても複数選択状態は維持されままです。
リスト表示からアイコン表示やカラム表示に切り替えても選択状態は維持されたままです。

ステータスバーにディクスの空き状態を表示する、
複数のファイルやフォルダを選択した状態での合計サイズを表示する、
ラベル(タグ)を付けるなど、便利で気の利いた機能があるので、
WindowsのエクスプローラよりもmacOSのファインダの方が使い勝手が良いと思っています。

さきほどWindows10で作業しているときに致命的な問題が発生しました。

Windows エクスプローラを使っているときに、あるフォルダを詳細表示にして
ごみ箱に入れたいファイルを複数選択した状態にしました。
念のためにプロパティでディスクの空きサイズを確認しました。
このとき、ファイル選択状態を示す水色反転から灰色反転に変わりましたが、
ファイルの選択状態には変わりがなかったので、そのまま"Del"キーを押したところ、
例の”ごみ箱に入れることができません”というダイアログが表示されました。
仕方がないので"OK"をクリックしてファイルを消去させたたころ、
そのフォルダ内にある非選択状態のファイルも含めて全てのファイルが消去されてしまいました。
これは酷い。あり得ない動作です。

これはWindows エクスプローラのバグですか?
それもとも”仕様”ですか?

ファイルを複数選択した状態でも、
更新日時やサイズをクリックすると1つを除いて非選択状態になるのに、
プロパティ表示を行うと見た目はは選択、非選択状態を変えずに暗黙的に全選択状態する。
一貫性のない動作で、かつ致命的な結果を及ぼすような動作をするなんて、
仕様ではなく、バグでしょう。

開く コメント(0)

高精度なRTC(リアルタイムクロック)には水晶発振子の温度校正を行うために
温度計が内臓されていて、通常は60秒おきに温度を測定して
RTCの32kHzという周波数を正確に保っているそうで、
OLEDには時刻と共にRTC内臓温度計の温度を表示しています。

イメージ 1
写真1. RTCの時刻とGPSの時刻および温度の表示

温度や湿度計測専用のセンサもあることは知っていたのですが、
大気圧まで3つ同時に測定できるBoschのBME280というチップを搭載したセンサが
売られていることを知ったので早速、アマゾンでで発注しました。

同センサのシリーズには温度と大気圧のみのBMP280というのがあるるので、
表品紹介ページで型番ばBME280であるおとと湿度が測定できることを確認して、
安全のために異なる2つの出品者に1個ずつ注文しました。
例によって中国大陸からの発送なので、到着まで2〜3週間かかります。

ほぼ同時に2個のセンサが届いたので、ESP8266とI2C接続して、プログラムを作ったのですが、
チップIDは0x60のはずが0x58、湿度補正に関するパラメータを読み出してもゼロが返ってきます。
双方の出品者に問い合わせるも、在庫がないので返金対応となってしまいました。
改めて別の出品者に注文しなおして待つこと2週間、またまたBME280ではなくBMP280でした。
ここまでで1ヶ月半ほどを無駄にしてしまいました。
ネットは諦めて、秋葉原にあるAitendoというお店に行って買ってきました。(BME280-6P)
湿度が測定できないBMP280は300円程度なのですが、湿度が測定できるBME280は800円と
少々お高くなっています。

これは製品毎に固有な補正パラメータを決めて書き込む手間がコストに跳ね返っているのでしょう。
恐らく、チップを治具に固定して恒温室にいれて、温度、湿度それに大気圧を複数回変更して
その時に出力されるADC(アナログ-デジタル コンバータ)の値を読み取って、補正パラメータを
計算して書き込んでいるのでしょう。
温度や大気圧は比較的簡単に変更可能ですが、加湿したり除湿するのは手間が掛かりそうですし、
目標値まで安定させるまで時間もかかるだろうなと想像されます。
このことがBME280のコスト増の要因になっているのかもしれません。

イメージ 2
写真2. BME280(右側)とBMP280(左側と中央)

ようやくBME280が入手できました。チップIDは0x60で、湿度補正パラメータも
それなりの値が入っていることが確認できました。
BMP280では温度と大気圧は補正計算で既にそれらしい値が計算できていま。

そこで湿度を補正計算してシリアルに出力してみたのですが、0%となってしまいました。
計算式はPDFのデータシートコピーして使用しています。

リスト1 BME280の湿度補正計算
uint32_t BME280_compensate_humidity(
    int32_t             adc_h,
    struct BME280_tag   *c
)
{
    int32_t     v_x1_u32r;

    v_x1_u32r   =   (c->t_fine - ((int32_t)76800));
    v_x1_u32r   =   (
                        (
                            (
                                (
                                    (adc_h << 14)
                                    -
                                    (((int32_t)c->dig_H4) << 20)
                                    -
                                    (((int32_t)c->dig_H5) * v_x1_u32r)
                                )
                                +
                                (   (int32_t)16384  )
                            ) >> 15
                        )
                        *
                        (
                            (
                                (
                                    (
                                        (
                                            (
                                                (
                                                    v_x1_u32r
                                                    *
                                                    (   (int32_t)c->dig_H6  )
                                                ) >> 10
                                            )
                                            *
                                            (
                                                (
                                                    (
                                                        v_x1_u32r
                                                        *
                                                        (   (int32_t)c->dig_H3 )
                                                    ) >> 11
                                                )
                                                +
                                                (   (int32_t)32768  )
                                            )
                                        ) >> 10
                                    )
                                    +
                                    (   (int32_t)2097152    )
                                )
                                *
                                (   (int32_t)c->dig_H2  )
                                +
                                8192
                            ) >> 14
                        )
                    );
    v_x1_u32r   =   (
                        v_x1_u32r
                        -
                        (
                            (
                                (
                                    (
                                        (v_x1_u32r >> 15) * (v_x1_u32r >> 15)
                                    ) >> 7
                                )
                                *
                                (   (int32_t)c->dig_H1  )
                            ) >> 4
                        )
                    );

    v_x1_u32r   =   ( v_x1_u32r <         0 )?         0 : v_x1_u32r;
    v_x1_u32r   =   ( v_x1_u32r > 419430400 )? 419430400 : v_x1_u32r;

    return( (uint32_t)(v_x1_u32r >> 12) );
}

上記のソースコードでは複数のBME280に対応できるように補正値などを
構造体のポインタ渡しにしてい、見やすいように対応する括弧をインデントで
位置を揃えています。

ADCからの読み取り値はゼロではないのに、計算の途中でゼロになっているようです。
そこで計算の途中の値をシリアルに出力して確認してみると案の定、途中でゼロになっています。
湿度に関する補正値はそれなりの値が読み取れています。
今一度、補正パラメータのアドレスとと対応を確認してみたところ、補正値読み取り関数に
誤りを見つけました。
符号ありと符号なし8ビットと16ビット整数が混在していることは注意していたのですが
湿度の補正パラメータだけ、上位4ビットと下位4ビットに分け、
それぞれ別の8ビットデータくっつけて12ビットにしているパラメータがあります。
しかもPDFファイルのページをまたぐ箇所に記述してあります。
間違った自分が悪いのですが、変則的な扱いをページの境界に記述するのもどうかと思います。
これでようやく湿度が計算できるようになりました。

温度は100で割った値が気温の整数値で、剰余が小数点以下2桁の値、
気圧は256で割った値がPa(パスカル)で、25600で悪とhPa(ヘクトパスカル)、
湿度は1024で割った値が0〜100%で、剰余が小数点です。
気圧と湿度の小数点以下の値は25600や1024で割った値を
必要に応じて小数点以下1桁なら10倍、2桁なら100倍しなければなりません。

また、補正値を保持する変数の符号あり/なしを間違っていたらしく、
湿度が63%までは上がるのですが、その先が1%になるというミスもありました。
変数ほ型はデータシート通りに正しく記述しましょう。


今回入手したBME280を搭載したモジュールはI2CとSPI接続の2つに対応しています。
SDOをハイインピーダンスにすると、SPI接続となり、
LowまたはHighにするとI2C(アドレスはLow:0x76, High=0x77)となります。
今回はI2C接続とし、2個購入したので同時に接続してOLEDに表示してみました。

イメージ 3
写真3. BME280を2個、I2C接続して温湿度・大気圧を測定

絶対的な精度は不明ですが、個体差はそれほどないようです。
また、温度と湿度のレスポンスが早いようで、センサに指を近づけただけで、
数秒で値が変化します。

イメージ 4
写真4. 指を近づける前の値と数秒後の値

手前のセンサに指を近づけて114秒で手前の湿度が10%近く上昇しました。
次に手持ちの温湿度計との比較を行ってみました。

イメージ 5
写真5. 温湿度計どうしの測定値

写真5. の上段は10年ほど前に購入した電波時計、中段は最近購入した安い温湿度計で、
下段はESP8266と温湿度・大気圧センサを組み合わせたの測定結果です。
上段の電波時計の表示値をずっと信用していたのですが、どうやら温度も
湿度も低めに表示されていたようです。
中段の温湿度計はほぼ同じ値を表示していますが環境の変化に鈍いようです。
下段の温湿度・大気圧センサは中段の安物の温湿度計に近い値が出ています。

ようやく温湿度および大気圧が表示できるようになりましたが、
解像度が低く、小さなOLEDでは現在値を表示するくらいしかできません。
時間の経過に伴う変化を記録して、それを表示できたらと思っています。
24時間〜数ヶ月の変化をグラフ表示で表示させてみたいですよね。
それにはもう少し解像度が高くて大型の液晶が必要です。

開く コメント(0)

開く トラックバック(0)

全41ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事