ダイアル式キーボード (ロータリーエンコーダー版)

ロータリーエンコーダを使ったダイアル式キーボードです。何の事か解らない方は初代テプラのページをご覧下さい。



ロータリーエンコーダーは Amazon 等で購入できます (購入時価格: ¥125)。



構成

プッシュボタン付きロータリーエンコーダーを使ったダイアル式キーボードです。

接続は以下のようになります。オス<->メスのジャンパーワイヤーが別途必要です。

Module Arduino
CLK 10
DT 9
SW 8
+ 5V
GND GND

See Also:



スケッチ

スケッチです。C / C++ の剰余 (%) って負数の挙動は実装依存なのですね...私、Delphi (Pascal) 使いなので軽く悩みました (w

const int ENCA_PIN PROGMEM = 10;
const int ENCB_PIN PROGMEM =  9;
const int BTN_PIN  PROGMEM =  8;

const int MODV PROGMEM = 96;

int encPos = 0;
int lastPinA = HIGH;

void setup() {
  Serial.begin(115200);
  pinMode(ENCA_PIN, INPUT);
  pinMode(ENCB_PIN, INPUT);
  pinMode(BTN_PIN, INPUT_PULLUP);
}

void loop() {
  int v = digitalRead(ENCA_PIN);
  if ((lastPinA == LOW) && (v == HIGH)) {  
    if (digitalRead(ENCB_PIN) == LOW) 
      encPos++;
    else 
      encPos--;
    encPos = (encPos + MODV) % MODV; // encPos MOD 96
  }
  char c = encPos + 0x20;  
  if (digitalRead(BTN_PIN) == LOW) {  
    Serial.print(c);
    delay(500);
  }      
  lastPinA = v;
}

シリアルモニタを開いておき、ロータリーエンコーダーを回してボタンを押す (軸を押し込む) と文字が入力されます。

ポテンショメーター版との違いは、ツマミの位置が相対的であるという点です。起動時からどれだけ動かしたかで文字が決まります。起動時の文字は必ずスペース (0x20) となります。

See Also:



スケッチ 2

もう一つサンプルスケッチを。

こちらは 1602 LCD (I2C) で文字入力するものです。

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int ENCA_PIN PROGMEM = 10;
const int ENCB_PIN PROGMEM =  9;
const int BTN_PIN  PROGMEM =  8;

const int MODV PROGMEM = 96;

int encPos = 0;
int lastPinA = HIGH;

int x = 0;
int y = 0;

LiquidCrystal_I2C lcd(0x3F162); // I2C: 0x3F, 16x2 LCD

void setup() {
  pinMode(ENCA_PIN, INPUT);
  pinMode(ENCB_PIN, INPUT);
  pinMode(BTN_PIN, INPUT_PULLUP);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(00);
  lcd.blink();
}

void loop() {
  int v = digitalRead(ENCA_PIN);
  char c;  
  if ((lastPinA == LOW) && (v == HIGH)) {  
    if (digitalRead(ENCB_PIN) == LOW) 
      encPos++;
    else 
      encPos--;
    encPos = (encPos + MODV) % MODV; // encPos MOD 96
    c = encPos + 0x20;  
    lcd.print(c);
    lcd.setCursor(x, y);
  }
  c = encPos + 0x20;  
  if (digitalRead(BTN_PIN) == LOW) {  
    if (c == 0x7F) {
      lcd.setCursor(x, y);
      lcd.print(" ");
      if  ((y == 1) || (x > 0))
        x--;
      if (x < 0) {
        x = 15;
        y--;
      }
    } else {
      if  ((y == 0) || (x < 15))
        x++;
      if (x > 15) {
        x = 0;
        y++;
      }
    }    
    lcd.setCursor(x, y);
    lcd.print(c);
    lcd.setCursor(x, y);
    delay(500);
  }      
  lastPinA = v;
}

0x7F でバックスペースもできます。


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: