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