CircuitPython 10行プログラミング Step3 (2) ロータリ・エンコーダ
連載の第1回(ライブラリはバージョン3)と第2回(ライブラリはバージョン4)では、ロータリ・エンコーダがうまく動きませんでした。ライブラリがバージョン5になったので、再度挑戦しました。動かなかった理由は、ライブラリなのかマイコン・ボードであったのかは検証していません。
ロータリ・エンコーダは2種類用意しました。一つは軸を押すと値のリセットなどが利用できるスイッチ付きのモデルです。もう一つは、大きめ(約55mmΦ)のダイヤルがついています。
●接続
最初のロータリ・エンコーダは、アマゾンで入手しました。
HiLetgo® 3個セット 回転式のエンコーダモジュール 360度 ロータリーコード モジュール エンコーダ Arduinoのために [並行輸入品]
インクリメンタル形、操作電圧は5V、パルスは20個と書かれていますが、3.3Vで利用します。CLKとDTは10kΩでプルアップされ、SWは接点がそのまま端子に出ています。実験では、SWはつなげていません。
マイコン・ボード Metro M4 Express AirLift |
ロータリ・エンコーダ |
---|---|
D1 | CLK |
D2 | DT |
3.3V | + |
GND | GND |
(※)D1はディジタル・ポート1、D2はディジタル・ポート2です。Arduino IDEでは'1'とか'2'と書いていました。
●スケッチ
Adafruitの「Rotary Encoder in CircuitPython」のサンプルrotary_encoder.pyを動かします。
(※) 本Webのプログラム中、インデントなどのスペースもしくは改行は、通常のプログラム内ではごみ文字になるので、コピペした後、エディタでスペース文字などを入れなおしてください。
import rotaryio
import time
from board import *
enc = rotaryio.IncrementalEncoder(D1, D2)
last_position = None
while True:
position = enc.position
if last_position == None or position != last_position:
print(position)
last_position = position
実行中の様子です。ロータリ・エンコーダの軸を左右に回しています。
●大きめのロータリ・エンコーダの接続
このロータリ・エンコーダも、アマゾンで入手しました。
パルスエンコーダ 6端子 CNC ハンドホイール エンコーダジェネレータ ミルルータ手動制御 5V 60MM(ブラック)
インクリメンタル形、操作電圧は5Vと書かれていますが、3.3Vで利用します。回すとクリック感があり、1周100クリックのようです。目盛りも0~99あり、スケッチを0でスタートして99までカウントすると、表示も99なので、1回転100パルスの仕様のようです。
裏面です。
マイコン・ボード Metro M4 Express AirLift |
ロータリ・エンコーダ |
---|---|
D1 | A |
D2 | B |
3.3V | Vcc |
GND | 0 |
スケッチは変更せずにそのまま実行しました。実行結果は、同じなので省略します。
コラム 実行環境
マイコン・ボードをマイクロUSBケーブルでつなぎ、エディタMu(バージョン1.02)を立ち上げると、ボードを認識し、CircuitPythonが利用できる環境になります。
プログラムをmain.pyで保存し、メニューのシリアルをクリックすると、print文の実行が下側の画面に出てきます。main.pyは、PCから見えるCIRCUITPYフォルダに保存されます。