Показать сообщение отдельно
Старый 11.01.2014, 23:42   #195
Andrey_T
Новый Пользователь
 
Регистрация: 28.08.2013
Возраст: 50
Регион: 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 вне форума   Ответить с цитированием