「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



この間秋月で買ってきたLED内蔵のロータリーエンコーダ
直接LEDを繋いで光らせてみただけだったので、ようやく
カリカリ回してカウントが出来るArduinoのスケッチ
を書いて遊んでみた。



ChaNさんのこのページに解りやすい解説があるので、
コーディング例(2)を元に作ったスケッチがこれ。

int a_sig = 7;    // a signal on d7
int b_sig = 8;    // b signal on d8

volatile int rot = 0;    // rotation value (initial = 0)
volatile int diff = 0;    // difference value (initial =0)

#include <MsTimer2.h>


void interrupt0(){
  int a_in;
  int b_in;
  int new_val;    // now value
  static int old_val = 0;    // old value (initial=0)
  
  if (digitalRead(a_sig)==HIGH){
    a_in = 1;
  }else{
    a_in = 0;
  }
  if (digitalRead(b_sig)==HIGH){
    b_in = 1;
  }else{
    b_in = 0;
  }
  new_val = a_in * 2 + b_in;
  
  if (( (new_val<if (( (new_val<int rotary_value(){

  noInterrupts();
  rot += diff;
  diff = 0;
  interrupts();
  
  return rot;
}



void setup() {
  Serial.begin(9600);
  
  pinMode(a_sig, INPUT); // a signal as input
  pinMode(b_sig, INPUT); // b signal as input
  
  MsTimer2::set(1, interrupt0); // 1ms period
  MsTimer2::start();
}


void loop() {

  int input_val;
  
  input_val = rotary_value();
  delay(100);
  Serial.println(input_val);
  
}


(後日訂正:変数rotとdiffの宣言を「static」じゃなく
 「volatile」に訂正)

ツマミをくるくる回すと、シリアルモニタに表示される
数値が思ったとおりに動いてくれる。


それにしても、ChaNさんの「コーディング例(2)」に
出てくる0x7とか0xdとかって、なんじゃ?と思った
んだけど、よくよく考えてみて解った。スバラシイ。

一定間隔(とりあえずオイラのスケッチでは1ミリ秒毎)
にデータを取り込むと考えて、前回取り込んだデータと
今回取り込んだデータを2つ繋ぎ合わせたビットパターン
なんだなと解った。

A相B相がそれぞれ、前回01→今回11のときは0b0111なので
0x7になり、前回11→今回01のときは0b1101なので0xdと
なると…。なるほど。
この間秋月で買ってきたロータリーエンコーダも、
以前買ったまま放置してあったやつも、1ノッチ(1クリック)
の間に4パターン(00→01→11→10→00に戻る)という
信号パターンになってた。

で、ビットパターンが変化するバリエーションのうち、
00が絡まないパターンから右回転か左回転かを抽出
できれば1ノッチ分の回転を抽出できるわけなので、
これらのうち「11」と「01」に絡むパターンだけ
取り出してみれば判断できる…と。ロータリーエンコーダ
の1ノッチ分って、大抵4パターン分で1ノッチになってる
と考えて良さそうなので、このように4パターンで1クリック
と考えたロジックが使いやすいんだろうな。とてもしっくり
キタ。

ちなみに、ゆっくり回しても、速く回しても、変な値を
示すことは無く、うまい具合に動作してくれた。内部は

もうちょっと弄りなおして、汎用的に使える部品に
出来ると良いんだけどな。


それにしてもロータリーエンコーダ。オイラ謹製の
Arduino赤道儀基板のUIでで使いたかったんだけど、
あともう1個くらいI/O端子が余ってればこいつを
使ったのになぁ… MEGA328でもちょっとI/Oピンが
足りなかったんだよな。I2C接続のキャラクターLCD
があれば足りたのかも知れないなぁ…


http://zasshi.news.yahoo.co.jp/article?a=20121109-00000000-techon-sci&pos=1
1枚で15TBの光ディスクって、何気にすごいな!
でも、光ディスクの将来性って…どうなの?


http://zasshi.news.yahoo.co.jp/article?a=20121022-00000303-bjournal-bus_all
日本から韓国企業に引き抜かれた技術者…。
まぁ、なんとなく想像できたよね。
ちなみに、きっと旬は原発技術者。あと数年したら
同じような記事が原発関連で取り上げられるんじゃ
ないかな。



コメント ( 2 )