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

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > AndroidCar > Дополнительные устройства

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2013, 00:06   #191
ilya174
Новый Пользователь
 
Регистрация: 16.01.2011
Регион: 74
Сообщений: 26
ilya174 is on a distinguished road
По умолчанию

Вот что у меня получилось.
Скетч для ардуино уно. Ардуино определяется как 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();     
  } 
}
ilya174 вне форума   Ответить с цитированием
Старый 02.12.2013, 15:05   #192
timtman
Старший Пользователь
 
Аватар для timtman
 
Регистрация: 05.04.2013
Возраст: 50
Город: Казань
Регион: 16, 116
Машина: X-Trail T30
Сообщений: 181
timtman has a spectacular aura abouttimtman has a spectacular aura about
По умолчанию

Рабочий код чтения кнопок для 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<n;i=i+1)
  {
    if(data>myRes[i]-15 && data<myRes[i]+15 && i_old!=i) 
    { 
      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().
__________________
Ровной дороги! мой проект: X-Trail T30 + Nexus7

Последний раз редактировалось timtman; 11.04.2014 в 11:30.
timtman вне форума   Ответить с цитированием
Старый 22.12.2013, 17:47   #193
macau
Старший Пользователь
 
Регистрация: 22.10.2012
Регион: 78, 98
Сообщений: 758
macau is just really nicemacau is just really nicemacau is just really nicemacau is just really nice
По умолчанию

Вот кстати мой вариант резестивных кнопок а-ля нищеброд
macau вне форума   Ответить с цитированием
Старый 24.12.2013, 10:14   #194
Daniel
Старший Пользователь
 
Аватар для Daniel
 
Регистрация: 13.11.2013
Возраст: 42
Город: Самара
Регион: 63, 163
Машина: Hyundai Elantra J4, Suzuki SX4
Сообщений: 632
Daniel has a reputation beyond reputeDaniel has a reputation beyond reputeDaniel has a reputation beyond reputeDaniel has a reputation beyond reputeDaniel has a reputation beyond reputeDaniel has a reputation beyond reputeDaniel has a reputation beyond reputeDaniel has a reputation beyond reputeDaniel has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от macau Посмотреть сообщение
+1

Только я убрал резисторы, и подпаялся к контроллеру клавиатуры. А установка - 1 в 1. (фото в подписи)
Daniel вне форума   Ответить с цитированием
Старый 11.01.2014, 23:42   #195
Andrey_T
Новый Пользователь
 
Регистрация: 28.08.2013
Возраст: 51
Регион: 23, 93
Сообщений: 1
Andrey_T is on a distinguished road
По умолчанию

Сделал для 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<KEY_MODE_DELAY");
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;
}
}
Andrey_T вне форума   Ответить с цитированием
Старый 18.01.2014, 17:14   #196
armlive
Старший Пользователь
 
Регистрация: 12.12.2013
Возраст: 43
Город: Армавир
Регион: 23, 93
Машина: Nissan Qashqai
Сообщений: 510
armlive is a glorious beacon of lightarmlive is a glorious beacon of lightarmlive is a glorious beacon of lightarmlive is a glorious beacon of lightarmlive is a glorious beacon of light
По умолчанию

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:16.
armlive вне форума   Ответить с цитированием
Старый 19.01.2014, 20:47   #197
armlive
Старший Пользователь
 
Регистрация: 12.12.2013
Возраст: 43
Город: Армавир
Регион: 23, 93
Машина: Nissan Qashqai
Сообщений: 510
armlive is a glorious beacon of lightarmlive is a glorious beacon of lightarmlive is a glorious beacon of lightarmlive is a glorious beacon of lightarmlive is a glorious beacon of light
По умолчанию

Вот рабочий вариант ардуино уно 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();     
  } 

Миниатюры
Нажмите на изображение для увеличения
Название: shema.jpg
Просмотров: 2164
Размер:	75.0 Кб
ID:	34402  

Последний раз редактировалось armlive; 29.03.2014 в 23:15.
armlive вне форума   Ответить с цитированием
Старый 20.01.2014, 09:34   #198
ilya174
Новый Пользователь
 
Регистрация: 16.01.2011
Регион: 74
Сообщений: 26
ilya174 is on a distinguished road
По умолчанию

Цитата:
Сообщение от armlive Посмотреть сообщение
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), может кто подскажет как это сделать?
Вложения
Тип файла: rar Коды кнопок клавиатуры.rar (627.9 Кб, 651 просмотров)
ilya174 вне форума   Ответить с цитированием
Старый 20.01.2014, 13:27   #199
d3890666
Пользователь
 
Регистрация: 22.01.2013
Город: Москва
Регион: 77, 97, 99, 177
Машина: Renault Duster
Сообщений: 38
d3890666 is on a distinguished road
По умолчанию

Цитата:
Сообщение от ilya174 Посмотреть сообщение
Единственное, что у меня не получилось это реализовать комбинацию клавиш (ALT+TAB), может кто подскажет как это сделать?
Keyboard.press(TAB);
Keyboard.press(ALT);
delay(120);
Keyboard.releaseAll();

а так не работает?
d3890666 вне форума   Ответить с цитированием
Старый 20.01.2014, 22:20   #200
ilya174
Новый Пользователь
 
Регистрация: 16.01.2011
Регион: 74
Сообщений: 26
ilya174 is on a distinguished road
По умолчанию

Цитата:
Сообщение от d3890666 Посмотреть сообщение
Keyboard.press(TAB);
Keyboard.press(ALT);
delay(120);
Keyboard.releaseAll();

а так не работает?
Это для Arduino Leonardo, у меня UNO
ilya174 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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