PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Резистивные кнопки (http://pccar.ru/forumdisplay.php?f=165)
-   -   Encoder + Arduino + Резистивные кнопки (http://pccar.ru/showthread.php?t=23202)

Lexx09 25.11.2015 10:35

Разберись со скобками в блоке кода с 20-й по 32-ю строку. В строке 24 у тебя открывается скобка просто так, это неправильно. Вероятно, лишние скобки в строках 23 и 24, но тогда непонятки с переменной flag.

ali_vlad 25.11.2015 11:41

Не хватает одной закрывающейся скобки в конце. Кстати про скобки: если курсор поместить на любую скобку то ответеая подсвеч вается. Самый простой способ проверки открытых и закрытых скобок.

TransF 25.11.2015 19:50

Всё проверяю, всё сходится, поубирал лишние коменты что бы самому понимать что пытаюсь написать
всё тоже самое, в програматоре опять ошибка

sketch_nov25a.ino: In function 'void loop()':
при этом выделяется строка ISR (PCINT0_vect)

как я понял нет действия в loop
но ведь оно есть в setup как и в правом регуляторе громкости :be::be::be: и там всё работает

TransF 26.11.2015 01:06

Почти вторая часть моего руля
Код HTML:

int analogPin=0;
int data;
unsigned long flag = 0;
unsigned long pauseMillis = 0;
void setup() {           
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT);
pinMode (9,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
 data=analogRead(analogPin); //читаем значение нажатой кнопки
  Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
  if (data>
=28 && data<=35)  // ALT+TAB
    {
Keyboard.press(KEY_LEFT_ALT); 
Keyboard.press(KEY_TAB); 
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
    }
  if (data>
=28 && data<=35)  // ALT+TAB
  {
Keyboard.press(KEY_TAB); 
Keyboard.release(KEY_TAB); 
flag = 0; 
pauseMillis = millis(); 
delay(1800);
Keyboard.releaseAll();
  }
  if (data>
=58 && data<=65)  // домой
    {
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
    }
  delay(180);
}
 
ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
        Remote.next(); 
        delay(10); 
        Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
        Remote.forward();
        delay(100); 
        Remote.clear();}
old_n= new_n;
}

Альт+таб к сожалению пока не стабилен но уже работает :big:
почему-то приложения не все подряд перелистывает а ровно через одно.
После еще придется объединить скетчи, это я думаю осилю)

Lexx09 26.11.2015 11:33

Вот этот кусок кода странный. Зачем два раза проверять одно и то же условие? Объедини.
Код:

if (data>=28 && data<=35)  // ALT+TAB
{
        Keyboard.press(KEY_LEFT_ALT); 
        Keyboard.press(KEY_TAB); 
        Keyboard.release(KEY_TAB);
        flag = 0;
        pauseMillis = millis();
}
if (data>=28 && data<=35)  // ALT+TAB
{
        Keyboard.press(KEY_TAB); 
        Keyboard.release(KEY_TAB); 
        flag = 0; 
        pauseMillis = millis(); 
        delay(1800);
        Keyboard.releaseAll();
}

Да, и сделай нормальные отступы...

TransF 26.11.2015 15:03

Если я обьеденяю их, то происходит:
1) нажание АЛЬТ,
2) нажатие ТАБ
3) отпуск ТАБ
4) нажатие ТАБ
5)отпуск ТАБ
6) ожидание 3 секунды
7) отпуск всего
В связи с этим: 1 - происходит перескакивание таба на 2 приложения и 2 - пока не пройдёт 3 секунды на кнопку не реагирует.

Цитата:

Сообщение от Lexx09 (Сообщение 344750)
Да, и сделай нормальные отступы...

Что значит нормальные отступы? (прошу прощения за тупость я гуманитарий и для меня нормальный отступ 1,25 в начале абзаца)
тут делал так просто для того чтобы себе понятнее было

TransF 29.11.2015 01:13

Закончил с пайкой, и теперь у меня 2 половинки управления моим мультирулём.

скомпоновал скетч, всё кроме второго энкодера для переключения треков
ни как не получается ничего(((

подскажите что как дописать вот в этот рабочий скетч для второго энкодера?

Код HTML:

int analogPin=0;
int data;
void setup() {           
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (8,INPUT);
pinMode (9,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
 data=analogRead(analogPin); //читаем значение нажатой кнопки
  Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
  /*поддерживаемые коды управляющих клавиш
  [url]http://arduino.cc/en/Reference/KeyboardModifiers*/[/url]
  if (data>
=28 && data<=35)  // приглушение звука
    {
      Remote.mute();
      Remote.clear();
    }
  if (data>
=58 && data<=65)  // воспроизведение / пауза
    {
      Remote.play_pause();
      Remote.clear();
    }
  if (data>
=140 && data<=150)  // домой
    {
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
    }
    if (data>
=88 && data<=95)  // ALT+TAB
    {
Keyboard.press(KEY_LEFT_ALT); 
Keyboard.press(KEY_TAB); 
Keyboard.release(KEY_TAB); 
Keyboard.press(KEY_TAB); 
Keyboard.releaseAll();
}
  delay(180);
}
 
ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
        Remote.increase(); 
        delay(10); 
        Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
        Remote.decrease();
        delay(100); 
        Remote.clear();}
old_n= new_n;
}

второй энкодер использую на 6 и 7 ногах ардуины

ali_vlad 29.11.2015 12:28

Дребезг контактов надо подавлять. Или аппаратно или программно. На мой взгляд самый простой способ - использование библиотеки bounce. А иначе глюки будут всегда.
Так же не забыаайте про "подтяжку" кнопок по питанию. Или к плюсу или к земле. На столе может работать идеально, а в машине может глючить.

TransF 29.11.2015 12:31

Цитата:

Сообщение от ali_vlad (Сообщение 344952)
Дребезг контактов надо подавлять. Или аппаратно или программно. На мой взгляд самый простой способ - использование библиотеки bounce. А иначе глюки будут всегда.
Так же не забыаайте про "подтяжку" кнопок по питанию. Или к плюсу или к земле. На столе может работать идеально, а в машине может глючить.

(С дребезгом всё норм, по крайней мере на столе. аппаратно он заглушен 104 конденсаторам. Глюков НЕТ.) всё изменилось((

не смог реализовать переключения треков, нашел скетч, вот отсюда https://www.drive2.ru/c/2347322/
он к сожалению далек от идеала, и появился бешенный зребезг

поскажите пожалуйста как в этом скетче реализовать подавление дребезга библиотекой bounce
Код HTML:

int analogPin=0;
int data;
unsigned long currentTime;
unsigned long loopTime;
const int pin_enc_A = 8; /// звук
const int pin_enc_B = 9; /// звук
const int pin_enc_C = 5; /// переключение
const int pin_enc_D = 4; /// переключение

unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
unsigned char encoder_C;
unsigned char encoder_D;
unsigned char encoder_C_prev=0;
void setup() {           

Keyboard.begin();
Serial.begin(9600);
pinMode(pin_enc_A, INPUT_PULLUP); // encoder 1
pinMode(pin_enc_B, INPUT_PULLUP); // encoder 2
pinMode(pin_enc_C, INPUT_PULLUP); // encoder 1
pinMode(pin_enc_D, INPUT_PULLUP); // encoder 2
currentTime = millis();
loopTime = currentTime;
///attachInterrupt(4, key_mute, FALLING);

}
void loop() {
 currentTime = millis();
 if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_C = digitalRead(pin_enc_C); // считываем состояние выхода А энкодера
encoder_D = digitalRead(pin_enc_D); // считываем состояние выхода А энкодера
if((!encoder_C) && (encoder_C_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_D)
{
// выход В в полож. сост., значит вращение по часовой стрелке
Remote.next();
delay(10);
Remote.clear();
}
else {
Remote.previous();
delay(10);
Remote.clear();
}
} encoder_C_prev = encoder_C;

}

////энкодер 2

currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_enc_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_enc_B); // считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
// выход В в полож. сост., значит вращение по часовой стрелке
Remote.increase();
delay(5);
Remote.clear();
}
else {
Remote.decrease();
delay(5);
Remote.clear();
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла

loopTime = currentTime;
}

 data=analogRead(analogPin); //читаем значение нажатой кнопки
  Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
  /*поддерживаемые коды управляющих клавиш
  http://arduino.cc/en/Reference/KeyboardModifiers*/
  if (data>=28 && data<=35)  // приглушение звука
    {
      Remote.mute();
      Remote.clear();
    }
  if (data>
=58 && data<=65)  // воспроизведение / пауза
    {
      Remote.play_pause();
      Remote.clear();
    }
  if (data>
=140 && data<=150)  // домой
    {
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
    }
    if (data>
=88 && data<=95)  // ALT+TAB
    {
Keyboard.press(KEY_LEFT_ALT); 
Keyboard.press(KEY_TAB); 
Keyboard.release(KEY_TAB); 
Keyboard.press(KEY_TAB); 
Keyboard.releaseAll();
}
  delay(180);
}


TransF 02.12.2015 23:08

Посидел покрутил в руках то что нашёл для энкодеров в инете, и пришел к выводу что скетча лучше чем от lti1 просто не найти, дополнил его кнопками.

Код HTML:

int analogPin=0;
int data;
void setup() {           
PCICR=1<<PCIE0;
PCMSK0=(1<<PCINT5)|(1<<PCINT4);
pinMode (9,INPUT);
pinMode (8,INPUT);
Keyboard.begin();
Serial.begin(9600);
}
void loop() {
 data=analogRead(analogPin); //читаем значение нажатой кнопки
  Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
  if (data>
=28 && data<=35)  // приглушение звука
    {
      Remote.mute();
      Remote.clear();
    }
  if (data>
=58 && data<=65)  // воспроизведение / пауза
    {
      Remote.play_pause();
      Remote.clear();
    }
  delay(180);
  if (data>
=88 && data<=95)  // ALT+TAB
    {
      Keyboard.press(KEY_LEFT_ALT); 
      Keyboard.press(KEY_TAB); 
      Keyboard.release(KEY_TAB); 
      Keyboard.press(KEY_TAB); 
      Keyboard.releaseAll();
}
  delay(180);
    if (data>
=140 && data<=150)  // домой
    {
Keyboard.press(KEY_ESC);
Keyboard.release(KEY_ESC);
    }
}

ISR (PCINT0_vect){
static byte old_n=PINB&B00110000;
byte new_n=PINB&B00110000;
if (old_n==32&&new_n==48||old_n==16&&new_n==0) {
        Remote.increase(); 
        delay(10); 
        Remote.clear();}
if (old_n==16&&new_n==48||old_n==32&&new_n==0) {
        Remote.decrease();
        delay(100); 
        Remote.clear();}
old_n= new_n;
}

Помогите пожалуйста, дописать кусок скетча для переключения треков.


Часовой пояс GMT +4, время: 09:46.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot