USB HID мультимедиа клавиатура под андроид

ali_vlad
Offline
Зарегистрирован: 20.02.2015

С другим кодом (сообщение 37) если вращать медленно, изменяет громкость как надо. Если быстро крутить - начинает жить своей жизнью.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

ali_vlad пишет:

С другим кодом (сообщение 37) если вращать медленно, изменяет громкость как надо. Если быстро крутить - начинает жить своей жизнью.

ну, в общем разбирайся с кодом, но упомянутый мной факт имеет место быть - приходится делать так:

int nEnc01 = Enc_01.read()/4;

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Я в написании пока не силен. Использовал код из поста 48. Ваш способ к нему применим?

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

ali_vlad пишет:

Я в написании пока не силен. Использовал код из поста 48. Ваш способ к нему применим?

я использую библиотеку http://www.pjrc.com/teensy/td_libs_Encoder.html

там можно выбирать опции прерываний на оба пина энкодера - самый скоростной режим, на один пин - средний, без прерываний - применяется для ручного кручения энкодера.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Смотрю и туплю. Не могли бы Вы пример выложить для медленного режима. А то там в примере по две левые, по две правые. Путаюсь.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

ali_vlad пишет:

Смотрю и туплю. Не могли бы Вы пример выложить для медленного режима. А то там в примере по две левые, по две правые. Путаюсь.

пару минут жди.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015
#define ENCODER_DO_NOT_USE_INTERRUPTS // без прерываний.
#include <Encoder.h> // подключаем библиотеку.

Encoder Enc_01(18, 19); // объявляем енкодер Enc_01, подключенный к пинам 18, 19

void setup ()
{

}
void loop() { 
int Enc01 = Enc_01.read()/4; // читаем в переменную из энкодера. 
Enc_01.write(Enc01*4); // пишем переменную в энкодер. 
} // конструкции /4 и *4 обусловлены механическим устройством данного энкодера - может быть не нужно
 

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Спасибо, буду разбираться

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

там в архиве пример NoInterrupts.pde есть - если совсем не понятно будет.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Выкладываю 100% готовый вариант USB HID медиа клавиатуры.

#define ENCODER_DO_NOT_USE_INTERRUPTS // без прерываний.
#include <Encoder.h>
Encoder Enc_1(9, 8);

void setup() {
  Remote.begin();
}
long old_pos = 0;
void loop() {
  long new_pos;
  new_pos = Enc_1.read()/4;
  if (new_pos > old_pos) {
    Remote.increase();
    old_pos = new_pos;
  }
  if (new_pos != old_pos) {
    Remote.decrease();
    old_pos = new_pos;
  }
}

 

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

этот кусок точно необходим?

12   if (new_pos > old_pos) {
13     Remote.increase();
14     old_pos = new_pos;
15   }

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Это для изменения громкости в +

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

ali_vlad пишет:

Это для изменения громкости в +

ок. а, в "-" у тебя что изменяет громкость? 

!= ??

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Клапауций 999 пишет:

ali_vlad пишет:

Это для изменения громкости в +

ок. а, в "-" у тебя что изменяет громкость? 

!= ??

Спасибо, что носом ткнул в ошибку, но, как ни странно, да.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

По мере обновления буду выкладывать свой проект клавиатуры. Добавил "MUTE".  Замечания приветствуются!

Хочу добавить выключение при удержании кнопки более 10 сек, но не знаю как.

#include <Bounce.h>
#define ENCODER_DO_NOT_USE_INTERRUPTS // без прерываний.
#include <Encoder.h>
Encoder Enc_1(9, 8);//Ноги энкодера
const int pin_mute = 7;//Кнопка mute
Bounce mute = Bounce(pin_mute,5);

void setup() {
  pinMode(pin_mute, INPUT_PULLUP);
  Remote.begin();
}
long old_pos = 0;
void loop() {
  long new_pos;
//Увеличение громкости
  new_pos = Enc_1.read()/4;
  if (new_pos > old_pos) {
    Remote.increase();
    Remote.clear();
    old_pos = new_pos;
  }
//Уменьшение громкости
  if (new_pos < old_pos) {
    Remote.decrease();
    Remote.clear();
    old_pos = new_pos;
  }
//Кнопка mute
  if (mute.update()){
    if (mute.read()==0){
      Remote.mute();
      Remote.clear();
    }
  }
}

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Ну вот я и вернулся.

Приведенный выше скетч работает, НО: регулирует громкость с шагом 2. Для компа это не страшно, там максимум 100. Для андроида - ужас, там максимум 16. Как сделать шаг 1?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ali_vlad, вам об этом писали в #52  #57

ali_vlad
Offline
Зарегистрирован: 20.02.2015

dimax пишет:

ali_vlad, вам об этом писали в #52  #57

В ком-порт изменяет с шагом 1. Громкость регулирует с шагом 2!

http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder?page=3#comm...

Kavalsky
Offline
Зарегистрирован: 25.03.2016

Приветствую.

Реализовал через обсуждаемые бибилотеки

USBAPI.h
HID.cpp

Подскажите, несколько вопросов:

1. Ругается на команды кнопок А-Z (KEY_А), на Шифты и Альты (KEY_TAB) - нормально. Там какой то отдельный синтаксис?

2.  Remote.previous(); - Резистивные нопки, не всегда корреектно работает, иногда переключает вперед, иногда на два назад, иногда мечется. Предполагаю что это из-за того что ВПЕРЕД - считывается аналогом как 780, а НАЗАД как 850, т.е. идет двойное считывание сначала вперед, потом назад ? В целом глючновато работает, а резистивные нужны :(

3. Решено.

void loop(){
int R_butt = analogRead (A0); 

if(R_butt < 860 && R_butt > 840){
    Remote.previous(); //отправляем команду Предыдущий трек
    delay(200);      //делаем небольшую задержу 
    Remote.clear();//очищаем команду

}
if(R_butt < 800 && R_butt > 770){

    Remote.next(); //отправляем команду Следующий трек
    delay(200);      //делаем небольшую задержу  
    Remote.clear();//очищаем команду
}
}

 

serenya
Offline
Зарегистрирован: 17.02.2012

Раз уж здесь так разжевали клаву на леонардо, может и мне подскажете? Написал скетч который запускает прогу и логинится, но беда с раскладкой клавы, работает через пень-колоду. То в командной строке не в той раскладке напишет, то пароль. Как это обойти?

starbart
Offline
Зарегистрирован: 22.05.2017

Всем доброго дня.

Не так давно взялся за ардуино, ранее опыт был только html и css, так то программровать особо то и не умею, но хочется :) 

Вообще залил скетч на ардуино про микро (леонардо) с регулировкой громкости и переключение песен на двух энкодерах, вроде бы и все работает, но вот иногда проскакивает переключение, то +1 то +3, то в -1.

Энкодеры через резисторы 10кОм, без конденсаторов. Кондеры обязательно ставить ? 

#include <keyboard.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; //переменная
#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 чтоб сюда больше не заходил
        }
  
 }

Может быть в скетче что-то нужно поправить ? Помогите кто чем сможет...

konog
Offline
Зарегистрирован: 17.12.2015

Подскажите есть готовый скетч под два энкодера на одном громкость и Муте, а на другом к примеру след и пред трек и пауза?

Заранее очень благодарен