前の記事でテストしたピン割込みを利用して、ロータリーエンコーダの回転方向を判定するスクリプトのテストをしました。
まず、回転報告を判定する方法を説明します。ロータリーエンコーダのA,B端子はプルアップしておきます。ロータリーエンコーダを回転させると下の図のように、各端子の電圧が時間とともに変化します。
A,Bの状態が変化した時(割込みが発生した時)のA,Bの値を読み取り、(B<<1)+Aの前の値と現在の値のXORをとると、時計回り(右回り)の時は、その値は、0か1になり、反時計回り(左回り)の時は、2か3になります。
つまり、判定式D<2で時計回り、D>=2の時反時計回りと判定することができます。
スクリプトです。
4行目5行目 ロータリーエンコーダのA,Bが接続されるGPIO14とGPIO15を入力、プルアップに設定。
34行目35行目 ピン割込みの設定、トリガは、立下りと立ち上がり、両方で割込みがかかるように設定。
14行目からが、割込み時に回転方向を判定する関数です。
最初、countをインクリメント、デクリメントするのに、count++,count--を使ったのですが、これが原因でエラーがでてしまいました。この原因が分からず、数時間を無駄にしました。MicroPythonではこの記述は通らないんですね。
それから、判定の基準ですが、今までPICなどでのプログラムでは、count>=4でRIGHT、count<=4でLEFTとしたのですが、count>=3,count<=3の方がスムーズに判定するので、この値にしました。
このスクリプトで実際にロータリーエンコーダを動かしてみると、一番最初のクリックだけ判定しませんが、その後はロスなく判定してくれました。
2021.12.3追記
上の問題を解決する方法が分かりました。スクリプトを次のように訂正してください。最初PinA=1,PinB=1なので
8行目 befDat=0x11 としてください。
これで、最初からスムーズに動くはずです。
判定された結果は、shellに表示されます。
接続回路図です。
ブレッドボードです。ロータリーエンコーダは、中華製の安価なものを使いました。かなりチャタリングがあるのですが、今回のスクリプトは、うまく回転方向を判定できます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます