rotarary chasing led

Hardware geleverd door Arduino
Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

rotarary chasing led

Berichtdoor edensan » 09 Apr 2017, 19:59

hallo ik heb een chasing led gemaakt middels een rotary encoder
nu is linksom geen probleem en rechtsom gaat alleen led 6 branden..
ik heb geen idee..

Code: Alles selecteren
/* interrupt routine for Rotary Encoders
   tested with Noble RE0124PVB 17.7FINB-24 http://www.nobleusa.com/pdf/xre.pdf - available at pollin.de
   and a few others, seems pretty universal

   The average rotary encoder has three pins, seen from front: A C B
   Clockwise rotation A(on)->B(on)->A(off)->B(off)
   CounterCW rotation B(on)->A(on)->B(off)->A(off)

   and may be a push switch with another two pins, pulled low at pin 8 in this case
   raf@synapps.de 20120107

*/

// usually the rotary encoders three pins have the ground pin in the middle
enum PinAssignments {
  encoderPinA = 2,   // right
  encoderPinB = 3,   // left
  clearButton = 4    // another two pins
};

volatile unsigned int encoderPos = 0;  // a counter for the dial
unsigned int lastReportedPos = 1;   // change management
static boolean rotating=false;      // debounce management

// interrupt service routine vars
boolean A_set = false;             
boolean B_set = false;
int   led1 = 5;
int   led2 = 6;
int   led3 = 7;
int   led4 = 8;
int   led5 = 9;
int   led6 = 10;

void setup() {
         

{
    pinMode(led1,OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(led4, OUTPUT);
    pinMode(led5, OUTPUT);
    pinMode(led6, OUTPUT);
}

  pinMode(encoderPinA, INPUT);
  pinMode(encoderPinB, INPUT);
  pinMode(clearButton, INPUT);
 // turn on pullup resistors
  digitalWrite(encoderPinA, HIGH);
  digitalWrite(encoderPinB, HIGH);
  digitalWrite(clearButton, HIGH);

// encoder pin on interrupt 0 (pin 2)
  attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
  attachInterrupt(1, doEncoderB, CHANGE);

  Serial.begin(9600);  // output
}

// main loop, work is done by interrupt service routines, this one only prints stuff
void loop() {
  rotating = true;  // reset the debouncer

 if (lastReportedPos != encoderPos ) {
   //Serial.print("Index:");
   //

     if (encoderPos == 0){
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
    digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
    Serial.println(encoderPos, DEC);
   lastReportedPos = encoderPos;
   }
   
   if (encoderPos == 1){
    digitalWrite(led1,HIGH);
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
    digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
    Serial.println(encoderPos, DEC);
  lastReportedPos = encoderPos;
   }
   if
    (encoderPos == 2){
    digitalWrite(led1,LOW);
    digitalWrite(led2,HIGH);
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
    digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
    Serial.println(encoderPos, DEC);
 lastReportedPos = encoderPos;
   }
    if
    (encoderPos == 3){
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    digitalWrite(led3,HIGH);
    digitalWrite(led4,LOW);
    digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
    Serial.println(encoderPos, DEC);
   lastReportedPos = encoderPos;
   }
    if
    (encoderPos == 4){
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led4,HIGH);
    digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
    Serial.println(encoderPos, DEC);
  lastReportedPos = encoderPos;
   }
    if
    (encoderPos == 5){
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
    digitalWrite(led5,HIGH);
    digitalWrite(led6,LOW);
    Serial.println(encoderPos, DEC);
   lastReportedPos = encoderPos;
   }
    if
    (encoderPos == 6){
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
    digitalWrite(led5,LOW);
    digitalWrite(led6,HIGH);
    Serial.println(encoderPos, DEC);
  lastReportedPos = encoderPos;
   }
    if
    (lastReportedPos >= 7){
     encoderPos = 1;
   //  lastReportedPos = encoderPos;
   }
     if
    (lastReportedPos <= 0){
     encoderPos = 6;
   //  lastReportedPos = encoderPos;
   }
  }
  if (digitalRead(clearButton) == LOW )  {
    encoderPos = 0;
  }
}

// Interrupt on A changing state
void doEncoderA(){
  // debounce
  if ( rotating ) delay (1);  // wait a little until the bouncing is done

  // Test transition, did things really change?
  if( digitalRead(encoderPinA) != A_set ) {  // debounce once more
    A_set = !A_set;

    // adjust counter + if A leads B
    if ( A_set && !B_set )
      encoderPos += 1;

    rotating = false;  // no more debouncing until loop() hits again
  }
}

// Interrupt on B changing state, same as A above
void doEncoderB(){
  if ( rotating ) delay (1);
  if( digitalRead(encoderPinB) != B_set ) {
    B_set = !B_set;
    //  adjust counter - 1 if B leads A
    if( B_set && !A_set )
      encoderPos -= 1;

    rotating = false;
  }
}


vr gr Edwin

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: rotarary chasing led

Berichtdoor shooter » 09 Apr 2017, 20:38

dat komt doordat je unsigned gebruikt hebt.
al die debounce is overigens niet nodig hoor, dat doet de encoder toch wel.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

Re: rotarary chasing led

Berichtdoor edensan » 10 Apr 2017, 10:05

bedankt voor je antwoord.

en ik heb al is heftig aan het googlen geweest maar signed maken is niet simpel... toch?
kun je me een beetje in de goede richting sturen?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: rotarary chasing led

Berichtdoor nicoverduin » 10 Apr 2017, 11:06

Woordje unsigned weglaten :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 19
Geregistreerd: 09 Mrt 2017, 13:51
Woonplaats: GB

Re: rotarary chasing led

Berichtdoor edensan » 10 Apr 2017, 12:21

AHHHH ja idd pff (retroblond)

maar als ik dat weglaat kan ik niet retour roteren.. en DAT was eigenlijk wel de bedoeling...

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: rotarary chasing led

Berichtdoor nicoverduin » 10 Apr 2017, 13:32

Geen idee. Heb ook niet naar de code gekeken... en ook ff geen tijd voor
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: rotarary chasing led

Berichtdoor Koepel » 11 Apr 2017, 02:59

Die code kom ik op meerdere plaatsen tegen, en anderen hebben er ook problemen mee.
Dit zou de bron kunnen zijn: https://github.com/jandrieu/Rotary/blob/master/rotary_test/rotary_test.ino.

Mijn voorstel is om die code te vergeten, en een werkende library te nemen zoals deze: https://www.pjrc.com/teensy/td_libs_Encoder.html.
Wat dit is weet ik niet: http://playground.arduino.cc/Main/RotaryEncoders.

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Bing [Bot] en 13 gasten