Как и в прошлом уроке про рулевое управлерие планшетом, для начала нам необходимо приобрести плату Arduino Leonadro или ArduinoMicro, главное отличие этих контроллеров в том что на них установлены микропроцессоры Atmega32u4 которая имеет на борту встроенную поддержку USB-соединения, благодаря чему не требуется вспомогательный процессор. Это позволяет устройствам на Atmega32u4 появляться на подключенном планшете (с поддержкой OTG) или компьютере в качестве мыши или клавиатуры в дополнение к виртуальному (CDC) последовательному порту (COM). В общем подойдет любой arduino совместимый контроллер который построен на Atmega32u4. + нам ещё потребуется сам повортный энкодер его можете приобрести на алиэкспресс.
Вторым шагом после того как приобрели необходимый вам контроллер необходимо скачать ArduinoIDE и установить для того чтобы установились драйвера, затем чтобы работали все функции скачайте подготовленную мной портативную версию ArduinoIDE вот ЗДЕСЬ, в этот архив уже добавлены все необходимые библиотеки и изменены файлы для работы в качестве медиа клавиатуры.
Подключение максимально простое, потребуется всего 5 проводков, и необходимо их соеденить следующим образом.
Далее расписаны команды для управления мультимедиа функциями.
//GENMC.ru управление мультимедиа при помощи энкодера
#include <SPI.h>//
#include <EEPROM2.h>
#include <EEPROM.h>
#define BTN_pin 8 // pin 8 кнопка энкодера SW
const int pin_A = 10; // pin 10 нога энкодера CLK
const int pin_B = 9; // pin 9 нога энкодера DT
unsigned char encoder_A; //переменная
unsigned char encoder_B; //переменная
unsigned char encoder_A_prev=0; //переменная
void setup() {
digitalWrite(BTN_pin, 1); //подтяжка кнопки энкодера
pinMode(pin_A, INPUT); //пины энкодера объявляем входами
pinMode(pin_B, INPUT); //пины энкодера объявляем входами
}
void loop()
{
{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Remote.increase(); //отправляем команду громкость выше
Remote.clear(); //очищаем команду
}
else {
Remote.decrease(); //отправляем команду громкость ниже
Remote.clear(); //очищаем команду
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}
if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Remote.play_pause(); //отправляем команду плей пауза
Remote.clear(); //очищаем команд
delay(500); //Делаем небольшую задержку чтоб не засыпало командами.
}
}
Далее рассмотрим как отправить комбинации нажатых клавиш на примере ALT+TAB для быстрого переключеня между активными приложениями (работает как на Windows так и на android) в таблице прведены команды которая понимает arduino.
| key | modifier | |||
|---|---|---|---|---|
| KEY_A | KEY_B | KEY_C | KEY_D | KEY_CTRL |
| KEY_E | KEY_F | KEY_G | KEY_H | KEY_SHIFT |
| KEY_I | KEY_J | KEY_K | KEY_L | KEY_ALT |
| KEY_M | KEY_N | KEY_O | KEY_P | KEY_GUI |
| KEY_Q | KEY_R | KEY_S | KEY_T | KEY_LEFT_CTRL |
| KEY_U | KEY_V | KEY_W | KEY_X | KEY_LEFT_SHIFT |
| KEY_Y | KEY_Z | KEY_1 | KEY_2 | KEY_LEFT_ALT |
| KEY_3 | KEY_4 | KEY_5 | KEY_6 | KEY_LEFT_GUI |
| KEY_7 | KEY_8 | KEY_9 | KEY_0 | KEY_RIGHT_CTRL |
| KEY_ENTER | KEY_ESC | KEY_BACKSPACE | KEY_TAB | KEY_RIGHT_SHIFT |
| KEY_SPACE | KEY_MINUS | KEY_EQUAL | KEY_LEFT_BRACE | KEY_RIGHT_ALT |
| KEY_RIGHT_BRACE | KEY_BACKSLASH | KEY_NUMBER | KEY_SEMICOLON | KEY_RIGHT_GUI |
| KEY_QUOTE | KEY_TILDE | KEY_COMMA | KEY_PERIOD | |
| KEY_SLASH | KEY_CAPS_LOCK | KEY_F1 | KEY_F2 | |
| KEY_F3 | KEY_F4 | KEY_F5 | KEY_F6 | |
| KEY_F7 | KEY_F8 | KEY_F9 | KEY_F10 | |
| KEY_F11 | KEY_F12 | KEY_PRINTSCREEN | KEY_SCROLL_LOCK | |
| KEY_PAUSE | KEY_INSERT | KEY_HOME | KEY_PAGE_UP | |
| KEY_DELETE | KEY_END | KEY_PAGE_DOWN | KEY_RIGHT | |
| KEY_LEFT | KEY_DOWN | KEY_UP | KEY_NUM_LOCK | |
| KEYPAD_SLASH | KEYPAD_ASTERIX | KEYPAD_MINUS | KEYPAD_PLUS | |
| KEYPAD_ENTER | KEYPAD_1 | KEYPAD_2 | KEYPAD_3 | |
| KEYPAD_4 | KEYPAD_5 | KEYPAD_6 | KEYPAD_7 | |
| KEYPAD_8 | KEYPAD_9 | KEYPAD_0 | KEYPAD_PERIOD | |
Скетч который ниже выполняет следующее: При вовороте энкодера на право прибавляет громкость при повороте на лево уменьшает, нажатие на кнопку энкодера включает режим переключения между приложениями (ALT+TAB) если в течении 1 секунды нажимать кнопку произойдёт переключение между программами, при истечении 1 секунды автоматический выберется выбранная программа.
////GENMC.ru управление мультимедиа при помощи энкодера
#define BTN_pin 8 // pin 8 кнопка энкодера SW
const int pin_A = 10; // pin 10 нога энкодера CLK
const int pin_B = 9; // pin 9 нога энкодера DT
unsigned char encoder_A; //переменная
unsigned char encoder_B; //переменная
unsigned char encoder_A_prev=0; //переменная
uint32_t vibor = 0; //Здесь будем хранть время
int perek = 0; //переменная переключатель
void setup() {
digitalWrite(BTN_pin, 1); //подтяжка кнопки энкодера
pinMode(pin_A, INPUT); //пины энкодера объявляем входами
pinMode(pin_B, INPUT); //пины энкодера объявляем входами
Keyboard.begin(); //подключим как клава
}
void loop()
{
{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Remote.increase(); //отправляем команду громкость выше
Remote.clear(); //очищаем команду
}
else {
Remote.decrease(); //отправляем команду громкость ниже
Remote.clear(); //очищаем команду
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}
if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_LEFT_ALT); //нажмем кнопку ALT
Keyboard.press(KEY_TAB); //нажмем кнопку TAB
Keyboard.release(KEY_TAB); //отпустим кнопку TAB
delay(150); //ждем 150мс чтоб не скакало по окошкам
vibor = millis(); //запускаем отсчет времени
perek=1; //переменной переключателя присваиваем 1
}
if((vibor && millis()-vibor > 1000) && perek==1) //если прошло больше 1 секунды и перемменая переключателя = 1
{
Keyboard.releaseAll(); //отпускаем все кнопки
perek = 0; //переменной переключателя присваиваем 0 чтоб сюда больше не заходил
}
}
//GENMC.ru управление мультимедиа при помощи энкодера
#define BTN_pin 8 // pin 8 кнопка энкодера SW
const int pin_A = 10; // pin 10 нога энкодера CLK
const int pin_B = 9; // pin 9 нога энкодера DT
unsigned char encoder_A; //переменная
unsigned char encoder_B; //переменная
unsigned char encoder_A_prev=0; //переменная
#define BTN_pin1 5 // pin 5 кнопка энкодера SW1
const int pin_A1 = 7; // pin 7 нога энкодера CLK1
const int pin_B1 = 6; // pin 6 нога энкодера DT1
unsigned char encoder_A1; //переменная1
unsigned char encoder_B1; //переменная1
unsigned char encoder_A_prev1=0; //переменная1
uint32_t vibor = 0; //Здесь будем хранть время
int perek = 0; //переменная переключатель
void setup() {
digitalWrite(BTN_pin, 1); //подтяжка кнопки энкодера
pinMode(pin_A, INPUT); //пины энкодера объявляем входами
pinMode(pin_B, INPUT); //пины энкодера объявляем входами
digitalWrite(BTN_pin1, 1); //подтяжка кнопки энкодера1
pinMode(pin_A1, INPUT); //пины энкодера объявляем входами1
pinMode(pin_B1, INPUT); //пины энкодера объявляем входами1
Keyboard.begin(); //подключим как клава
}
void loop()
{
//////////////ЭНКОДЕР 1///////////
{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Remote.increase(); //отправляем команду громкость выше
Remote.clear(); //очищаем команду
}
else {
Remote.decrease(); //отправляем команду громкость ниже
Remote.clear(); //очищаем команду
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}
if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Remote.mute(); //отправляем команду убрать звук
Remote.clear(); //очищаем команд
delay(500); //Делаем небольшую задержку чтоб не засыпало командами.
}
//////////ЭНКОДЕР 2//////////////
{ encoder_A1 = digitalRead(pin_A1); // считываем состояние выхода А энкодера
encoder_B1 = digitalRead(pin_B1); // считываем состояние выхода B энкодера
if((!encoder_A1) && (encoder_A_prev1)){ // если состояние изменилось с положительного к нулю
if(encoder_B1)
{
Remote.next(); //отправляем команду слудующая песня
Remote.clear(); //очищаем команду
}
else {
Remote.previous(); //отправляем команду предыдущая песня
Remote.clear(); //очищаем команду
}
}
encoder_A_prev1 = encoder_A1; // сохраняем значение А для следующего цикла
}
if(digitalRead(BTN_pin1)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_LEFT_ALT); //нажмем кнопку ALT
Keyboard.press(KEY_TAB); //нажмем кнопку TAB
Keyboard.release(KEY_TAB); //отпустим кнопку TAB
delay(150); //ждем 150мс чтоб не скакало по окошкам
vibor = millis(); //запускаем отсчет времени
perek=1; //переменной переключателя присваиваем 1
}
if((vibor && millis()-vibor > 1000) && perek==1) //если прошло больше 1 секунды и перемменая переключателя = 1
{
Keyboard.releaseAll(); //отпускаем все кнопки
perek = 0; //переменной переключателя присваиваем 0 чтоб сюда больше не заходил
}
}