PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Дополнительные устройства (http://pccar.ru/forumdisplay.php?f=177)
-   -   Резистивные кнопки под андроид (http://pccar.ru/showthread.php?t=18478)

armlive 20.01.2014 22:23

Цитата:

Сообщение от ilya174 (Сообщение 283923)
Это для Arduino Leonardo, у меня UNO

А действие кода на две команды пробовал прописать?
Внутри стоит, поэкспериментировать не могу, но я бы на действие кнопки к примеру сделал
если нажата кнопка ALT, то отправляем и код кнопки TAB.
тяжело вспомнить азы программирования, когда 15 лет этим уже не занимался
Код:

LastKeyPressed = CH_TAB;
        buf[0] = (код клавиши альт);
        buf[2]=CH_TA)B;
        LastTimeKeyPressed = TimeKeyPressed;
    Serial.write(buf, 8);       
    releaseKey();       
      }

Но я бы сделал на оборот
Код:

LastKeyPressed = CH_LEFT_ALT;
        buf[0] = (код клавиши TAB);
        buf[2]=CH_LEFT_ALT;
        LastTimeKeyPressed = TimeKeyPressed;
    Serial.write(buf, 8);       
    releaseKey();       
      }


ilya174 21.01.2014 21:06

Так пробовал. На windows 7 окна переключаются, причем ни как если с клавиатуры нажимать ALT+TAB появляется маленькое окошко с запущенными программами и там уже выбираешь нужное окно, а просто идет перебор открытых окон как на XP. Но вот андроид почему-то никак не реагирует на такую комбинацию.

Andrey_61 21.01.2014 23:25

Народ, на тему Alt+Tab не совсем верный алгоритм.
Надо не отправлять Alt+Tab постоянно, а зажать Alt и удерживая его отправлять Tab

вот кусок моего кода при получении команды с ИК-пульта (требуется доп библиотека Timer.h)
Код для Leonardo, но думаю можно адаптировать и под UNO

Код:

boolean altTabFirstPress = HIGH; //Первое нажатие alt+tab
int altTabTimer; //Таймер ALT+TAB

....
    if(событие){ 
      if(boolean(altTabFirstPress)==HIGH){ //Если это нажатие первое
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер (1000мс) сброса ALT+TAB
        altTabFirstPress = LOW; //Сбрасываем переменную
        Keyboard.press(KEY_ALT); //Нажимаем Alt
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Alt
      }
      else{ //Если это нажатие НЕ первое
        timer.stop(altTabTimer); //Останавливаем таймер сброса ALT+TAB
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Tab
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер сброса ALT+TAB снова     
      }
....

//отпускаем Alt+Tab
void resetAltTab (){
  altTabFirstPress = HIGH; //Устанавливаем переменную
  Keyboard.releaseAll(); //Отпускаем все кнопки, для UNO как я понимаю придется прописать каждую кнопку отдельно
}


armlive 21.01.2014 23:48

Я нашел, что в андроиде есть своя одна команда для этих целей,
Цитата:

APP_SWITCH (RECENT_APP) – вызов панели «Недавние» с возможностью переключаться между приложениями (либо вызов диспетчера приложений в зависимости от прошивки. APP_SWITCH или RECENT_APP зависит от производителя и прошивки, так в HTC это APP_SWITCH, а в Gigabyte Gsmart это RECENT_APP)
Надо найти методом подбора в нексусе

ilya174 22.01.2014 08:18

Цитата:

Сообщение от armlive (Сообщение 284063)
Я нашел, что в андроиде есть своя одна команда для этих целей,

Надо найти методом подбора в нексусе

Обе команды пробовал в нексусе- не заработало.

armlive 22.01.2014 11:12

Цитата:

Сообщение от ilya174 (Сообщение 284094)
Обе команды пробовал в нексусе- не заработало.

Я же написал, нужно подбирать из тех, что есть в нексусе

Chubaka885 11.02.2014 09:38

Цитата:

Сообщение от Andrey_61 (Сообщение 284055)
Народ, на тему Alt+Tab не совсем верный алгоритм.
Надо не отправлять Alt+Tab постоянно, а зажать Alt и удерживая его отправлять Tab

вот кусок моего кода при получении команды с ИК-пульта (требуется доп библиотека Timer.h)
Код для Leonardo, но думаю можно адаптировать и под UNO

Код:

boolean altTabFirstPress = HIGH; //Первое нажатие alt+tab
int altTabTimer; //Таймер ALT+TAB

....
    if(событие){ 
      if(boolean(altTabFirstPress)==HIGH){ //Если это нажатие первое
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер (1000мс) сброса ALT+TAB
        altTabFirstPress = LOW; //Сбрасываем переменную
        Keyboard.press(KEY_ALT); //Нажимаем Alt
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Alt
      }
      else{ //Если это нажатие НЕ первое
        timer.stop(altTabTimer); //Останавливаем таймер сброса ALT+TAB
        Keyboard.press(KEY_TAB); //Нажимаем Tab
        Keyboard.release(KEY_TAB); //Отпускаем Tab
        altTabTimer = timer.after(1000, resetAltTab); //Запускаем таймер сброса ALT+TAB снова     
      }
....

//отпускаем Alt+Tab
void resetAltTab (){
  altTabFirstPress = HIGH; //Устанавливаем переменную
  Keyboard.releaseAll(); //Отпускаем все кнопки, для UNO как я понимаю придется прописать каждую кнопку отдельно
}


Почему то ругается на timer.after.... Говорит что timer не декларирован. Хотя библиотеку Timer скопировал в либы программы. В начале скетча добавил Timer.h

Chubaka885 22.02.2014 22:32

А кто нибудь реализовал на одной резистивной кнопке одиночное нажатие и удержание? Не поделитесь. А то никак не могу догнать как сделать(((

Вот вроде сделал, но при нажатии и удержании функция по одиночному нажатию всё равно сначала проходит.

Код:

int buttonPin=6; //пин для резистивных кнопок
int data;
int flag=0;
long previousMillis = 0;
int val=0;

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

void loop()
{
 data=analogRead(buttonPin); //читаем значение нажатой кнопки
 Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
 
  if (data<=900) //если нажата любая из кнопок начинается отсчёт
  {
    if (millis() -previousMillis >200)   
    {
      previousMillis = millis();   
      val++;

//кнопка громкости +
      if (data>=210 && data<=232 && flag==0 && val==1)  //одиночное нажатие
      {
      Remote.increase(); //прибавить громкость на ед.
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data>=210 && data<=232 && val>=2)  // удержание
      {
      Remote.increase(); //прибавлять громкость до отпускания
      Remote.clear();
      val=0;
      }

//кнопка громкости -
      if (data>=460 && data<=488 && flag==0 && val>=1 && val<=3)  //одиночное нажатие
      {
      Remote.decrease(); //убавить громкость на ед.
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data>=460 && data<=488 && val>=4)  //удержание
      {
      Remote.decrease(); //убавлять громкость до отпускания
      Remote.clear();
      val=0;
      }

//кнопка следующий трек
      if (data==0 && flag==0 && val==1)  //одиночное нажатие
      {
      Remote.next(); //следующий трек
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data==0 && val>=2)  //удержание
      {
      Remote.forward(); //перемотка вперёд
      Remote.clear();
      val=0;
      }
 
//кнопка предидущий трек
      if (data>=76 && data<=92 && flag==0 && val>=1 && val<=5)  //одиночное нажатие
      {
      Remote.previous(); //предидущий трек
      Remote.clear();
      flag=1;
      val=0;
      }
      if (data>=76 && data<=92 && val>=6)  //удержание
      {
      Remote.rewind(); //перемотка назад
      Remote.clear();
      val=0;
      }
   
//кнопка приглушения звука
      if (data>=565 && data<=594 && flag==0)  //нажата кнопка
      {
      Remote.mute();
      Remote.clear();
      flag=1;
      val=0;
      }
    }
  }
//не нажата не одна из кнопок
  if (data>=950 && data<=960 && flag==1)
  {
  flag=0;
  }
}


lti1 22.02.2014 23:26

Цитата:

Сообщение от Chubaka885 (Сообщение 288404)
А кто нибудь реализовал на одной резистивной кнопке одиночное нажатие и удержание? Не поделитесь. А то никак не могу догнать как сделать(((

Вот вроде сделал, но при нажатии и удержании функция по одиночному нажатию всё равно сначала проходит.

Алгоритм такой: короткое нажатие, более 100 и менее 500 миллисекунд - Play/pause; длинное, более 500 миллисекунд - Mute.
Тоже самое с Next и Fast Forward, Previous и Rewind. При удержании увеличения и уменьшения громкости, увеличивает или уменьшает громкость на 10 делений в секунду, а при коротком нажатии, менее 500 миллисекунд - увеличивает или уменьшает громкость на 1 деление.
Код:

int analogPin=0;
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;

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

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

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

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=600 && data<=630 && flag == 0) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    Remote.increase();
    flag = 5;
    delay(10);
    Remote.clear();
  }

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

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=500 && data<=530 && flag == 0) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    Remote.decrease();
    flag = 6;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=500 && data<=530 && flag == 6 || data>=500 && data<=530 && flag == 3) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.decrease(); // действие после удержание кнопки, Уменьшить громкость каждые 0,1 секунды
    flag = 3;
    Remote.clear();
    delay(100);
  }
 
//********************** Play/pause и Mute ************************************   

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

  if(data<=100 && flag == 1) // действие после короткого нажатия кнопки, воспроизведение / пауза
  {
    Remote.play_pause();
    flag = 0;
    delay(10);
    Remote.clear();
  }
 
  if(millis()-eventTime>500 && data>=920 && data<=960 && flag == 1) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.mute(); // действие после удержание кнопки, приглушение звука
    flag = 0;
    delay(10);
    Remote.clear();
  }
//********************** Next и Fast Forward ************************************   
   
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=815 && data<=845) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    flag = 2;
  }
 
  if(data<=100 && flag == 2) // действие после короткого нажатия кнопки, Next
  {
    Remote.next();
    flag = 0;
    delay(10);
    Remote.clear();
  }

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

  if(millis()-eventTime>500 && data>=700 && data<=740 && flag == 4 || data>=700 && data<=740 && flag == 3) // удержание кнопки от 500 до ∞ миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.rewind(); // действие после удержание кнопки, Rewind
    flag = 3;
    Remote.clear();
    delay(100);
  }
 
  if(data<=100 && flag == 3 || data<=100 && flag == 5 || data<=100 && flag == 6) // действие после отпускания кнопки
  {
    flag = 0;
  } 
}


Chubaka885 23.02.2014 17:56

lti1 Большое спасибо!! Всё заработало как надо.

Осталось, вместо play/pause сделать AltTab. Попробую сам.

И ещё. Не подскажите, существует ли команда HID переключения папок в аудиоплеере?

lti1 24.02.2014 00:27

Цитата:

Сообщение от Chubaka885 (Сообщение 288452)
lti1 Большое спасибо!! Всё заработало как надо.

Осталось, вместо play/pause сделать AltTab. Попробую сам.

Здесь можно посмотреть как сделан Alt+Tab и по аналогии доработать под себя. Алгоритм следующий: первое нажатие нажимает Alt+Tab и сразу отпускает Tab, повторное нажатие, в течении секунды опять нажимает Alt+Tab и опять отпускает Tab, через секунду после любого нажатия Alt отпускается.
Цитата:

Сообщение от Chubaka885 (Сообщение 288452)
И ещё. Не подскажите, существует ли команда HID переключения папок в аудиоплеере?

Сам задавался таким вопросом, ни чего не нашел, скорее всего такого не существует. Пробовал у себя реализовать через Tasker, отлавливать комбинации клавиш и назначать действия перехода по папкам, но мне не понравилось, иногда сильно тормозит.

Chubaka885 24.02.2014 17:50

Цитата:

Сообщение от lti1 (Сообщение 288480)
Здесь можно посмотреть как сделан Alt+Tab и по аналогии доработать под себя. Алгоритм следующий: первое нажатие нажимает Alt+Tab и сразу отпускает Tab, повторное нажатие, в течении секунды опять нажимает Alt+Tab и опять отпускает Tab, через секунду после любого нажатия Alt отпускается.

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

Цитата:

Сообщение от lti1 (Сообщение 288480)
Сама задавался таким вопросом, ни чего не нашел, скорее всего такого не существует. Пробовал у себя реализовать через Tasker, отлавливать комбинации клавиш и назначать действия перехода по папкам, но мне не понравилось, иногда сильно тормозит.

Да, скорей всего такой команды нет. Придётся для переключения папок в дисплей тыкать))). А если с помощью таскера сильно тормозит?

lti1 24.02.2014 19:20

Цитата:

Сообщение от Chubaka885 (Сообщение 288580)
Спасибо ещё раз, всё получилось. Только мне кажется что первое нажатие должно отправлять таб два раза а последующие уже по одному, иначе (на планшете) приходится нажимать два раза чтобы переключится на следующею активную программу.

Да наверное так логичнее будет, когда сделаете, выложите в эту тему.
Цитата:

Сообщение от Chubaka885 (Сообщение 288580)
Да, скорей всего такой команды нет. Придётся для переключения папок в дисплей тыкать))). А если с помощью таскера сильно тормозит?

Иногда сильно, но возможно у меня планшет криво прошит, от сюда и тормоза. Сейчас вообще Tasker отключил, потому как не только переход по папкам тормозил.

Chubaka885 26.02.2014 20:24

Готовый скетч для резестивных кнопок, любезно предоставленный lti1 за что ему огромное спасибо. Для работы требуются модифицированные USBAPI.h, HID.cpp. Скачать вложение с поста #182.
Скетч работает на arduino pro micro, arduino leonardo.

Алгоритм:
Кнопки громкости.
Одиночное нажатие - прибавление/убавление на одну единицу.
Удержание - прибавление/убавление до отпускания.

Кнопки следующий/предидущий трек
Одно нажатие - следующий/предидущий трек
Удержание - перемотка

Кнопка mode
первое нажатие - отсылается нажатие ALT и два раза TAB. Каждое следующее нажатие, если не истекло 800 мили сек. отсылает один раз TAB, ALT остаётся нажатым.
Удержание - плей/пауза.

PHP код:

int analogPin=6;    //пин для подключения кнопок
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>=950 && flag == 0// все кнопки отпущены
   
{
    
eventTime=millis();
   }

  if(
millis()-eventTime>10 && millis()-eventTime<499 && data>=210 && data<=230 && flag == 0// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
   

    
Remote.increase();
    
flag 5;
    
delay(10);
    
Remote.clear();
   }

  if(
millis()-eventTime>500 && data>=210 && data<=230 && flag == || data>=210 && data<=230 && flag == 3// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
   

    
Remote.increase(); // действие после удержание кнопки, Увеличить громкость каждые 0,1 секунды
    
flag 3;
    
Remote.clear();
    
delay(100);
   }

  if(
millis()-eventTime>10 && millis()-eventTime<499 && data>=457 && data<=477 && flag == 0// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
   

    
Remote.decrease();
    
flag 6;
    
delay(10);
    
Remote.clear();
   }

  if(
millis()-eventTime>500 && data>=457 && data<=477 && flag == || data>=457 && data<=477 && flag == 3// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
   

    
Remote.decrease(); // действие после удержание кнопки, Уменьшить громкость каждые 0,1 секунды
    
flag 3;
    
Remote.clear();
    
delay(100);
   }
   
//********************** AltTab + Play/pause ************************************    

if(millis()-eventTime>10 && millis()-eventTime<499 && data>=567 && data<=587// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
   

    
flag 1;
   }

  if(
data>=950 && flag == && 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>=950 && flag == && pauseMillis != 0// действие после короткого повторного нажатия кнопки, Alt+Tab
   
{
    
Keyboard.press(KEY_TAB);
    
Keyboard.release(KEY_TAB);
    
flag 0;
    
pauseMillis millis();
   }
   
  if(
pauseMillis && millis()-pauseMillis >= 800 && data>=950// && flag == 7 && data>=950)
  
{
    
flag 0;
    
pauseMillis 0;
    
Keyboard.releaseAll();
  }
   
  if(
millis()-eventTime>500 && data>=567 && data<=587 && flag == 1// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
   

    
Remote.play_pause(); // действие после удержание кнопки, воспроизведение / пауза
    
flag 0;
    
delay(10);
    
Remote.clear();
   }
//********************** Next и Fast Forward ************************************    
    
  
if(millis()-eventTime>10 && millis()-eventTime<499 && data>=&& data<=10// короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
   

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

  if(
millis()-eventTime>500 && data>=&& data<=10 && flag == || data>=&& data<=10 && flag == 3// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
   

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

    
flag 4;
   }
   
  if(
data>=950 && flag == 4// действие после короткого нажатия кнопки, Previous
   
{
    
Remote.previous();
    
flag 0;
    
delay(10);
    
Remote.clear();
   }

  if(
millis()-eventTime>500 && data>=74 && data<=94 && flag == || data>=74 && data<=94 && flag == 3// удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
   

    
Remote.rewind(); // действие после удержание кнопки, Rewind
    
flag 3;
    
Remote.clear();
    
delay(100);
   }
   
  if(
data>=950 && flag == || data>=950 && flag == || data>=950 && flag == 6// действие после отпускания кнопки
   
{
    
flag 0;
   }   



Oreshrek 26.03.2014 16:41

Цитата:

Сообщение от armlive (Сообщение 283867)
Вот рабочий вариант ардуино уно r3 , с управлением по питанию.
Код взят у ilya174, основа и настроен под кашкай.
У кашкая по три кнопки на каждом выводе, соединяем их резисторами(разные номиналы обязательно) и делаем один вывод от шести полученных кнопок и общий минус. К ардуино уно подключаем минус к минусу, вывод от кнопок к A0, A0 через подтягивающий резистор(2ком) подключаем к +
Раскомментируйте //Serial.println(dt1); и залейте скетч.
Считайте свои значения в мониторе и установите для каждой кнопки и залейте скетч.
Дальше прошейте USB HID и почти готово.
Открываем "system\usr\keylayout\Generic.kl" (сделайте обязательно копию оригинала) и правим под себя.
Ни клавиатура, ни кнопки не страдают.
PHP код:

// Для рулевых кнопок
uint8_t buf[8] = { 
  
};
  
// реле питания звуковой карты  
  #define relePin4 11 
  
// Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_VOL_MINUS_DELAY   (200)
#define KEY_CH_VOL_PLUS_DELAY    (200)
#define KEY_CH_PAUSE_DELAY       (200)
#define KEY_CH_PREV_TRACK_DELAY  (200)
#define KEY_CH_FORW_TRACK_DELAY  (200)
#define KEY_CH_TAB_DELAY         (200)
#define KEY_CH_ESC_DELAY         (200)
#define KEY_CH_AUDIO_OFF_DELAY   (400)
#define KEY_CH_PLUS_DELAY        (200)
#define KEY_MODE_DELAY        (200)
#define KEY_MODE_DELAY        (200)
#define KEY_MODE_DELAY        (200)
#define KEY_MODE_DELAY        (200)

// Значения кнопок
#define KEY_CH_VOL_MINUS    (540)
#define KEY_CH_VOL_PLUS     (337)
#define KEY_CH_PAUSE         (0)
#define KEY_CH_PREV_TRACK   (500)
#define KEY_CH_FORW_TRACK   (252)
#define KEY_CH_TAB          (484)
#define KEY_CH_ESC          (218)
#define KEY_CH_AUDIO_OFF    (0)
#define KEY_CH_PLUS    (0)
#define KEY_CH_MINUS    (0)
#define KEY_CH_MINUS    (0)
#define KEY_CH_MINUS    (1500)
#define KEY_CH_MINUS    (1500)


// Погрешность при чтении кнопок
#define KEY_DELTA       (10)

// Коды кнопок, что отсылаем в порт внешней проге
#define CH_VOL_MINUS        (81) //Кнопка down
#define CH_VOL_PLUS         (82) //Кнопка   up
#define CH_PAUSE            (0) //
#define CH_PREV_TRACK       (80) //Кнопка   left
#define CH_FORW_TRACK       (79) //Кнопка  right
#define CH_TAB              (72)  //Кнопка        break, Pause
#define CH_ESC              (74) //Кнопка         Home
#define CH_AUDIO_OFF        (0) 
#define CH_PLUS             (0)
#define CH_MINUS            (0)
#define CH_MINUS            (0)
#define CH_MINUS            (0)
#define CH_MINUS            (0)
#define NONE                (0)

// Кнопки
#define ACCPin 2 // через делитель к ACC
#define ControlPin A1 // через делитель к +12В
#define relePin1 8 // реле USB HUB
#define relePin2 9 // реле планшета (OTG)
#define relePin3 10 // реле звуковой карты (замыкания на землю)            
#define ONHUB 1000 // время включения реле HUB
#define ONTablet 4000 // время включения планшета
#define ONAudio 9000 // время включения аудио        
#define OFFHUB 8000 // время выключения реле HUB
#define OFFTablet 3000 // время выключения планшета
#define OFFAudio 10 // время выключения аудио        

unsigned long LastTimeKeyPressed millis();
unsigned long durationmillisoldoff 0;
boolean stateACCrelestate1relestate2,relestate3,relestate4  0;
int LastKeyPressed NONE;
int flag 1;
int flag2 0;
void setup()      
{  
Serial.begin(9600);
pinMode(relePin1OUTPUT); 
pinMode(relePin2OUTPUT);
pinMode(relePin3OUTPUT);
pinMode(relePin4OUTPUT);
}      

void loop()      
{   
  
ReadSteering();
  
Knopki();
  
delay(10);


// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()      
{   
  
pinMode(relePin4OUTPUT);
  
digitalWrite(relePin4,flag );
  
unsigned long TimeKeyPressed;
  
int KeyPressed NONE;
  
int dt1 analogRead(A0);
  
delay(10);
  
//Serial.println(dt1); // Раскомментировать для вывода и обозначения значения кнопок в монитор 
  
int dt2 analogRead(A0);
  
//Serial.println(dt2);  
  
if (abs(dt1-dt2)<=490 and dt1<1024 //если нет дребезга и что-то есть
  

    
// Регистрируем время нажатия кнопки
    
    
TimeKeyPressed millis();  //получить реальное время     
    
    //CH_VOL_MINUS    
    
if ( (dt1-KEY_DELTA <= KEY_CH_VOL_MINUS) and (dt1+KEY_DELTA >= KEY_CH_VOL_MINUS) )
    {
      if ( (
LastKeyPressed != CH_VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_VOL_MINUS_DELAY))
      { 
        
LastKeyPressed CH_VOL_MINUS;        
        
buf[2] = CH_VOL_MINUS;                 
    
LastTimeKeyPressed TimeKeyPressed;
    
//Serial.print(CH_VOL_MINUS);
     
Serial.write(buf8);
      
releaseKey();
       
//Serial.print(CH_VOL_MINUS);
      
}
    }  
    
//CH_VOL_PLUS
    
else if ( (dt1-KEY_DELTA <= KEY_CH_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_CH_VOL_PLUS) )
    {
      if ( (
LastKeyPressed != CH_VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_VOL_PLUS_DELAY) )
      {
        
LastKeyPressed CH_VOL_PLUS;
        
buf[2]=CH_VOL_PLUS;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);
     
//Serial.println(CH_VOL_PLUS);      
    
releaseKey();        
      }  
    }
    
//CH_PAUSE
    
else if ( (dt1-KEY_DELTA <= KEY_CH_PAUSE) and (dt1+KEY_DELTA >=KEY_CH_PAUSE) )
    {
      if ( (
LastKeyPressed != CH_PAUSE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PAUSE_DELAY) )
      {
        
LastKeyPressed CH_PAUSE;
        
buf[2]=CH_PAUSE;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);
     
//Serial.println(CH_PAUSE);    
     
releaseKey();        
      }  
    }
    
//CH_PREV_TRACK
    
else if ( (dt1-KEY_DELTA <= KEY_CH_PREV_TRACK) and (dt1+KEY_DELTA >=KEY_CH_PREV_TRACK) )
    {
      if ( (
LastKeyPressed != CH_PREV_TRACK) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PREV_TRACK_DELAY) )
      {
        
LastKeyPressed CH_PREV_TRACK;
        
buf[2]=CH_PREV_TRACK;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);
     
//Serial.println(CH_PREV_TRACK);    
    
releaseKey();        
      }  
    }
    
//CH_FORW_TRACK
    
else if ( (dt1-KEY_DELTA <= KEY_CH_FORW_TRACK) and (dt1+KEY_DELTA >=KEY_CH_FORW_TRACK) )
    {
      if ( (
LastKeyPressed != CH_FORW_TRACK) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_FORW_TRACK_DELAY) )
      {
        
LastKeyPressed CH_FORW_TRACK;
        
buf[2]=CH_FORW_TRACK;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);
     
//Serial.println(CH_FORW_TRACK);    
    
releaseKey();       
      }  
    }
    
//CH_TAB
    
else if ( (dt1-KEY_DELTA <= KEY_CH_TAB) and (dt1+KEY_DELTA >=KEY_CH_TAB) )
    {
      if ( (
LastKeyPressed != CH_TAB) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_TAB_DELAY) )
      {
        
LastKeyPressed CH_TAB;
        
buf[2]=CH_TAB;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);
     
//Serial.println(CH_TAB);    
    
releaseKey();        
      }  
    }
    
//CH_ESC
    
else if ( (dt1-KEY_DELTA <= KEY_CH_ESC) and (dt1+KEY_DELTA >=KEY_CH_ESC) )
    {
      if ( (
LastKeyPressed != CH_ESC) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_ESC_DELAY) )
      {
        
LastKeyPressed CH_ESC;
        
buf[2]=CH_ESC;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);
     
//Serial.println(CH_ESC);    
    
releaseKey();        
      }  
    }
    
//CH_AUDIO_OFF    
    
else if ( (dt1-KEY_DELTA <= KEY_CH_AUDIO_OFF) and (dt1+KEY_DELTA >=KEY_CH_AUDIO_OFF) )
    {      
      if ( (
LastKeyPressed != CH_AUDIO_OFF) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_AUDIO_OFF_DELAY)&& flag==1)      
      {        
        
digitalWrite(relePin4flag2);
         
flag 0;
         
flag2 1;
        }
         else if ( (
LastKeyPressed != CH_AUDIO_OFF) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_AUDIO_OFF_DELAY)&& flag==0)
      {       
         
digitalWrite(relePin4flag2);        
         
flag 1;
         
flag2 0;
        }        
        
LastKeyPressed CH_AUDIO_OFF;  
   
LastTimeKeyPressed TimeKeyPressed;
    
//Serial.println(CH_AUDIO_OFF);
        
releaseKey();                
      }  
    
    
//CH_PLUS
    
else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (
LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        
LastKeyPressed CH_PLUS;
        
buf[2]=CH_MINUS;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);    
    
releaseKey();         
      }  
    }
    
//CH_PLUS
    
else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (
LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        
LastKeyPressed CH_PLUS;
        
buf[2]=CH_MINUS;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);    
    
releaseKey();         
      }  
    }
    
//CH_PLUS
    
else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (
LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        
LastKeyPressed CH_PLUS;
        
buf[2]=CH_MINUS;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);    
    
releaseKey();         
      }  
    }
    
//CH_PLUS
    
else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (
LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        
LastKeyPressed CH_PLUS;
        
buf[2]=CH_MINUS;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);    
    
releaseKey();         
      }  
    }
    
//CH_PLUS
    
else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (
LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        
LastKeyPressed CH_PLUS;
        
buf[2]=CH_MINUS;
         
LastTimeKeyPressed TimeKeyPressed;
     
Serial.write(buf8);    
    
releaseKey();        
      }  
    }
  }   
}

void releaseKey() 
{
  
buf[0] = 0;
  
buf[2] = 0;
  
Serial.write(buf8);    // Release key  
}
  
void  Knopki()
{
  if (
digitalRead(ACCPin)&&!stateACC) {
    
stateACC=1;
    
duration millis();
    }
    if (!
digitalRead(ACCPin)&&stateACC) {
    
stateACC=0;
    
off millis();
        }
    if(
digitalRead(ACCPin) && stateACC && millis ()-duration ONHUB){
    
digitalWrite(relePin1HIGH);
    
relestate1 1;
    
millisold millis();
    }
    if(
digitalRead(ACCPin) && stateACC &&  millis ()-duration ONTablet){
    
digitalWrite(relePin2HIGH);
    
relestate2 1;
    
millisold millis();
    }
    if(
digitalRead(ACCPin) && stateACC &&  millis ()-duration ONAudio){
    
digitalWrite(relePin3HIGH);
    
relestate3 1;
    
millisold millis();
    }
 if(!
digitalRead(ACCPin) && !stateACC && millis () -offOFFHUB){
    
digitalWrite(relePin1LOW);
    
relestate1 0;
    
millisold millis();    
  } 
if(!
digitalRead(ACCPin) && !stateACC &&  millis () -off OFFTablet){
    
digitalWrite(relePin2LOW);
    
relestate2 0;
    
millisold millis();     
  } 
 if(!
digitalRead(ACCPin) && !stateACC &&  millis () -off OFFAudio){
    
digitalWrite(relePin3LOW);
    
relestate3 0;
    
millisold millis();     
  } 





Для таких как я, впервые сталкивающихся с программированием на arduino прошу разъяснить "что" и "как")
Имею arduino uno r3, qashqai 2013
Ардуину я прошил, залил без раскомментирования, т.е. не делал так как ты написал про переназначение, думаю, что значения кнопок у меня те же, что и у тебя)
Что не понял, что за "прошейте usb hid" это ты так заливку скетча назвал или что-то еще как-то, где-то надо шить?)
"system\usr\keylayout\Generic.kl" это я так понял, в нексусе надо править, что именно? Если есть возможность, свой файл можешь выложить или мне скинуть?
3) Не понятно, по этому "К ардуино уно подключаем минус к минусу, вывод от кнопок к A0, A0 через подтягивающий резистор(2ком) подключаем к +" вопрос куда втыкать минус (где power на плате, там несколько gnd), что за резистор, и к какому плюсу подключать опять же на плате, где power, там 3.3 и 5 в, который?

armlive 26.03.2014 16:52

Цитата:

Сообщение от Oreshrek (Сообщение 292098)
Для таких как я, впервые сталкивающихся с программированием на arduino прошу разъяснить "что" и "как")
Имею arduino uno r3, qashqai 2013
Ардуину я прошил, залил без раскомментирования, т.е. не делал так как ты написал про переназначение, думаю, что значения кнопок у меня те же, что и у тебя)
Что не понял, что за "прошейте usb hid" это ты так заливку скетча назвал или что-то еще как-то, где-то надо шить?)
"system\usr\keylayout\Generic.kl" это я так понял, в нексусе надо править, что именно? Если есть возможность, свой файл можешь выложить или мне скинуть?
3) Не понятно, по этому "К ардуино уно подключаем минус к минусу, вывод от кнопок к A0, A0 через подтягивающий резистор(2ком) подключаем к +" вопрос куда втыкать минус (где power на плате, там несколько gnd), что за резистор, и к какому плюсу подключать опять же на плате, где power, там 3.3 и 5 в, который?

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

Oreshrek 26.03.2014 17:13

Цитата:

Сообщение от armlive (Сообщение 292104)
Нужно делать как я написал, у меня номиналы резисторов другие.
Все файлы я скину. Резистор подключай к 5в

так, пишу, что я понял,
1) подключаю к 6пину колодки резистор на 47ом, к 16 пину, резистор на 150 ом, объединяю проводом, вставляю конец в ардуину А0, припаиваю к этому проводу резистор и вставляю в ардуину +5в, из 15 пина вставляю провод в любой gnd на ардуине.
2) Убираю слеши перед //Serial.println(dt1), заливаю через программу для ардуины получившийся скетч
3) В программе нажимаю иконку справа с лупой типа (монитор порта, как я понял), нажимаю кнопки, смотрю, как они у меня определяются.
4) Меняю в скетче значения кнопок на мои (определившиеся), заливаю готовый скетч.
Дальше, что делать?

armlive 26.03.2014 18:29

Цитата:

Сообщение от Oreshrek (Сообщение 292114)
так, пишу, что я понял,
1) подключаю к 6пину колодки резистор на 47ом, к 16 пину, резистор на 150 ом, объединяю проводом, вставляю конец в ардуину А0, припаиваю к этому проводу резистор и вставляю в ардуину +5в, из 15 пина вставляю провод в любой gnd на ардуине.
2) Убираю слеши перед //Serial.println(dt1), заливаю через программу для ардуины получившийся скетч
3) В программе нажимаю иконку справа с лупой типа (монитор порта, как я понял), нажимаю кнопки, смотрю, как они у меня определяются.
4) Меняю в скетче значения кнопок на мои (определившиеся), заливаю готовый скетч.
Дальше, что делать?

Правильно, дальше позже скину файлы и объясню

Oreshrek 26.03.2014 19:08

Цитата:

Сообщение от armlive (Сообщение 292122)
Правильно, дальше позже скину файлы и объясню

Ок, спасибо, буду ждать)

armlive 26.03.2014 21:00

Вложений: 1
Вот почитай и потренируйся http://arduino.cc/en/Hacking/DFUProgramming8U2

Arduino-keyboard-0.3.hex Для прошивки, будет определятся как HID клавиатура, это конечный вариант.
UNO-dfu_and_usbserial_combined.hex стандартная, для UNO-dfu_and_usbserial_combined.hex.
Прикрепил файлы

Oreshrek 26.03.2014 21:33

Цитата:

Сообщение от armlive (Сообщение 292137)
Вот почитай и потренируйся http://arduino.cc/en/Hacking/DFUProgramming8U2

Arduino-keyboard-0.3.hex Для прошивки, будет определятся как HID клавиатура, это конечный вариант.
UNO-dfu_and_usbserial_combined.hex стандартная, для UNO-dfu_and_usbserial_combined.hex.
Прикрепил файлы

Для работы кнопок нужно шить Arduino-keyboard-0.3.hex, а UNO-dfu_and_usbserial_combined.hex это стандартная прошивка? Правильно?

armlive 26.03.2014 21:48

Цитата:

Сообщение от Oreshrek (Сообщение 292143)
Для работы кнопок нужно шить Arduino-keyboard-0.3.hex, а UNO-dfu_and_usbserial_combined.hex это стандартная прошивка? Правильно?

Да, это шьется контроллер

Oreshrek 29.03.2014 15:36

Цитата:

Сообщение от armlive (Сообщение 292148)
Да, это шьется контроллер

привет, с прошивкой контроллера все было проще всего) только через другую прогу заливал хекс.
После прошивки под "хид" не заметил, чтобы планшет как-то реагировал на ардуину, все также просто зажигается диод на ардуине и все. Так и должно быть?
И по монитору, в мониторе бежит цифра нажимаю кнопки, меняются строчки, как раз эти строчки как понял и надо отлавливать?
А что именно в файле по кнопкам, на планшете менять? Нужно строки какие-то добавить или переназначать уже существующие?

armlive 29.03.2014 22:20

Вложений: 1
Цитата:

Сообщение от Oreshrek (Сообщение 292512)
привет, с прошивкой контроллера все было проще всего) только через другую прогу заливал хекс.
После прошивки под "хид" не заметил, чтобы планшет как-то реагировал на ардуину, все также просто зажигается диод на ардуине и все. Так и должно быть?
И по монитору, в мониторе бежит цифра нажимаю кнопки, меняются строчки, как раз эти строчки как понял и надо отлавливать?
А что именно в файле по кнопкам, на планшете менять? Нужно строки какие-то добавить или переназначать уже существующие?

Проверить можешь этим приложением, если не работает исправляй.
По монитору: Нажал к примеру Vol + побежала цифра 567, это значение прописываешь #define KEY_CH_VOL_PLUS (СуДА).
Готовый Generic и файл уно, даже под дешевые джойстики исправил

Oreshrek 30.03.2014 20:24

Цитата:

Сообщение от armlive (Сообщение 292532)
Проверить можешь этим приложением, если не работает исправляй.
По монитору: Нажал к примеру Vol + побежала цифра 567, это значение прописываешь #define KEY_CH_VOL_PLUS (СуДА).
Готовый Generic и файл уно, даже под дешевые джойстики исправил

пока на радостях, решил написать отчет) долго конечно ипался, даже с учетом того, что ты скинул мне почти готовые файлы. Проблема была в том, что кнопки опознавались все равно не так как нужно, в итоге через keycodedisplay считал как у меня определялись кнопки, и уже с учетом этого редактировал редактированный тобой дженерик)) Буду летом в Армавире, с меня магарыч, спасибо огромное за помощь и уделенное внимание) С кнопками в итоге разделался)

armlive 30.03.2014 21:28

Цитата:

Сообщение от Oreshrek (Сообщение 292590)
пока на радостях, решил написать отчет) долго конечно ипался, даже с учетом того, что ты скинул мне почти готовые файлы. Проблема была в том, что кнопки опознавались все равно не так как нужно, в итоге через keycodedisplay считал как у меня определялись кнопки, и уже с учетом этого редактировал редактированный тобой дженерик)) Буду летом в Армавире, с меня магарыч, спасибо огромное за помощь и уделенное внимание) С кнопками в итоге разделался)

Рад за тебя!

oledv 06.04.2014 22:17

Подскажите как в Андройде нажать кнопу Меню.

лёна 06.04.2014 23:05

oledv
Привет,как это,нажать кнопку меню ? обычно,и меню чего ?вопрос вообще какой то не полный,подумай и сформулируй правильный вопрос,тогда тебе помогут.

oledv 07.04.2014 00:36

Поставлю вопрос по другому ) да немного не корректно его задал )

Как в андройде с подключенной ардуиной, которая прикинулась hid устройством смоделировать нажатие на кнопку Home для перехода на рабочий стол?

d3890666 07.04.2014 01:14

Править generic.kl либо зажать alt+esc. Я использовал второе. По стандартным сочетаниям для андройда есть файл generic.kcm. help

oledv 07.04.2014 01:49

Цитата:

Сообщение от d3890666 (Сообщение 293387)
Править generic.kl либо зажать alt+esc. Я использовал второе. По стандартным сочетаниям для андройда есть файл generic.kcm. help

спасибо, работает.

ilya174 07.04.2014 22:25

Цитата:

Сообщение от oledv (Сообщение 293383)
Поставлю вопрос по другому ) да немного не корректно его задал )

Как в андройде с подключенной ардуиной, которая прикинулась hid устройством смоделировать нажатие на кнопку Home для перехода на рабочий стол?

Я для этих целей использую приложение Multilanguage Keymap Redefiner очень удобная прога. Можно переназначить любую кнопку.

Chubaka885 09.04.2014 22:52

Кто нибудь знает как "жёстко" прописать сочетание клавиш на запуск приложения, не используя Multilanguage Keymap Redefiner и подобные ей?

anton2204 09.04.2014 23:32

Цитата:

Сообщение от Chubaka885 (Сообщение 293721)
Кто нибудь знает как "жёстко" прописать сочетание клавиш на запуск приложения, не используя Multilanguage Keymap Redefiner и подобные ей?

Можно.Через Быстрый запуск.
http://pccar.ru/showpost.php?p=279247&postcount=54

Chubaka885 10.04.2014 18:03

Цитата:

Сообщение от anton2204 (Сообщение 293728)
Можно.Через Быстрый запуск.
http://pccar.ru/showpost.php?p=279247&postcount=54

Спасибо. То что нужно. И запуск шустрее и чётко всё отрабатывает.
Только я так понял что сочетания только с кнопкой win?

Alekssandr 01.05.2014 00:29

Вложений: 1
Наконец то доделал прошивку на свою машинку которая будет управлять 3-мя устройствами сразу.
Из устройств BLUETOOTH наушники с кнопками, NEXUS 7, Магнитола PIONER. Было решено сделать так чтоб всеми этими устройствами можно было управлять при помощи 5-и резистивных кнопок через контроллер Arduino micro pro.

кнопка выглядит так

http://photo.qip.ru/photo/alexstanko.../136283090.jpg


С ардуино знаком около года, в этот проект вложил все чему научился=) все работает стабильно и так как надо.

В итоге имеем 3 менюшки,
Переключение по меню происходит удержанием клавиши моде в течении 6-и секунд, + выбранная позиция не сбрасывается при отключении питания она подгружает всю инфу с энергонезависимой памяти EEPROM

1-я для PIONER (сопротивления нужных номиналов замыкаются оптронами)
кнопка PWR -> следующая песня
кнопка MODE -> приглушение звука
кнопка SEEK -> предидущая песня
кнопка VOL+ -> увеличение громкости PIONEER
кнопка VOL- -> уменьшение громкости PIONEER

2-я для BLUETOOTH (нужные кнопки замыкаются оптронами)
кнопка PWR -> следующая песня
кнопка MODE -> пауза, плей, ответить на звонок
кнопка MODE при удержании более чем 3-х сек гарнитура включиться или отключиться
кнопка SEEK -> предидущая песня
кнопка VOL+ -> увеличение громкости PIONEER
кнопка VOL- -> уменьшение громкости PIONEER

3-я для NEXUS 7 (работает как HID)
кнопка PWR -> следующая песня
кнопка PWR при удержании кнопки увеличивается громкость на планшете
кнопка MODE -> плей пауза
кнопка SEEK -> предидущая песня
кнопка SEEK при удержании кнопки уменьшается громкость на планшете
кнопка VOL+ -> увеличение громкости PIONEER
кнопка VOL- -> уменьшение громкости PIONEER

Здесь скетч Вложение 35866 работает под Arduino Leonadro и Arduino microPro, также не забудьте заменить 2 файла USBAPI.h, HID.cpp скачать можно из с поста #182
Надеюсь этот код поможет кому.

Всем спасибо наконец то у меня заканчивается потихоньку эта эпопея с кнопками на руле=)))

Осталось доделать индикатор который будет отображать что сейчас выбрано и включено.

armlive 04.06.2014 10:20

Вопрос: у кого работают кнопки на Arduino UNO R3, стабильно?
После замены блока питания, начались косяки, в месте с кодами кнопок отсылается ещё что-то, что постоянно вводит систему в ступор, а потом выскакивает окно о остановке приложений, в основном гугл поиск. Что только не делал, в терминале все чисто, уже 3 день мучаюсь.

pokertk 04.06.2014 20:37

кнопка выглядит так

http://photo.qip.ru/photo/alexstanko.../136283090.jpg
[/QUOTE]

От чего такая кнопка?

armlive 05.06.2014 00:32

Цитата:

Сообщение от armlive (Сообщение 298975)
Вопрос: у кого работают кнопки на Arduino UNO R3, стабильно?
После замены блока питания, начались косяки, в месте с кодами кнопок отсылается ещё что-то, что постоянно вводит систему в ступор, а потом выскакивает окно о остановке приложений, в основном гугл поиск. Что только не делал, в терминале все чисто, уже 3 день мучаюсь.

Купил сегодня леонардо, такая же ерунда, че за ....?

pokertk 05.06.2014 01:36

Цитата:

Сообщение от armlive (Сообщение 299110)
Купил сегодня леонардо, такая же ерунда, че за ....?

Дребезг, не?


Часовой пояс GMT +4, время: 14:12.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot