図2は、今回の実験に用いる回路基板です。マイコンとロータリーエンコーダーをブレッドボードに装填しています。
マイコンボードは「Arduino Nano Atmega168」を用います。端子は基板長辺の両側に15ピンずつあります。ブレッドボードは横に付されている若い番号側を左に置きます。そしてマイコンボードは図2のようにUSBのコネクターがある方を左側にして、マイコンボードの15本のピンを差し込みます。
次に今回の主役であるロータリーエンコーダーをブレッドボードに装填していきます。ロータリーエンコーダーからもピンは出ているのですが、直接ブレッドボードに装填できないので、ユニバーサルボードを介してブレッドボードに刺せるように治具を作りました。秋月電子通商でもこのロータリーエンコーダー専用のDIP化基板も取り扱っていますので、もしこの実験が目的なら一緒に購入するのが良いかと思います。図2で示している通り、A端子をブレッドボードの24番、C端子を23番そしてB端子を22番に装填します。
ブレッドボードにおけるロータリーエンコーダーとマイコンボードの配線ですが、A端子をマイコンボードの3番入出力ピン、B端子をマイコンボードの2番入出力ピンにジャンパー線でワイヤリングします。なお、ロータリーエンコーダーのC端子はマイコンのグランドに接続します。
今回の実験では、ロータリーエンコーダーのノブを時計方向に回すとカウンターが増加し、時計と逆方向に回すとカウンターの値が減少するというプログラムを作成します。そして、これらの値をPC側のArduino IDEのシリアルモニターで確認します。
以下に示すリスト1とリスト2がプログラムコードになります。Arduino IDEの使用を前提としているので、IDEの設定については読者の皆さんの環境に合わせて行ってください。
2: const int A=2,B=3; 3: void setup() { 4: pinMode(A, INPUT_PULLUP); 5: pinMode(B, INPUT_PULLUP); 6: Serial.begin(9600); 7: }
2行目は整数変数AとBにそれぞれ2と3を代入しています。2と3はそれぞれ、ロータリーエンコーダーのA端子とB端子を接続したマイコンボードのピン番号です。これらの番号でArduinoのプログラムからピンを指定できるようになります。
3行目はsetup()関数です。Arduinoのローカルルールですが、電源投入時あるいはリセット時に一度だけ実行される関数です。
4行目ではA端子が接続されている入出力ピンを入力として設定しており、このピンのプルアップ抵抗をマイコン内部で設定しています。プルアップ抵抗に関しては以下の連載第3回をご覧ください。
5行目も同様にB端子が接続されているマイコンのピンを設定しています。
このプログラムでは、ロータリーエンコーダーの動作を確認する変数をUSB経由のシリアルポートでPCに送っているのですが、6行目はそのための初期設定です。
10: void loop() { 11: static int stat,count,dir,start=0; 12: if (digitalRead(A) == HIGH) { 13: if (stat == 0) start = millis(); 14: stat = 1; 15: } else{ 16: if (stat == 1 && ((millis()-start)>10)) 17: Serial.println((digitalRead(B))?--count:++count); 18: stat = 0; 19: } 20:}
10行目のloop()は、Arduinoのローカルルールではありますが一定の間隔で呼び出される関数です。
11行目では、この関数内で使われる変数を宣言しています。いずれもstaticでintなのですが、この関数に再入したときでも値が保持される整数型変数です。startはA接点の状態を保持する変数です。countはロータリーエンコーダーのノブを時計回りに回せば値が増し、逆方向に回せば値が減じるという変数として使っています。dirはノブの回転方向を保持するための変数です。startはチャタリング現象が治まるまでの時間を計測するために用いる変数です。
このプログラムは連載第9回で紹介したチャタリング対策のプログラムがベースになっています。本記事ではロータリーエンコーダー用に追加した部分のみ解説しますので、それ以外については連載第9回を参照してください。
13行目はA端子の立ち上がりでその時点の時刻をstart変数に代入します。
17行目でロータリーエンコーダーの回転方向を判断して、count変数の値を増減させています。
回転方向の判断については、前ページの表1にあるA端子、B端子の出力波形を確認してください。A端子の立ち上がり後、チャタリングが落ち着いたであろう一定時間(10ms)以上経過した時点で、B端子の状態を読み出し、それが0か1で回転方向を判断します。
いかがでしたでしょうか。今回はマイコン(Arduino)にロータリーエンコーダーを接続してみました。これが使えるようになるとマイコンだけで様々なUIを提供できるのではないでしょうか。
Copyright © ITmedia, Inc. All Rights Reserved.