w3456

   Здесь я хочу вам рассказать как управлять громкостью и музыкой при помощи Поворотного энкодера (иначе - датчик угла поворота), это устройство, преобразующее угол поворота вращающегося объекта (вала) в электрические сигналы, позволяющие определить этот угол. Будет работать и на Windows и на Android
 
 

w3456

 Здесь я хочу вам рассказать как управлять громкостью и музыкой при помощи Поворотного энкодера (иначе - датчик угла поворота), это устройство, преобразующее угол поворота вращающегося объекта (вала) в электрические сигналы, позволяющие определить этот угол. Сейчас вам я не буду объяснять принцип действия энкодера, благо в интернете огромное количество информации и если интересен прнцип действия можете прочтать. Перейдём напрямую к поставленной задаче. А именно управлять мультимедиа функциями компьютера или планшета. 

Видео версия, медиа энкодер на Arduino Micro

Как и в прошлом уроке про рулевое управлерие планшетом, для начала нам необходимо приобрести плату Arduino Leonadro или ArduinoMicro, главное отличие этих контроллеров в том что на них установлены микропроцессоры Atmega32u4 которая имеет на борту встроенную поддержку USB-соединения, благодаря чему не требуется вспомогательный процессор. Это позволяет устройствам на Atmega32u4 появляться на подключенном планшете (с поддержкой OTG) или компьютере в качестве мыши или клавиатуры в дополнение к виртуальному (CDC) последовательному порту (COM). В общем подойдет любой arduino совместимый контроллер который построен на Atmega32u4. + нам ещё потребуется сам повортный энкодер его можете приобрести на алиэкспресс.

Вторым шагом после того как приобрели необходимый вам контроллер необходимо скачать ArduinoIDE и установить для того чтобы установились драйвера, затем чтобы работали все функции скачайте подготовленную мной портативную версию ArduinoIDE вот ЗДЕСЬ, в этот архив уже добавлены все необходимые библиотеки и изменены файлы для работы в качестве медиа клавиатуры.

Подключение максимально простое, потребуется всего 5 проводков, и необходимо их соеденить следующим образом.

энкодер GND - GND arduino Micro
энкодер 5v - 5v arduino Micro
энкодер SW - D8 arduino Micro
энкодер DT - D10 arduino Micro
энкодер SLK - D9 arduino Micro
Выводы SW, DT, SLK можете поменять на свои какие угодно в скетче. 
5678

 Далее расписаны команды для управления мультимедиа функциями.

Remote.next();             //следующая песня
Remote.previous();       //предыдущая песня
Remote.play_pause();   //плей и паузу
Remote.increase();       //громкость прибавить
Remote.decrease();      //громкость убавить
Remote.mute();            //Убрать звук
Remote.play();             // Воспроизвести
Remote.stop();             //Остановить воспроизведение
Remote.forward();        //Ускорить воспроизведение
Remote.rewind();         //Обратное воспроизведение
и конечно же скетч для arduino
//GENMC.ru управление мультимедиа при помощи энкодера
#include <SPI.h&gt//
#include <EEPROM2.h&gt
#include <EEPROM.h&gt

#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. 

keymodifier
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 чтоб сюда больше не заходил
        }
   }

2 энкодера Android и Arduino Micro

//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 чтоб сюда больше не заходил
        }
  
 }

 

Добавить комментарий


Защитный код
Обновить

Комментарии  

Анатолий74
0 # RE: Медиа энкодер на ARDUINO MICROАнатолий74 30.09.2017 13:07
А как можно настроить на кнопку энкодера переключение с колонок на наушники в windows 10?
Ответить | Ответить с цитатой | Цитировать
Andy
-1 # Медиа энкодер на ARDUINO MICROAndy 27.09.2017 17:38
Basically supplements are a mixture of ingredients which have been employed for enhancing male sexual performance from
centuries. Combining oils with exercises help it become more effective, but even without one, results are great.
Adding an all-natural penis vitamin formula towards the daily penis care routine can enhance the
love life and make the penis healthy.

Feel free to surf to my web site :: https://www.viagrapascherfr.com/viagra-pas-cher-inde-belgique/: https://www.viagrapascherfr.com/viagra-pas-cher-inde-belgique/
Ответить | Ответить с цитатой | Цитировать
Andrey
0 # RE: Медиа энкодер на ARDUINO MICROAndrey 22.09.2017 16:28
Здравствуйте Александр!
Есть пара энкодеров от Фольксвагеновской магнитолы на 15 и 30 щелчков. Попробовал ваши скетчи, работают стабильно но, есть проблема, выполнение команды происходит на каждый второй щелчок (в самой магнитоле отрабатывается каждый щелчок).
Подскажите пожалуйста, как можно решить данную проблему?
Ответить | Ответить с цитатой | Цитировать
Lhwskms
0 # блютузLhwskms 11.07.2017 05:18
Здравствуй Александр, если подключить к андруино блютуз модуль будет ли андроид понимать что приходят эти команды медиа управления по блютузу?
Ответить | Ответить с цитатой | Цитировать
Ruslan
0 # encodeRuslan 27.09.2016 13:34
зддравствуйте. вопрос маленькая проблема так как в архиве нет библиотеки EEPROM2 где можна скачать. спасибо
Ответить | Ответить с цитатой | Цитировать
Игорь
0 # RE: Медиа энкодер на ARDUINO MICROИгорь 06.07.2016 09:10
Добрый день Александр. Мне очень понравилась ваша статья. Хочу на вашем примере сделать управление яркостью экрана андройд устройства.
Можешь подсказать что нужно поменять в скетч для arduino ?
Ответить | Ответить с цитатой | Цитировать
Александр Федоров
0 # RE: Медиа энкодер на ARDUINO MICROАлександр Федоров 07.07.2016 14:57
Моете воспользоваться программой с pccar, называется SerialManager http://pccar.ru/showthread.php?t=24120
Ответить | Ответить с цитатой | Цитировать
Антон
0 # Антон 26.04.2016 10:43
Добрый день, добрался я до энкодера, но вот на моей плате от магнитолы энкотер с 3 контактами (без кнопки). Можешь подсказать что и как соединять?
Ответить | Ответить с цитатой | Цитировать
Александр Федоров
0 # Александр Федоров 02.05.2016 12:44
Если это просто энкодер, то вам придётся ещё подтяжку делать. Читайте инструкции как подключать энкодер, там нет ничего сложного. Или просто купите такой-же энкодер как на фото, стоит она не дорого.
Ответить | Ответить с цитатой | Цитировать
Антон
0 # Антон 10.05.2016 12:50
Спасибо большое за Вашу помощь. Разобрался с энкодером, в том то и дело что заменить на другой не мог, так как этот энкодер установлен в штатной магнитоле. По задумке весь проект должен выглядеть как штатное устройство. Остается всязать скетч для всех кнопок (кнопки руля, кнопки на панели + энкодет), проверка всего этого на работоспособность и глюки и после всего этого будет фото отчет и статья, если конечно позволите разместить это на вашем сайте.
Ответить | Ответить с цитатой | Цитировать
  • Рулевое управление

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

  • Круиз контроль в автомобиль

    Круиз контроль в автомобиль

  • Дисплей для круиз контроля

    Дисплей для круизконтроля