Вложений: 2
Управление при помощи поворотного энкодера (Rotary Encoder)
Давно хотел провести эксперимент с энкодером и прикрутить его к Arduino Nano
Но все никак не удавалось его приобрести .
Вчера разобрал старую убитую мышку и выпаял из нее Энкодер для экспериментов. Все оказалось достаточно просто . Написал скетч для cArduino / Arduino, взял уже готовую программу для ПК написанную для другого проекта и через 15 мин. я уже регулировал громкость при помощи энкодера.
Недавно приобрел энкодер с нажатием и подправил Sketch под него, теперь можно назначать вращение энкодера с нажатием и без него или назначать комбинацию клавишь только на нажатие
Программу скачиваем здесь
Код для Arduino Nano:
PHP код:
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0PinC 4
byte bytes[2]={0,7} ;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
Serial.begin (115200);
}
void loop()
{
if(digitalRead(encoder0PinC)==LOW)
{
bytes[1]=8;
Serial.write( bytes,2);
while(digitalRead(encoder0PinC)==LOW){delay(50);}
bytes[1]=7;
}
}
// обработка прерывания
void doEncoderA()
{
if(digitalRead(encoder0PinB)==HIGH){bytes[0]=25;}else{bytes[0]=5;}
Serial.write( bytes,2);
bytes[0]=0;
}
// обработка прерывания
void doEncoderB()
{
if(digitalRead(encoder0PinA)==HIGH){bytes[0]=5;}else{bytes[0]=25;}
Serial.write( bytes,2);
bytes[0]=0;
}
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
А когда появится сам энкодер в кармониторе?:)
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Уже приехали, нужно только поехать забрать.
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Я подключал энкодер с помощью резисторов на один аналоговый канал. На нем же все остальные резистивные кнопки. Работает достаточно четко.
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Тоже интересное решение, только не совсем понял как контроллер определит в каком направлении энкодер вращается. Можно схему подключения глянуть?
Вложений: 1
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Цитата:
Сообщение от
Chip
Тоже интересное решение, только не совсем понял как контроллер определит в каком направлении энкодер вращается. Можно схему подключения глянуть?
Ну вот как то так. Еще резистор на землю надо чтобы наводки убрать (не стал его рисовать). В общем ардуино смотрит момент перехода - если сначала 0 потом 200 потом 600 значит в одну сторону крутится, а если 0 потом 400 потом 600 значит в обратную. Цифры с потолка для наглядности.
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Это понятно, я так сразу и представлял, сбило с толку твое сообщение
Цитата:
На нем же все остальные резистивные кнопки
Прерывание как реализовал для аналого входа ?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Цитата:
Сообщение от
Chip
Это понятно, я так сразу и представлял, сбило с толку твое сообщение
Прерывание как реализовал для аналого входа ?
а никак. я чайник пока. вот кусочек скеча
val = analogRead(0);
if (val < 60)
pos = 3;
if (val < 50)
pos = 4;
if (val < 35)
pos = 2;
if (val < 10)
pos = 1;
if ((pos == 1) && (pos0 == 4))
Serial.println('<');
if ((pos == 3) && (pos0 == 2))
Serial.println('<');
if ((pos == 1) && (pos0 == 2))
Serial.println('>');
if ((pos == 3) && (pos0 == 4))
Serial.println('>');
pos0 = pos;
delay(2);
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Энкодер на резисторы вешать несколько некорректно - энкодер может давать такую частоту, что она будет "сьедаться" ацп - суть есть конденсатором + обработчиком напряжения на этом конденсаторе.
Если есть возможность, то надо делать на цифровых входах.
В схеме еще хорошо бы повесить сопротивления с сигналов энкодера на питание, для пущей надежности.
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Внутренняя подтяжка подключена
PHP код:
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
А вот с дребезгом нужно что то делать, лучше наверно подправить немного код, чем кондеры вешать