там можно выбирать опции прерываний на оба пина энкодера - самый скоростной режим, на один пин - средний, без прерываний - применяется для ручного кручения энкодера.
#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 обусловлены механическим устройством данного энкодера - может быть не нужно
Приведенный выше скетч работает, НО: регулирует громкость с шагом 2. Для компа это не страшно, там максимум 100. Для андроида - ужас, там максимум 16. Как сделать шаг 1?
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();//очищаем команду
}
}
Раз уж здесь так разжевали клаву на леонардо, может и мне подскажете? Написал скетч который запускает прогу и логинится, но беда с раскладкой клавы, работает через пень-колоду. То в командной строке не в той раскладке напишет, то пароль. Как это обойти?
Не так давно взялся за ардуино, ранее опыт был только 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 чтоб сюда больше не заходил
}
}
Может быть в скетче что-то нужно поправить ? Помогите кто чем сможет...
С другим кодом (сообщение 37) если вращать медленно, изменяет громкость как надо. Если быстро крутить - начинает жить своей жизнью.
С другим кодом (сообщение 37) если вращать медленно, изменяет громкость как надо. Если быстро крутить - начинает жить своей жизнью.
ну, в общем разбирайся с кодом, но упомянутый мной факт имеет место быть - приходится делать так:
Я в написании пока не силен. Использовал код из поста 48. Ваш способ к нему применим?
Я в написании пока не силен. Использовал код из поста 48. Ваш способ к нему применим?
я использую библиотеку http://www.pjrc.com/teensy/td_libs_Encoder.html
там можно выбирать опции прерываний на оба пина энкодера - самый скоростной режим, на один пин - средний, без прерываний - применяется для ручного кручения энкодера.
Смотрю и туплю. Не могли бы Вы пример выложить для медленного режима. А то там в примере по две левые, по две правые. Путаюсь.
Смотрю и туплю. Не могли бы Вы пример выложить для медленного режима. А то там в примере по две левые, по две правые. Путаюсь.
пару минут жди.
#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 обусловлены механическим устройством данного энкодера - может быть не нужноСпасибо, буду разбираться
там в архиве пример NoInterrupts.pde есть - если совсем не понятно будет.
Выкладываю 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; } }этот кусок точно необходим?
12if(new_pos > old_pos) {13Remote.increase();14old_pos = new_pos;15}Это для изменения громкости в +
Это для изменения громкости в +
ок. а, в "-" у тебя что изменяет громкость?
!= ??
Это для изменения громкости в +
ок. а, в "-" у тебя что изменяет громкость?
!= ??
Спасибо, что носом ткнул в ошибку, но, как ни странно, да.
По мере обновления буду выкладывать свой проект клавиатуры. Добавил "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(); } } }Ну вот я и вернулся.
Приведенный выше скетч работает, НО: регулирует громкость с шагом 2. Для компа это не страшно, там максимум 100. Для андроида - ужас, там максимум 16. Как сделать шаг 1?
ali_vlad, вам об этом писали в #52 #57
ali_vlad, вам об этом писали в #52 #57
В ком-порт изменяет с шагом 1. Громкость регулирует с шагом 2!
http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder?page=3#comm...
Приветствую.
Реализовал через обсуждаемые бибилотеки
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();//очищаем команду } }Раз уж здесь так разжевали клаву на леонардо, может и мне подскажете? Написал скетч который запускает прогу и логинится, но беда с раскладкой клавы, работает через пень-колоду. То в командной строке не в той раскладке напишет, то пароль. Как это обойти?
Всем доброго дня.
Не так давно взялся за ардуино, ранее опыт был только 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 чтоб сюда больше не заходил } }Может быть в скетче что-то нужно поправить ? Помогите кто чем сможет...
Подскажите есть готовый скетч под два энкодера на одном громкость и Муте, а на другом к примеру след и пред трек и пауза?
Заранее очень благодарен