Резистивные кнопки + arduino

DizzJk
Offline
Зарегистрирован: 29.11.2016

Вечер добрый! Написал в соседней ветке, а там тишина... короче, непроходите мимо, люди добрые...

Бьюсь со скетчем уже неделю, и к бабкам ходил, и с бубном прыгал, даже на шоу экстрасенсов звонил..... ничего не помогает.... вообще задача рулить треками резистивными кнопками с руля, для этого добавлены мультимедия кнопки (добавлен remote в файлы USBAPI.h, HID.cpp подробнее тут _ttp://stefanjones.ca/blog/arduino-leonardo-remote-multimedia-keys/), а прблема в том, что громкость регулируется, а переключение/перемотка нет, т.е. иногда может переключить(было 2 раза за неделю)

Схема подключения: к пину А0 подтянута через резистор 10КОм 5В, а к земле и А0 подключены кнопки с руля, но есть небольшая особенность, я вывел от руля 2 контакта  (одна из них масса и подключена а ардунио на массу) И 5В подключена на A0.

ARDUNIO Leonardo

Вот скетч:

//****************** Здесь необходимо указать свои значения ***************  

 

int analogPin=0; // пин для подключения кнопок, по умолчанию A0  

 

int release_button = 1023; // значение при отпущенных кнопках  

int button_release_range = 50; // диапазон значения + - при отпущенных кнопках  

int button_range = 30; // диапазон значения нажатых кнопок + -  

int time_holding = 500; // время для удержания кнопок в миллисекундах  

int time_tinkling = 40; // время исключающее дребезг контактов в миллисекундах  

int vol_up = 200; // значение кнопки увеличить громкость  

int vol_down = .400; // значение кнопки уменьшить громкость  

int next = 600; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании  

int previous = 800; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании  

 

//**************************************************************************  

 

 

int data;   

unsigned long flag = 0;   

unsigned long eventTime = 0;   

unsigned long pauseMillis = 0;  

 

void setup()   

{  

analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)  

Keyboard.begin();   

}   

 

void loop()   

{   

data=analogRead(analogPin);   

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 0)   

{   

eventTime=millis();   

}   

 

//********************** Громкость ************************************  

 

if(millis()-eventTime= vol_up - button_range && data <= vol_up + button_range && flag == 0)  

{    

Remote.increase();   

flag = 5;   

delay(10);   

Remote.clear();   

}   

 

if(millis()-eventTime>time_holding && data >= vol_up - button_range && data <= vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up + button_range && flag && flag == 3)   

{    

Remote.increase();  

flag = 3;   

Remote.clear();   

delay(100);   

}   

 

if(millis()-eventTime= vol_down - button_range && data <= vol_down + button_range && flag == 0)   

{    

Remote.decrease();   

flag = 6;   

delay(10);   

Remote.clear();   

}   

 

if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <= vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <= vol_down + button_range && flag == 3)   

{    

Remote.decrease();   

flag = 3;   

Remote.clear();   

delay(100);   

}   

 

 

//********************** Next и Fast Forward ************************************    

 

if(millis()-eventTime= next - button_range && data <= next + button_range)   

{    

flag = 2;   

}   

 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 2)   

{   

Remote.next();   

flag = 0;   

delay(10);   

Remote.clear();   

}   

 

 

//********************** Previous и Rewind ************************************    

 

if(millis()-eventTime= previous - button_range && data <= previous + button_range)   

{    

flag = 4;   

}   

 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 4)   

{   

Remote.previous();   

flag = 0;   

delay(10);   

Remote.clear();   

}   

 

  

}

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Вы, когда тему создали, могли заметить ПРЯМО над вашей темой - прилепленная тема о том, КАК, ЧОРТ ВОЗЬМИ, ВСТАВЛЯТЬ КОД.

Сделайте это пожалуйста. Если не понимате зачем - то просто в знак уважения к правилам этого дома.

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

wdrakula пишет:

Сделайте это пожалуйста.

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

DizzJk
Offline
Зарегистрирован: 29.11.2016

wdrakula пишет:

Вы, когда тему создали, могли заметить ПРЯМО над вашей темой - прилепленная тема о том, КАК, ЧОРТ ВОЗЬМИ, ВСТАВЛЯТЬ КОД.

Сделайте это пожалуйста. Если не понимате зачем - то просто в знак уважения к правилам этого дома.

Сижу с телефона га работе, чет никак не выходит (((

В хроме с включенной галочкой полная версия, появилась строка, надеюсь это поможет

//****************** Здесь необходимо указать свои значения ***************  

 

int analogPin=0; // пин для подключения кнопок, по умолчанию A0  

 

int release_button = 1023; // значение при отпущенных кнопках  

int button_release_range = 50; // диапазон значения + - при отпущенных кнопках  

int button_range = 30; // диапазон значения нажатых кнопок + -  

int time_holding = 500; // время для удержания кнопок в миллисекундах  

int time_tinkling = 40; // время исключающее дребезг контактов в миллисекундах  

int vol_up = 200; // значение кнопки увеличить громкость  

int vol_down = .400; // значение кнопки уменьшить громкость  

int next = 600; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании  

int previous = 800; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании  

 

//**************************************************************************  

 

 

int data;   

unsigned long flag = 0;   

unsigned long eventTime = 0;   

unsigned long pauseMillis = 0;  

 

void setup()   

{  

analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)  

Keyboard.begin();   

}   

 

void loop()   

{   

data=analogRead(analogPin);   

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 0)   

{   

eventTime=millis();   

}   

 

//********************** Громкость ************************************  

 

if(millis()-eventTime= vol_up - button_range && data <= vol_up + button_range && flag == 0)  

{    

Remote.increase();   

flag = 5;   

delay(10);   

Remote.clear();   

}   

 

if(millis()-eventTime>time_holding && data >= vol_up - button_range && data <= vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up + button_range && flag && flag == 3)   

{    

Remote.increase();  

flag = 3;   

Remote.clear();   

delay(100);   

}   

 

if(millis()-eventTime= vol_down - button_range && data <= vol_down + button_range && flag == 0)   

{    

Remote.decrease();   

flag = 6;   

delay(10);   

Remote.clear();   

}   

 

if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <= vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <= vol_down + button_range && flag == 3)   

{    

Remote.decrease();   

flag = 3;   

Remote.clear();   

delay(100);   

}   

 

 

//********************** Next и Fast Forward ************************************    

 

if(millis()-eventTime= next - button_range && data <= next + button_range)   

{    

flag = 2;   

}   

 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 2)   

{   

Remote.next();   

flag = 0;   

delay(10);   

Remote.clear();   

}   

 

 

//********************** Previous и Rewind ************************************    

 

if(millis()-eventTime= previous - button_range && data <= previous + button_range)   

{    

flag = 4;   

}   

 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 4)   

{   

Remote.previous();   

flag = 0;   

delay(10);   

Remote.clear();   

}   

 

  

}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1.поглядите на строки 147 и 179 и попытайтесь понять, что за херня там написана.

2. дело даже не в том, что перепутан = и ==, там не это, там просто куска кода нет. Я не стану выяснять - какого. Раз Вы это не увидели - значит код не Ваш. А с чужим кодом - это за бабки в "Ищу исполнителя".

DizzJk
Offline
Зарегистрирован: 29.11.2016

ни разу не претендовал на авторство того кода, меня даже больше интересует правильность подключения, которое я описал в 1 посте. а свой код вот, но и сним ни черта не работает (в смысле громкость работает, а переключение никак) (((((

int analogPin=0;
int data;

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

void loop()
{
  data=analogRead(analogPin); //читаем значение нажатой кнопки
  Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
  if (data>=190 && data<=220) 
    {
      Remote.increase();  // громкость +
       delay(100);
      Remote.clear();
    }
  if (data>=390 && data<=420)  // громкость -
    {
      Remote.decrease();
       delay(100);
      Remote.clear();
    }
       if (data>=590 && data<=620)  // следующий трек
    {
      Remote.next();
       delay(100);
      Remote.clear();
    }
         if (data>=790 && data<=820)  // предыдущий трек
    {
      Remote.previous();
       delay(100);
      Remote.clear();
    }
     }

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DizzJk пишет:

Схема подключения: к пину А0 подтянута через резистор 10КОм 5В, а к земле и А0 подключены кнопки с руля, но есть небольшая особенность, я вывел от руля 2 контакта  (одна из них масса и подключена а ардунио на массу) И 5В подключена на A0.

Если Вы про это описание, то в нем я почти ничего не понял. Напишите внятно и нарисуйте.

А так - что за два провода? Зачем и куда? Ничерта не ясно.

Код, который вы привели как свой- должен работать, если значения соответствуют и ремоут работает. Вы проверяли ремоут отдельно и что выдает монитор порта?

DizzJk
Offline
Зарегистрирован: 29.11.2016

С рисованием туго на телефоне. Пробую внятное описать: 10КОм резистор идет от контакта А0 к 5в на ардунии, от руля с резистивными кнопками вывел 2 провода, и подключил их к GND и А0 на ардунио. Но есть особенность, на контактах, которые идут от руля уже присутствует 5В.

Монитор порта выдает 1023 при нажатии на кнопки, значения меняются на те что я указал в скетче

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DizzJk пишет:

Но есть особенность, на контактах, которые идут от руля уже присутствует 5В.

Вот эта фраза так и осталась мне непонятной. %)

Но если монитор порта так выдает, то все должно работать. Проверьте сам ремоут отдельно просто командами с ком-порта.

через Serial.read(). В таком коде, как Вы привели, просто негде ошибиться. Все должно работать.

DizzJk
Offline
Зарегистрирован: 29.11.2016

Такая схема

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

то есть кнопки подтянуты к +5 еще и на руле? тогда на контроллере подтяжка уже не нужна, но 10К - ни на что не повлияют. Вообще не приципиально.

Больше +5 могут прийти от руля? Это единственный риск.

А код ремоут все-таки проверьте отдельно.

=============

все вышесказанное верно, если +5 на руле не грязные. если там помехи, это может быть проблеммой.

DizzJk
Offline
Зарегистрирован: 29.11.2016

У меня в машине Кан Шина и поэтому пришлось от сим модуля кинуть 2 провода, и видимо в этом модуле добавляется 5в . т.е я подпаял не к самим кнопкам, а уже когда они приходят на сим модуль

 

Перепроверю все, больше 5 не должно прийти.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

и еще просто любопытно: а чем вы управляете через HID, в машине?... Я - прям сильно удивлен - никак придумать не могу!

DizzJk
Offline
Зарегистрирован: 29.11.2016

wdrakula пишет:

и еще просто любопытно: а чем вы управляете через HID, в машине?... Я - прям сильно удивлен - никак придумать не могу!

Давай на ты, если не против, у меня стоит комп в машине carpc как у нас принято его называть, он и рулит аудиосистемой

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ясно. Комп - это хорошо.

У меня - одна из машин - кемпер (Hymer Camp 622 CL). Я на нем по Европе катаюсь... Ну, когда есть пара лишних копеек ;).

Я все хочу на него общий комп сделать, чтобы в нем и музыку и навигацию и управление всем питанием, техникой (холодильник, отопление, вода) ...и прочее собрать. Может тарелку еще с автонаведением на спутник... кондей на крыше, если поставлю.

На американских кемперах (ну, сам знаешь, там это целая культура) все удобнее придумано, чем на немецких, как мой. Но американцы и сильно больше по размерам.

DizzJk
Offline
Зарегистрирован: 29.11.2016

Блин, прям моя мечта, на кемпере по Европе, а то появилась копеечка и вместо авантюризма надо было решать жилищный вопрос, сейчас 2 ребенок 3 мес... и все откладывается на неопределенный срок. А на легковушке много не накатаешь тем более в 4 ром.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Мой кемпер, если посмотришь в гугле - как раз на папа+мама + двое детей (на корме - детская зона из двух коек одна-над-другой). Но я катаюсь только с женой. У меня, слава Б..гу, один сын и уже папа.

DizzJk
Offline
Зарегистрирован: 29.11.2016

Конечно сразу посмотрел на твою хату)). Зачетная! Надеюсь тоже осуществлю мечту)

DizzJk
Offline
Зарегистрирован: 29.11.2016

Мистика, вчера вечером заработало, и сегодня утром работает как так...