Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Господа, кто нибудь пробывал данную схему снабдить умной лед подсветкой? у самого не хватает цепей нейронов в мозгу, что бы написать скетч. http://www.waitingforfriday.com/inde..._Demonstration тут человек представил даже очень клевый пример. С таким колечком из матового оргстекла думаю эффект должен быть хорошКлац На ардуинке ведь еще есть свободные ноги. Реально?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Приветсвую.
Стоит на первый взгляд простая задача - подключить энкодер к ардуино, обработать сигнал и выдать другой.
На практике: в авто уже стоит крутилка(энкодер, который не воспринимается новым ГУ) и при вращении влево, вправо выдает определенный код. Энкодер имеет два выхода, логические уровни: 0,24 и 3В.
Думаю просто подключить напрямую к входам ардуино, наверное аналоговым. Хотя наверное правильнее к цифровым и использовать прерывания, вот только логический уровень 3В наверное мал для единицы.
Далее нужно определить куда поворачивался энкодер (но это уже скетч, думаю я его осилю сам) и в зависимости от направления провести имитацию нажатия кнопки (звук + или -). В ГУ есть специальные выходы для резистивных кнопок и любые резистивные кнопки можно обучить.
Вопрос, собственно такой, такая схема имеет право на жизнь?
http://big-e.ru/images/4х4_arduino/nano_autolight.png
На выходы D7, D10 подам HIGH ток пойдет через резистор с опред. номиналом на вход ГУ (номиналы резисторов взяты с рулевых кнопок). Хотя может не на 5В надо сажать, а на землю?
Ну как-то так, покритикуйте.
Вложений: 1
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Цитата:
вот только логический уровень 3В наверное мал для единицы.
Лог. 1 начинается от 2в
Цитата:
Вопрос, собственно такой, такая схема имеет право на жизнь?
имеет , но лучше такая. Так называемый резистивный ЦАП. Если использовать 3 выхода то можно получить на выходе 8 уровней от 0 до 5в
Вложение 18815
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Вот так верно?
http://big-e.ru/images/4%D1%854_ardu...autolight1.png
При смене сигнала на энкодере(D2, D3) подключается либо D4(High) через резистор 680ом, либо D5 - 330ом.
Вот только, правильно ли я провел схемнотехническую имититацию нажатия резистивной кнопки не знаю.
Код:
#define VolUp 4
#define VolDown 5
#define encoder0PinA 2
#define encoder0PinB 3
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание interrupt 0 на pin 2
attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание interrupt 0 на pin 3
pinMode(VolUp, OUTPUT);
pinMode(VolDown, OUTPUT);
Serial.begin (115200);
}
void loop()
{
//digitalWrite(VolDown , HIGH);
}
// обработка прерывания
void doEncoderA()
{
if(digitalRead(encoder0PinB)==HIGH){Volume(1);}
}
// обработка прерывания
void doEncoderB()
{
if(digitalRead(encoder0PinA)==HIGH){Volume(0);}
}
void Volume(byte updown)
{
Serial.println(updown);
if (updown==1) {digitalWrite(VolUp , HIGH);}
else {digitalWrite(VolDown , HIGH);}
delay(200);
digitalWrite(VolUp , LOW);
digitalWrite(VolDown , LOW);
}
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Между R2 и R3 тоже резистор нужен
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
А зачем? они (R1 и R2) разный номинал у меня имеют.
И я так понял на D4, D5 нужно HIGH установить по умолчанию.
А для имитации нажатия резистивной кнопки либо на D4 либо на D5 нужно установить LOW.
Так?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Все это работает только на ардуино с FTDI232R? А как быть с CH340? Для него драйвер не подходит и программа HKey выдает то что девайс нот фаунд, это никак не исправить? Может драйвер есть для CH340 у кого?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
А Вам для чего эта программа? Может получится решить задачу без нее?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Да вот хотел к энкодеру штатному подключился, чтоб громкостью управлять. Скетч залил, подпаялся к энкодеру (пока на макетке), кондеры-мондеры, все дела, чтоб дребезг исключить... Вообщем в порт выводит символы при повороте влево или вправо (смотрел через патти и ардуиновский терминал), все норм, но вот згвоздка сейчас вся в программе, которая будет слушать порт и уже непосредственно регулировать громкость в системе. А хоткей только с фтдай, как я понял, работает, а у меня Ардуино нано 3.0 на CH340... Вот и думаю то ли другую ардуину заказать, то ли что... Вот...
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Можно использовать USB->FTDI мост
К сожалению исходники программы уже утерял
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Есть вопрос. Можно ли обрабатывать нажатие на энкодер в функции прерывания?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Можно конечно.
У меня есть код для энкодера с обработкой нажатия и использует всего 1 прерывание
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Цитата:
Сообщение от
Chip
Можно конечно.
У меня есть код для энкодера с обработкой нажатия и использует всего 1 прерывание
Ардуина может обрабатывать только одну функцию прерывания ?
Буду благодарен если смогу посмотреть на ваш код.
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Цитата:
Ардуина может обрабатывать только одну функцию прерывания ?
Нет не одну, но прерываний не бывает много их всегда не хватает
Скетч взял от стробоскопа http://cyber-place.ru/showthread.php?t=2703
Энкодер можно вращать без нажатия изменяя чавстоту стробоскопа и вращать с нажатием изменяется длительность импульса
Визуально изменения можно наблюдать на светодиоде D13
Если что то будет не понятно, разъясню
PHP код:
//Скетч от Cyber-Place.ru
// Выводы ЭНКОДЕРА
#define CLK 3 // Clock Подключаем к INT1, нельзя переназначать
#define DT 4 // второй вывод энкодера
#define SW 5 // switch кнопка энкодера
#define Min 1 // минимальное значение
#define Max 20000 //максимальное значение
#define led_pin 12 // подключен светодиод
#define coil_pin A0
#define step_freq 1 // шаг изменения частоты плавно 0,1гц
#define step_timelght 100 // шаг приращивания в мкс
volatile int freq = 250; // частота в Гц умноженная на 10, для более плавной настройки
volatile uint32_t paus, time_light=2000; // время свечения светодиода в мкс
uint32_t oldcount;
boolean DT_last; // последнее состояние энкодера
void setup()
{
pinMode(CLK,INPUT_PULLUP); // Clock Подключаем к INT1, нельзя переназначать
pinMode(DT, INPUT_PULLUP); // второй вывод энкодера
pinMode(SW, INPUT_PULLUP); // кнопка энкодера
pinMode(led_pin, OUTPUT); // управление симистором
pinMode(coil_pin, OUTPUT);
attachInterrupt(1, encoderTick, CHANGE); // прерывания от Энкодера
DT_last = digitalRead(CLK); // считываем положение CLK
}
void loop()
{
paus=5000000/freq;
digitalWrite(coil_pin, 1);
digitalWrite(led_pin, 1);
oldcount = micros();
while( (micros() - oldcount) < time_light){} // длительность импульса выдержки
digitalWrite(led_pin, 0);
while( (micros() - oldcount) < paus){} // положительный полупериод
digitalWrite(coil_pin, 0);
oldcount = micros();
while( (micros() - oldcount) < paus){} //отрицательный полупериод
}
//********************обработчики прерываний Энкодера*******************************
void encoderTick() // Обратка прерываний от Энкодера
{
uint8_t DT_now = digitalRead(CLK); // считываем текущее положение CLK
if (DT_now != DT_last && digitalRead(SW)) // если предыдущее и текущее положение не равны, значит был поворот
{
if (digitalRead(DT) != DT_now) // если DT не равен CLK, значит вращение по часовой стрелке
{
if( freq < Max ) freq += step_freq; // прибавить
} else { // если DT равен CLK, значит вращение против часовой
if( freq > Min ) freq -= step_freq; // убавить
}
} else
if (DT_now != DT_last && !digitalRead(SW)) //если нажата кнопка и было вращение
{
if (digitalRead(DT) != DT_now) // если DT не равен CLK, значит вращение по часовой стрелке
{
if( time_light < paus ) { time_light += step_timelght; } // убавить длительность
} else if( time_light > 0 ) time_light -= step_timelght; // прибавить длительность импульса выдержки/
}
DT_last = DT_now; // сохранить положение CLK для следующей проверки
}
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Цитата:
Сообщение от
Chip
Нет не одну, но прерываний не бывает много их всегда не хватает
А если нужно отработать нажатие на вал энкодера как на кнопку (нажал - отпустил) , функция прерывания будет вызываться только при изменении DT . Значит кнопку энкодера нужно тоже подключить к прерыванию?
PHP код:
#define CLK 4
#define DT 3
#define SW 2
long count = 0;
boolean DT_1, DT_2;
void setup() {
Serial.begin (9600);
pinMode (CLK, INPUT);
pinMode (DT, INPUT);
pinMode (SW, INPUT_PULLUP);
attachInterrupt(1, encoder, CHANGE);
attachInterrupt(0, encoderPress, CHANGE); // если обозначить новое прерывание таким способом ( выдаёт ошибку)
DT_2 = digitalRead(DT);
}
void loop() {
Serial.println(count);
}
void encoder() {
DT_1 = digitalRead(DT);
if (DT_1 != DT_2) {
if (digitalRead(CLK) != DT_1) {
count ++;
} else {
count --;
}
}
DT_2 = DT_1;
}
void encoderPress() {
if(!digitalRead(SW)) {
count += 10;
}
}
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Можно подключить к прерыванию, но можно и в главном цикле обрабатывать
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Вот , как ввести 2-ю функцию прерывания параллельно первой ?
Re: Управление при помощи поворотного энкодера (Rotary Encoder)
Прерывание INT0 INT1 работают независимо друг от друга