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

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

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, время: 10:10.

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