Подправил код, оставил только рулевые кнопки и энкодер с нажатием.
Хочу так же подключить второй энкодер, но ничего не получается :-(
На данный момент у меня работает полноценно один энкодер и у второго энкодера работает только нажатие.
Код:
Пробовал добавить заменить строки в конце кода на такие:Код:#include <IRremote.h> #include <EEPROM.h> byte bytes[4]={0,3}; // 0-3 байт - энкодер, рулевые кнопки, ИК приемник int JOYSTIK_PIN = 5 ; // вход для рулевых кнопок int RECV_PIN = 10; // вход ИК приемника int encoder0PinA = 2 ; // вывод А энкодера int encoder0PinB = 3 ; // вывод В энкодера int encoder0PinC = 4 ; // вход кнопки энкодера int encoder1PinA = 5 ; // вывод А энкодера 2 int encoder1PinB = 6 ; // вывод В энкодера 2 int encoder1PinC = 7 ; // вход кнопки энкодера 2 byte temp; //IRrecv irrecv(RECV_PIN); //decode_results results; unsigned long res_dt; //****************************************** void setup() { pinMode(encoder0PinA, INPUT); digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор энкодера pinMode(encoder0PinB, INPUT); digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор энкодера pinMode(encoder0PinC, INPUT); digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор энкодера pinMode(encoder1PinA, INPUT); digitalWrite(encoder1PinA, HIGH); // подключить подтягивающий резистор pinMode(encoder1PinB, INPUT); digitalWrite(encoder1PinB, HIGH); // подключить подтягивающий резистор pinMode(encoder1PinC, INPUT); digitalWrite(encoder1PinC, HIGH); // подключить подтягивающий резистор attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание энкодера interrupt 0 на pin 2 attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание энкодера interrupt 0 на pin 3 Serial.begin(115200); // настроить скорость com порт } //****************Кнопка Энкодера**************************** void loop() { if(digitalRead(encoder0PinC)==LOW) { bytes[0] = 0; bytes[1] = 8; bytes[2] = 0; bytes[3] = 0; Serial.write(bytes,4); while(digitalRead(encoder0PinC)==LOW){delay(50);} bytes[0] = 0; bytes[1] = 7; bytes[2] = 0; bytes[3] = 0; } if(digitalRead(encoder1PinC)==LOW) { bytes[0] = 0; bytes[1] = 6; bytes[2] = 0; bytes[3] = 0; Serial.write(bytes,4); while(digitalRead(encoder1PinC)==LOW){delay(50);} bytes[0] = 0; bytes[1] = 5; bytes[2] = 0; bytes[3] = 0; } joystik(); } //****************Резистивные кнопки************************** void joystik() { res_dt = analogRead(JOYSTIK_PIN); // прочитать данные АЦП if( res_dt < 1023) { delay(50); // пауза для проверки дребезга if(res_dt == analogRead(JOYSTIK_PIN)) // если нет дребезга { bytes[0] = res_dt & 255; // преобразовать в 2-байта bytes[1] = (res_dt & 768) >> 8; bytes[2] = 0; bytes[3] = 0; Serial.write( bytes,4); // отправить прочитаное значение компьютеру delay(250); // пауза между нажатиями } } } //*******************Поворот Энкодера (обработка прерывания)**** void doEncoderA() { cli(); if(digitalRead(encoder0PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;} bytes[0] = 0; bytes[2] = 0; bytes[3] = 0; Serial.write( bytes,4); sei(); } //*******************Поворот Энкодера (обработка прерывания)**** void doEncoderB() { cli(); if(digitalRead(encoder0PinA)==HIGH){bytes[1]=5;}else{bytes[1]=25;} bytes[0] = 0; bytes[2] = 0; bytes[3] = 0; Serial.write( bytes,4); sei(); }
И даже:Код HTML:if(digitalRead(encoder0PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;} if(digitalRead(encoder1PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;}
Со значениями bytes[1]=25; так же экспериментировал.Код HTML:if(digitalRead(encoder1PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;}
Но ничего не выходит, второй энкодер молчит.
И главное - при повороте первого энкодера (когда в коде прописываю encoder1PinB) работает именно первый.
2 энкодера отдельно (без резистивных кнопок) работали прекрасно: http://compcar.ru/forum/showthread.p...ll=1#post88754
Но там смотрю принцип немного другой.
По такому же принципу исправил код на такой:
Второй энкодер срабатывает примерно 1 раз из 5-10 (иногда проскакивают значения при повороте).Код:#include <IRremote.h> #include <EEPROM.h> byte bytes[4]={0,3}; // 0-3 байт - энкодер, рулевые кнопки, ИК приемник int JOYSTIK_PIN = 5 ; // вход для рулевых кнопок int RECV_PIN = 10; // вход ИК приемника int encoder0PinA = 2 ; // вывод А энкодера int encoder0PinB = 3 ; // вывод В энкодера int encoder0PinC = 4 ; // вход кнопки энкодера int encoder1PinA = 5 ; // вывод А энкодера 2 int encoder1PinB = 6 ; // вывод В энкодера 2 int encoder1PinC = 7 ; // вход кнопки энкодера 2 byte temp; //IRrecv irrecv(RECV_PIN); //decode_results results; unsigned long res_dt; //****************************************** void setup() { pinMode(encoder0PinA, INPUT); digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор энкодера pinMode(encoder0PinB, INPUT); digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор энкодера pinMode(encoder0PinC, INPUT); digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор энкодера pinMode(encoder1PinA, INPUT); digitalWrite(encoder1PinA, HIGH); // подключить подтягивающий резистор pinMode(encoder1PinB, INPUT); digitalWrite(encoder1PinB, HIGH); // подключить подтягивающий резистор pinMode(encoder1PinC, INPUT); digitalWrite(encoder1PinC, HIGH); // подключить подтягивающий резистор attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание энкодера interrupt 0 на pin 2 attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание энкодера interrupt 0 на pin 3 Serial.begin(115200); // настроить скорость com порт } //****************Кнопка Энкодера**************************** unsigned graydecode(unsigned gray) { unsigned bin; for (bin = 0; gray; gray >>= 1) bin ^= gray; return bin; } void loop() { static uint8_t tmp_code = 0; uint8_t gray_code = digitalRead(encoder1PinA) | (digitalRead(encoder1PinB) << 1), code = graydecode(gray_code); if (code == 0) { if (tmp_code == 3) { bytes[0]=9; bytes[1]=6; Serial.write( bytes,2); bytes[0]=0; } else if (tmp_code == 1) { bytes[0]=9; bytes[1]=7; Serial.write( bytes,2); bytes[0]=0; } } tmp_code = code; delay(2); if(digitalRead(encoder0PinC)==LOW) { bytes[0] = 0; bytes[1] = 8; bytes[2] = 0; bytes[3] = 0; Serial.write(bytes,4); while(digitalRead(encoder0PinC)==LOW){delay(50);} bytes[0] = 0; bytes[1] = 7; bytes[2] = 0; bytes[3] = 0; } if(digitalRead(encoder1PinC)==LOW) { bytes[0] = 0; bytes[1] = 6; bytes[2] = 0; bytes[3] = 0; Serial.write(bytes,4); while(digitalRead(encoder1PinC)==LOW){delay(50);} bytes[0] = 0; bytes[1] = 5; bytes[2] = 0; bytes[3] = 0; } joystik(); } //****************Резистивные кнопки************************** void joystik() { res_dt = analogRead(JOYSTIK_PIN); // прочитать данные АЦП if( res_dt < 1023) { delay(50); // пауза для проверки дребезга if(res_dt == analogRead(JOYSTIK_PIN)) // если нет дребезга { bytes[0] = res_dt & 255; // преобразовать в 2-байта bytes[1] = (res_dt & 768) >> 8; bytes[2] = 0; bytes[3] = 0; Serial.write( bytes,4); // отправить прочитаное значение компьютеру delay(250); // пауза между нажатиями } } } //*******************Поворот Энкодера (обработка прерывания)**** void doEncoderA() { cli(); if(digitalRead(encoder0PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;} bytes[0] = 0; bytes[2] = 0; bytes[3] = 0; Serial.write( bytes,4); sei(); } //*******************Поворот Энкодера (обработка прерывания)**** void doEncoderB() { cli(); if(digitalRead(encoder0PinA)==HIGH){bytes[1]=5;}else{bytes[1]=25;} bytes[0] = 0; bytes[2] = 0; bytes[3] = 0; Serial.write( bytes,4); sei(); }
Не поможете подправить скетч?




Ответить с цитированием