Эмулятор клавиатуры usb с резистивными кнопками. Проблема с зависанием arduino.
- Войдите на сайт для отправки комментариев
Вс, 03/01/2016 - 12:32
Здравствуйте есть скетч и ардуино про микро. собран эмулятор клавиатуры с резистивными кнопками. Все отлично работает. Но есть проблема. если планшет включается уже вместе с физически подключенным эмулятором, то эмулятор зависает до отключения и подключения обратно или reset .... на другом планшете все работает отлично. Подскажите может кто знает как можно победить проблему??
//****************** Здесь необходимо указать свои значения *************** int analogPin=0; // пин для подключения кнопок, по умолчанию A0 int release_button = 0; // значение при отпущенных кнопках int button_release_range = 200; // диапазон значения + - при отпущенных кнопках int button_range = 7; // диапазон значения нажатых кнопок + - int time_holding = 500; // время для удержания кнопок в миллисекундах int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах int vol_up = 470; // значение кнопки увеличить громкость int vol_down = 563; // значение кнопки уменьшить громкость int alt_tab = 795; // значение кнопки которая будет работать как Alt + Tab int next = 740; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании int previous = 689; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании int play_pause = 933; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании int f3 = 492; int f4 = 513; //************************************************************************* 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, key_mute, FALLING); 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()-time_tinkling && millis()-eventTime<time_holding-1 && data >= f3 - button_range && data <= f3 + button_range && flag == 0) //f3 начало { Keyboard.press(KEY_F3); flag = 5; delay(10); Keyboard.releaseAll(); }//f3 конец if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= f4 - button_range && data <= f4 + button_range && flag == 0) //f4 начало { Keyboard.press(KEY_F4); flag = 5; delay(10); Keyboard.releaseAll(); }//f4 конец if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_up - button_range && data <= vol_up + button_range && flag == 0) { Keyboard.press(KEY_F1); flag = 5; delay(10); Keyboard.releaseAll(); } 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) { Keyboard.press(KEY_F2); flag = 6; delay(10); Keyboard.releaseAll(); } 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; } } 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();}