arrow-righthamburgerlogo-marksocial-facebooksocial-githubsocial-twitter
2018.03.26

くるくる回して値を入力!ロータリエンコーダでインプットの幅を広げよう

森田

電子工作レシピ
   このエントリーをはてなブックマークに追加  

どうも。森田(@morita_pac)です。

ボタンを押してトリガー発動!センサー値をグラフにダイレクトアタック!IoTって最高かよ!

ってみなさん感じていると思います。

そこへ、新たなスパイスを投ずるべく、森田はロータリエンコーダをおすすめします。

ロータリエンコーダってなにかね?

これです。 回転の機械的変位量を電気信号に変換してくれます。つまり、くるくるくるくる回してデジタル入力できるアイテム。

今回はクリック有り(カチカチなってくれる)のインクリメンタル式のロータリエンコーダを使って解説します。

⇒ 参考: ロータリエンコーダ販売ページ(RSコンポーネンツ

さまざまな種類のロータリエンコーダがあるので、上記サイトなどを参照してみてください。今回利用したもの(EC12E2420801)も購入できます。

インクリメンタル式って何!?

まだ引かないでください。。。

まず、ロータリエンコーダには信号検出の異なる「インクリメンタル式」と「アブソリュート式」があります。

アブソリュート式

回転位置が絶対的な数値として出力される高精度な方式で、電源断時でも回転位置を保持しておけることが特徴です。その分お値段も少々お高めなものが多いです。

回転方向も、数値の増減から判断できます。

インクリメンタル式

回転した角度だけパルス(短時間の電流)出力される方式で、今回使うロータリエンコーダの場合だと、15度回転させるとカチッとする感触があり、その時1パルスが出力され、24パルス出力で1回転となります。

回転方向を検出するために、位相が異なるA層B層の2つの端子からパルスを出力する構造になっており、 例えば、A→Bの順にパルスの変化があった場合は時計回り、B→Aの順にパルスの変化があった場合は反時計周りのように区別することができます。 ※イメージです。

使えるようにしてみよう。

それでは、さっそくロータリエンコーダを使ってみるよ!

今回は、ESP32、ESP8266などのボードにJavaScriptで書き込みができる「Mongoose OS」を利用してみます。なぜなら僕はMongoose OSが好きだからです。

Arduino言語での開発に慣れていない方にとっては、シンプルでわかりやすく感じると思います。Arduino IDEを使った方法やサンプルコードも、先例がたくさんあるので調べてみてください!

⇒ 参考: Arduino Unoでロータリーエンコーダを使う│SAKURA87.net
⇒ 参考: 【Arduino】マウスホイール(ロータリーエンコーダ)の回転量を取得する│おもちゃラボ

Mongoose OSを導入するまでの手順は下記の記事を参照してください。

用意したもの

配線

下記の図を参考に配線してください。

プログラム

正回転(※)でプラス10、逆回転でマイナス10の数値をログに出力するプログラムです。コピーしてMongoose OSで書き込みます。それぞれのコードの詳細はコメントに記載します。

※…正回転はエンコーダの位置アドレスが増加する回転方向のことです。今回利用したロータリエンコーダの場合は時計回りが正回転、反時計回りが逆回転です。

//GPIOのAPIを使えるようにします。
load('api_gpio.js');

//ロータリエンコーダのA,Bのピンアサイン
let pinA = 19;
let pinB = 18;

//A,Bの状態を読みます。
let stateA = GPIO.read(pinA);
let stateB = GPIO.read(pinB);

let count =50;
let rotate =0;

//おまじない
GPIO.set_mode(pinA,GPIO.MODE_INPUT);
GPIO.set_mode(pinB,GPIO.MODE_INPUT);

//プラス1(正回転)を判断するための関数です。
let getRotationActA = function(){
        let Acount = 0;
        let AA = GPIO.read(pinA);
        let AB = GPIO.read(pinB);
        if (AA === 0 && AB === 1)
        {
            AA = GPIO.read(pinA);
            AB = GPIO.read(pinB);
            Acount = 1;
        }
   return Acount;
};

//マイナス1(逆回転)を判断するための関数です。
let getRotationActB = function(){
        let Bcount = 0;
        let BA = GPIO.read(pinA);
        let BB = GPIO.read(pinB);
        if (BA === 1 && BB === 0)
        {
            BA = GPIO.read(pinA);
            BB = GPIO.read(pinB);
            Bcount = -1;
        }
   return Bcount;
};

//Aにパルスが来た時に動くイベントです。
GPIO.set_button_handler(pinA, GPIO.PULL_UP, GPIO.INT_EDGE_NEG, 100, function(x) {
  rotate = getRotationActA();
  if(rotate === 1){
  count = count +rotate*10;
  print(count);
  }
}, null);


//Bにパルスが来た時に動くイベントです。
GPIO.set_button_handler(pinB, GPIO.PULL_UP, GPIO.INT_EDGE_NEG, 100, function(x) {
  rotate = getRotationActB();
  if(rotate === -1){
  count = count +rotate*10;
  print(count);
  }
}, null);

試してみよう。

書き込めたら、実際に試してみましょう。 Mongoose OSのコンソールからロータリエンコーダの値を確認することができます。

下記はOLEDディスプレイに値を表示するようにしてみました。 正回転で値が増え、逆回転で値が減っていきます!

Mongoose OSの特徴とチャタリングの関係から、勢いよくロータリエンコーダを回すと正確に信号を捉えられません。解決できる方法があるぜ。という場合はご連絡くださいませ。

さいごに

いかがでしたでしょうか。これで、入力に新たな選択肢が加わったと思います。

ロータリエンコーダにはボタン付きのものもあったりしますので、選択してボタンプッシュで送信のような機能が欲しい場合に使えると思います。

初期搭載のスイッチやセンサからの入力に飽きてしまった方は、ぜひ試してみてください!

   このエントリーをはてなブックマークに追加