Управление резистивными кнопками
- Войдите на сайт для отправки комментариев
Пт, 25/10/2013 - 10:06
Здравствуйте!
Помогите разобраться. Задача подключение Arduino Uno к резистивным кнопкам и управление Android устройством (планшет).
Заливаю этот скетч:
// Для рулевых кнопок // Задержки между нажатиями конкретных кнопок, миллисекунды #define KEY_CH_MINUS_DELAY (200) #define KEY_CH_PLUS_DELAY (200) #define KEY_VOL_MINUS_DELAY (150) #define KEY_VOL_PLUS_DELAY (150) #define KEY_MODE_DELAY (300) // Значения кнопок #define KEY_CH_MINUS (445) #define KEY_CH_PLUS (640) #define KEY_VOL_MINUS (90) #define KEY_VOL_PLUS (270) #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(); int LastKeyPressed = NONE; void setup() { Serial.begin(57600); } void loop() { ReadSteering(); delay(50); } // Читает рулевые кнопки и пишет в порт код нажатой кнопки void ReadSteering() { unsigned long TimeKeyPressed; int KeyPressed = NONE; int dt1 = analogRead(3); delay(50); int dt2 = analogRead(3); 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; } } //MODE else if ( (dt1-KEY_DELTA <= KEY_MODE) and (dt1+KEY_DELTA >=KEY_MODE) ) { if ( (LastKeyPressed != MODE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_MODE_DELAY) ) { LastKeyPressed = MODE; KeyPressed = MODE; LastTimeKeyPressed = TimeKeyPressed; } } if (KeyPressed != NONE) { Serial.print(char(255)); Serial.print(KeyPressed,DEC); } //Serial.print(dt1,DEC); //Serial.print(" "); //Serial.println(dt2,DEC); } }
Прошиваю котроллер USB как HID устройство (клавиатура). Подключаю Arduino к компу, генерируют нажатие кнопки и начинаются чудеса. Клавиатура перестает работать, мышь начинает работать не корректно. При подключении к планшету- Android определяет устройство как Arduino Keyboard, но при нажатии кнопок ничего не происходит.
Хотя если залить вот этот скетч:
/* Arduino USB Keyboard HID demo * Volume+/Volume-/Mute keys */ uint8_t buf[8] = { 0 }; /* Keyboard report buffer */ #define PIN_VOLUME_UP 5 #define PIN_VOLUME_DOWN 6 #define PIN_MUTE 7 int state = 1; void setup() { Serial.begin(9600); pinMode(PIN_VOLUME_UP, INPUT); pinMode(PIN_VOLUME_DOWN, INPUT); pinMode(PIN_MUTE, INPUT); // enable internal pull-ups digitalWrite(PIN_VOLUME_UP, 1); digitalWrite(PIN_VOLUME_DOWN, 1); digitalWrite(PIN_MUTE, 1); delay(200); } void loop() { state = digitalRead(PIN_VOLUME_UP); if (state != 1) { buf[2] = 128; // Volume up key Serial.write(buf, 8); // Send keypress releaseKey(); } state = digitalRead(PIN_VOLUME_DOWN); if (state != 1) { buf[2] = 129; // Volume down key Serial.write(buf, 8); // Send keypress releaseKey(); } state = digitalRead(PIN_MUTE); if (state != 1) { buf[2] = 127; // Mute key Serial.write(buf, 8); // Send keypress releaseKey(); } } void releaseKey() { buf[0] = 0; buf[2] = 0; Serial.write(buf, 8); // Release key }
то все работает нормально, но он не для резистивных кнопок.
В чем может быть проблема?
Как ты ATmega8U2 прошил? Не могу установить драйвера для флипа.