Резистивная клавиатура на Arduino pro micro

Автор: Tonich от 23-03-2016, 12:07

Резистивная клавиатура на Arduino pro micro

Один из первых моих проектов на Arduino. Устройство предназначено для использования совместно с ПК или планшетом, для расширения возможностей стандартной клавиатуры.

Резистивная клавиатура на Arduino pro micro


Резистивные кнопки подключаются к аналоговому входу A0, при нажатии кнопки на АЦП контроллера появляется определённый уровень напряжения и эмулируется нажатие клавиатурной клавиши.
Описание библиотеки MouseKeyboard.

Я использовал данный контроллер для обработки нажатий резистивного подрулевого джойстика в автомобиле. Обрабатываются клавиши управление громкостью и Mute, переключения треков(при коротком нажатии) и перемотки(при удержании), а также воспроизведение/пауза (при длительном нажатии) и ALT+TAB при коротком. Можно назначить большое количество других клавиш или их комбинаций.
В данной схеме можно изменить количество кнопок, подобрав сопротивления резисторов.

int analogPin=0;    //пин для подключения кнопок 
int data; 
unsigned long flag = 0; 
unsigned long eventTime = 0; 
unsigned long pauseMillis = 0; 

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

void loop() 
{ 
  data=analogRead(analogPin); //читаем значение нажатой кнопки 
  
//********************** Громкость ************************************ 

  if(data<=175 && flag == 0) // все кнопки отпущены 
  { 
    eventTime=millis(); 
  } 

 // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=881 && data<=901 && flag == 0)  
  {  
    Remote.increase(); 
    flag = 5; 
    delay(10); 
    Remote.clear(); 
  } 
  // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  if(millis()-eventTime>500 && data>=881 && data<=901 && flag == 5 || data>=881 && data<=901 && flag == 3)  
  {  
    Remote.increase(); // действие после удержание кнопки, Увеличить громкость каждые 0,1 секунды 
    flag = 3; 
    Remote.clear(); 
    delay(100); 
  } 
  
  // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=961 && data<=981 && flag == 0)  
  {  
    Remote.decrease(); 
    flag = 6; 
    delay(10); 
    Remote.clear(); 
  } 
  
  
  // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  if(millis()-eventTime>500 && data>=961 && data<=981 && flag == 6 || data>=961 && data<=981 && flag == 3)  
  {  
    Remote.decrease(); // действие после удержание кнопки, Уменьшить громкость каждые 0,1 секунды 
    flag = 3; 
    Remote.clear(); 
    delay(100); 
  } 

  //********************** AltTab + Play/pause ************************************     
  // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=490 && data<=510)  
  {  
    flag = 1; 
  } 

  if(data<=175 && flag == 1 && pauseMillis == 0) // действие после короткого нажатия кнопки, Alt+Tab 
  { 
    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<=175 && flag == 1 && pauseMillis != 0) // действие после короткого повторного нажатия кнопки, Alt+Tab 
  { 
    Keyboard.press(KEY_TAB); 
    Keyboard.release(KEY_TAB); 
    flag = 0; 
    pauseMillis = millis(); 
  } 

  if(pauseMillis && millis()-pauseMillis >= 800 && data<=175) // && flag == 7 && data<=175) 
  { 
    flag = 0; 
    pauseMillis = 0; 
    Keyboard.releaseAll(); 
  } 
  
 // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500) 
  if(millis()-eventTime>500 && data>=490 && data<=510 && flag == 1) 
  {  
    Remote.play_pause(); // действие после удержание кнопки, воспроизведение / пауза 
    flag = 0; 
    delay(10); 
    Remote.clear(); 
  } 
  //********************** Next и Fast Forward ************************************     
  // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=644 && data<=664)  
  {  
    flag = 2; 
  } 

  if(data<=175 && flag == 2) // действие после короткого нажатия кнопки, Next 
  { 
    Remote.next(); 
    flag = 0; 
    delay(10); 
    Remote.clear(); 
  } 

 // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  if(millis()-eventTime>500 && data>=644 && data<=664 && flag == 2 || data>=644 && data<=664 && flag == 3)  
  {  
    Remote.forward(); // действие после удержание кнопки, Fast Forward 
    flag = 3; 
    Remote.clear(); 
    delay(100); 
  } 
  //********************** Previous и Rewind ************************************     
  // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=775 && data<=795)  
  {  
    flag = 4; 
  } 

  if(data<=175 && flag == 4) // действие после короткого нажатия кнопки, Previous 
  { 
    Remote.previous(); 
    flag = 0; 
    delay(10); 
    Remote.clear(); 
  } 
  // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  if(millis()-eventTime>500 && data>=775 && data<=795 && flag == 4 || data>=775 && data<=795 && flag == 3)  
  {  
    Remote.rewind(); // действие после удержание кнопки, Rewind 
    flag = 3; 
    Remote.clear(); 
    delay(100); 
  } 

  if(data<=175 && flag == 3 || data<=175 && flag == 5 || data<=175 && flag == 6) // действие после отпускания кнопки 
  { 
    flag = 0; 
  }    
}    


Скачать скетч: resistkeyboard.ino [5,68 Kb] (cкачиваний: 536)

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.