PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Дополнительные устройства (http://pccar.ru/forumdisplay.php?f=177)
-   -   Резистивные кнопки под андроид (http://pccar.ru/showthread.php?t=18478)

Artemka181 16.06.2014 07:38

Делаю так как написано, все проходит но как USB hid не определяется. В андройде не работает тоже.

Chubaka885 09.08.2014 20:08

Помню где то на форуме было решение одновременной работы андройд клавиатуры при подключенной внешней. Кто нибудь даст ссылку?
Поиском найти не могу.

з.ы решение не установкой APK а изменением кода в прошивке.

SpawnUA 11.08.2014 14:08

Одновременное использование экранной и внешней клавы возможно, если поставить Smart Keyboard - там можно настроить чтобы показывалась и экранная клава.

Chubaka885 02.09.2014 21:57

Цитата:

Сообщение от SpawnUA (Сообщение 303705)
Одновременное использование экранной и внешней клавы возможно, если поставить Smart Keyboard - там можно настроить чтобы показывалась и экранная клава.

Спасибо!, но я хотел без установки APK. Видел что можно где что то прописать, а гле видел не помню.

Artemka181 05.09.2014 21:05

Приветствую. Приобрел ардуино леонардо. Заливаю скетч кнопки работают. Коды кнопокподобрал. Но вот данный скетч не работает.Планшет на него не реагирует хотя как устройство ввода определил. Что могу делать не так ?
Набор резестивных кнопок подключен к А0
Цитата:

// Для рулевых кнопок
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();
}
}

lti1 05.09.2014 22:23

Цитата:

Сообщение от Artemka181 (Сообщение 305680)
Приветствую. Приобрел ардуино леонардо. Заливаю скетч кнопки работают. Коды кнопокподобрал. Но вот данный скетч не работает.Планшет на него не реагирует хотя как устройство ввода определил. Что могу делать не так ?
Набор резестивных кнопок подключен к А0

А чем этот скетч не понравился?

Artemka181 06.09.2014 19:04

Цитата:

Сообщение от lti1 (Сообщение 305694)
А чем этот скетч не понравился?

Хотелось питанием планшета поуправлять

Daniel 07.09.2014 02:18

Цитата:

Сообщение от Artemka181 (Сообщение 305752)
Хотелось питанием планшета поуправлять

Питание питанием, управляй на здоровье, но чтобы планшет принимал нажатия кнопок, как клавиатурные, нужно их посылать не в serial, а как в скетче выше, через remote или Keyboard. Это же леонардо, все уже реализовано.

Artemka181 07.09.2014 17:42

Цитата:

Сообщение от Daniel (Сообщение 305771)
Питание питанием, управляй на здоровье, но чтобы планшет принимал нажатия кнопок, как клавиатурные, нужно их посылать не в serial, а как в скетче выше, через remote или Keyboard. Это же леонардо, все уже реализовано.

Понял. Спасибо

ВладимирC 18.10.2014 20:58

Цитата:

Сообщение от Chubaka885 (Сообщение 288838)
Готовый скетч для резестивных кнопок, любезно предоставленный lti1 за что ему огромное спасибо. Для работы требуются модифицированные USBAPI.h, HID.cpp. Скачать вложение с поста #182.
Скетч работает на arduino pro micro, arduino leonardo.

Алгоритм:
Кнопки громкости.
Одиночное нажатие - прибавление/убавление на одну единицу.
Удержание - прибавление/убавление до отпускания.

Кнопки следующий/предидущий трек
Одно нажатие - следующий/предидущий трек
Удержание - перемотка

Кнопка mode
первое нажатие - отсылается нажатие ALT и два раза TAB. Каждое следующее нажатие, если не истекло 800 мили сек. отсылает один раз TAB, ALT остаётся нажатым.
Удержание - плей/пауза.

Код:

int analogPin=6;    //пин для подключения кнопок
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;

void setup()
{
Keyboard.begin();
}

void loop()
{
  data=analogRead(analogPin); //читаем значение нажатой кнопки
 
//********************** Громкость ************************************

  if(data>=950 && flag == 0) // все кнопки отпущены
  {
    eventTime=millis();
  }

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=210 && data<=230 && flag == 0) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    Remote.increase();
    flag = 5;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=210 && data<=230 && flag == 5 || data>=210 && data<=230 && flag == 3) // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.increase(); // действие после удержание кнопки, Увеличить громкость каждые 0,1 секунды
    flag = 3;
    Remote.clear();
    delay(100);
  }

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=457 && data<=477 && flag == 0) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    Remote.decrease();
    flag = 6;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=457 && data<=477 && flag == 6 || data>=457 && data<=477 && flag == 3) // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.decrease(); // действие после удержание кнопки, Уменьшить громкость каждые 0,1 секунды
    flag = 3;
    Remote.clear();
    delay(100);
  }
 
//********************** AltTab + Play/pause ************************************   

if(millis()-eventTime>10 && millis()-eventTime<499 && data>=567 && data<=587) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    flag = 1;
  }

  if(data>=950 && flag == 1 && pauseMillis == 0) // действие после короткого нажатия кнопки, Alt+Tab
  {
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_TAB);
    Keyboard.release(KEY_TAB);
    Keyboard.press(KEY_TAB);
    Keyboard.release(KEY_TAB);
    flag = 0;
    pauseMillis = millis();
  }
 
  if(data>=950 && flag == 1 && pauseMillis != 0) // действие после короткого повторного нажатия кнопки, Alt+Tab
  {
    Keyboard.press(KEY_TAB);
    Keyboard.release(KEY_TAB);
    flag = 0;
    pauseMillis = millis();
  }
 
  if(pauseMillis && millis()-pauseMillis >= 800 && data>=950) // && flag == 7 && data>=950)
  {
    flag = 0;
    pauseMillis = 0;
    Keyboard.releaseAll();
  }
 
  if(millis()-eventTime>500 && data>=567 && data<=587 && flag == 1) // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.play_pause(); // действие после удержание кнопки, воспроизведение / пауза
    flag = 0;
    delay(10);
    Remote.clear();
  }
//********************** Next и Fast Forward ************************************   
   
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=0 && data<=10) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    flag = 2;
  }
 
  if(data>=950 && flag == 2) // действие после короткого нажатия кнопки, Next
  {
    Remote.next();
    flag = 0;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=0 && data<=10 && flag == 2 || data>=0 && data<=10 && flag == 3) // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.forward(); // действие после удержание кнопки, Fast Forward
    flag = 3;
    Remote.clear();
    delay(100);
  }
//********************** Previous и Rewind ************************************   
   
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=74 && data<=94) // короткое нажатие кнопки от 10 до 499 миллисекунд (изменяется здесь millis()-eventTime>10 && millis()-eventTime<499)
  {
    flag = 4;
  }
 
  if(data>=950 && flag == 4) // действие после короткого нажатия кнопки, Previous
  {
    Remote.previous();
    flag = 0;
    delay(10);
    Remote.clear();
  }

  if(millis()-eventTime>500 && data>=74 && data<=94 && flag == 4 || data>=74 && data<=94 && flag == 3) // удержание кнопки от 500 до ? миллисекунд (изменяется здесь millis()-eventTime>500)
  {
    Remote.rewind(); // действие после удержание кнопки, Rewind
    flag = 3;
    Remote.clear();
    delay(100);
  }
 
  if(data>=950 && flag == 3 || data>=950 && flag == 5 || data>=950 && flag == 6) // действие после отпускания кнопки
  {
    flag = 0;
  } 
}


Подскажи, плиз, это готовый скетч, т.е. я заливаю, компилирую и все должно работать? Я пытаюсь, но мне кучу ошибок выдает, файлы менял.


Часовой пояс GMT +4, время: 20:31.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot