Управление подрулевыми кнопками

maks_oteam
Offline
Зарегистрирован: 13.11.2018

Добрый день. Помогите решить проблему. Имеется код управления джойстиком:

#include <Keypad.h>
const byte ROWS = 3; //four rows
const byte COLS = 4; //four columns
 
char hexaKeys[ROWS][COLS] = {
  {'6','x','4','a'},
  {'8','1','2','b'},
  {'7','3','5','c'}
 
};
byte colPins[COLS] = {
  6, 5, 4, 3}; //connect to the row pinouts of the keypad
byte rowPins[ROWS] = {
  9, 8, 7}; //connect to the column pinouts of the keypad
 
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
 
void setup(){
  Serial.begin(9600);
}
void loop()
{
  char key = customKeypad.getKey();
  
  if (key != NO_KEY)
  { 
    Serial.println(key);
  }
  char LastJoystickKey;
  switch(key){
  case  'a':
  if(LastJoystickKey=='b'){
  Remote.next();
    delay(200);
    Remote.clear();
  }
  if(LastJoystickKey=='c'){
  Remote.previous(); 
    delay(200);
    Remote.clear();
  }
  break;
  case 'b':
  if(LastJoystickKey=='a'){
  Remote.previous(); 
    delay(200);
    Remote.clear();
  }
  if(LastJoystickKey=='c'){
  Remote.next();
    delay(200);
    Remote.clear();
  }
  break;
  case 'c':
  if(LastJoystickKey=='a'){
  Remote.next();
    delay(200);
    Remote.clear();
  }
  if(LastJoystickKey=='b'){
  Remote.previous(); 
    delay(200);
    Remote.clear();
  }
  break;
  default:{
  }
  if(key=='a'||key=='b'||key=='c'){
  LastJoystickKey=key;
  }  
}
if (key == '2'){
    Remote.play_pause();
    delay(10);
    Remote.clear();
  }
  if (key == '3'){
      Remote.decrease();
      delay(10);
      Remote.clear();
    }
 
    if (key == '1'){
      Remote.increase();
      delay(10);
      Remote.clear();
    }
}
На джойстике имеется крутелка (не энкодер), которая работает по принципу замыкания контактов как и кнопка. Крутелка имеет 3 положения (3 пары замыкания контактов). Замыкания происходят по схеме 4пин+7пин, 4пин+8пин, 4пин+9пин.
Вопрос в следующем: на крутелке постоянно замкнута одна из пар контактов, из-за этого код не хочет работать, если разомкнуть (физически), то код рабочий и все кнопки кроме крутелки работают.
Помогите решить проблему.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А пробдлема-то в чём? Разомкните физически и всё работает.

И да, кода не читал, вставьте как положено, тогда может кто и почитает.

maks_oteam
Offline
Зарегистрирован: 13.11.2018

Мне крутелка нужна, а физически разомкнуть я имел ввиду с пина провод убрать

maks_oteam
Offline
Зарегистрирован: 13.11.2018

maks_oteam пишет:

Добрый день. Помогите решить проблему. Имеется код управления джойстиком:

#include <Keypad.h>
const byte ROWS = 3; //four rows
const byte COLS = 4; //four columns

char hexaKeys[ROWS][COLS] = {
  {'6','x','4','a'},
  {'8','1','2','b'},
  {'7','3','5','c'}

};
byte colPins[COLS] = {
  6, 5, 4, 3}; //connect to the row pinouts of the keypad
byte rowPins[ROWS] = {
  9, 8, 7}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
}
void loop()
{
  char key = customKeypad.getKey();
  
  if (key != NO_KEY)
  { 
    Serial.println(key);
  }
  char LastJoystickKey;
  switch(key){
  case  'a':
  if(LastJoystickKey=='b'){
  Remote.next();
    delay(200);
    Remote.clear();
  }
  if(LastJoystickKey=='c'){
  Remote.previous(); 
    delay(200);
    Remote.clear();
  }
  break;
  case 'b':
  if(LastJoystickKey=='a'){
  Remote.previous(); 
    delay(200);
    Remote.clear();
  }
  if(LastJoystickKey=='c'){
  Remote.next();
    delay(200);
    Remote.clear();
  }
  break;
  case 'c':
  if(LastJoystickKey=='a'){
  Remote.next();
    delay(200);
    Remote.clear();
  }
  if(LastJoystickKey=='b'){
  Remote.previous(); 
    delay(200);
    Remote.clear();
  }
  break;
  default:{
  }
  if(key=='a'||key=='b'||key=='c'){
  LastJoystickKey=key;
  }  
}
if (key == '2'){
    Remote.play_pause();
    delay(10);
    Remote.clear();
  }
  if (key == '3'){
      Remote.decrease();
      delay(10);
      Remote.clear();
    }

    if (key == '1'){
      Remote.increase();
      delay(10);
      Remote.clear();
    }
}

 

На джойстике имеется крутелка (не энкодер), которая работает по принципу замыкания контактов как и кнопка. Крутелка имеет 3 положения (3 пары замыкания контактов). Замыкания происходят по схеме 4пин+7пин, 4пин+8пин, 4пин+9пин.
Вопрос в следующем: на крутелке постоянно замкнута одна из пар контактов, из-за этого код не хочет работать, если разомкнуть (физически), то код рабочий и все кнопки кроме крутелки работают.
Помогите решить проблему.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

maks_oteam пишет:
На джойстике имеется крутелка (не энкодер), которая работает по принципу замыкания контактов как и кнопка. Крутелка имеет 3 положения (3 пары замыкания контактов). Замыкания происходят по схеме 4пин+7пин, 4пин+8пин, 4пин+9пин.
Ну ясно же 4 пин на GND Ардуины; 7пин, 8пин, 9пин на пины Ардуины 2, 3,4. А дальше уже обрабатывать как отдельные кнопки. Странно почему в раздел программирования тему дали.

maks_oteam
Offline
Зарегистрирован: 13.11.2018

не помогло

b707
Offline
Зарегистрирован: 26.05.2017

maks_oteam пишет:

не помогло

что не помогло то?

Вы выражайтесь яснее - напишите четко, как оно должно работать и как оно сейчас "не работает" или работает не так.

Насколько я пониманию в автомобилях, крутилка там скорее всего что-то типа переключателя света или паузы в дворниках? - ваша ошибка в том, что по смыслу это не кнопка, а переключатель, оно с этим кодом работать не будет, тут логика другая нужна. Чтобы эту логику сформулировать - нужно то описание, которое я просил выше. Пока будете описывать - может и сами разберетесь, что в коде поменять.

maks_oteam
Offline
Зарегистрирован: 13.11.2018

С кнопками я думаю понятно. Принцип работы крутелки: крутится на 360 градусов, при этом имеет 3 положения(замыкания), всегда замкнута в каком-то положении

maks_oteam
Offline
Зарегистрирован: 13.11.2018

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
MaksVV
Offline
Зарегистрирован: 06.08.2015

нужна нормальная принципиальная схема чтобы было проще понять  как подключены кнопки. Не зная этого, делать что либо бесполезно

maks_oteam
Offline
Зарегистрирован: 13.11.2018

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, нет, нормально там всё с кнопками. Вот смотрите. Пины 3-6 ставим в INPUT и притягиваем к ... ну, скажем к земле. Пины 7-9 никогда не включаем в режим OUTPUT два сразу - только по одному.

Итак,

1) ставим пины 8 и 9 в INPUT, а пин 7 в OUTPUT и подаём на него HIGH. Если на одном (или больше) из пинов 3-6 появился HIGH, значит соответсвующая кнопка (1--3 или ENC1 нажата).

2) ставим пины 7 и 9 в INPUT, а пин 8 в OUTPUT и подаём на него HIGH. Если на одном (или больше) из пинов 3-6 появился HIGH, значит соответсвующая кнопка (4--6 или ENC2 нажата).

3) ставим пины 7 и 8 в INPUT, а пин 9 в OUTPUT и подаём на него HIGH. Если на одном (или больше) из пинов 3-6 появился HIGH, значит соответсвующая кнопка (7--9 или ENC3 нажата).

Вот так их все и сканируем постоянно. Нормально получается.

 

 

maks_oteam
Offline
Зарегистрирован: 13.11.2018

Спасибо за помощь

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, Вы поняли принцип опроса? Пример нужен, а то в соседней теме вроде валялся.

maks_oteam
Offline
Зарегистрирован: 13.11.2018

Да, понял

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот в этой теме есть описание похожей схемы, но там ещё диоды есть, чтобы пины не пожечь (помните моё замечание про "никогда два сразу", так вот там это не страшно). А у Вас на диодах сэкономили, но принци тот же. И там, кстати, тоже "подрулевые", посмотрите если интересно. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

ЕвгенийП пишет:

Да, нет, нормально там всё с кнопками. Вот смотрите. Пины 3-6 ставим в INPUT и притягиваем к ... ну, скажем к земле. Пины 7-9 никогда не включаем в режим OUTPUT два сразу - только по одному.

Итак,

1) ставим пины 8 и 9 в INPUT, а пин 7 в OUTPUT и подаём на него HIGH. Если на одном (или больше) из пинов 3-6 появился HIGH, значит соответсвующая кнопка (1--3 или ENC1 нажата).

2) ставим пины 7 и 9 в INPUT, а пин 8 в OUTPUT и подаём на него HIGH. Если на одном (или больше) из пинов 3-6 появился HIGH, значит соответсвующая кнопка (4--6 или ENC2 нажата).

3) ставим пины 7 и 8 в INPUT, а пин 9 в OUTPUT и подаём на него HIGH. Если на одном (или больше) из пинов 3-6 появился HIGH, значит соответсвующая кнопка (7--9 или ENC3 нажата).

Вот так их все и сканируем постоянно. Нормально получается.

 

 

спасибо, поучительно. как всегда от вас супер полезная инфа!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кстати, если пины 3-6 притянуть не к земле, а к питанию - всё то же самое, только HIHG везде на LOW заменяем.

maks_oteam
Offline
Зарегистрирован: 13.11.2018

ЕвгенийП пишет:

Кстати, если пины 3-6 притянуть не к земле, а к питанию - всё то же самое, только HIHG везде на LOW заменяем.

Спасибо

MaksVV
Offline
Зарегистрирован: 06.08.2015

это ведь матрица кнопок. Титановый велосипед клапы , я так понимаю, это поддерживает. Читаем внизу про марицу.  Т.к. диодов нет нужно использовать режим 1-Key rollover или 2-key rollover

взято оттуда 

rtyz
Offline
Зарегистрирован: 30.10.2019

получилось сделать? а то у меня мой код не хочет запускаться? 

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

rtyz пишет:

получилось сделать? а то у меня мой код не хочет запускаться? 


я запретил.
!секретная инфа - титановый велосипед пины матрицы не жгёть, хоть все провода скрути в кучку.
#всего то нужно при опросе матрицы в оутпут переводить только один пин, а отсальные должны быть в инпут.

*Kein Nagel, kein Zauberstab. Clapautius.

rtyz
Offline
Зарегистрирован: 30.10.2019

Клапауций 003 пишет:
rtyz пишет:

получилось сделать? а то у меня мой код не хочет запускаться? 

я запретил. !секретная инфа - титановый велосипед пины матрицы не жгёть, хоть все провода скрути в кучку. #всего то нужно при опросе матрицы в оутпут переводить только один пин, а отсальные должны быть в инпут. *Kein Nagel, kein Zauberstab. Clapautius.

это ведь матричный джойстик

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

rtyz пишет:

это ведь матричный джойстик

даже не знаю, что сказать по этому поводу.

ок. это что-то и, что?