Управление резистивными кнопками
- Войдите на сайт для отправки комментариев
Пт, 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 прошил? Не могу установить драйвера для флипа.