Подключение Энкодера и LCD-I2C

Xboct
Offline
Зарегистрирован: 12.02.2020

День добрый знатокам.

На большинстве подключений вижу как энкодеры подключаются к D2 и D3. К этим же контактам у Yun rev.2 выведены SDA и SCL для I2C подключений. Если я хочу подключить дисплей через I2C то куда лучше подключить энкодер?

RxMaxx
Offline
Зарегистрирован: 10.04.2020

Энкодер, обычно, цепляют на ноги, где есть прерывания, можно и без прерываний работать, но тогда будут пропуски и не совсем адекватное поведение, особенно на больших оборотах. Ищите подробное описание своей платы, и смотрите есть ли свободные ноги с прерыванием. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Xboct пишет:

День добрый знатокам.

На большинстве подключений вижу как энкодеры подключаются к D2 и D3. К этим же контактам у Yun rev.2 выведены SDA и SCL для I2C подключений. Если я хочу подключить дисплей через I2C то куда лучше подключить энкодер?

А что за ардуина то? У уно/нано и прочих на atmega 328  аппаратной I2C находится на А4/А5.

Xboct
Offline
Зарегистрирован: 12.02.2020

asam пишет:

то? У уно/нано и прочих на atmega 328  аппаратной I2C находится на А4/А5.

Это Yun Rev.2

по описанию у неё I2C на D2 и D3. 

 

Макс, спасибо за подсказку

Прерывания у Yun Rev.2 на D0-D3 и D7 . Т.к. я хочу использовать D0 & D1 для сериал дата, а D2 и D3 для I2C, то остаётся один только D7. Подключить хотя бы один из выходов Up/Dwn incremental decoder к нему, чтоб хоть как-то уменьшить пропуски? больших скоростей вращения не предполагаю - вращения вала енкодера пальцами.

RxMaxx
Offline
Зарегистрирован: 10.04.2020

Xboct пишет:
то остаётся один только D7. Подключить хотя бы один из выходов Up/Dwn incremental decoder к нему, чтоб хоть как-то уменьшить пропуски?

Не уверен, что хватит одного прерывания для энкодера, но попробовать можно.

У меня энкодер подключен через MCP23017, которая использует всего одно прерывание. Это работает, но возможно будет сильно лишним костылем в вашем случае. Можно подумать, и как нибудь через логические элементы типа ИЛИ (или тупо через диоды) стучаться еще и на ногу с прерыванием при повороте.

Kakmyc
Offline
Зарегистрирован: 15.01.2018
void EncA_ISR(){
        digitalRead(EncA)==digitalRead(EncB)?val++:val--;
    }

Вполне хватает и одного прерывания.

И более того:За один щелчок энкодера сигнал на выводах (дребезг не рассматриваем) изменяется 4 раза(по 2 раза на каждом из выводов). Поэтому и прерывания хватит одного и даже следить нужно только за одним из фронтов сигнала.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Более удобный вариант при работе с энкодером, не менять значение переменной за которую отвечает поворот, а ввести ещё одну знаковую и при повороте в одну сторону присваивать ей значение "1" , а при повороте в другую "-1".

Ну и дальше в коде где будет запрос делать что то такое:

if(enc_tick){val+=enc_tick;enc_tick=0;}

 

Верно для кодов без delay() обрабатываемых быстрее , чем пользователь крутит энкодер.