15.06.2015, 18:15 | #1 |
Старший Пользователь
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
|
Encoder + Arduino + Резистивные кнопки
В принципе в машине минимальный набор кнопок для любого кар-писишника это: Vol+, Vol-, AltTab, Previous и Rewind.Что на форуме уже реализовано в сообщении уважаемого lti1
есть ещё куча примеров и уроков как здесь на форуме так и на просторах инета о том как прикрутить энкодер к ардуине например вот http://www.pccar.ru/showthread.php?t=20222 Теперь для меня встал вопрос как это объединить в один скетч и что бы это всё работало как клавиатура при подключении к любому PC в том числе и планшету. Прошу помощи знающих и ведающих програмированием Последний раз редактировалось admin; 27.03.2017 в 02:07. |
16.06.2015, 02:08 | #2 |
Гуру
Регистрация: 20.07.2009
Город: Минск
Регион: Беларусь
Сообщений: 1,543
|
теория
http://arduino.ru/forum/programmirov...ra-pod-android коды клавиш https://code.google.com/p/androhid/wiki/Keycodes ардуина годится любая, которая подключается напрямую к USB, без всяких USB-Serial мостов (FT232, CH340 etc.) Читаем ссылки до полного просветления. Задаем вопросы, хотя там и так все понятно: прикидываемся USB-клавой, скетчем обрабатываем кнопки и энкодер, посылаем нужные сканкоды клавиатуры. Будет работать в любом аппарате на Андроид с поддержкой OTG.
__________________
Мой проект: Citroen Xsara Android CarPC Последний раз редактировалось admin; 27.03.2017 в 02:07. |
16.06.2015, 15:17 | #3 |
Старший Пользователь
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
|
Спасибо за ликбез, но это я всё читал и ничего непонятно. Мои знания в програмировании заканчиваются на школьном уровне, это как построить космический корабль кандидату юридических наук.
Прошу помощи в предложениях что где и куда писать? вот так выглядит рабочий скетч для энкодера PHP код:
PHP код:
подскажите как их объединить? Последний раз редактировалось admin; 27.03.2017 в 02:08. |
18.06.2015, 19:28 | #4 |
Старший Пользователь
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
|
Нашел ещё одну тему
http://www.pccar.ru/showthread.php?t=20222 может всё таки кто нибудь подключится? или все грамотные а делиться грамотой стыдно? Едиственное там все регулировки делаются фубаром, а хотелось бы на прямую в ОС регулировать громкость
__________________
AUDI A6 (C5) V6 2.8L |
19.06.2015, 00:15 | #5 |
Гуру
Регистрация: 20.07.2009
Город: Минск
Регион: Беларусь
Сообщений: 1,543
|
Собрал два вместе
Откуда эти либы Keyboard и Remote - лучше спросить в тех ветках, откуда взяты эти куски кода. PHP код:
__________________
Мой проект: Citroen Xsara Android CarPC |
23.06.2015, 14:42 | #6 |
Старший Пользователь
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
|
Спасибо за сборку данного скетча, и с библиотеками всё норм, ни каких ошибок нет.
Но вот почему-то часть отвечающая за энкодер не работает при чем не могу понять почему((( Пытался заставить работать скетч с энкодером не получается, как он у меня заработал в прошлый раз не могу понять может сделать всю сборку попроще типа вот такой? PHP код:
__________________
AUDI A6 (C5) V6 2.8L Последний раз редактировалось TransF; 23.06.2015 в 16:25. |
03.07.2015, 20:39 | #7 |
Новый Пользователь
Регистрация: 03.07.2015
Возраст: 35
Регион: 66, 96
Машина: нет
Сообщений: 1
|
Решил сделать Encoder + Arduino + Резистивные кнопки.
Только у меня другой подход. Я хочу сделать плату на Atmega8. Размеры платы не более 5х5 см. В плату будут подключаться резистивные кнопки и энкодер. Мультимедиа клавишы 3 цифровых входа Энкодер VOL+ //// VOL- //// MUTE //// UNMUTE 5 ¬ходов кнопки матрица 5х4 1 Play/Pause 2 Stop 3 Next 4 Previous 5 Brightness+ 6 Brightness- 7 Power 8 Reset 9 Forward 10 Back 11 Refresh 12 Full Screen 13 Sleep 14 Tab 15 Enter 16 Space 17 Lock 18 Reserve 19 Reserve 20 Reserve Схема соединений уже нарисована, плата разведена. Осталось сделать печатные платы и прошить. Нужны соискатели готовые приобрести плату (без компонентов). 10 плат обойдется в 20$, 2$ за штуку при условии 10 человек. Жду вопросов и предложений. Последний раз редактировалось admin; 27.03.2017 в 15:06. |
07.07.2015, 10:39 | #8 | ||
Старший Пользователь
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
|
Цитата:
Ардуино всё таки универсальная штуковина и каждый может настроить ее как ему удобно, а в Вашем сообщении только слова. Есть хотя бы макетка или пример который реально существует и работает? Посидев на разных форумах и почитав сообщения умных (не то что я) людей практически собрал полноценный пульт на ардуине. ))) Чуть позже выложу схему и скетч)))
__________________
AUDI A6 (C5) V6 2.8L Последний раз редактировалось admin; 27.03.2017 в 15:07. |
||
09.07.2015, 18:55 | #9 |
Старший Пользователь
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
|
И так:
поиски по инету и общение с грамотными людьми дало свои результаты 1.100% работающий код для энкодера Код:
//Скетч регулятора громкости на энкодере для Arduino PRO MICRO // энкодер на 8 и 9 пинах выводы подтянуты к питанию, // конденсаторы на землю желательно. //кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно. void setup() { PCICR=1<<PCIE0; PCMSK0=(1<<PCINT5)|(1<<PCINT4); pinMode (7,INPUT_PULLUP); pinMode (8,INPUT); pinMode (9,INPUT); attachInterrupt(4, key_mute, FALLING); Remote.begin(); } void loop() { } 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();} if (old_n==16&&new_n==48||old_n==32&&new_n==0) {Remote.decrease();} old_n= new_n; } void key_mute() {Remote.mute();} http://arduino.ru/forum/programmirov...comment-111864 2. так же как и у всех тут на форуме работающий скетч от lti1 Сочленение этих двух скетчей ни выдает ни каких ошибок, проходит компиляцию, но работают только кнопки не могу понять в чем проблема. может у кого есть идеи где ошибка в скетче обьедененном? Код:
//****************** Здесь необходимо указать свои значения *************** int analogPin=0; // пин для подключения кнопок, по умолчанию A0 int release_button = 1023; // значение при отпущенных кнопках int button_release_range = 50; // диапазон значения + - при отпущенных кнопках int button_range = 20; // диапазон значения нажатых кнопок + - int time_holding = 500; // время для удержания кнопок в миллисекундах int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах int vol_up = 130; // значение кнопки увеличить громкость int vol_down = 340; // значение кнопки уменьшить громкость int alt_tab = 380; // значение кнопки которая будет работать как Alt + Tab int next = 470; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании int previous = 600; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании int play_pause = 700; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании //************************************************************************** int data; unsigned long flag = 0; unsigned long eventTime = 0; unsigned long pauseMillis = 0; void setup() { PCICR = 1<<PCIE0; PCMSK0 = (1<<PCINT5)|(1<<PCINT4); pinMode (7,INPUT_PULLUP); pinMode (8,INPUT); pinMode (9,INPUT); attachInterrupt(4, keyMute, FALLING); Remote.begin(); Keyboard.begin(); } ISR (PCINT0_vect) { static byte old_n = PINB&B11000000; byte new_n = PINB&B11000000; if (old_n == 32&&new_n==48 || old_n == 16&&new_n == 0) {Remote.increase();} if (old_n == 16&&new_n==48 || old_n == 32&&new_n == 0) {Remote.decrease();} old_n = new_n; } void keyMute() { Remote.mute(); } void loop() { data = analogRead(analogPin); if (data >= release_button - button_release_range && data <= release_button + button_release_range && flag == 0) { eventTime = millis(); } //********************** Громкость ************************************ if (millis() - time_tinkling && millis() - eventTime < time_holding-1 && data >= 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() - time_tinkling && millis() - eventTime < time_holding-1 && data >= 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); } //********************** AltTab + Ещё что то ************************************ if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= alt_tab - button_range && data <= alt_tab + button_range) { flag = 1; } if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis == 0) { Keyboard.press(KEY_LEFT_ALT); Keyboard.press(KEY_TAB); Keyboard.release(KEY_TAB); Keyboard.press(KEY_TAB); Keyboard.release(KEY_TAB); flag = 0; pauseMillis = millis(); } if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis != 0) { Keyboard.press(KEY_TAB); Keyboard.release(KEY_TAB); flag = 0; pauseMillis = millis(); } if(pauseMillis && millis()-pauseMillis >= 800 && data>=release_button - button_release_range && data<=release_button + button_release_range) { flag = 0; pauseMillis = 0; Keyboard.releaseAll(); } if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <= alt_tab + button_range && flag == 1) { flag = 0; } //********************** Next и Fast Forward ************************************ if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= 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(); } if(millis()-eventTime>time_holding && data >= next - button_range && data <= next + button_range && flag == 2 || data >= next - button_range && data <= next + button_range && flag == 3) { Remote.forward(); flag = 3; Remote.clear(); delay(100); } //********************** Previous и Rewind ************************************ if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= 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(); } if(millis()-eventTime>time_holding && data >= previous - button_range && data <= previous + button_range && flag == 4 || data >= previous - button_range && data <= previous + button_range && flag == 3) { Remote.rewind(); flag = 3; Remote.clear(); delay(100); } //********************** Play/pause + Mute ************************************ if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause - button_range && data <= play_pause + button_range) { flag = 7; } if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 7) { Remote.play_pause(); flag = 0; delay(10); Remote.clear(); } if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <= play_pause + button_range && flag == 7) { Remote.mute(); flag = 0; delay(10); Remote.clear(); } if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 3 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 5 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 6) { flag = 0; } }
__________________
AUDI A6 (C5) V6 2.8L |
23.07.2015, 14:59 | #10 |
Старший Пользователь
Регистрация: 14.06.2009
Город: Ставрополь
Регион: 26
Машина: AUDI A6 (C5) 2000г.в. V6 2.8L
Сообщений: 131
|
Уважаемый lti1 прислал мне свой скетч для энекодера
Код HTML:
//Скетч регулятора громкости на энкодере для Arduino PRO MICRO // энкодер на 8 и 9 пинах выводы подтянуты к питанию, // конденсаторы на землю желательно. //кнопка энкодера на 7 ноге, притянута к + программно. конденсатор желательно. void setup() { PCICR=1<<PCIE0; PCMSK0=(1<<PCINT5)|(1<<PCINT4); pinMode (7,INPUT_PULLUP); pinMode (8,INPUT); pinMode (9,INPUT); attachInterrupt(4, key_mute, FALLING); Keyboard.begin(); } void loop() { } 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(10); Remote.clear();} old_n= new_n; } void key_mute() { Remote.mute(); delay(10); Remote.clear();} Но видимо у меня кривые руки не могу обьеденить скетч для кнопок и энкодера. Хочу переделать теперь кнопки потому как щелчки не красивые и именно они дают дребезг при нажатии на кнопки хотя новые
__________________
AUDI A6 (C5) V6 2.8L |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|