Управление резистивными кнопками

ilya174
Offline
Зарегистрирован: 17.09.2013

Здравствуйте!

Помогите разобраться. Задача подключение 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  
}

то все работает нормально, но он не для резистивных кнопок.

В чем может быть проблема?

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Как ты ATmega8U2 прошил? Не могу установить драйвера для флипа.