MSDR folyamatos hangolás forgó enkóderrel (rotary encoder)

Ma megérkezett egy alkatrészem az MSDR-hez, nevezetesen egy forgó encoder (rotary encoder) amelynek nagy előnye a potikkal szemben, hogy digitális jelekkel dolgozik, valamint végtelenített a körbeforgási ciklusa, így egy kis illesztéstechnikával és programozással folyamatos hangolást teszlehetővé az MSDR-ben.

Az alkatrész így néz ki:

és az alábbi oldalról rendeltem meg:

www.hestore.hu/prod_10022007.html

Az alábbi leírás alapján az Arduino 2-es és 3-as digitális portjaihoz, valamint a GND-hez illesztettem, és a megszakításos lekérdezést beimplementáltam az MSDR Arduino vezérlésébe.

http://bildr.org/2012/08/rotary-encoder-arduino/

Így normál állapotban – a mostani felprogramozás szerint – 1 kHz-et léptet raszterenként fel-, és le, benyomott állapotban (az encoder tengelye egyben nyomógomb is) 50 Hz-et fel-, és le.

Az alábbi rövid videón demonstrálom a működést.

[youtube]http://www.youtube.com/watch?v=69AZ_IlyDTk[/youtube]

Mivel ez az alkatrész eredetileg nem volt betervezve a készülék előlap elkészítésekor, ezért a bal oldali led furatát nagyobbítottam meg, oda került az encoder, a led furatait pedig arányosan eltolva fúrtam be a másikak közé.

Az arduino forrás jelenleg így néz ki, ha valaki tanulmányozni szeretné:

#include <Keypad.h>

const int analogInPin = 2;  // Analog input pin that the potentiometer is attached to
const int analogInPin1 = 1;
const int analogInPin2 = 0;
const int analogInPin3 = 3;
const int analogInPin4 = 4;

int encoderSwitchPin = 4; //push button switch
int encoderPin1 = 3;
int encoderPin2 = 2;
int jelz = 0;
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
volatile long encoderValue1 = 0;
long lastencoderValue = 0;
long utolsoenc = 0;
int lastMSB = 0;
int lastLSB = 0;

int sensorValue = 0;        // value read from the pot
int sensorValue1 = 0;        // value read from the pot
int sensorValue2 = 0;        // value read from the pot
int sensorValue3 = 0;        // value read from the pot
int sensorValue4 = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)
int outputValue1 = 0;        // value output to the PWM (analog out)
int outputValue2 = 0;        // value output to the PWM (analog out)
int outputValue3 = 0;        // value output to the PWM (analog out)
int outputValue4 = 0;        // value output to the PWM (analog out)
int lastval  = 0;
int lastval1 = 0;
int lastval2 = 0;
int lastval3 = 0;
int lastval4 = 0;
int jel =1;
int modejel = 0;
int rxjel = 0;
char rr=’i’;
const byte ROWS = 4; //four rows
const byte COLS = 3; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {‘1′,’2′,’3’},
  {‘4′,’5′,’6’},
  {‘7′,’8′,’9’},
  {‘M’,’0′,’E’}
};
byte rowPins[ROWS] = {28, 26, 24, 22}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 32, 30}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  Serial.begin(9600);
  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);
  pinMode(encoderSwitchPin, INPUT);
  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
  digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on
  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3)
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);
 
  pinMode(52, OUTPUT);
  pinMode(53, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);    // set ventill on
 
}

void loop(){

  char customKey = customKeypad.getKey();
  if (customKey){
    //digitalWrite(13, HIGH);   // set the LED on
    tone(9,2000,3);
    if (customKey==’E’) {Serial.println(“”); jel=1;} else
    if (customKey==’M’) {Serial.print(“.”); jel=1;} else
    if (customKey!=’M’ and customKey!=’E’) {jel=0; Serial.print(customKey);}
           
      delay (100);
      //digitalWrite(13, LOW);    // set the LED off
      noTone(9);
  } else
      {sensorValue = analogRead(analogInPin);     
       sensorValue1 = analogRead(analogInPin1);
       sensorValue2 = analogRead(analogInPin2);      
       sensorValue3 = analogRead(analogInPin3);
       sensorValue4 = analogRead(analogInPin4);     

      outputValue = map(sensorValue, 0, 1023, 0, 100);
      outputValue1 = map(sensorValue1, 0, 1023, 0, 100 );
      outputValue2 = map(sensorValue2, 0, 1023, 0, 21 );
      outputValue3 = map(sensorValue3, 0, 1023, 0, 100 );
      outputValue4 = map(sensorValue4, 0, 1023, 0, 100 );
      
      if (lastval!=outputValue and lastval!=outputValue-1 and lastval!=outputValue+1 and jel==1){
          Serial.print(“S”);
          Serial.println(outputValue);
          lastval=outputValue;
          delay(100);
      }
      if (lastval1!=outputValue1 and lastval1!=outputValue1-1 and lastval1!=outputValue1+1 and jel==1){
          //if (outputValue1<=10 and outputValue1>=0) {
           if (modejel==1){ Serial.print(“M”);
             Serial.println(outputValue1);
              lastval1=outputValue1; }
                 delay(200);
                 modejel++;
                 if (modejel==2) modejel=0;
            if (outputValue1<=49 and outputValue1>=0) {digitalWrite(13, HIGH); digitalWrite(12,LOW);} else {digitalWrite(13, LOW); digitalWrite(12,HIGH);}
             }// }
      if (lastval2!=outputValue2 and lastval2!=outputValue2-1 and lastval2!=outputValue2+1 and jel==1){
            Serial.print(“V”);
            Serial.println(outputValue2);
            lastval2=outputValue2;
             }
      if (lastval3!=outputValue3 and lastval3!=outputValue3-1 and lastval3!=outputValue3+1 and jel==1){
            Serial.print(“A”);
            Serial.println(outputValue3);
            lastval3=outputValue3;
             }
      if (lastval4!=outputValue4 and lastval4!=outputValue4-1 and lastval4!=outputValue4+1 and jel==1){
            Serial.print(“X”);
            Serial.println(outputValue4);
            lastval4=outputValue4;
      }
      if (jelz == 1){
          if(digitalRead(encoderSwitchPin)){
            //button is not being pushed
            Serial.print(“f”);
            Serial.println(encoderValue/2);
            jelz = 0;}
          else{
            //button is being pushed
            Serial.print(“F”);
            Serial.println(encoderValue1/2);
            jelz = 0;}
          }

             }
        rr=Serial.read();
        if (rr==’i’){lastval=0; lastval1=0;lastval2=0;lastval3=0;lastval4=0; rr=’s’;} else
        if (rr==’r’) {digitalWrite(52, HIGH); digitalWrite(53, LOW); } else
        if (rr==’n’) {digitalWrite(53, HIGH); digitalWrite(52, LOW); }
}

 
void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
    if(digitalRead(encoderSwitchPin)){encoderValue ++; jelz =1;} else { encoderValue1 ++; jelz=1;}}
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
    if(digitalRead(encoderSwitchPin)){encoderValue –; jelz =1;} else { encoderValue1 –; jelz=1;}}

  lastEncoded = encoded; //store this value for next time
  utolsoenc = encoderValue;
}  

a

Vélemény, hozzászólás?