Работа с энкодером на основе программы Arduino

XIX Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

Работа с энкодером на основе программы Arduino

Слепнев Д.Н. 1
1МБОУ Лесногородская СОШ
Черникова И.С. 1
1МБОУ Лесногородская СОШ
Автор работы награжден дипломом победителя I степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

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

Предмет исследования – плата ArduinoNano, программное обеспечение, модуль поворотного энкодера.

Целью данного проекта является собрать макет модуляэнкодера и провести комплексное исследование модуля поворотного энкодера, разработать программу управления на базе Arduino.

Задачи:

  • изучить принцип работы модуля поворотного энкодера;

  • исследовать особенности аппаратного и программного обеспеченияArduinoNano.

Методы исследования: анализ литературы по заданной теме, моделирование управления энкодером, формализация.

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

1.1 Инкрементальный энкодер

Э
нкодер
 (от англ. encode – преобразовывать) – это устройство для преобразования угловых положений или линейных перемещений в цифровой сигнал, т.е. энкодер – это датчик угла или линейного перемещения, соответственно существуют крутильные и линейные энкодеры. [1.1]

1.1 Пример инкрементального энкодера

Принцип работы энкодера заключается в преобразовании механического перемещения в электрические сигналы, у обычного инкрементального энкодера, который будет рассматриваться в данном проекте, этот сигнал представляет собой два прямоугольных импульса (при равномерном вращении), сдвинутых по фазе на 90 градусов. Сигналы с этих двух каналов позволяют определить направление вращения энкодера и величину углового перемещения. Направление вращения определяется опережением или отставанием импульсов одного из каналов относительно второго канала. Величина перемещения определяется по количеству импульсов на этих двух каналах.  [1.2]

1.2 Сигнал, снятый с энкодера

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

1.2 Преимущества и недостатки инкрементального энкодера

К плюсам можно отнести:

  • Дешевизну и простоту в монтаже и применении.

  • Минимальное количество ошибок во время подсчета импульсов, либо полное их отсутствие.

  • Универсальность использования.

  • Возможность определения направления вращения замеряемого объекта.

К недостаткам можно отнести:

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

  • Наличие некоторых ограничений в плане обеспечения разрешающей способности – при повышении степени точности определения потребуется увеличивать и число рабочих каналов.

  • Необходимость преобразования двоичного кода Грея в некоторых типах датчиков.

2.1 Программно-аппаратное обеспечение ArduinoNano

Arduino — торговая марка аппаратно-программных средств для построения и прототипирования простых систем, моделей и экспериментов в области электроники, автоматики, автоматизации процессов и робототехники.

Программная часть состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем, так и сторонними производителями. Полностью открытая архитектура системы позволяет свободно копировать[2] или дополнять линейку продукции Arduino.

2.2 Плата ArduinoNano

ArduinoNano [2.1] - это функциональный аналог ArduinoUno, но размещённый на миниатюрной плате.
Отличие заключается в отсутствии собственного гнезда для внешнего питания, использованием чипа FTDI FT232RL для USB-Serial преобразования и применением mini-USB кабеля для взаимодействия вместо стандартного.
Платформа имеет штырьковые контакты, что позволяет легко устанавливать её на breadboard. Используйте ArduinoNano там, где важна компактность, а возможностей Arduino Mini недостаточно.

2.1 Пример плата ArduinoNano

Характеристики:
- Микроконтроллер: ATmega328;
- Тактовая частота: 16 МГц;
- Напряжение логических уровней: 5 В;
- Входное напряжение питания: 7 - 12 В
- Портов ввода-вывода общего назначения: 22;
- Портов с поддержкой ШИМ: 6;
- Портов, подключённых к АЦП: 8;
- Flash-память: 32 КБ;
- Габариты: 18×45 мм.

2.3 Сильные и слабые стороны ArduinoNano.

К плюсам можно отнести:

  • Цена. ArduinoNano возможно купить по относительно низкой цене (200 ~ 300 руб.).

  • Кроссплатформенность. Программное обеспечение Arduino осуществляет работу на большинстве известных программ Windows, Macintosh OS X, Linux, являясь открытым приложением, работающим на Java.

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

  • Открытые спецификации и схемы оборудования. Arduino основан на микроконтроллерах Atmel ATMEGA8 и ATMEGA168. Схемы модулей публикуются под лицензией Creative Commons, из-за этого опытные схемотехники могут создавать свои собственные версии модуля.

К минусам можно отнести:

  • Частота. Достаточно низкая частота имеющегося процессора.

  • Память. Малое количество флэш-памяти для создания программ.

3 Необходимые комплектующие.

  1. Плата ArduinoNano

  2. Программная среда Arduino и лаборатория

  3. Энкодер с RC-фильтром

  4. Программная среда QT Creator

  5. Мотор-редуктор с колесом.

  6. Дополнительные файлы для синхронной работы программ, написанных на QTCreatorи ArduinoIDE

Сборка макета:

Соединим энкодер с мотором при помощи изогнутой металлической пластины и термотрубки. Далее при помощи соединительных проводов подключим энкодер к плате ArduinoNano как показано на рисунке 3, по которым будет осуществляться передача данных. Сама плата ArduinoUno подключается через USB провод к одному из портов персонального компьютера для обмена данными с помощью программ, написанными в QT Creator и программной среде Arduino.

 

3 Пример плата ArduinoNano

4 Программная часть проекта

Для работы с платой Arduino и передачи с неё данных используется программа, написанная в программной среде Arduino, которая выглядит следующим образом:

float s = 0;

float s1 = 0;

float v = 0;

volatile int counter = 0; // счётчик

volatile bool encFlag = 0; // флагповорота

void setup() {

Serial.begin(9600);

attachInterrupt(0, encIsr, CHANGE);

attachInterrupt(1, encIsr, CHANGE);

}

void loop() {

s1=s;

s = (counter*6.8 *3.14 / 20);

v = (s - s1) * 10;

Serial.println(v);

delay(100);

}

volatile byte reset = 0, last = 0;

void encIsr() {

byte state = (PIND & 0b1100) >> 2;

if (reset && state == 0b11) {

int prevCount = counter;

if (last == 0b10) counter--;

else if (last == 0b01) counter++;

if (prevCount != counter) encFlag = 1;

reset = 0;

}

if (!state) reset = 1;

last = state;

}

Данная программа считывает сигналы с энкодера и определяет направление его поворота, после чего рассчитывает и выводить текущую скорость колеса.

Комментарии к программе:

float s = 0;- пройденное расстояние за все время

float s1; - пройденное расстояние за 0.1 секунду до настоящего времени

float v = 0;- расчётная скорость колеса

volatileintcounter = 0; - счётчиктиковэнкодера

volatileboolencFlag = 0; - флаг поворота

voidsetup() {} – Функция, которая вызывается только один раз, когда стартует скетч программы. Используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д.
В функции setup() задаются:

Serial.begin(9600); - Функция, задающая в скобках скорость обмена данными через последовательный порт.

attachInterrupt(0, encIsr, CHANGE);

attachInterrupt(1, encIsr, CHANGE);- Задает функцию обработки внешнего прерывания, то есть функция, которая будет вызвана по внешнему прерыванию.attachInterrupt (pin, function, mode), гдеpin - номер цифрового порта; function - функция, вызываемая прерыванием; mode - задает режим обработки прерывания, в данном случае это CHANGE - функция прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот.

voidloop() {} – Функция, в которой введённые команды будут выполняться последовательно всё время (циклично), пока включена плата Arduino.
В функции loop() задаются:

s1=s; - считывание пройдённого расстояния за 0.1 секунду до настоящего времени

s = (counter*6.8 *3.14 / 20); - вычисление пройдённого расстояния за все время

v = (s - s1) * 10; - расчет скорости в секунду

Serial.println(v); - выводим значение скорости в поток

delay(100); - обновляем цикл с периодичностью в 0.1 секунду

voidencIsr() – функция определяет состояние каналов энкодера и, в случае их изменения, определяет тип поворота, после чего возвращает значения каналов в исходные

Для работы с платой Arduino на компьютере через консоль используется программа, написанная в программной среде QT Creator, которая выглядит следующим образом:

#include<serial.h>

#include<iostream>

usingnamespacestd;

intmain()

{

constchar*device="\\\\.\\COM3";

uint32_tbaud_rate=9600;

Serialserial_port;

if(!serial_port.open(device,baud_rate)){

cout<<"Error"<<endl;

return1;

}

do{

stringreceived;

received=serial_port.read_line();

floatrec_float=stof(received);

cout<<"Speedis"<<rec_float<<"cmpersecond"<<endl;

}

while(true);

return(0);

}

Данная программа связывается с последовательным портом, к которому подключена плата ArduinoUno, получает из него значения типа string и преобразует их в вещественное число, после чего выводит его в консоль пользователя.

Для корректной работы в программе QT Creator необходимо установить доп. файлы.

Комментарии к программе:

#include<serial.h>
#
include<iostream>
#
include<unistd.h> - Используемыебиблиотекив проекте для работы с консолью и передачи данных.

usingnamespacestd; - Используемое пространство имён.

intmain(){} – Тело программы, в котором выполняются:

constchar *device = "\\\\.\\COM5"; - Указание соответствующего порта, к которому подключена плата Arduino.

uint32_tbaud_rate = 9600; - Параметр скорости работы с портом.

Serialserial_port; - СозданиеобъектаSerial.

if(!serial_port.open(device,baud_rate)) {
cout<<"Error"<<endl;
return 1;} - Данныйусловныйоператорвыводитнадписьошибки, еслиподкючениекпортуоказалосьнеудачным.

do {} while (True) – Цикл, который будет выполняться бесконечно и в теле которого происходят основные действия, а именно:

stringreceived; - создаем переменную для хранения полученных с порта данных

received = serial_port.read_line(); - передаем ей значение из порта

floatrec_float = stof(received); - преобразуем полученное значение в вещественное число

cout<<"Speedis "<<rec_float<<" cmpersecond"<<endl; - Выводзначениявконсольпользователю.

Заключение

Энкодер – это электронный датчик, который крепится на какой-либо вращающейся детали. Он позволяет с необходимой точностью измерять разные параметры: скорость вращения, расстояние (длину), направление вращения, угловые положения по отношению к нулевой метке. Энкодер является датчиком обратной связи, на выходе которого цифровой сигнал меняется в зависимости от его вращения или от угла его поворота. Этот сигнал обрабатывается в счетчике или контроллере, который выдает команды на устройство индикации или привод. Было проведено комплексное исследование особенностей энкодера, программного и аппаратного обеспечения Arduino. Выявлены положительные характеристики. Проведена сборка макета .Энкодер соединили с мотором при помощи изогнутой металлической пластины и термотрубки. Далее при помощи соединительных проводов подключили энкодер к плате ArduinoNano , по которым будет осуществляться передача данных. Сама плата ArduinoUno подключается через USB провод к одному из портов персонального компьютера для обмена данными с помощью программ, написанными в QT Creator и программной среде Arduino.Для работы с платой Arduino и передачи с неё данных разработана программа, написанная в программной среде Arduino. Данная программа считывает сигналы с энкодера и определяет направление его поворота, после чего рассчитывает и выводить текущую скорость колеса.

Для работы с платой Arduino на компьютере через консоль используется программа, написанная в программной среде QT Creator.

Данная программа связывается с последовательным портом, к которому подключена плата ArduinoUno, получает из него значения типа string и преобразует их в вещественное число, после чего выводит его в консоль пользователя.

Для корректной работы в программе QT Creator необходимо установить доп. файлы.

Используемая литература

  1. https://tehprivod.su/poleznaya-informatsiya/naznachenie-i-vidy-enkoderov.html

  2. https://innodrive.ru/articles/inkrementalnyj-ehnkoder/

  3. https://arduino.ru/Hardware/ArduinoBoardNano

  4. https://alexgyver.ru/encoder/

Просмотров работы: 248