次の工作に使おうと考えているロータリエンコーダを試してみました。秋月で売られているフルカラーRGB LEDが付いていて、軸がプッシュスイッチになっているものです。取り合えずの習作なのでArduino UNOを引っ張り出してきて使っています。
動かしているときの様子です。
ロータリエンコーダのエンコード信号とLEDは独立しています。ただし各LEDのアノードとプッシュスイッチの一方は共通ピンです。
ロータリエンコーダのデコード方法は、ELMさんのロータリー・エンコーダの使い方 を参考にさせていただきました。感謝。回路・スケッチは無保証です。
//------------------------------------------------------------ // 2020.6.28 naka // ロータリエンコーダ習作 // //------------------------------------------------------------ #include <FaBoLCDmini_AQM0802A.h> FaBoLCDmini_AQM0802A lcd; #define SDAPIN A4 #define SCLPIN A5 #define RT0 2 #define RT1 3 #define LED_R 4 #define LED_G 5 #define LED_B 6 #define SW 7 int Count; void setup() { // i/oピン設定 pinMode(RT0,INPUT_PULLUP); pinMode(RT1,INPUT_PULLUP); pinMode(LED_R,OUTPUT); pinMode(LED_G,OUTPUT); pinMode(LED_B,OUTPUT); pinMode(SW,INPUT); // モニタLCD設定 SetupLCD(); lcd.clear(); lcd.print("Encoder "); // カウンタ Count = 0; } void loop() { int dir; char buff[10]; while(1) { dir = sample_coder(); // エンコーダの回転方向 if (dir!=0 || Count==0) { Count += dir; disp_count(Count); LED_LightsUp(Count); } if (digitalRead(SW)==1) { // ロータリエンコーダの軸スイッチが押されたか? Count = 0; disp_count(Count); LED_LightsUp(Count); break; } } while(digitalRead(SW)==1); delay(100); } void SetupLCD() { lcd.begin(); lcd.command(0x38); lcd.command(0x39); lcd.command(0x14); lcd.command(0x73); lcd.command(0x51); // 5V // lcd.command(0x56); // 3.3V delay(2); lcd.command(0x6c); delay(300); lcd.command(0x38); delay(1); lcd.command(0x01); delay(2); lcd.command(0x0c); delay(2); } void disp_count(int cnt) { char buff[9]; sprintf(buff,"CNT=%3d",cnt); lcd.setCursor(0, 1); // Col,Raw lcd.print(buff); } void LED_LightsUp(int val) { if (val<0) led_rgb(0,0,1); // Blue else if (val==0) led_rgb(0,0,0); // off else if (val<10) led_rgb(0,1,0); // green else if (val<20) led_rgb(1,1,0); // yellow else if (val<30) led_rgb(1,0,0); // red else if (val>=30) led_rgb(1,0,1); // purple } void led_rgb(int r,int g,int b) { r = (r ^ -1) & 1; // 論理反転 digitalWrite(LED_R,r); g = (g ^ -1) & 1; digitalWrite(LED_G,g); b = (b ^ -1) & 1; digitalWrite(LED_B,b); } int sample_coder() { static int code = 0; int code_val,code_pin0,code_pin1; code_val = (PIND >> 2) & 3; code = ((code << 2) | code_val) & 15; // switch (code) { // デテンド位置=3 case 0xE: return(1); case 0xD: return(-1); default: return(0); } } //------------------------------------------------------------
0 件のコメント:
コメントを投稿