Синхронное управление двумя оптическими линейными приводами с помощью Arduino

Синхронное движение между несколькими линейными приводами может иметь жизненно важное значение для успеха некоторых приложений клиентов, одним из которых является два линейных привода, открывающих люк. Для этого мы рекомендуем использовать специальный инструмент Firgelli блок синхронного управления FA-SYNC-2 и FA-SYNC-4. Однако некоторые домашние мастера и хакеры предпочитают свободу, которую предлагает микроконтроллер, такой как Arduino, и предпочитают вместо этого писать свою собственную программу синхронного управления. Цель этого руководства - предоставить обзор того, как этого добиться с помощью Линейный привод Optical Series.

Предисловие

Это руководство не является подробным описанием шагов, необходимых для достижения синхронного управления с Arduino, а скорее представляет собой общий обзор, который поможет вам написать собственную программу. Это продвинутое руководство предполагает, что вы уже знакомы с аппаратным и программным обеспечением Arduino, а в идеале имеете опыт работы с сигналами широтно-импульсной модуляции (ШИМ), процедурой обслуживания прерываний (ISR), устранением неисправностей датчиков и кодировщиков двигателей. Пример, представленный в этом руководстве, представляет собой примитивный пропорциональный контроллер. В следующем примере можно реализовать множество улучшений, включая, помимо прочего: реализацию контура ПИД-регулирования и масштабирование до более чем двух линейных приводов. Имейте в виду, что у нас нет ресурсов для обеспечения технической поддержки приложений Arduino, и мы не будем отлаживать, редактировать, предоставлять код или схемы подключения за пределами этих общедоступных руководств.

Обзор синхронного управления

Синхронное управление достигается путем сравнения длины двух линейных приводов и пропорциональной регулировки скорости; если один привод начинает двигаться быстрее другого, мы его замедляем. Мы можем считывать положение линейного привода через встроенный оптический энкодер. Оптический энкодер - это небольшой пластиковый диск с 10 отверстиями в нем, который подключен к двигателю постоянного тока, так что, когда двигатель вращается, пластиковый диск тоже. Инфракрасный светодиод направлен на пластиковый диск, так что, когда он вращает свет, он либо проходит через отверстия в оптическом диске, либо блокируется пластиком диска. Инфракрасный датчик на другой стороне диска определяет, когда свет проходит через отверстие, и выдает прямоугольный сигнал. Подсчитав количество импульсов, которые обнаруживает приемник, мы можем вычислить как частоту вращения двигателя, так и расстояние, пройденное линейным приводом. Оптический линейный привод 35 фунтов имеет 50 (+/- 5) оптических импульсов на дюйм хода, в то время как приводы 200 фунтов и 400 фунтов имеют 100 (+/- 5) импульсов на дюйм. Сравнивая, насколько далеко выдвинулся каждый линейный привод, мы можем пропорционально регулировать скорость двух приводов, чтобы они всегда оставались одинаковой длины при выдвижении.

Необходимые компоненты

Схема подключения

Синхронное управление двумя оптическими линейными приводами с помощью Arduino

Выполните указанные выше электрические соединения. Всегда проверяйте цвета проводов, выходящих из линейного привода, так как условные обозначения окраски могут отличаться от показанных на приведенной выше диаграмме. Будьте осторожны, чтобы не пропустить 3 кнопки мгновенного действия, подключенные между цифровыми контактами 7, 8, 9 и GND.

    Краткое руководство

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

    • Выполните подключения, как показано на электрической схеме.
    • Загрузите и запустите первую программу ниже.
    • Скопируйте два значения, выведенные этой программой, в строку 23 второй программы ниже.
    • Загрузите и запустите вторую программу.
    • Настройте свою систему, варьируя переменную K_p (строка 37, вторая программа). Это проще всего сделать, подключив потенциометр к аналоговому выводу A0 и изменив код для чтения потенциометра и используя функцию map (): K_p = map (analogRead (A0), 0, 1023, 0, 20000);

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

    Обзор программы калибровки

    Прежде чем можно будет добиться синхронного управления, мы должны сначала откалибровать систему. Это включает в себя подсчет количества импульсов на цикл срабатывания, поскольку, как указано в технических характеристиках продукта, существует допуск (+/- 5) импульсов на дюйм хода. Загрузите и запустите программу ниже. Эта программа полностью втянет приводы (строка 53) и установит переменную счетчика оптических импульсов на ноль, после чего она полностью выдвинется и полностью втянется (строки 63 и 74, соответственно). Во время этого цикла срабатывания количество импульсов будет подсчитано программой обслуживания прерывания (ISR), строки 153 и 166. По завершении цикла срабатывания будет выведено среднее количество импульсов, строка 88, запишите эти значения на будущее.

    https://gist.github.com/Will-Firgelli/89978da2585a747ef5ff988b2fa53904

    Обзор синхронной программы

    Перед загрузкой программы синхронного управления необходимо сначала скопировать значения, выдаваемые программой калибровки, в строку 23 и заменить текущий массив: {908, 906} своими собственными значениями. Кроме того, если вы используете линейный привод 35 фунтов, вам нужно будет изменить значение переменной в строке 29 с 20 миллисекунд на 8 миллисекунд.

    После полного втягивания один раз (для определения исходной точки) вы можете перемещать оба поступательных привода синхронно, нажав три кнопки, соответствующие командам выдвижения, втягивания и останова. Приводы будут оставаться синхронными даже при неравномерной нагрузке, сравнивая свои относительные счетчики импульсов и регулируя скорость между ними, чтобы всегда оставаться синхронными. Имейте в виду, что текущая программа реализует простой пропорциональный контроллер, линия 93, как таковая, подвержена перерегулированию и колебаниям вокруг равновесия. Вы можете настроить это, изменяя переменную K_p, определенную в строке 37.Это проще всего сделать, подключив потенциометр к аналоговому выводу A0 и изменив код для чтения потенциометра и используя функцию map (): K_p = map (analogRead (A0), 0, 1023, 0, 20000);

    Для достижения наилучших результатов мы настоятельно рекомендуем удалить пропорциональный контроллер и реализовать контур ПИД-регулирования; однако это выходит за рамки этого вводного руководства и намеренно опущено.

    https://gist.github.com/Will-Firgelli/44a14a4f3cac3209164efe8abe3285b6

    Использование приводов Bullet 36 и Bullet 50 в синхронном режиме

    В дополнение к линейному приводу серии Optical мы также предлагаем два линейных привода со встроенными энкодерами: Bullet 36 Cal. и Bullet 50 Cal, оба из которых имеют внутренний квадратурный энкодер на эффекте Холла. Энкодер на эффекте Холла работает по тому же принципу, что и оптический энкодер, но вместо света он использует магнетизм. Кроме того, будучи квадратурным энкодером, он имеет два сигнальных выхода, каждый смещен по фазе на 90 градусов. Таким образом, вам необходимо использовать плату Arduino с 4 или более контактами прерывания (Arduino Uno имеет только два) и изменить код для обработки ввода от двух сигналов на привод. Кроме того, переменную времени устранения дребезга falsepulseDelay необходимо настроить вместе с K_p.

    Советы по написанию собственной программы

    Более двух линейных приводов

    При использовании двух или более линейных приводов Arduino Uno больше не будет работать, поскольку у него есть только два доступных контакта прерывания. Вам нужно будет использовать плату Arduino с соответствующим количеством доступных контактов прерывания, дополнительная информация: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

    Во-вторых, в интересах эффективности рекомендуется векторизовать ваше программирование с использованием массивов и циклов for () для итерации по каждому актуатору.

    Debouncing

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

    Обработка переворачивания

    Если вы изменяете код, помните об опрокидывании при работе с функцией millis (). И millis (), и массив lastDebounceTime объявлены как длинные переменные без знака, что означает, что они могут хранить значения до 4 294 967 295 (32 ^ 2-1). Это соответствует примерно 49,7 дням пролонгации. Текущая программа предназначена для обработки опрокидывания в функциях ISR (процедура обслуживания прерывания): count_0 и count_1, однако, если вы измените эту программу, убедитесь, что правильно обработали переменную опрокидывания, иначе ваша программа выйдет из строя после ~ 49,7 дней непрерывного использования. Для получения дополнительной информации см .: https://www.norwegiancreations.com/2018/10/arduino-tutorial-avoiding-the-overflow-issue-when-using-millis-and-micros/

     

    Share This Article
    Tags: