Доброго дня всем,
не нашел профильную тему, хотя вопрос должен быть актуальным, по идее
Можно ли подключить инкрементальный энкодер напрямую к Ардуино?
Вроде бы блок "счетчик" как раз имеет нужные входы.
Задача - получить в итоге плавно изменяемое напряжение 0...5В (в идеале вообще настраиваемый диапазон, это, видимо, можно организовать блоком "scale"? )
если да, то как дальше обрабатывать сигнал с выхода счетчика?
спасибо
блок счетчика и энкодер
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
блок счетчика и энкодер
[ref]ingener[/ref], Пользовательские блоки, энкодеры.
Отправлено спустя 5 минут 41 секунду:
Отправлено спустя 5 минут 41 секунду:
Ардуино не имеет цап - только шим, поэтому это Ваш выбор, каким образом получить 0-5в, ОУ( схем предостаточно) или цап, например поддерживаемый программой MCP4725.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- ingener
- Лейтенант
- Сообщения: 580
- Зарегистрирован: 14 окт 2018, 00:26
- Имя: Андрей
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
блок счетчика и энкодер
[ref=#ff8000]Sancho[/ref], спасибо за ссылки, поизучаем. Хотя там как-то все сложно...
А ШИМ тоже хорошо, из него получить аналог очень просто.
Отправлено спустя 11 часов 9 минут 57 секунд:
Вот отыскался рабочий скетч для прямого подключения энкодера к ардуино и получения на выходе ШИМ сигнала. Однако работает он очень грубо, можно ли как-то повысить дискретизацию (сделать более мелкими шаги энкодера) - как-то вставить деление импульсов на определенное число?
/*
** Энкодер
** Для управлением яркостью LED используется энкодер Sparkfun
*/
int brightness = 120; // яркость LED, начинаем с половины
int fadeAmount = 10; // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
void setup() {
// declare pin 9 to be an output:
pinMode(9, OUTPUT); // устанавливаем pin 9 как выход
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем яркость, не более чем до 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
// выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем яркость, но не ниже 0
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
analogWrite(9, brightness); // устанавливаем яркость на 9 ножку
loopTime = currentTime;
}
}
А ШИМ тоже хорошо, из него получить аналог очень просто.
Отправлено спустя 11 часов 9 минут 57 секунд:
Вот отыскался рабочий скетч для прямого подключения энкодера к ардуино и получения на выходе ШИМ сигнала. Однако работает он очень грубо, можно ли как-то повысить дискретизацию (сделать более мелкими шаги энкодера) - как-то вставить деление импульсов на определенное число?
/*
** Энкодер
** Для управлением яркостью LED используется энкодер Sparkfun
*/
int brightness = 120; // яркость LED, начинаем с половины
int fadeAmount = 10; // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
void setup() {
// declare pin 9 to be an output:
pinMode(9, OUTPUT); // устанавливаем pin 9 как выход
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем яркость, не более чем до 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
// выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем яркость, но не ниже 0
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
analogWrite(9, brightness); // устанавливаем яркость на 9 ножку
loopTime = currentTime;
}
}
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей