Pomoc Enkoder Arduino - Hixi - 02-12-2017
Hej,
Mam taki problem, po podłączeniu enkodera:
https://sklep.avt.pl/impulsator-12-impulsow-na-360-poziomy-oska-plastikowa-podcieta-ed1612-12c12-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);
};
}
}
RE: Pomoc Enkoder Arduino - adix - 02-12-2017
Nie pisz post pod postem użyj edycji i używaj kodę bo mnie aż oczy bolą.
RE: Pomoc Enkoder Arduino - krn78 - 04-12-2017
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.
RE: Pomoc Enkoder Arduino - Hixi - 05-12-2017
Kurde kupiłem kolejne arduino i dupa pomocy
RE: Pomoc Enkoder Arduino - namok - 05-12-2017
Zamiast nowego arduino należało kupić analizator stanów logicznych Saleae: https://allegro.pl/listing?string=saleae&order=m&bmatch=ss-base-relevance-floki-5-nga-hcp-ele-1-4-1003
Podpinasz taka zabawkę do urządzenia(w tym przypadku enkodera) i widzisz co się dzieje z sygnałami.
RE: Pomoc Enkoder Arduino - Hixi - 05-12-2017
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
RE: Pomoc Enkoder Arduino - namok - 06-12-2017
(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.
RE: Pomoc Enkoder Arduino - Hixi - 19-12-2017
Do zamknięcia
|