前の記事でテストしたピン割込みを利用して、ロータリーエンコーダの回転方向を判定するスクリプトのテストをしました。
まず、回転報告を判定する方法を説明します。ロータリーエンコーダのA,B端子はプルアップしておきます。ロータリーエンコーダを回転させると下の図のように、各端子の電圧が時間とともに変化します。
A,Bの状態が変化した時(割込みが発生した時)のA,Bの値を読み取り、(B<<1)+Aの前の値と現在の値のXORをとると、時計回り(右回り)の時は、その値は、0か1になり、反時計回り(左回り)の時は、2か3になります。
つまり、判定式D<2で時計回り、D>=2の時反時計回りと判定することができます。
![](https://blogimg.goo.ne.jp/user_image/3e/7b/f46afd6846d7bc478f724db08c91fa5c.png)
スクリプトです。
4行目5行目 ロータリーエンコーダのA,Bが接続されるGPIO14とGPIO15を入力、プルアップに設定。
34行目35行目 ピン割込みの設定、トリガは、立下りと立ち上がり、両方で割込みがかかるように設定。
![](https://blogimg.goo.ne.jp/user_image/1c/22/1d2833b097691c57f85895d95b9b7e44.png)
![](https://blogimg.goo.ne.jp/user_image/79/87/40cd37e6585e8725386af3ffab6d9c58.png)
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に表示されます。
![](https://blogimg.goo.ne.jp/user_image/52/7f/f683404c03eeac87dc14eb2659745b9b.png)
接続回路図です。
![](https://blogimg.goo.ne.jp/user_image/4c/60/4c00f9d9733d08811c623770baeb69bb.png)
ブレッドボードです。ロータリーエンコーダは、中華製の安価なものを使いました。かなりチャタリングがあるのですが、今回のスクリプトは、うまく回転方向を判定できます。
![](https://blogimg.goo.ne.jp/user_image/1e/4e/eb1a7750e76c2c0c8afa9a621f7cb592.jpg)
※コメント投稿者のブログIDはブログ作成者のみに通知されます