Сделал для 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;
}
}