Энкодер 2 сигнала

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
Всем доброго времени суток!

Нужна помощь в осущетвлении идеи.
Есть энкодер 3 пина. Нужно снять сигналы поворота колеса на верх и вниз два разных сигнала, то есть провода которые будут подавать сигнал дальше.
Подскажите какой микроконтроллер(максимально компактный и недорогой) лучше взять где не будет проблем со снятием сигнала на 2 разных провода.

Также возможно у кого-то есть какой-то готовый код для загрузки в микрокотроллер, так как все коды которые видел работают именно посредством одного контакта где определяется в какую сторону крутиться колесо.

Заранее спасибо.
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
2,955
887
Какой микроконтроллер лучше взять где не будет проблем со снятием сигнала на 2 разных провода.
так как все коды которые видел работают именно посредством одного контакта
Бред какой -то. У любого энкодера два контакта.
А что такое "снятие сигнала на два провода"? - может снятие С ДВУХ проводов?
Автор, вы сами понимаете, о чем говорите?
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
@bort707,

Возможно я не правильно понимаю алгоритм работы энкодера, не кидайте камнями сразу . Энкодер 3 лапки то есть A- сигнал 1, B - Сигнал 2, C - масса.
Для того чтобы снять сигнал с энкодера по тому что видел в интернете - мы берем сигнал А и B и опираясь на то какой сигнал был первый мы понимаем в какую сторону крутиться энкодер(по крайней мере я так понимаю как он работает), но эти два сигнала так же работают одновременно при вращении, что если снимать сигнал без какой-то обработки сигнала он не будет понимать в какую сторону крутиться энкодер. Из того что видел- отправляющий сигнал после обработки как правило в одном проводе. А мне нужно настроить будет так чтоб после обработки сигнала при прокрутке наверх подавался сигнал условимся на дорожку 5(то есть первый провод), соответсвенно прокрутке вниз дорожка 6(то есть второй провод). Надеюсь не слишком криво обьяснил.
 

bort707

★★★★★★✩
21 Сен 2020
2,955
887
чтоб после обработки сигнала при прокрутке наверх подавался сигнал условимся на дорожку 5(то есть первый провод), соответсвенно прокрутке вниз дорожка 6
Зачем вам после обработки еще куда-то сигнал подавать? Пусть сам контроллер сигнал и обрабатывает.
Или объясните всю задачу.
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
Задача в том, что есть две платы одна - с энкодером, вторая - с кнопками, и нужно чтоб когда кручу энкодер наверх посылался сигнал на одну кнопку(на другой плате) и когда вниз на другую.
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
370
112
Подскажите какой микроконтроллер(максимально компактный и недорогой) лучше взять где не будет проблем со снятием сигнала на 2 разных провода.
На днях было обсуждение кода на ATtiny10 - контроллер очень компактный и не дорогой. Но программирование требует ручного подхода. Т.е. готовые библиотеки не заработают. (ATtiny10 просто как пример - возможно он не подойдет по количеству ног, или другим параметрам).
Сделайте прототип на любом имеющемся у вас контроллере, а когда заработает, то можно будет выбирать.
Возможно следует учесть, что на Алиэкспресс есть вероятность купить дешево, но не рабочее. (Например одно время на ATtiny13 жаловались).
 
  • Лойс +1
Реакции: Chelovekula

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
В общем купил контроллер на базе ATmega328p. Залил код для проверки. И при прокрутке энкодера отображается только "right". Тип энкодера выбрал 1, так как 2 вообще ничего не показывал. Подскажите на что обратить внимание.
C++:
#include <GyverEncoder.h>


#define SW 3
#define DT 4

Encoder enc1(SW, DT);
void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип

}
void loop() {
  // обязательная функция отработки. Должна постоянно опрашиваться
  enc1.tick();
   if (enc1.isRight()) Serial.println("right");
      if (enc1.isLeft()) Serial.println("left");
 
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Направление вращения , вы вроде это сами писали, определяется последовательностью замыкания контактов. А у вас 1 контакт и кнопка, о какой последовательности тогда может идти речь ? ну и библиотека видит, что канал DT замкнут, а второй нет. и так будет всегда, значит и направление будет всегда одно.
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
Направление вращения , вы вроде это сами писали, определяется последовательностью замыкания контактов. А у вас 1 контакт и кнопка, о какой последовательности тогда может идти речь ? ну и библиотека видит, что канал DT замкнут, а второй нет. и так будет всегда, значит и направление будет всегда одно.
Очень сглупил когда отправил тот код где кнопка. Но даже в когда поправил код и изменил на 2 контакта энкодера пишит так же только "right".
C++:
#include <GyverEncoder.h>


#define CLK 3
#define DT 4

Encoder enc1(CLK, DT);
void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип

}
void loop() {
  // обязательная функция отработки. Должна постоянно опрашиваться
  enc1.tick();
   
      if (enc1.isLeft()) Serial.println("left");
      if (enc1.isRight()) Serial.println("right");


}
Не знаю важно это или нет. Просто тот код присылал до этого, пытался проверять что будет отображать если буду убирать из цепочки DT и CLK, но значения всегда "right".
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Ну вот простой код для теста самого энкодера, проверьте свой энкодер

Это симуляция, нормально состояние выходов это 11,
Тут переход в одну сторону (от 11 до 11):
Код:
11
01
00
10
11
И в другую
Код:
11
10
00
01
11
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
Ну вот простой код для теста самого энкодера, проверьте свой энкодер

Это симуляция, нормально состояние выходов это 11,
Тут переход в одну сторону (от 11 до 11):
Код:
11
01
00
10
11
И в другую
Код:
11
10
00
01
11
По Вашей провреке энкодера выдает следующие показания

В одну сторону и этот первый 01 появляется сам без вращения. А так сделано то 3 тика.
C++:
17:44:03.669 -> 01
17:44:06.211 -> 00
17:44:06.211 -> 01
17:44:06.981 -> 00
17:44:06.981 -> 01
17:44:07.858 -> 00
17:44:07.858 -> 01
17:44:34.500 -> 00
В другую сторону выдает так:
C++:
17:45:56.738 -> 01
17:45:57.282 -> 00
17:45:57.329 -> 01
17:46:00.040 -> 00
17:46:00.040 -> 01
17:46:01.205 -> 00
17:46:01.205 -> 01


Лог целиком 6 тиков. По 3 тика в каждую сторону.
C++:
17:44:03.669 -> 01
17:44:06.211 -> 00
17:44:06.211 -> 01
17:44:06.981 -> 00
17:44:06.981 -> 01
17:44:07.858 -> 00
17:44:07.858 -> 01
17:44:34.500 -> 00
17:45:56.738 -> 01
17:45:57.282 -> 00
17:45:57.329 -> 01
17:46:00.040 -> 00
17:46:00.040 -> 01
17:46:01.205 -> 00
17:46:01.205 -> 01
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
Подскажите пожалуйста как сделать чтоб он подавал сигнал LOW только когда происходит поворот энкодера, в остальное время же не подавал ничего.


C++:
#include <GyverEncoder.h>


#define CLK 4
#define DT 3

Encoder enc1(CLK, DT);
void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
  pinMode(10, OUTPUT);  // D10 как выход
  pinMode(11, OUTPUT);  // D11 как выход
 
}
void loop() {
  // обязательная функция отработки. Должна постоянно опрашиваться
  enc1.tick();
 
      if (enc1.isLeft()) digitalWrite(11, LOW);    // вывод сигнала если крутиться вниз
    if (enc1.isRight()) digitalWrite(10, LOW); // вывод сигнала если крутиться вверх

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Энкодер такое устройство, что не имеет постоянного вращения, у него шаги, шаг вправо, шаг влево и кнопка. Т.е. сказать однозначно. что он крутится нельзя. Он вот сейчас крутанулся. а теперь уже нет. И крутить его можно с разной скоростью. Т.е. вроде бы должно быть так:
C++:
if (enc1.isLeft()) digitalWrite(11, LOW);
else digitalWrite(11, HIGH);
Но тогда встанет вопрос о длительности импульса на 11 пине. Может так случиться , что его хватит , а может и нет. Тогда надо будет переключать по таймеру и по смене направления.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Изначально будет высокий уровень, при вращении будет кратковременное снижение на низкий уровень и опять высокий , т.к. следующая проверка состояния энкодера покажет что он не крутился.
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
Подача высокого сигнала на провод мне наверное не сгодиться.
Возможно переводить сигнал в input и в output при прокрутке может исправить ситуацию ?
Просто туда куда подается сигнал идет управления сигналом LOW но дальше там сигнал обрабатывается через штатный процессор и если туда подать HIGH то тот процессор вообще с ума сойдет.
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
В общем решил сделать так чтобы менялись пины (OUTPUT, INPUT), так как побоялся этих постоянных 5вольт на пин.
C++:
#include <GyverEncoder.h>


#define CLK 4
#define DT 3

Encoder enc1(CLK, DT);
void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
 
}
void loop() {
  // обязательная функция отработки. Должна постоянно опрашиваться
  enc1.tick();
 
      if (enc1.isLeft()) {
        pinMode(11, OUTPUT);
        digitalWrite(11, LOW);
        delay(200);
        Serial.println("down");
        }
        else pinMode(11, INPUT);    // вывод сигнала если крутиться вниз
    if (enc1.isRight()) {
        pinMode(10, OUTPUT);
        digitalWrite(10, LOW);
        delay(200);
        Serial.println("up");
    }
    else pinMode(10, INPUT); // вывод сигнала если крутиться вверх

}
Но что смущает что крутя энкодер в одном направлении, в моем случае вверх или низ переодически показывает другую сторону. Это дело в самом энкодере, по типу как умирает энкодер мыши ?

Пример прокрутки вверх:
C++:
13:49:57.304 -> up
13:49:57.851 -> up
13:49:58.263 -> up
13:49:58.720 -> up
13:49:59.166 -> up
13:49:59.564 -> up
13:50:00.010 -> up
13:50:00.421 -> up
13:50:00.867 -> up
13:50:01.235 -> down
13:50:01.620 -> down
13:50:02.004 -> up
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
вполне может быть.

И что по вашему будет на пине при смене OUTPUT на INPUT ?
Ну тестер показывает 0вольт и на землю не звонит.
Я чайник в этом всем, просто стараюсь мыслить логически, и получается когда INPUT он пытается взять сигнал(а сигнала там нет), а когда OUTPUT отправить, в моем слуачае он отправляет землю.
Просто в ситуации с HIGH он показывал 5 вольт и меня это пугает, но опять как Вы сказали если ему не дать LOW, то он не будет видеть эти 5 вольт, но страх что там где-то есть этот LOW меня не покидает.

Так делать нельзя.
enc1.tick(); должен вызываться настолько часто, чтобы не пропускать импульсы энкодера.
Без delay очень короткое время импульса, и он просто не успевал увидеть сигнал, и получалось так что ничего не происходило.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Без delay очень короткое время импульса, и он просто не успевал увидеть сигнал, и получалось так что ничего не происходило.
Но тогда встанет вопрос о длительности импульса на 11 пине. Может так случиться , что его хватит , а может и нет. Тогда надо будет переключать по таймеру и по смене направления.
Я про это говорил. надо запоминать время через миллис и по истечении нужного периода снимать уровень.

Просто в ситуации с HIGH он показывал 5 вольт и меня это пугает, но опять как Вы сказали если ему не дать LOW, то он не будет видеть эти 5 вольт, но страх что там где-то есть этот LOW меня не покидает.
А тому , что ловит сигнал на другой стороне провода какой высокий уровень нужен ? Делайте/купить преобразователь уровней .
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
Я про это говорил. надо запоминать время через миллис и по истечении нужного периода снимать уровень.
Я благодаря Вам и пришел к этому delay, про миллис видел какие-то примеры, но не очень понимаю как с ним работать в моем примере, как считать это время.

А тому , что ловит сигнал на другой стороне провода какой высокий уровень нужен ? Делайте/купить преобразователь уровней .
Ему нужен LOW сигнал сам по себе, ну и плата там работает вроде от тех же 5вольт которые преобразованны с 12. А с переводом сигналов в INPUT это работать корректно не будет ?