Страница 1 из 18 123456711 ... ПоследняяПоследняя
Показано с 1 по 10 из 178
  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Управление при помощи поворотного энкодера (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(encoder0PinAINPUT);   
      
    digitalWrite(encoder0PinAHIGH);     // подключить подтягивающий резистор  
      
    pinMode(encoder0PinBINPUT);   
      
    digitalWrite(encoder0PinBHIGH);    // подключить подтягивающий резистор 
      
    pinMode(encoder0PinCINPUT);   
      
    digitalWrite(encoder0PinCHIGH);    // подключить подтягивающий резистор  
      
      
    attachInterrupt(0doEncoderAFALLING);  // настроить прерывание interrupt 0 на pin 2  
      
    attachInterrupt(1doEncoderBFALLING);  // настроить прерывание interrupt 0 на pin 3  
      
    Serial.begin (115200);  
    }   

    void loop()  
    {    
     if(
    digitalRead(encoder0PinC)==LOW
       {
         
    bytes[1]=8;
          
    Serial.writebytes,2);  
          while(
    digitalRead(encoder0PinC)==LOW){delay(50);}
           
    bytes[1]=7
       }
    }  

    // обработка прерывания  
    void doEncoderA()  
    {  
      if(
    digitalRead(encoder0PinB)==HIGH){bytes[0]=25;}else{bytes[0]=5;}   
      
    Serial.writebytes,2); 
      
    bytes[0]=0;
    }    

    // обработка прерывания  
    void doEncoderB()  
    {  
        if(
    digitalRead(encoder0PinA)==HIGH){bytes[0]=5;}else{bytes[0]=25;}  
        
    Serial.writebytes,2); 
        
    bytes[0]=0;    

    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	enc.jpg 
Просмотров:	31855 
Размер:	46.1 Кб 
ID:	12215  
    Последний раз редактировалось Chip; 19.03.2017 в 02:47.

  2. #2
    Гуру
    Регистрация
    08.12.2008
    Возраст
    41
    Сообщений
    577
    Вес репутации
    313

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    А когда появится сам энкодер в кармониторе?
    Nissan Almera N16 продана

  3. #3
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Уже приехали, нужно только поехать забрать.

  4. #4
    Новичок
    Регистрация
    26.10.2009
    Сообщений
    18
    Вес репутации
    188

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Я подключал энкодер с помощью резисторов на один аналоговый канал. На нем же все остальные резистивные кнопки. Работает достаточно четко.

  5. #5
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Тоже интересное решение, только не совсем понял как контроллер определит в каком направлении энкодер вращается. Можно схему подключения глянуть?
    Последний раз редактировалось Chip; 28.10.2009 в 22:57.

  6. #6
    Новичок
    Регистрация
    26.10.2009
    Сообщений
    18
    Вес репутации
    188

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Цитата Сообщение от Chip Посмотреть сообщение
    Тоже интересное решение, только не совсем понял как контроллер определит в каком направлении энкодер вращается. Можно схему подключения глянуть?
    Ну вот как то так. Еще резистор на землю надо чтобы наводки убрать (не стал его рисовать). В общем ардуино смотрит момент перехода - если сначала 0 потом 200 потом 600 значит в одну сторону крутится, а если 0 потом 400 потом 600 значит в обратную. Цифры с потолка для наглядности.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	Энкодер.JPG 
Просмотров:	27417 
Размер:	12.9 Кб 
ID:	6352  

  7. #7
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Это понятно, я так сразу и представлял, сбило с толку твое сообщение
    На нем же все остальные резистивные кнопки
    Прерывание как реализовал для аналого входа ?
    Последний раз редактировалось Chip; 30.10.2009 в 15:38.

  8. #8
    Новичок
    Регистрация
    26.10.2009
    Сообщений
    18
    Вес репутации
    188

    По умолчанию 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);

  9. #9
    торпедопек Аватар для Urvin
    Регистрация
    15.10.2009
    Возраст
    37
    Сообщений
    43
    Вес репутации
    194

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Энкодер на резисторы вешать несколько некорректно - энкодер может давать такую частоту, что она будет "сьедаться" ацп - суть есть конденсатором + обработчиком напряжения на этом конденсаторе.
    Если есть возможность, то надо делать на цифровых входах.

    В схеме еще хорошо бы повесить сопротивления с сигналов энкодера на питание, для пущей надежности.

  10. #10
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: Управление при помощи поворотного энкодера (Rotary Encoder)

    Внутренняя подтяжка подключена
    PHP код:
      pinMode(encoder0PinAINPUT);  
      
    digitalWrite(encoder0PinAHIGH);     // подключить подтягивающий резистор 
      
    pinMode(encoder0PinBINPUT);  
      
    digitalWrite(encoder0PinBHIGH);    // подключить подтягивающий резистор 
    А вот с дребезгом нужно что то делать, лучше наверно подправить немного код, чем кондеры вешать
    Последний раз редактировалось Chip; 31.10.2009 в 03:34.

Страница 1 из 18 123456711 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •