Помоги написать скетч на Arduino UNO для управления AndroidCar планшетом.
- Войдите на сайт для отправки комментариев
Втр, 17/09/2013 - 12:21
Идея заключается в управлении питанием планшета по определенному алгоритму, также посылка команд управления (эмуляция нажатий кнопок клавиатуры) на планшет по средствам USB (Arduino видится планшету как 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(); } }