Доброе время суток вам всем!
Пытаясь осуществить CarPc из Nexus 7 2013 у себя в машине наткнулся на одну интересную вещь - Leonardo с возможностью HID keyboard.
До этого думал ставить просто контроллер для управлением включения-отключения планшета и переферии. Было просто.
Но я задумал облегчить управление планшетом в движении и для этого купил подрулевой джойстик от ам Renault.
Вот его схема
То, что я находил из скетчей под Ардуино, были либо под UNO либо на резистивное управление магнитолой.
PHP код:
/////////////////////////////////////////////////////////////////
// alpine
#define alpinePin 13
#define cmdPower 0x09
#define cmdSource 0x0A
#define cmdBand 0x0D
#define cmdVolumeDown 0x15
#define cmdVolumeUp 0x14
#define cmdUp 0x0E
#define cmdDown 0x0F
#define cmdLeft 0x13
#define cmdRight 0x12
#define cmdPlay 0x07
#define cmdAProc 0x06
#define cmdMute 0x16
#define cmdAngleUp 0x4C
#define cmdAngleDown 0x4B
#define cmdCDChange 0x03
/////////////////////////////////////////////////////////////////
// джойстик
#define rows 3
#define cols 2
// номера кнопок в соответствии со схемой
const byte keys[rows][cols] =
{
{1,4},
{2,5},
{6,3}
};
// состояния направлений енкодера
const byte encoderdirection[3][3] = // 0 - на месте, 1 - вниз, 2 - вверх
{
{0, 1, 2}, // 0
{2, 0, 1}, // 1
{1, 2, 0} // 2
};
// номера пинов
const byte rowPins[rows] = {8, 6, 9}; // строки (желтый, зеленый, голубой)
const byte colPins[cols] = {1, 0}; // столбцы (черный, красный)
#define encoderPin 2 // пин енкодера (коричневый)
byte encodervalue;
// маски для клавиш
#define MaskMediaButton 1
#define MaskRadioButton 2
#define MaskVolumeUpButton 4
#define MaskVolumeDownButton 8
#define MaskOkButton 16
#define MaskMuteButton 32
#define MaskScrollDown 64
#define MaskScrollUp 128
/////////////////////////////////////////////////////////////////
void setup()
{
int i;
// строки - на выход
for (i = 0; i < rows; ++i)
{
pinMode(rowPins[i], OUTPUT);
}
// столбцы - на вход
for (i = 0; i < cols; ++i)
{
pinMode(colPins[i], INPUT);
digitalWrite(colPins[i], HIGH); // включаем подтягивающий резистор
}
// столбец для енкодера
pinMode(encoderPin, INPUT);
digitalWrite(encoderPin, HIGH); // включаем подтягивающий резистор
encodervalue = 0;
Serial.begin(9600);
// initialize mouse control:
Mouse.begin();
Keyboard.begin();
}
// сканирование джойстика
byte scan(void)
{
int i, j;
byte code = 0;
for (i = 0; i < rows; ++i)
{
digitalWrite(rowPins[i], LOW);
// кнопки
for (j = 0; j < cols; ++j)
{
if(digitalRead(colPins[j]) == false)
{
code |= 1 << (keys[i][j] - 1);
}
}
// енкодер
if (digitalRead(encoderPin) == false)
{
int oldencodervalue = encodervalue;
encodervalue = i;
switch (encoderdirection[oldencodervalue][encodervalue])
{
case 1: // вниз
code |= 64;
break;
case 2: // вверх
code |= 128;
break;
}
}
digitalWrite(rowPins[i], HIGH);
}
return code;
}
// отправка байта
void SendByte(byte data)
{
for (int i = 0; i < 8; ++i)
{
digitalWrite(alpinePin, HIGH);
delayMicroseconds(560);
digitalWrite(alpinePin, LOW);
if (data & 1)
{ // 1
delayMicroseconds(1680);
}
else
{ // 0
delayMicroseconds(560);
}
data >>= 1;
}
}
// отправка команды
void Send(byte command)
{
digitalWrite(alpinePin, HIGH);
delayMicroseconds(9000);
digitalWrite(alpinePin, LOW);
delayMicroseconds(4500);
SendByte(0x86);
SendByte(0x72);
SendByte(command);
SendByte(~command);
digitalWrite(alpinePin, HIGH);
delayMicroseconds(560);
digitalWrite(alpinePin, LOW);
}
// цикл программы
void loop(void)
{
byte code;
code = scan();
if (code & MaskMediaButton)
Keyboard.write('u');
if (code & MaskRadioButton)
Send(cmdUp);
if (code & MaskVolumeUpButton)
Send(cmdRight);
if (code & MaskVolumeDownButton)
Send(cmdLeft);
if (code & MaskOkButton)
Send(cmdPlay);
if (code & MaskMuteButton)
Send(cmdMute);
if (code & MaskScrollDown)
Send(cmdVolumeDown);
if (code & MaskScrollUp)
Send(cmdVolumeUp);
}
Протестировав этот скетч на нажатия кнопок я попытался написать скетч под свои нужды.
С управлением питания планшета и переферии я разобрался, а с джойстиком, увы нет.
По этому проблема сейчас встала в управлении андроид планшетом с этого подрулевого джойстика как с HID клавиатуры с короткими и длинными нажатиями на кнопки + энкодер.
Так как я в програмирование залез только сейчас, прошу вашей помощи в реализации проекта. В долгу не останусь, т.е. Ваш труд будет оплачен по договорености.
Жду ваших предложений, можно в личку.
С уважением,
D. K.