• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc Enkoder Arduino
#1
Hej, 
Mam taki problem, po podłączeniu enkodera:

https://sklep.avt.pl/impulsator-12-impul...-20fl.html

Powstaje taki problem jak nim przekręcam to reaguje co jakiś czas jak by coś nie łaczyło jak by to robił losowo..robiłem wszystko tak jak w tym filmie 

https://www.youtube.com/watch?v=Z7Sc4MJ8RPM
Dodam że przyciski wszystkie działają jak trzeba.
Dodam jeszcze że jak lutowałem to przemarzyłem trochę te elementy co na foto zaznaczone poszedł dziwny cymek biały i okopciło trochę płytkę.

sketch:
Kod:
//BUTTON BOX 
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 18
#define NUMROWS 3
#define NUMCOLS 6


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4,5},
  {6,7,8,9,10,11},
  {12,13,14,15,16,17},
  
};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
  {0,1,24,25,0},
  {2,3,26,27,0},
  {4,5,28,29,0},
  {6,7,30,31,0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
  // R_CCW_BEGIN
  {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
  // R_CW_BEGIN
  {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
  // R_START_M (11)
  {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
  // R_CW_BEGIN_M
  {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
  // R_CCW_BEGIN_M
  {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
  // R_CW_FINAL
  {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
  // R_CW_BEGIN
  {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
  // R_CW_NEXT
  {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
  // R_CCW_BEGIN
  {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
  // R_CCW_FINAL
  {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
  // R_CCW_NEXT
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

byte rowPins[NUMROWS] = {21,20,19}; 
byte colPins[NUMCOLS] = {15,14,16,10,9,8}; 

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_JOYSTICK, 32, 0,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  Joystick.begin();
  rotary_init();}

void loop() { 

  CheckAllEncoders();

  CheckAllButtons();

}

void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            switch (buttbx.key[i].kstate) {  
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
}


void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries[i].pin1, HIGH);
      digitalWrite(rotaries[i].pin2, HIGH);
    #endif
  }
}


unsigned char rotary_process(int _i) {
   unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  for (int i=0;i<NUMROTARIES;i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
}


Załączone pliki Miniatury
   
 
#2
Nie pisz post pod postem użyj edycji i używaj kodę bo mnie aż oczy bolą.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
#3
Znalazłem prosty kod dla enkodera, tutaj.

Kod:
/* Read Quadrature Encoder
  Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V.

  Sketch by max wolf / www.meso.net
  v. 0.1 - very basic functions - mw 20061220

*/

int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

void setup() {
 pinMode (encoder0PinA, INPUT);
 pinMode (encoder0PinB, INPUT);
 Serial.begin (9600);
}

void loop() {
 n = digitalRead(encoder0PinA);
 if ((encoder0PinALast == LOW) && (n == HIGH)) {
   if (digitalRead(encoder0PinB) == LOW) {
     encoder0Pos--;
   } else {
     encoder0Pos++;
   }
   Serial.print (encoder0Pos);
   Serial.print ("/");
 }
 encoder0PinALast = n;
}

Może coś spaprałeś z połączeniami. Sprawdź, czy nie masz zimnych lutów.
 
#4
Kurde kupiłem kolejne arduino i dupa Sad pomocy
 
#5
Zamiast nowego arduino należało kupić analizator stanów logicznych Saleae: https://allegro.pl/listing?string=saleae...e-1-4-1003
Podpinasz taka zabawkę do urządzenia(w tym przypadku enkodera) i widzisz co się dzieje z sygnałami.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
#6
Na enkoderze masa jest po środku a sygnały po na prawym i lewym pinie, dobrze myślę..?
Nie wiem być może mam zły impulsator/enkoder...na filmie jest podłączany inny a mianowicie niejaki EC11
 
#7
(05-12-2017, 23:47)Hixi napisał(a): Na enkoderze masa jest po środku a sygnały po na prawym i lewym pinie, dobrze myślę..?
Teoretycznie tak.
Sprawdź poniższy program
Kod:
#define PinA 2  
#define PinB 3  

unsigned long time = 0;
long count = 0;
long num = 0;

void setup()
{
 Serial.begin(9600);

 pinMode(PinA,INPUT_PULLUP);
 pinMode(PinB,INPUT_PULLUP);

 attachInterrupt(0, blinkA, LOW);  
 attachInterrupt(1, blinkB, LOW);  

 time = millis();
}

void loop()
{
 while (num != count)
 {
   num = count;
   Serial.println(num);
 }
}

void blinkA()
{
 if ((millis() - time) > 3)
       count ++;
 time = millis();
}

void blinkB()
{
 if ((millis() - time) > 3)  
       count --;
 time = millis();
}
Zewnętrzne piny enkodera podpinasz pod piny 2 i 3 a środkowy do masy.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
#8
Do zamknięcia
 
  


Skocz do:


Przeglądający: 1 gości