Старший Пользователь
Регистрация: 24.02.2013
Возраст: 40
Город: Москва
Регион: 77, 97, 99, 177
Машина: Kia Optima
Сообщений: 180
|
Цитата:
Сообщение от armlive
Вот рабочий вариант ардуино уно r3 , с управлением по питанию.
Код взят у ilya174, основа и настроен под кашкай.
У кашкая по три кнопки на каждом выводе, соединяем их резисторами(разные номиналы обязательно) и делаем один вывод от шести полученных кнопок и общий минус. К ардуино уно подключаем минус к минусу, вывод от кнопок к A0, A0 через подтягивающий резистор(2ком) подключаем к +
Раскомментируйте //Serial.println(dt1); и залейте скетч.
Считайте свои значения в мониторе и установите для каждой кнопки и залейте скетч.
Дальше прошейте USB HID и почти готово.
Открываем "system\usr\keylayout\Generic.kl" (сделайте обязательно копию оригинала) и правим под себя.
Ни клавиатура, ни кнопки не страдают.
PHP код:
// Для рулевых кнопок
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 (540)
#define KEY_CH_VOL_PLUS (337)
#define KEY_CH_PAUSE (0)
#define KEY_CH_PREV_TRACK (500)
#define KEY_CH_FORW_TRACK (252)
#define KEY_CH_TAB (484)
#define KEY_CH_ESC (218)
#define KEY_CH_AUDIO_OFF (0)
#define KEY_CH_PLUS (0)
#define KEY_CH_MINUS (0)
#define KEY_CH_MINUS (0)
#define KEY_CH_MINUS (1500)
#define KEY_CH_MINUS (1500)
// Погрешность при чтении кнопок
#define KEY_DELTA (10)
// Коды кнопок, что отсылаем в порт внешней проге
#define CH_VOL_MINUS (81) //Кнопка down
#define CH_VOL_PLUS (82) //Кнопка up
#define CH_PAUSE (0) //
#define CH_PREV_TRACK (80) //Кнопка left
#define CH_FORW_TRACK (79) //Кнопка right
#define CH_TAB (72) //Кнопка break, Pause
#define CH_ESC (74) //Кнопка Home
#define CH_AUDIO_OFF (0)
#define CH_PLUS (0)
#define CH_MINUS (0)
#define CH_MINUS (0)
#define CH_MINUS (0)
#define CH_MINUS (0)
#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);
//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.print(CH_VOL_MINUS);
Serial.write(buf, 8);
releaseKey();
//Serial.print(CH_VOL_MINUS);
}
}
//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);
//Serial.println(CH_VOL_PLUS);
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);
//Serial.println(CH_PAUSE);
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);
//Serial.println(CH_PREV_TRACK);
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);
//Serial.println(CH_FORW_TRACK);
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);
//Serial.println(CH_TAB);
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);
//Serial.println(CH_ESC);
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;
//Serial.println(CH_AUDIO_OFF);
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();
}
}
|
Для таких как я, впервые сталкивающихся с программированием на arduino прошу разъяснить "что" и "как")
Имею arduino uno r3, qashqai 2013
Ардуину я прошил, залил без раскомментирования, т.е. не делал так как ты написал про переназначение, думаю, что значения кнопок у меня те же, что и у тебя)
Что не понял, что за "прошейте usb hid" это ты так заливку скетча назвал или что-то еще как-то, где-то надо шить?)
"system\usr\keylayout\Generic.kl" это я так понял, в нексусе надо править, что именно? Если есть возможность, свой файл можешь выложить или мне скинуть?
3) Не понятно, по этому "К ардуино уно подключаем минус к минусу, вывод от кнопок к A0, A0 через подтягивающий резистор(2ком) подключаем к +" вопрос куда втыкать минус (где power на плате, там несколько gnd), что за резистор, и к какому плюсу подключать опять же на плате, где power, там 3.3 и 5 в, который?
|