там можно выбирать опции прерываний на оба пина энкодера - самый скоростной режим, на один пин - средний, без прерываний - применяется для ручного кручения энкодера.
#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
там можно выбирать опции прерываний на оба пина энкодера - самый скоростной режим, на один пин - средний, без прерываний - применяется для ручного кручения энкодера.
Смотрю и туплю. Не могли бы Вы пример выложить для медленного режима. А то там в примере по две левые, по две правые. Путаюсь.
Смотрю и туплю. Не могли бы Вы пример выложить для медленного режима. А то там в примере по две левые, по две правые. Путаюсь.
пару минут жди.
Спасибо, буду разбираться
там в архиве пример NoInterrupts.pde есть - если совсем не понятно будет.
Выкладываю 100% готовый вариант USB HID медиа клавиатуры.
этот кусок точно необходим?
12
if
(new_pos > old_pos) {
13
Remote.increase();
14
old_pos = new_pos;
15
}
Это для изменения громкости в +
Это для изменения громкости в +
ок. а, в "-" у тебя что изменяет громкость?
!= ??
Это для изменения громкости в +
ок. а, в "-" у тебя что изменяет громкость?
!= ??
Спасибо, что носом ткнул в ошибку, но, как ни странно, да.
По мере обновления буду выкладывать свой проект клавиатуры. Добавил "MUTE". Замечания приветствуются!
Хочу добавить выключение при удержании кнопки более 10 сек, но не знаю как.
Ну вот я и вернулся.
Приведенный выше скетч работает, НО: регулирует громкость с шагом 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. Решено.
Раз уж здесь так разжевали клаву на леонардо, может и мне подскажете? Написал скетч который запускает прогу и логинится, но беда с раскладкой клавы, работает через пень-колоду. То в командной строке не в той раскладке напишет, то пароль. Как это обойти?
Всем доброго дня.
Не так давно взялся за ардуино, ранее опыт был только html и css, так то программровать особо то и не умею, но хочется :)
Вообще залил скетч на ардуино про микро (леонардо) с регулировкой громкости и переключение песен на двух энкодерах, вроде бы и все работает, но вот иногда проскакивает переключение, то +1 то +3, то в -1.
Энкодеры через резисторы 10кОм, без конденсаторов. Кондеры обязательно ставить ?
Может быть в скетче что-то нужно поправить ? Помогите кто чем сможет...
Подскажите есть готовый скетч под два энкодера на одном громкость и Муте, а на другом к примеру след и пред трек и пауза?
Заранее очень благодарен