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

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

YAM1966 31.07.2013 20:28

Девайс готов http://pccar.ru/showthread.php?t=19437

xxoma 27.08.2013 20:15

Цитата:

Сообщение от ruzzzteg (Сообщение 264793)
Товарищи...
а как в андройде обстоят дела с управлением по ИК...
может проще всего купить пультец и управлять в свое удовольствие... конечно если есть програмка которая назначит правильно кнопки...
http://a.a.d-cd.net/75c1248s-480.jpg

я делал ик приемник на ардуине который эмулирует нажатия медиа клавиш юсб клавиатуры. Если интересно расскажу подробности :smile2:

Alex-NN 27.08.2013 20:31

Давай, давно жду подобного устройства!!!

xxoma 28.08.2013 17:04

Цитата:

Сообщение от Alex-NN (Сообщение 268744)
Давай, давно жду подобного устройства!!!

Все просто, я взял дешевую юсб клаву, вытянул из нее саму плату контроллера. Нашел какие выводу надо замкнуть для конкретной кнопки. Написал скетч с помощью которого ардуина при определенном коде ик пульта подает логическую 1 на определенный вывод к которому подключена 561КТ3 которая в свою очередь замыкает нужные выводы на контроллере клавиатуры. Можно было, конечно, обойтись без контроллера клавиатуры а перепрошить ардуину что бы она определялась как USB HID устройство но я планирую собрать на макетке отдельно девайс а не использовать целую ардуину для этого. Если надо схему или скетч то позднее выложу. Хотя там ничего сложного. Стандартная библиотека IR + case который выбирает под нужный код нужное действие.
Еще планирую подцепить температурный дачтик и выводить значения на виджет. Но с программированием под андроид пока что у меня туго. Будут просить знакомого что бы написал виджет.

Alex-NN 28.08.2013 20:26

Цитата:

Если надо схему или скетч то позднее выложу.
Выкладывай, конечно, подробности.:yes2:

Цитата:

Еще планирую подцепить температурный дачтик и выводить значения на виджет.
+1,
После Икара тоже не хватает датчиков разных на экране.
Если осилите виджет вывода температуры, думаю, многим это будет интересно.:yes2:

SuperLSD 06.09.2013 11:31

а просто кнопки на руле получилось у кого нибудь подцепить, и как?

s.m. 06.09.2013 11:41

Цитата:

Сообщение от Alex-NN (Сообщение 268871)
Выкладывай, конечно, подробности.:yes2:



+1,
После Икара тоже не хватает датчиков разных на экране.
Если осилите виджет вывода температуры, думаю, многим это будет интересно.:yes2:

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

Alex-NN 06.09.2013 11:58

Цитата:

Сообщение от s.m. (Сообщение 269821)
ну ничего сложного в виджете таком нет. код для термометра есть в моем проекте - в скетче и кому надо - могу кусок жава кода дать который вытаскивает эту температуру из ардуины

Было бы неплохо!:yes4:

s.m. 06.09.2013 13:05

Цитата:

Сообщение от Alex-NN (Сообщение 269823)
Было бы неплохо!:yes4:

Стучитесь в личку с конкретными вопросами - помогу

ilya174 13.09.2013 08:14

У кого-нибудь получилось подключить Arduino uno к планшету в качестве hid устройства?
Сделал все как написано здесь: http://mitchtech.net/arduino-usb-hid-keyboard/
но ни ББ ни планшет не распознают hid устройство.

Maxim Droy 13.09.2013 13:50

Цитата:

Сообщение от ilya174 (Сообщение 270502)
У кого-нибудь получилось подключить Arduino uno к планшету в качестве hid устройства?
Сделал все как написано здесь: http://mitchtech.net/arduino-usb-hid-keyboard/
но ни ББ ни планшет не распознают hid устройство.

Нормальная прошивка

ilya174 16.09.2013 14:36

Благодарю!
Все заработало, пытаюсь написать скетч для управления планшетом от штатных кнопок и автоматикой питания.

salo 26.09.2013 19:17

кто-нибудь пробовал подключать пульт?
есть задача подружить его с кнопками на руле.
самое важное это переключение трэков и громкость.
вот такой например :
пульт универсальный

mcf1 26.09.2013 20:07

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

salo 26.09.2013 20:18

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

anton2204 26.09.2013 22:11

Тоже интересный/аналогичный пультик нашел Tooploo T2 Wireless Gyroscope Air Mouse

mcf1 27.09.2013 01:39

Цитата:

Сообщение от sacha-r (Сообщение 243500)
А зачем 4 канала резестивных кнопок, по мне так одного достаточно.
Или я что то не понимаю?
Ссылку на одно канальный вариант давал выше.

как оказалось, в моей XV на руле восемь кнопок, по четыре на двух линиях. т.е. joyconn подошел очень даже.

avgaz 27.09.2013 02:32

Цитата:

Сообщение от salo (Сообщение 271948)
кто-нибудь пробовал подключать пульт?
есть задача подружить его с кнопками на руле.
самое важное это переключение трэков и громкость.
вот такой например :
пульт универсальный

По сути можно любую мышку взять скажем где 4 кнопки, переназначить их как вам нужно, ну и распотрошить её

lti1 28.09.2013 04:47

При наличии bluetooth в планшете можно еще сделать на основе ИК управление Android по Bluetooth. Arduino Pro Mini atmega328 3.3V/8M имеет очень маленькие размеры, а bluetooth HC-05 ещё меньше, засунуть их прямо в руль. Необходимо только обеспечит питание 3.3 вольта, но там где есть кнопки на руле должно быть и питание, а при отсутствии можно запитать от кнопки сигнала.

xxoma 01.10.2013 02:06

Вложений: 1
Вот делаю прогу на основе https://github.com/ksksue/FTDriver/t...riverTutorial1 которая принимает данные с ик пульта с помощью ардуины по serial port и управляет Power Amp-ом и системной громкостью, пока что все недопиленое но работает. Так как это моя первая прога для Андроид то строго не судите, появиться время - доделаю.
Для работы нужно ардуину с подключеным инфракрасным приемником.
Заливаете в ардуину скетч типа этого
Код:

#include

int RECV_PIN = 13;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    digitalWrite(8,HIGH);
   
   
    if (results.value==0xFF906F) {//поменяйте на свой код
    //Serial.print(results.value, HEX);
    Serial.print(1);
    delay(100);
    }
   
    if (results.value==0xFFC23D) {//поменяйте на свой код
        Serial.print(2);
        delay(100);
    }
    if (results.value==0xFFA857) {//поменяйте на свой код
        Serial.print(3);
        delay(100);
    }
   
    if (results.value==0xFF02FD) {//поменяйте на свой код
      Serial.print(4);
        delay(100);
    }
   
   
     
    if (results.value==0xFF629D) {//ch+
        Serial.print(5);
        delay(100);
    }

    if (results.value==0xFF22DD) {//eq
        Serial.print(6);
        digitalWrite(A2,HIGH);
        delay(100);
        digitalWrite(A2,LOW);
    }
    if (results.value==0xFFE21D) {//ch-
        Serial.print(7);
        delay(100);
    }
   
    if (results.value==0xFFA25D) {//pause
        Serial.print(8);
        delay(100);
    } 
  irrecv.resume(); // Receive the next value
  digitalWrite(8,LOW);
  }
}

Меняете коды от пульта на свои. Прога принимает цифры от 1 до 8 делает соотвествующие действия.
VOL_UP_CODE = 2;
VOL_DOWN_CODE = 4;
PREV_CODE = 1;
NEXT_CODE = 3;
UP_CODE = 7;
DOWN_CODE = 5;
SHUFFLE ON/OFF= 6;
PLAY_PAUSE_CODE = 8;
Прога юзает Power Amp api поэтому с другими проигрывателями работать не будет, только громкость получиться регулировать. В планах сделать нормальный юзер интерфейс с возможностью самому выбирать нужное действие под конкретный код кнопки ик пульта. Прога запускает отдельный сервис после старта которого главное активити можно закрыть. Есть пока что не решенная проблема с запросом доступа к юсб девайсам, который даже после нажатия "больше не спрашивать" все равно после отключения/подключения otg спрашивает разрешения, поэтому кнопку Start Service надо нажимать несколько раз пока сервис не подконектиться к юсб сериал. Еще планирую в будущим прикрутить датчики температуры и выводить данные на виджет. Помощь разбирающихся людей приветсвуется. Если кому надо исходники то выложу, может совместными усилиями допилим :read2:
П.С. Тестировалось на нексус 7 с тимуровской прошивкой и Sams Galaxy S2.

avgaz 01.10.2013 21:55

Как все сложно с IR пультом не легче прикупить такой маленький http://www.aliexpress.com/item/Laser...105532496.html и сделать крепление для руля?

lti1 15.11.2013 10:05

Вложений: 2
Начало здесь.
Nett, в папке \arduino-1.0.5\hardware\arduino\cores\arduino для IDE 1.0.5 или \arduino-1.6.5-r5\hardware\arduino\avr\cores\arduino для IDE 1.6.5 меняете два файла USBAPI.h, HID.cpp на те, что во вложении соответственно. И добавляете в код из поста murano нужные действия, не нужные удаляете
Код:

int analogPin=0;
int data;

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

void loop()
{
  data=analogRead(analogPin); //читаем значение нажатой кнопки
  Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта
  /*поддерживаемые коды управляющих клавиш
  http://arduino.cc/en/Reference/KeyboardModifiers*/
  if (data==614)  Keyboard.write(176); //ENTER
  if (data==122)  Keyboard.write(216); //стрелка влево
  if (data==165)  Keyboard.write(215); //стрелка вправо
  if (data==216)  Keyboard.write(218); //стрелка вверх
  if (data==276)  Keyboard.write(217); //стрелка вниз
if (data>=315 && data<=345)  // приглушение звука
    {
      Remote.mute();
      Remote.clear();
    }
  if (data>=420 && data<=460)  // воспроизведение / пауза
    {
      Remote.play_pause();
      Remote.clear();
    }

  delay(100);
}

И как писал murano, добавить диапазон значения +- 5%, напимер если значение клавиши 330 вместо data==330 использовать data>=315 && data<=345 и т.д.
Возможные варианты мультимедиа клавиш
Код:

// Volume
Remote.increase();        Volume Up
Remote.decrease();        Volume Down
Remote.mute();                Mute
 
// Playback
Remote.play();                Play
Remote.pause();                Pause
Remote.play_pause();        Play/Pause
Remote.stop();                Stop
 
// Track Controls
Remote.next();                Next
Remote.previous();        Previous
Remote.forward();        Fast Forward
Remote.rewind();        Rewind

Remote.power();                Power
Remote.home();                WWW Home
Remote.search();        WWW Search

Кстати, какая у Вас плата? Должна быть Arduino Leonardo или Arduino Pro Micro.
Исходник здесь, Stop заменен на Play/Pause

anton2204 15.11.2013 10:50

Можно вот это применить без сложной доработки и настройки! Сам буду использовать эту платку для управления Андроид планшетом(мультимедиа кнопки) с универсального перепрограммируемого ИК пульта на руле.
Но можно и резистивные кнопочки прикрутить:
Цитата:

- 4 канала для подключения резистивных кнопок (до 15 кнопок на канал)
Если я не прав - пусть меня YAM1966 поправит ))))

lti1 15.11.2013 11:20

anton2204, согласен, это достойное устройство. Но если есть плата Arduino Leonardo или Arduino Pro Micro, зачем покупать ещё что то?
ИМХО с Arduino интереснее ну и цена Arduino Pro Micro всего 6-8$ с eBay.

YAM1966 15.11.2013 11:48

Цитата:

Сообщение от lti1 (Сообщение 277292)
anton2204, согласен, это достойное устройство. Но если есть плата Arduino Leonardo или Arduino Pro Micro, зачем покупать ещё что то?
ИМХО с Arduino интереснее ну и цена Arduino Pro Micro всего 6-8$ с eBay.

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

Так, для затравки: http://habrahabr.ru/post/146489/

lti1 15.11.2013 12:34

Я именно такой юзер, мне интересно побаловаться микро контролерами, но не так глубоко как Вы в этом разбираетесь.

Митрич18 15.11.2013 13:57

Цитата:

Сообщение от YAM1966 (Сообщение 277293)
Если самому интересно программировать и изучать что-то новое, то согласен, ардуино именно для этого. Но ардуино - в общем-то конструктор-игрушка для непрофессионалов. Ни разу не встречал еще именно программистов, которые используют это чудо в своих разработках.
Если Вы сами разрабатываете библиотеки для работы с конкретными внешними устройствами - респект Вам. Если пользуетесь готовыми - тоже молодцы, но не забывайте, что их писали тоже люди со своим знанием и подходом. И нет гарантии что их подход в понимании работы будет таким-же как и у Вас.

Так, для затравки: http://habrahabr.ru/post/146489/

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

Nett 15.11.2013 15:06

Цитата:

Сообщение от lti1 (Сообщение 277286)
Начало здесь.
Nett, в папке \arduino-1.0.5\hardware\arduino\cores\arduino меняете два файла USBAPI.h, HID.cpp на те что во вложении. И добавляете в код из этого поста нужные действия, не нужные удаляете

Спасибо огромное за подробную инструкцию, все заработало с первого раза:smile1:, вот только вопрос остался, в шапке нексуса и у murano написано что экранная клава не работает, однако она как была так и осталось, это нормально или что-то не так?

lti1 15.11.2013 16:20

Цитата:

Сообщение от Nett (Сообщение 277311)
Спасибо огромное за подробную инструкцию, все заработало с первого раза:smile1:, вот только вопрос остался, в шапке нексуса и у murano написано что экранная клава не работает, однако она как была так и осталось, это нормально или что-то не так?

Всегда пожалуйста!:smile2:
Это заработало? А то как уже писал, сам не проверял, не на чем.
Код:

// Volume
Remote.increase();        Volume Up
Remote.decrease();        Volume Down
Remote.mute();                Mute
 
// Playback
Remote.play();                Play
Remote.pause();                Pause
Remote.play_pause();        Play/Pause
Remote.stop();                Stop
 
// Track Controls
Remote.next();                Next
Remote.previous();        Previous
Remote.forward();        Fast Forward
Remote.rewind();        Rewind

По клавиатуре не стоит парится, у меня SGT2 то же не пропадает при подключении хардовой клавы.

Nett 15.11.2013 16:36

Цитата:

Сообщение от lti1 (Сообщение 277319)
Всегда пожалуйста!:smile2:
Это заработало? А то как уже писал, сам не проверял, не на чем.
Код HTML:

// Volume
Remote.increase();        Volume Up
Remote.decrease();        Volume Down
Remote.mute();                Mute
 
// Playback
Remote.play();                Play
Remote.pause();                Pause
Remote.play_pause();        Play/Pause
Remote.stop();                Stop
 
// Track Controls
Remote.next();                Next
Remote.previous();        Previous
Remote.forward();        Fast Forward
Remote.rewind();        Rewind


Да, как раз от сюда и брал. Все как часики швейцарские работает. Правда до машины еще не дошел, проверял дома на резисторах, думаю разницы не будет. P.S все делал на ардуино леонардо.

ilya174 24.11.2013 00:06

Вот что у меня получилось.
Скетч для ардуино уно. Ардуино определяется как HID устройство. В скетче управление планшетом ресистивными кнопками и управление питанием.

Код:

// Для рулевых кнопок
uint8_t buf[8] = {
  0 };
 
// реле питания звуковой карты 
  #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    (1023)
#define KEY_CH_VOL_PLUS      (1523)
#define KEY_CH_PAUSE        (1500)
#define KEY_CH_PREV_TRACK    (1500)
#define KEY_CH_FORW_TRACK    (1500)
#define KEY_CH_TAB          (1500)
#define KEY_CH_ESC          (1500)
#define KEY_CH_AUDIO_OFF    (700)
#define KEY_CH_PLUS          (1500)
#define KEY_CH_MINUS        (1500)
#define KEY_CH_MINUS        (1500)
#define KEY_CH_MINUS        (1500)
#define KEY_CH_MINUS        (1500)


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

// Коды кнопок, что отсылаем в порт внешней проге
#define CH_VOL_MINUS        (226)   
#define CH_VOL_PLUS        (43)
#define CH_PAUSE            (3)
#define CH_PREV_TRACK      (4)
#define CH_FORW_TRACK      (5)
#define CH_TAB              (14)
#define CH_ESC              (128)
#define CH_AUDIO_OFF        (1)
#define CH_PLUS            (6)
#define CH_MINUS            (7)
#define CH_MINUS            (8)
#define CH_MINUS            (9)
#define CH_MINUS            (12)
#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 duration, millisold, off = 0;
boolean stateACC, relestate1, relestate2,relestate3,relestate4  = 0;
int LastKeyPressed = NONE;
int flag = 1;
int flag2 = 0;
void setup()     

Serial.begin(9600);
pinMode(relePin1, OUTPUT);
pinMode(relePin2, OUTPUT);
pinMode(relePin3, OUTPUT);
pinMode(relePin4, OUTPUT);
}     

void loop()     

  ReadSteering();
  Knopki();
  delay(10);
}

// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()     

  pinMode(relePin4, OUTPUT);
  digitalWrite(relePin4,flag );
  unsigned long TimeKeyPressed;
  int KeyPressed = NONE;
  int dt1 = analogRead(A0);
  delay(10);
  int dt2 = analogRead(A0);
  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.write(buf, 8);       
    releaseKey();
      }
    } 
    //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(buf, 8);       
    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(buf, 8);       
    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(buf, 8);       
    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(buf, 8);       
    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(buf, 8);       
    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(buf, 8);       
    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(relePin4, flag2);
        flag = 0;
        flag2 = 1;
        }
        else if ( (LastKeyPressed != CH_AUDIO_OFF) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_AUDIO_OFF_DELAY)&& flag==0)
      {     
        digitalWrite(relePin4, flag2);       
        flag = 1;
        flag2 = 0;
        }       
        LastKeyPressed = CH_AUDIO_OFF; 
  LastTimeKeyPressed = TimeKeyPressed;   
        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(buf, 8);       
    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(buf, 8);       
    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(buf, 8);       
    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(buf, 8);       
    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(buf, 8);       
    releaseKey();       
      } 
    }
  } 
}

void releaseKey()
{
  buf[0] = 0;
  buf[2] = 0;
  Serial.write(buf, 8);        // 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(relePin1, HIGH);
    relestate1 = 1;
    millisold = millis();
    }
    if(digitalRead(ACCPin) && stateACC &&  millis ()-duration > ONTablet){
    digitalWrite(relePin2, HIGH);
    relestate2 = 1;
    millisold = millis();
    }
    if(digitalRead(ACCPin) && stateACC &&  millis ()-duration > ONAudio){
    digitalWrite(relePin3, HIGH);
    relestate3 = 1;
    millisold = millis();
    }   
 if(!digitalRead(ACCPin) && !stateACC && millis () -off> OFFHUB){
    digitalWrite(relePin1, LOW);
    relestate1 = 0;
    millisold = millis();   
  }
if(!digitalRead(ACCPin) && !stateACC &&  millis () -off > OFFTablet){
    digitalWrite(relePin2, LOW);
    relestate2 = 0;
    millisold = millis();   
  }
 if(!digitalRead(ACCPin) && !stateACC &&  millis () -off > OFFAudio){
    digitalWrite(relePin3, LOW);
    relestate3 = 0;
    millisold = millis();   
  }
}


timtman 02.12.2013 15:05

Рабочий код чтения кнопок для Arduino Leonardo и Micro - проверно на китайском Arduino Pro Micro .
выдает клавиатурные сочетания Win+A, Win+B ... Win+G
удобно для настройки через быстрый запуск http://pccar.ru/showpost.php?p=279247&postcount=54
Код:

int analogPin=A0; 
int data;

int  myRes[7]={291,197,160,232,263, 66,113};  // значения установлены опытным путем
char myKey[7]={'a','b','c','d','e','f','g'}; //х.з. буквы какие-то
int n=7; //размер массивов выше
int i_old=n+1; //надо так (типа война с дребезгом, хотя тут его нет)
int i;

void setup()
{
//  Serial.begin(9600);
  pinMode(analogPin,INPUT);
  digitalWrite(analogPin,HIGH);
  Keyboard.begin();
}

void loop()
{
  data=analogRead(analogPin);
//      Serial.println(data);
  for (i=0;i   {
    if(data>myRes[i]-15 && data     {
      i_old=i;
      Keyboard.press(KEY_LEFT_GUI);
      Keyboard.press(myKey[i]);
      delay(100);
      Keyboard.releaseAll();
    }
    if(data>1000) { i_old=n+1; }
  }
  delay(50);
}


Резистивных кнопок у меня 7 шт, номиналы у них 2кОм, 4кОм ... 14кОм (хотя не суть).

Опять ВАЖНО: К ардуине подключаюсь к GND и А0 (делитель самому делать не надо).

P.S. Перевод выражения "подтяжка вверх" (стырено с ардуино.ру):
Если вход/выход (pin) был установлен в режим вход (INPUT), то функция digitalWrite со значением HIGH будет активировать внутренний 20K нагрузочный резистор. Подача LOW в свою очередь отключает этот резистор. Нагрузочного резистра достаточно чтобы светодиод, подключенный к входу, светил тускло. Если вдруг светодиод работает, но очень тускло, возможно необходимо установить режим выход (OUTPUT) функцией pinMode().

macau 22.12.2013 17:47

Вот кстати мой вариант резестивных кнопок а-ля нищеброд

Daniel 24.12.2013 10:14

Цитата:

Сообщение от macau (Сообщение 281399)

+1

Только я убрал резисторы, и подпаялся к контроллеру клавиатуры. А установка - 1 в 1. (фото в подписи) :smile2:

Andrey_T 11.01.2014 23:42

Сделал для TOYOTA резистивного руля интерфейс на Arduino UNO R3
За основу взял код отсюдаhttp://compcar.ru/forum/showthread.p...ll=1#post57800
и отсюдаhttp://atomic-cactus.com/2013/03/26/...rduino-part-1/, здесь же все подробно описано, как превратить ардуину в HID клавиатуру. Так как устройство Parrot Asteroid Smart с системой Android 2.3, то HID коды управляют напрямую только громкостью, все остальное реализовано через комбинацию кнопок SEARCH+KEY с помощью таскера и меню быстрого вызова приложений.
Код:

/ Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_MINUS_DELAY (500)
#define KEY_CH_PLUS_DELAY (500)
#define KEY_VOL_MINUS_DELAY (200)
#define KEY_VOL_PLUS_DELAY (200)
#define KEY_MODE_DELAY (800)
#define VARIANT_DELAY (200) //Время работы в режиме курсора (циклов по 125 милисекунд)
#define SOURCE_DELAY (3000) //Время выбора источника звука

// Значения кнопок для резистора подпорки 3Ком
#define KEY_CH_MINUS (93)
#define KEY_CH_PLUS (20)
#define KEY_VOL_MINUS (529)
#define KEY_VOL_PLUS (256)
//#define KEY_MODE (805)

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

// Номера кнопок
#define CH_MINUS (1)
#define CH_PLUS (2)
#define VOL_MINUS (3)
#define VOL_PLUS (4)
#define MODE (5)
#define NONE (0)


unsigned long LastTimeKeyPressed = millis();
unsigned long LastTimeModePressed = millis();
int LastKeyPressed = NONE;
int i=0;
boolean radio = false;
boolean LastModePressed = false;
boolean KeysPressed = false;
boolean ModePressed = false;
boolean LastMode = false;
boolean KMode = false;
boolean Variant = false;
boolean SoundSource = false;
boolean EnterPressed = false;
uint8_t buffer[8] = {
0};
boolean dirty = true;

void setup()
{
Serial.begin(9600);
pinMode(8, INPUT);
digitalWrite(8, HIGH);
}

void loop()
{
ReadSteering();
delay(75);
releaseKey();
}

// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()
{
unsigned long TimeKeyPressed;
int KeyPressed = NONE;
int dt1 = analogRead(0);
//Нажата кнопка MODE
ModePressed=(digitalRead(8) == LOW);
if (ModePressed and !LastMode)
{
LastTimeModePressed=millis();
}
delay(50);
int dt2 = analogRead(0);
if (abs(dt1-dt2)<=5 and dt1<900 ) //если нет дребезга и что-то есть
{
// Регистрируем время нажатия кнопки
TimeKeyPressed = millis();

//CH_MINUS
if ( (dt1-KEY_DELTA <= KEY_CH_MINUS) and (dt1+KEY_DELTA >= KEY_CH_MINUS) )
{
if ( (LastKeyPressed != CH_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_MINUS_DELAY) )
{
LastKeyPressed = CH_MINUS;
KeyPressed = CH_MINUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//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;
KeyPressed = CH_PLUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//VOL_MINUS
else if ( (dt1-KEY_DELTA <= KEY_VOL_MINUS) and (dt1+KEY_DELTA >=KEY_VOL_MINUS) )
{
if ( (LastKeyPressed != VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_MINUS_DELAY) )
{
LastKeyPressed = VOL_MINUS;
KeyPressed = VOL_MINUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//VOL_PLUS
else if ( (dt1-KEY_DELTA <= KEY_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_VOL_PLUS) )
{
if ( (LastKeyPressed != VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_PLUS_DELAY) )
{
LastKeyPressed = VOL_PLUS;
KeyPressed = VOL_PLUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
}
KMode= (digitalRead(8) == LOW) and (ModePressed); //Нажата кнопка MODE
if (KeyPressed != NONE)
{
KeysPressed = true;
if (Variant or SoundSource) //Если режим курсора или выбор источника звука
{
switch(KeyPressed)
{
case CH_MINUS:
if (Variant)
{
sendKey(0x50,0); //влево
//Serial.println("LEFT_VARIANT");
}
else
{
sendKey(0x65,0x05); // SEARCH+b = App #2
//Serial.println("SEARCH+B_SOURCE");
SoundSource=false;
}
break;
case CH_PLUS:
if (Variant)
{
sendKey(0x4f,0); //вправо
//Serial.println("RIGHT_VARIANT");
}
else
{
sendKey(0x65,0x06); // SEARCH+c = App #3
//Serial.println("SEARCH+C_SOURCE");
SoundSource=false;
}
break;
case VOL_MINUS:
sendKey(0x51,0); //вниз
//Serial.println("DOWN");
break;
case VOL_PLUS:
sendKey(0x52,0); //вверх
//Serial.println("UP");
break;
}
}
else
{
switch(KeyPressed)
{
case CH_MINUS:
sendKey(0x65,0x13); // SEARCH+p = Previous Song
//Serial.println("SEARCH+P");
break;
case CH_PLUS:
sendKey(0x65,0x11); // SEARCH+n = Next Song
//Serial.println("SEARCH+N");
break;
case VOL_MINUS:
sendKey(0x81,0); //громкость -
//Serial.println("VOLUME-");
break;
case VOL_PLUS: //громкость +
sendKey(0x80,0);
//Serial.println("VOLUME+");
break;
}
}
}

else //Если небыло нажато кнопок, то проверяем, отпускалась ли кнопка MODE и до этого не сней нажимались кнопки
{
if (LastMode and !KMode)
{
if (abs(millis()-LastTimeModePressed) < KEY_MODE_DELAY)
{
//Serial.println("time if (Variant or SoundSource)
{
if (SoundSource and !KeysPressed)
{
sendKey(0x0029,0); //Esc
//Serial.println("ESC_SOURCE");
}
else
{
sendKey(0x28,0); //Enter
//Serial.println("ENTER_SOURCE");
EnterPressed=true;
}
SoundSource=false;
}
else
{
sendKey(0x65,0x04); // SEARCH+a = Music App #1
//Serial.println("SEARCH+A_SOURCE_TRUE");
SoundSource=true;
KeysPressed = false;
}
}
else
{
Variant=!Variant;
if (Variant)
{
sendKey(0x003a,0); //Menu
//Serial.println("MENU");
EnterPressed=false;
}
else
{
//Если небыла нажата кнопка ENTER
if (!EnterPressed)
{
sendKey(0x0029,0); //Esc
//Serial.println("ESC");
}
}
}
}
else //Если не нажимались вообще никакие кнопки
{
if (Variant) //Если кнопки долго не нажимались, то возвращаемся в режим управления музыкой
{ // Ставим все значения как при старте
i=i+1;
if (i>VARIANT_DELAY)
{
LastModePressed = false;
ModePressed = false;
LastMode = false;
KMode = false;
Variant = false;
SoundSource = false;
EnterPressed = false;
KeysPressed = false;
LastTimeKeyPressed = millis();
LastTimeModePressed = millis();
//Serial.println("---RESET SETTINGS--");
i=0;
}
}
else
{
if ( SoundSource and (abs(millis()-LastTimeModePressed) > SOURCE_DELAY))
{
if (KeysPressed) //Если нажимался курсор, то через время нажмется ENTER
{
sendKey(0x28,0); //Enter
//Serial.println("ENTER_SOURCE");
}
else //Иначе возврат
{
sendKey(0x0029,0); //Esc
//Serial.println("ESC_SOURCE");
}
SoundSource=false;
}
}
}
}
LastMode=KMode;
}

void sendKey(int code, int code2) {
buffer[2] = code;
buffer[3] = code2;

Serial.write(buffer, 8);
dirty = true;
}

void releaseKey() {
if (dirty) {
buffer[0] = 0;
buffer[2] = 0;
buffer[3] = 0;
Serial.write(buffer, 8);
dirty = false;
}
}


armlive 18.01.2014 17:14

ilya174,
Цитата:

Вот что у меня получилось.
Скетч для ардуино уно. Ардуино определяется как HID устройство. В скетче управление планшетом ресистивными кнопками и управление питанием.
PHP код:

// Коды кнопок, что отсылаем в порт внешней проге
#define CH_VOL_MINUS        (226)    
#define CH_VOL_PLUS         (43)
#define CH_PAUSE            (3)
#define CH_PREV_TRACK       (4)
#define CH_FORW_TRACK       (5)
#define CH_TAB              (14)
#define CH_ESC              (128)
#define CH_AUDIO_OFF        (1)
#define CH_PLUS             (6)
#define CH_MINUS            (7)
#define CH_MINUS            (8)
#define CH_MINUS            (9)
#define CH_MINUS            (12)
#define NONE                (0) 

что за хитрые коды кнопок, ни как не могу понять, нормальные коды не подходят, а здесь к примеру define CH_VOL_PLUS (43) это буква b?
Может кто знает?
И так, методом подбора узнал все коды кнопок, но мультимедию не нашел. Назначил некоторые коды неиспользуемых кнопок и переназначил их в файле планшета. Позже выложу и разжую

armlive 19.01.2014 20:47

Вложений: 1
Вот рабочий вариант ардуино уно 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  (400)
#define KEY_CH_FORW_TRACK_DELAY  (400)
#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)

// Значения кнопок значение "1500" свободные кнопки, если у вас больше 6 кнопок, можете использовать прописав свои значения
#define KEY_CH_VOL_MINUS    (540)
#define KEY_CH_VOL_PLUS     (337)
#define KEY_CH_PAUSE         (1500)
#define KEY_CH_PREV_TRACK   (500)
#define KEY_CH_FORW_TRACK   (251)
#define KEY_CH_TAB          (484)
#define KEY_CH_ESC          (217)
#define KEY_CH_AUDIO_OFF    (1500)
#define KEY_CH_PLUS    (1500)
#define KEY_CH_MINUS    (1500)


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

// Коды кнопок, что отсылаем в порт внешней проге, 0 пустое значение при добавлении кнопок больше 6-ти, пропишите коды желаемых кнопок
#define CH_VOL_MINUS        (81) 
#define CH_VOL_PLUS         (82) 
#define CH_PAUSE            (0) 
#define CH_PREV_TRACK       (80) 
#define CH_FORW_TRACK       (79) 
#define CH_TAB              (72)  
#define CH_ESC              (74) 
#define CH_AUDIO_OFF        (0) 
#define CH_PLUS             (0)
#define CH_MINUS            (0)
#define NONE                (0)

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

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.write(buf8);
      
releaseKey();
      }
    }  
    
//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);      
    
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);    
     
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);
    
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);
    
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);
    
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);
    
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;
        
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();     
  } 



ilya174 20.01.2014 09:34

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

Сообщение от armlive (Сообщение 283796)
ilya174,
PHP код:

// Коды кнопок, что отсылаем в порт внешней проге
#define CH_VOL_MINUS        (226)    
#define CH_VOL_PLUS         (43)
#define CH_PAUSE            (3)
#define CH_PREV_TRACK       (4)
#define CH_FORW_TRACK       (5)
#define CH_TAB              (14)
#define CH_ESC              (128)
#define CH_AUDIO_OFF        (1)
#define CH_PLUS             (6)
#define CH_MINUS            (7)
#define CH_MINUS            (8)
#define CH_MINUS            (9)
#define CH_MINUS            (12)
#define NONE                (0) 

что за хитрые коды кнопок, ни как не могу понять, нормальные коды не подходят, а здесь к примеру define CH_VOL_PLUS (43) это буква b?
Может кто знает?
И так, методом подбора узнал все коды кнопок, но мультимедию не нашел. Назначил некоторые коды неиспользуемых кнопок и переназначил их в файле планшета. Позже выложу и разжую

На форуме я выложил сырой вариант скетча, т.е. значения кнопок не соответствуют названиям. Нужные коды кнопок можно взять отсюда или скачать прикрепленный файл.
Мультимедиа кнопки также переназначал в планшете. Есть еще прога для переназначения кнопок и запуска приложений по кнопке (если нужно могу поискать).
Единственное, что у меня не получилось это реализовать комбинацию клавиш (ALT+TAB), может кто подскажет как это сделать?

d3890666 20.01.2014 13:27

Цитата:

Сообщение от ilya174 (Сообщение 283880)
Единственное, что у меня не получилось это реализовать комбинацию клавиш (ALT+TAB), может кто подскажет как это сделать?

Keyboard.press(TAB);
Keyboard.press(ALT);
delay(120);
Keyboard.releaseAll();

а так не работает?

ilya174 20.01.2014 22:20

Цитата:

Сообщение от d3890666 (Сообщение 283893)
Keyboard.press(TAB);
Keyboard.press(ALT);
delay(120);
Keyboard.releaseAll();

а так не работает?

Это для Arduino Leonardo, у меня UNO


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

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