Акции
Блог
О 3DiY
  • О компании
  • Реквизиты
  • Партнеры
  • Клиенты
  • Вакансии
Оплата
Доставка
Гос. закупки
Товары под заказ
ВК Видео
Отзывы
Услуги
  • 3D печать
    • 3D печать пластиком FDM/FFF
    • 3D печать фотополимером
Контакты
  • Как до нас добраться
    8 (800) 500-45-93
    8 (800) 500-45-93отдел продаж Россия
    8 (495) 565-35-93отдел продаж Москва
    E-mail

    info@3d-diy.ru — отдел продаж

    support@3d-diy.ru — тех. поддержка

    Адрес
    Москва, Павловская улица, 27с7
    м. Тульская
    Режим работы
    пн – пт 11:00—19:00
    8.05 – 11.05 не работаем
    3DIY
    3D принтеры
    Материалы для 3D печати
    Комплектующие 3D принтера
    Arduino и робототехника
    Комплектующие ЧПУ станка
    Инструменты
    Запчасти для 3D принтеров по брендам
    Товары снятые с продажи
    • 3D принтеры
      • Печать пластиком (FDM/FFF)
        Печать пластиком (FDM/FFF)
      • Печать фотополимером (SLA/DLP/LCD)
        Печать фотополимером (SLA/DLP/LCD)
      • Печать воском (MJP)
        Печать воском (MJP)
      • Для дома
        Для дома
      • Для бизнеса
        Для бизнеса
      • Для производства
        Для производства
      • Наборы для сборки
        Наборы для сборки
      • Промышленные
        Промышленные
      Phrozen
      FlyingBear
      QIDI
      CreatBot
      FlashForge
      Bambu Lab
      ERYONE
      Elegoo
      eSUN
      Creality
      BIGTREETECH
      Anycubic
    • Материалы для 3D печати
      • Пластики
        Пластики
        • ABS
        • PLA
        • PETG
        • HIPS
        • PVA
        • FLEX (TPU)
        • Nylon/PA (Нейлон)
        • PC (Поликарбонат)
        • PEEK
        • POM (Полиацеталь)
        • PP (Полипропилен)
        • Резина
        • Стеклонаполненные
        • Термочувствительные
        • Угленаполненные
        • SBS
        • Светящиеся
        • Металлические
        • Спец. пластик
        • Пластик для 3D ручек
      • Фотополимеры
        Фотополимеры
        • Стандартные
        • ABS-типа
        • Гибкие
        • Водосмываемые
        • Выжигаемые
        • Инженерные
        • Стоматологические
        • Для хобби
      Phrozen
      FlyingBear
      QIDI
      CreatBot
      FlashForge
      Bambu Lab
      ERYONE
      Elegoo
      eSUN
      Creality
      BIGTREETECH
      Anycubic
    • Комплектующие 3D принтера
      • Электроника
        Электроника
        • Платы управления
        • Шаговые двигатели (ШД)
        • Драйверы ШД 3D принтеров
        • Драйверы шаговых двигателей ЧПУ
        • Дисплеи
        • Датчики и модули
        • Блоки питания
        • Реле
        • Концевые выключатели
        • Вентиляторы      
          • Вентиляторы осевые
          • Вентиляторы радиальные (улитки)
          • Решетки и фильтры для вентиляторов
        • Провода, кабели и разъемы
      • Механика
        Механика
        • Зубчатые шкивы
        • Зубчатые ремни
        • Трапецеидальные винт-гайки
        • Шарико-винтовые передачи (ШВП)      
          • Гайки ШВП
          • Модули крепления гаек ШВП
          • Обратотанные ШВП
          • Опоры ШВП
        • Соединительные муфты
        • Ролики для зубчатых ремней
        • Цилиндрические направляющие
        • Рельсовые направляющие      
          • Профильные направляющие HIWIN
          • Профильные направляющие КИТАЙ
        • Держатели вала
        • Корпусные детали      
          • Корпуса
          • Апгрейды
          • Комплектующие для корпусов
        • Запчасти OpenBuilds
        • Подшипники качения
        • Пружины
      • Нагревательные столы и сопутствующие
        Нагревательные столы и сопутствующие
        • Нагревательные платформы
        • PEI пластины
        • Стекла и Зеркала
        • Теплоизоляция
        • Основания для столов
        • Силиконовые проставки (пружины)
        • Термисторы
        • Зажимы-фиксаторы
        • Пружины
      • Экструдеры
        Экструдеры
        • Экструдеры и механизмы подачи
        • Хотэнды
        • Сопла
        • Термобарьеры
        • Термисторы
        • Нагревательные блоки
        • Теплоизоляция нагревательных блоков
        • Тефлоновые трубки
        • Радиаторы
        • Нагревательные элементы
        • Шестерни
        • Фитинги
        • Сопутствующие товары
      • Сушилки для пластика
        Сушилки для пластика
      • УФ-камеры
        УФ-камеры
      • Мойки
        Мойки
      • Ультразвуковые ванны (мойки)
        Ультразвуковые ванны (мойки)
      • 3D ручки
        3D ручки
      • 3D-сканеры
        3D-сканеры
      • Расходные материалы для SLA / LCD
        Расходные материалы для SLA / LCD
      • Сопутствующие
        Сопутствующие
      • Наборы для мейкеров
        Наборы для мейкеров
      • Инструменты для 3D печатника
        Инструменты для 3D печатника
      • Постобработка
        Постобработка
      • Адгезивы
        Адгезивы
      Phrozen
      FlyingBear
      QIDI
      CreatBot
      FlashForge
      Bambu Lab
      ERYONE
      Elegoo
      eSUN
      Creality
      BIGTREETECH
      Anycubic
    • Arduino и робототехника
      • Arduino
        Arduino
      • Raspberry Pi
        Raspberry Pi
        • Микрокомпьютеры
        • Дисплеи      
          • TFT-LCD дисплеи Raspberry Pi
          • IPS-LCD дисплеи Raspberry Pi
          • AMOLED дисплеи Raspberry Pi
        • Корпуса
        • Шилды
        • Камеры
        • Питание
        • Охлаждение
      • Обучающие наборы
        Обучающие наборы
      • Orange Pi
        Orange Pi
      • Одноплатники
        Одноплатники
      • Модули
        Модули
        • Платы расширения
        • Беспроводные модули
        • Интерфейсы
        • Релейные модули
        • Преобразователи питания
        • Лазерные модули
        • Аудио
        • Видео
        • Клавиатура
        • Драйверы моторов
        • Измерительные
        • Другие
      • Датчики
        Датчики
        • Аудио
        • Газа
        • Инфракрасные
        • Климатические
        • Жидкостные
        • Механического воздействия
        • Положения (акселерометры/компасы/гироскопы)
        • Пространства
        • Света и цвета
        • Тактильные
        • Тока и напряжения
      • Дисплеи
        Дисплеи
        • TFT-LCD дисплеи
        • STN-LCD дисплеи
        • LED дисплеи
        • OLED дисплеи
        • Дисплеи DWIN
        • E-Paper дисплеи
      • Механика
        Механика
        • Колёса
        • Коллекторные двигатели
        • Сервоприводы
        • Шаговые двигатели
        • Другие
        • Линейные актуаторы (приводы)
      • Макетные платы
        Макетные платы
      • Светодиоды
        Светодиоды
        • Светодиодные кольца
        • Светодиодные матрицы
        • Сегментные индикаторы
        • Светодиоды круглые
        • Другие
      • Провода и кабели
        Провода и кабели
      • Источники питания
        Источники питания
      • Радиодетали
        Радиодетали
        • Кварц
        • Кнопки
        • Конденсаторы
        • Резисторы
        • Транзисторы
        • Другие
        • Стабилизаторы
      Phrozen
      FlyingBear
      QIDI
      CreatBot
      FlashForge
      Bambu Lab
      ERYONE
      Elegoo
      eSUN
      Creality
      BIGTREETECH
      Anycubic
    • Комплектующие ЧПУ станка
      • Шаговые двигатели и аксессуары
        Шаговые двигатели и аксессуары
        • NEMA 8
        • NEMA 11
        • NEMA 14
        • NEMA 17
        • NEMA 23
        • NEMA 34
        • NEMA 42
        • NEMA 52
        • Шаговые актуаторы
        • Шаговые двигатели с редуктором      
          • C планетарным редуктором
          • C цилиндрическим редуктором
        • Шаговые двигатели с тормозом
        • Круглые шаговые двигатели
        • Сопутствующие
      • Зубчатые ременные передачи
        Зубчатые ременные передачи
        • Зубчатые ремни      
          • Зубчатые ремни GT2
          • Зубчатые ремни HTD 3M
          • Зубчатые ремни HTD 5M
          • Зубчатые ремни T2.5
          • Зубчатые ремни T5
        • Зубчатые шкивы      
          • Зубчатые шкивы GT2
          • Зубчатые шкивы HTD 3M
        • Ролики
      • Шарико-винтовые передачи (ШВП)
        Шарико-винтовые передачи (ШВП)
        • Готовые ШВП, обработанные
        • Гайки ШВП
        • Опоры ШВП
        • Модули крепления гаек ШВП
        • Кронштейны-опоры ШВП
      • Трапецеидальные передачи винт-гайка
        Трапецеидальные передачи винт-гайка
        • Винты трапецеидальные
        • Гайки трапецеидальные
        • Муфты Oldham
        • Сопутствующие
      • Цилиндрические направляющие
        Цилиндрические направляющие
        • Полированные валы
        • Цилиндрические рельсы
        • Линейные подшипники
        • Модули с линейным подшипником
        • Втулки скольжения
        • Держатели вала
        • Пластиковые втулки скольжения
      • Профильные направляющие
        Профильные направляющие
        • Профильные направляющие HIWIN      
          • Каретки HIWIN
          • Рельсы HIWIN
        • Профильные направляющие      
          • Каретки
          • Рельсы
        • Роликовые направляющие
      • Муфты соединительные
        Муфты соединительные
        • Жесткие
        • Кулачковые
        • Спиральные
        • Мембрнные
        • Сильфонные
        • Пружинные
        • Гибкие
      • Электроника
        Электроника
        • Блоки питания
        • Вентиляторы электрические и аксессуары      
          • Вентиляторы осевые
          • Вентиляторы радиальные (улитки)
          • Решетки и фильтры для вентиляторов
        • Драйверы шаговых двигателей
        • Микропереключатели и концевики
        • Датчики касания инструмента
        • Кнопки и индикаторы
      • Фрезы
        Фрезы
        • Спиральные фрезы      
          • Стружка вверх
          • Стружка вниз
        • Компрессионные фрезы
        • Прямые фрезы
        • Конусные фрезы
        • Сферические фрезы
        • Фрезы рашпильные (кукуруза)
        • Цанги
        • Сопутствующие
      • Карбоновый профиль / трубки
        Карбоновый профиль / трубки
      • Пневматическое оборудование
        Пневматическое оборудование
        • Регуляторы давления, фильтры, лубрикаторы
      • Системы подачи смазки
        Системы подачи смазки
        • Автоматические смазочные насосы
        • Ручные смазочные насосы
        • Маслораспределительные аксессуары
      • Сопутствующие
        Сопутствующие
      • Шпиндели и сопутствующие
        Шпиндели и сопутствующие
        • Шпиндели воздушного охлаждения
        • Шпиндели жидкостного охлаждения
        • Частотные преобразователи
        • Крепления для шпинделей
        • Системы охлаждения шпинделей
        • Подведение СОЖ
        • Прижимы для шпинделей
        • Распылители масляного тумана
        • Щетка-насадка для шпинделя
        • Сопутствующие для шпинделей
      • Механика
        Механика
        • Кабель-каналы гибкие
        • Подшипники качения
        • Подшипниковые узлы
      • Конструкционный профиль
        Конструкционный профиль
        • Сухари пазовые
        • Т-болты
        • Т-гайки
        • Серия 15      
          • Анодированный
          • Без покрытия
        • Серия 20      
          • Анодированный
          • Без покрытия
        • Серия 20 (V-паз)      
          • Анодированный
          • Без покрытия
        • Серия 30      
          • Анодированный
          • Без покрытия
        • Серия 40      
          • Анодированный
          • Без покрытия
        • Серия 45      
          • Анодированный
          • Без покрытия
        • Серия 50      
          • Анодированный
          • Без покрытия
      • Комплектующие OpenBuilds
        Комплектующие OpenBuilds
        • Ролики OpenBuilds
      • Лазерные станки
        Лазерные станки
      • Лазерная резка и аксессуары
        Лазерная резка и аксессуары
        • Блоки розжига
        • Воздушные компрессоры
        • Датчики
        • Крепление лазерной трубки
        • Лазерные головки и держатели зеркал
        • Полупроводниковые лазерные модули
        • Системы охлаждения
        • Системы управления (Контроллеры)      
          • Контроллеры RuiDa
      Phrozen
      FlyingBear
      QIDI
      CreatBot
      FlashForge
      Bambu Lab
      ERYONE
      Elegoo
      eSUN
      Creality
      BIGTREETECH
      Anycubic
    • Инструменты
      • Зачистка и обрезка кабеля
        Зачистка и обрезка кабеля
      • Измерительный инструмент
        Измерительный инструмент
        • Мультиметры
      • Кабель и провода
        Кабель и провода
        • Акустический кабель
        • Высоковольтный кабель
      • Клеевые пистолеты (термопистолеты)
        Клеевые пистолеты (термопистолеты)
      • Напильники и надфили
        Напильники и надфили
      • Обжимной инструмент
        Обжимной инструмент
      • Отвертки
        Отвертки
      • Паяльное оборудование
        Паяльное оборудование
        • Наборы для паяльных работ
        • Отсосы припоя
        • Паяльные принадлежности
        • Паяльные станции
        • Припой
        • Электрические паяльники
      • Пинцеты
        Пинцеты
      • Расходные материалы
        Расходные материалы
        • Изолента
        • Клеевые стержни
      Phrozen
      FlyingBear
      QIDI
      CreatBot
      FlashForge
      Bambu Lab
      ERYONE
      Elegoo
      eSUN
      Creality
      BIGTREETECH
      Anycubic
    • Запчасти для 3D принтеров по брендам
      • 3DIY printers
        3DIY printers
        • Bizon 3
        • STRATEX 350
        • STRATEX 500
        • REX 6K Mono
        • P3 Steel 200 PRO
        • P3 Steel 300 PRO
        • P3 Steel 300 DUAL PRO
      • Bambu Lab
        Bambu Lab
        • Bambu Lab A1 mini
        • Bambu Lab A1
        • Bambu Lab P1 Series
        • Bambu Lab X1 Series
      • Creality
        Creality
        • Creality K1
        • Creality K1 MAX
        • Creality K1C
        • Creality K2 plus
      • Flashforge
        Flashforge
        • Adventurer 5M / 5M Pro
      • Qidi
        Qidi
        • Qidi Tech X-Plus 3
        • Qidi Tech X-Max 3
        • QIDI Plus 4
        • Qidi Q1 Pro
      Phrozen
      FlyingBear
      QIDI
      CreatBot
      FlashForge
      Bambu Lab
      ERYONE
      Elegoo
      eSUN
      Creality
      BIGTREETECH
      Anycubic
    • Товары снятые с продажи
        Phrozen
        FlyingBear
        QIDI
        CreatBot
        FlashForge
        Bambu Lab
        ERYONE
        Elegoo
        eSUN
        Creality
        BIGTREETECH
        Anycubic
      Войти
      0Избранное
      0Корзина
      3D принтерыПластик для 3D принтераФотополимерыКомплектующие 3DКомплектующие ЧПУРобототехникаЗапчасти 3D принтеров по брендам
      3DIY
      Войти
      0Избранное
      0Корзина
      3DIY
      Телефоны
      8 (800) 500-45-93отдел продаж Россия
      8 (495) 565-35-93отдел продаж Москва
      E-mail

      info@3d-diy.ru — отдел продаж

      support@3d-diy.ru — тех. поддержка

      Адрес
      Москва, Павловская улица, 27с7
      м. Тульская
      Режим работы
      пн – пт 11:00—19:00
      8.05 – 11.05 не работаем
      0
      0
      • Кабинет
      • 0Избранное
      • 0Корзина
      • Бренды
      • Акции
      • Услуги
        • Услуги
        • 3D печать
          • 3D печать
          • 3D печать пластиком FDM/FFF
          • 3D печать фотополимером
      • Компания
        • Компания
        • О компании
        • Реквизиты
        • Партнеры
        • Клиенты
        • Вакансии
      • Блог
      • Информация
        • Информация
        • Гарантия на товар
        • Возврат товара
        • Политика конфиденциальности
        • Договор-оферта
        • FAQ
      • Контакты
        • Контакты
        • Как до нас добраться
      8 (800) 500-45-93отдел продаж Россия
      • Телефоны
      • 8 (800) 500-45-93 отдел продаж Россия
      • 8 (495) 565-35-93 отдел продаж Москва
      • info@3d-diy.ru — отдел продаж

        support@3d-diy.ru — тех. поддержка

      • Москва, Павловская улица, 27с7
        м. Тульская
      • пн – пт 11:00—19:00
        8.05 – 11.05 не работаем
      Главная
      Блог
      Модули
      DIY энкодер

      DIY энкодер

      DIY энкодер
      Модули 1 января 2024

      Содержание

      • Назначение и устройство

      • Характеристики

      • Подключение к Ардуино

      • Примеры использования

      • Выводы

      • FAQ


      Назначение и устройство энкодера

      Под энкодером, применительно к DIY, мы чаще всего представляем себе удобное, интуитивно понятное устройство управления электронными приборами в виде “крутилки”, иногда с возможностью на нее нажать как на обычную кнопку. Очень часто оно являлось единственным средством общения с 3D-принтерами прошлого поколения, а многими приверженцами старой школы считается самым удобным решением и сейчас. Именно его мы рассмотрим внимательно в этой статье и разберемся, как его можно использовать в своих проектах.

      encoder.jpg

      Вообще “энкодер” - это общее название большого семейства датчиков, сильно различающихся по назначению, характеристикам, исполнению и цене. Главное, что их объединяет, это возможность преобразовывать угол поворота в сигналы, понятные контроллеру. Точность промышленных энкодеров может достигать сотых и даже тысячных долей градуса, наши же DIY энкодеры имеют всего несколько десятков шагов на оборот, чего вполне достаточно для решения их задач. По способу выдачи информации подразделяются на инкрементальные и абсолютные. Абсолютный всегда выдает информацию о своем точном положении в данный конкретный момент, независимо от предыдущих состояний и событий. Включив прибор с таким энкодером, мы сразу можем получить информацию о контролируемом им механизме, что необходимо для станков ЧПУ, робототехники, промышленных автоматов и прочих подобных устройств.

      Наш DIY энкодер относится к инкрементальным, то есть он может замечать только изменения, которые с ним происходят в процессе работы, да и то, если их вовремя отслеживать.

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

      encoder_v_razbore.jpg

      Схематически они более близки между собой и все устроены примерно так:

      shema_principialnaya.jpg

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


      Характеристики

      Диапазон вращения 360 градусов. На один оборот приходится от 20 импульсов (различается у разных моделей). Может быть использован для определения скорости вращения и угла поворота ручки управления. Позволяет определять направление вращения. Энкодер дополнительно имеет кнопку, чтобы привести ее в действие, необходимо нажать на вал. Напряжение до 12В. Скорость вращения до 2 об/сек.


      Подключение энкодера к Arduino

      Прежде всего, попробуем понять, что из себя представляет наш энкодер с точки зрения электроники. В отличие от своих дорогих промышленных собратьев с оптическими, магнитными и индуктивными датчиками, он является устройством с простыми механическими контактами как у тактовых кнопок. По факту это и есть две кнопки, которые то нажимаются, то отпускаются в процессе вращения с некоторым смещением по времени, одна чуть раньше, другая чуть позже, в зависимости от направления. Потому подключать его следует по классической “кнопочной” схеме с подтяжкой одного контакта к плюсу при помощи резистора 1 КОм, второго напрямую к нулю. Так как “кнопки” две, резистора тоже надо два. Средний контакт общий, его мы зануляем.

      shema_podkluchenia.jpg

      Сигнальные ножки подключим, для примера, к контактам 2 и 8 (чуть позже будет пояснение, почему именно к ним).

      Если подать на Ардуино питание и посмотреть логическим анализатором или осциллографом, что происходит на этих ножках при вращении вала в разные стороны, можно заметить интересную картину. Вот крутим в одну сторону:

      signal_vpravo.jpg

      А вот в другую:

      signal_vlevo.jpg

      На верхней картинке запечатлены 6 “щелчков” энкодера, на нижней 7. Каждый “щелчок” энкодера, то есть его установка в фиксированное положение, инвертирует сигнал на обеих ножках с небольшой задержкой. Обратите внимание, сигнал на ножках повторяется, но опережающая ножка в каждом случаях разная, и зависит от направления вращения. Этим свойством мы и воспользуемся для отслеживания сигналов, нам надо будет лишь дождаться изменения сигнала на одной из ножек и сравнить его с сигналом второй. Если они совпадают, прибавляем значение, если нет - убавляем.


      Примеры использования

      Первым, самым простым способом будет решить задачу в лоб. Он же и самый неправильный, хоть и вполне рабочий.

       #define C1 2 // первый контакт #define C2 8 // второй контакт int stepEnc = 0; // состояние энкодера byte buffEnc[2]; // буффер состояния первой кнопки byte flagEnc = 0; // флаг изменения void setup() { pinMode(C1, INPUT); pinMode(C2, INPUT); Serial.begin(9600); } void loop() { enc(); // отслеживаем if (flagEnc) { // если изменение было Serial.println(stepEnc); // выводим состояние в порт flagEnc = 0; // сбрасываем флаг } } void enc() { static unsigned long timer; if (timer + 5 > millis()) return; // замеряем каждые 5 мс buffEnc[0] = buffEnc[1]; buffEnc[1] = digitalRead(C1); if (buffEnc[0] != buffEnc[1]) { // заметили изменение сигнала на первой ножке stepEnc += digitalRead(C2) == buffEnc[1] ? 1 : -1; // если вторая еще в плюсе, прибавляем, если уже в минусе, убавляем flagEnc = 1; // поднимаем флаг } timer = millis(); } 
      Что тут происходит? Функцией enc() мы опрашиваем каждые 5 мс состояние первой кнопки, запоминая предыдущее, для того, чтобы заметить, когда оно изменится, то есть будет нажата или отжата первая “кнопка”. Зачем пауза 5 мс? Механические контакты не идеальны, они могут “дребезжать”, чем портить результаты измерений, делая их неприемлемыми. Избавиться от лишних сигналов при дребезге можно аппаратно (гуглим, рассчитываем и собираем RC-цепь) или программно, делая паузы между замерами, что гораздо проще. В данном случае, 5 мс, по результатам наблюдений, является оптимальным значением, так как точно пропустит дребезг, при этом не пропустит большую часть сигнала от энкодера при умеренной скорости его вращения.

      Почему же я назвал код неправильным, если он рабочий? Функция enc() должна постоянно вызываться в цикле без пропусков времени дольше упомянутых 5 мс. Если в программе работает еще какой-либо код, пропуски, скорее всего, будут, и весьма часто. Даже вывод информации в com-порт способен этому помешать, не говоря уже про все остальное. Если же в программе будут мерзкие, но любимые новичками delay(), то работать такой энкодер будет совсем отвратительно. Как можно обойти эту проблему?

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

       #define C1 2 // первый контакт #define C2 8 // второй контакт int stepEnc = 0; // состояние энкодера byte buffEnc[2]; // буффер состояния первой кнопки byte flagEnc = 0; // флаг изменения unsigned long timerPrint; void setup() { pinMode(C1, INPUT); pinMode(C2, INPUT); timerStart(); Serial.begin(9600); } void loop() { if (flagEnc) { // если изменение было Serial.println(stepEnc); // выводим состояние в порт flagEnc = 0; // сбрасываем флаг } } void timerStart() { cli(); TCCR1A = 0b00000000; TCCR1B = 0b00001100; // x256, сброс при совпадении 1A OCR1A = 0x0138; // 5ms TIMSK1 = 0b0000010; // прерывание А sei(); } ISR(TIMER1_COMPA_vect) { buffEnc[0] = buffEnc[1]; buffEnc[1] = digitalRead(C1); if (buffEnc[0] != buffEnc[1]) { // заметили изменение сигнала на первой ножке stepEnc += digitalRead(C2) == buffEnc[1] ? 1 : -1; // если вторая еще в плюсе, прибавляем, если уже в минусе, убавляем flagEnc = 1; // поднимаем флаг } } 
      Команда timerStart() запускает таймер, который будет вызывать функцию отслеживания каждые 5 мс. Мы не будем рассматривать здесь, как работать с таймером, как назначить другое время, просто сделаем тот же период, что и в первом способе. Теперь положение энкодера всегда будет под рукой в переменной stepEnc, чем бы основная программа ни занималась, и даже если ее нет вообще. Что можно считать минусом этого способа? Вращаться энкодер будет, как правило, не часто, настроили им что хотели и оставили в покое, а код будет выполняться все время работы, отвлекая контроллер, немного тратя его ресурсы, занимая один из таймеров. В каких-то случаях это может стать проблемой. 

      Оба описанных выше способа имеют еще один недостаток. Вот график показаний энкодера, снятых этой программой:

      grafik_1_2.jpg

      Сперва я вращал вал довольно быстро, заметны ошибки, затем с нормальной скоростью, ошибок почти нет, и, наконец, очень быстро, ошибки сливаются в сплошную “пилу”. Возникает это явление вот почему:

      signal_mlaya_pauza.jpg

      При очень быстром вращении задержка между переключениями ножек может быть короче паузы, которую мы задали для замеров, в нашем примере 1,6 мс против 5 мс. Особенно часто такое встречается на растущем фронте. Бороться с этим явлением можно тремя способами:

      • не вращать вал слишком быстро, что не всегда может понравиться конечному пользователю,

      • уменьшить паузу между опросами, при этом увеличив нагрузку на контроллер и увеличив вероятность проскакивания дребезга,

      • исключить эту паузы вообще, об этом подробнее в третьем способе.

      Способ третий, прерывание по событию. Вот теперь становится понятно, почему я выбрал пин 2. Потому что на него средствами среды разработки Ардуино можно легко привязать прерывание по событию, а именно по изменению сигнала. 

       #define C1 2 // первый контакт #define C2 8 // второй контакт int stepEnc = 0; // состояние энкодера byte buffEnc[2]; // буффер состояния первой кнопки byte flagEnc = 0; // флаг изменения void setup() { pinMode(C1, INPUT); pinMode(C2, INPUT); attachInterrupt(INT0, pushPD, CHANGE); // привязываем функцию к изменению сигнала на пине 2 Serial.begin(9600); } void loop() { if (flagEnc) { // если изменение было Serial.println(stepEnc); // выводим состояние в порт flagEnc = 0; // сбрасываем флаг } } void pushPD() { static unsigned long timer; if (timer > millis()) return; // если вызывается слишком часто, значит это дребезг, он нам не нужен stepEnc += digitalRead(C2) == digitalRead(C1) ? 1 : -1; // определяем направление по состоянию второй ножки flagEnc = 1; timer = millis() + 10; // пауза антидребезга 5 мс, на отслеживание не влияет } 

      Контроллер не выполняет лишнюю работу, сигналы не пропускаются, код компактен, прозрачен и понятен, красота да и только! Из минусов можно отметить невозможность использования средствами Ардуино других пинов, кроме 2 и 3. Если они заняты или энкодеров более двух, такой способ вам не подойдет.

      График, построенный третьей программой, почти идеален при любой скорости вращения вала, если не считать дрогнувшей в одном месте руки:

      ggafik_3.jpg

      Примечание: помешать правильной работе во втором и третьем варианте могут также периодические отключения таймера, например от библиотеки для работы с адресными светодиодами. Во время вывода информации на ленту все прерывания отключаются, чтобы не исказить поток данных. Поэтому, если ваш контроллер занят, скажем, постоянным анимированием подсветки или выводом графики на панель, отслеживать энкодер он корректно не сможет, придется придумывать систему из нескольких контроллеров, учитывайте этот факт при создании проекта.


      Выводы

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


      FAQ

       1.Можно ли использовать в одном проекте несколько независимых энкодеров?
      Да, по способу 1 и 2 достаточно внести в программу изменения по опросу дополнительных пар пинов. Если нужно больше энкодеров, чем есть свободных пинов на контроллере, придется использовать сдвиговые регистры типа 74HC165 и другие решения. Способом 3, средствами разработки Ардуино, можно использовать только два энкодера.

       2.Можно ли ускорить опрос энкодера, если, например, требуется вращать его быстрее, чем предусмотрено примерами?
      Да, если уменьшить паузу между опросами, но это может снизить точность считывания. Кроме того, данный энкодер не рассчитан на большие скорости вращения и может быстро выйти из строя.

       3.Можно ли ускорить функцию опроса энкодера?
      Да, если опрашивать пины портов напрямую, а не через digitalRead(), можно выиграть несколько микросекунд с каждой итерации функции. Но в большинстве случаев это будет незаметно.

       4.Можно ли изменить направление вращения?
      Конечно, поменяв местами пины и контакты, или программно, заменив минусы на плюсы и наоборот в строке digitalRead(C2) ? stepEnc++ : stepEnc--;

       5.Как работать с кнопкой нажатия на вал?
      Так же, как с любой обычной механической кнопкой, она ничем от них не отличается.

       6.Можно ли подобным энкодером отслеживать угол поворота оси?

      Можно, если точность в пределах шага достаточна, а это градусов 15 и более. Кроме того, потребуется калибровать нулевое положение при каждом запуске. Обычно для этого используются промышленные энкодеры с абсолютным сигналом положения и большим количеством шагов на оборот. Описанные в данной статье способы работы к ним не подходят.

      Это интересно

      Драйвер шагового двигателя A4988
      Модули
      Драйвер шагового двигателя A4988
      1 января 2024
      RFID-модуль RC522
      Модули
      RFID-модуль RC522
      1 января 2024
      Реле электромеханическое 10А 5В
      Модули
      Реле электромеханическое 10А 5В
      1 января 2024
      Драйвер двигателя L9110S
      Модули
      Драйвер двигателя L9110S
      1 января 2024
      Nodemcu Lua Wi-Fi на Esp8266
      Модули
      Nodemcu Lua Wi-Fi на Esp8266
      1 января 2024
      Wi-Fi модуль ESP-01
      Модули
      Wi-Fi модуль ESP-01
      1 января 2024
      • Комментарии
      Загрузка комментариев...
      Назад к списку
      • Все публикации248
        • 3D принтеры38
        • 3D печать57
        • ЧПУ10
        • Датчики27
        • Модули38
        • Arduino механика6
        • Arduino платы8
        • Дисплеи6
        • Кейсы1
        • Компоненты13
        • Мировые новости35
        • Проекты7
        • Сопутствующие2
      Связаться с нами
      8 (800) 500-45-93
      8 (800) 500-45-93отдел продаж Россия
      8 (495) 565-35-93отдел продаж Москва
      E-mail

      info@3d-diy.ru — отдел продаж

      support@3d-diy.ru — тех. поддержка

      Адрес
      Москва, Павловская улица, 27с7
      м. Тульская
      Режим работы
      пн – пт 11:00—19:00
      8.05 – 11.05 не работаем

      info@3d-diy.ru — отдел продаж

      support@3d-diy.ru — тех. поддержка

      Москва, Павловская улица, 27с7
      м. Тульская
      Магазин
      Бренды
      Акции
      Каталог
      Услуги
      Компания
      О компании
      Реквизиты
      Партнеры
      Клиенты
      Вакансии
      Информация
      Гарантия на товар
      Возврат товара
      Политика конфиденциальности
      Договор-оферта
      FAQ
      Помощь
      Условия оплаты
      Условия доставки
      Товары под заказ
      Гос. закупки
      Как сделать заказ
      Вопрос-ответ
      2013 - 2025 © 3DiY (Тридиай) - интернет-магазин комплектующих для 3D принтеров, ЧПУ станков и робототехники
      Конфиденциальность
      Оферта
      ГлавнаяКаталог0Корзина0ИзбранныеКабинет
      Уважаемые клиенты
      8-9 мая - выходные
      С праздником!