Вот здесь прикупил http://devicter.ru/goods/Iteaduino-Tiny. Написал скетч для чтения рулевых кнопок. Iteaduino Tiny (ATtiny 85) прикидывается в системе УСБ клавиатурой и шлет нажатия кнопок. Все работает пока не перезагрузишь комп. После перезагрузки в системе "Неизвестное устройство". Выдернешь из разъема и снова воткнешь, появляется клавиатура и все снова хорошо. Как бы это победить?
вот скетч, за основу взял уже присутствующий в сети.
#include "DigiKeyboard.h"
// Для рулевых кнопок
// Задержки между нажатиями конкретных кнопок, миллисекунды
#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 (558)
#define KEY_CH_PLUS (640) //net takoi
#define KEY_VOL_MINUS (58)
#define KEY_VOL_PLUS (295)
#define KEY_MODE (782)
// Погрешность при чтении кнопок
#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() {
// don’t need to set anything up to use DigiKeyboard
pinMode(1, INPUT); // Make sure IR pin is set as input
//pinMode(1, OUTPUT);
}
void loop() {
DigiKeyboard.update();
ReadSteering();
delay(50);
} // loop end
// digitalWrite(1, HIGH);
// delay(1000); // wait for a second
// turn the LED off by making the voltage LOW
// digitalWrite(1, LOW);
// delay(1000);
// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()
{
unsigned long TimeKeyPressed;
int KeyPressed = NONE;
int dt1 = analogRead(1);
delay(50);
int dt2 = analogRead(1);
// DigiKeyboard.print(dt2);
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;
DigiKeyboard.sendKeyStroke(KEY_F8);
}
}
//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;
DigiKeyboard.sendKeyStroke(KEY_C);
}
}
//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;
DigiKeyboard.sendKeyStroke(KEY_F6);
}
}
//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;
DigiKeyboard.sendKeyStroke(KEY_F5);
}
}
//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;
DigiKeyboard.sendKeyStroke(KEY_F7);
}
}
// if (KeyPressed != NONE)
// {
// Serial.print(char(255));
// Serial.print(KeyPressed,DEC);
// DigiKeyboard.sendKeyStroke(KEY_E);
// }
//Serial.print(dt1,DEC);
//Serial.print(" ");
//Serial.println(dt2,DEC);
}
}