Уроки Ардуино для начинающих

Уроки Ардуино

Блог технической поддержки моих разработок

В уроке разработаем драйвер шагового двигателя с управлением от компьютера. Я расскажу о текстовом протоколе обмена данными с использованием AT команд. Научимся управлять двигателем через монитор последовательного порта Arduino IDE и с помощью программы верхнего уровня StepMotor.

Я поставил задачу разработать интеллектуальный драйвер шагового двигателя на базе платы Ардуино. Драйвер должен позволять управлять двигателем от компьютера через стандартный кабель подключения платы Ардуино или через любой другой последовательный порт.

Функциональные возможности устройства определяются библиотекой StepMotor из урока 29.

Аппаратная часть драйвера.

Для подключения униполярного двигателя к плате Ардуино я использовал схему из Урока 28.

Но можно применить любую другую схему для униполярного или биполярного шаговых двигателей.

Я подключил достаточно мощный двигатель FL57STH76-1006. У него 400 шагов на полный оборот, ток фазы 1 А.

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

Обмен данными между платой Ардуино и компьютером.

Разработка программной части драйвера сводится к получению данных от компьютера и вызове функций библиотеки StepMotor из Урока 29. Работу с библиотекой StepMotor мы подробно разбирали в этом уроке. А вот полноценным обменом данными с компьютером мы еще не занимались.

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

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

Протоколы бывают текстовыми и числовыми. Например, число ”231” в текстовом протоколе будет передано как 3 байта с кодами символов ”2”,”3” и ”1”. А в числовом протоколе для передачи этого же числа достаточно передать один байт с двоичным кодом 231. Из этого примера видно главное достоинство числовых протоколов – для передачи одинакового объема информации требуется значительно меньше передаваемых данных.

Но у текстовых протоколов есть свое преимущество, благодаря которому они применяются чаще, чем числовые. Это возможность контроля, отладки их стандартными средствами – текстовыми терминалами. Когда мы отлаживали программы на Ардуино с помощью последовательного порта, мы посылали данные на компьютер в текстовом формате. Запускали монитор последовательного порта и видели на экране компьютера напряжение, или температуру, или какое-нибудь другое данное в понятном нам виде. Но ведь мы могли послать данные в двоичном коде командой Serial.write(byte). Данных было бы значительно меньше, но для их расшифровки пришлось бы использовать специальную программу, которая понимает, что это за данные и как их интерпретировать.

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

Текстовый протокол обмена через AT команды.

AT команды это простой текстовый протокол обмена данными, в котором каждая команда начинается символами “AT”. Далее следуют параметры и коды также в текстовом виде.

Последовательность символов “AT” происходит от английского “Attention” (внимание) и означает, что пришла новая команда. Стандартным ответом AT протокола является последовательность “OK” (все нормально).

AT команды широко используются для обмена данными с модемами, в том числе и с модулями GSM, с модулями WiFi, GPS и многими другими устройствами. Мы вернемся к AT командам в уроках о беспроводных технологиях связи.

AT команды драйвера шагового двигателя.

Разработаем наш протокол обмена.

Какие команды нам нужны? Если мы используем библиотеку StepMotor, то нам нужны команды для каждой функции библиотеки:

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

К командам соответствующим методам библиотеки добавлена команда проверки обмена. Надо иметь возможность узнать, включен ли драйвер.

Общий формат команды выглядит так:

  • Каждая команда должна начинаться с ”AT”.
  • Далее следует последовательность символов – кодов, чисел, параметров.
  • Заканчивать команду принято управляющими символами ”
    ” (возврат каретки, код 13) и ”
    ” (перевод строки, код 10). Об этих символах написано в предыдущем уроке. Монитор последовательного порта автоматически добавляет ”
    ” к любым данным. Т.е. когда Вы набираете в мониторе ”AT” и нажимаете клавишу “Enter”, то монитор передает 4 символа ”AT
    ”.
  • В ответе используется последовательность ”OK
    ”. Благодаря управляющим символам каждый ответ в окне монитора последовательного порта будет печататься с новой строки.
Читайте также:  Джили МК замена масла в МКПП

Используя эти правила, я выбрал для драйвера следующие форматы AT команд.

  • 0 – шаговый режим;
  • 1 – полу шаговый режим;
  • 2 – между шаговый режим.
  • 0 – без фиксации двигателя при остановке;
  • 1 – фиксация ротора остановленного двигателя.

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

Еще в протоколе отсутствует защита целостности данных контрольными кодами. Но AT команды, как правило, используются для устройств, расположенных вблизи друг от друга и в контрольных кодах нет необходимости. К тому же наличие контрольных сумм сведет на нет главное достоинство текстового протокола – возможность управления с любого текстового терминала. Не будете же Вы рассчитывать контрольные коды вручную.

Реализация резидентной программы драйвера.

Программу можете загрузить по этой ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Должны быть установлены библиотеки TimerOne.h и StepMotor.h. Обе библиотеки есть в Уроке 29. Как установить написано в Уроке 9.

О работе с библиотекой StepMotor я подробно писал в уроке 29. Остается пояснить блок обмена данными с компьютером.

В цикле loop() расположен программный блок выделения команды.

// обмен с компьютером
letterNum= Serial.available(); // чтение числа принятых символов

if ( letterNum == 0 ) <
// данных нет
timeOutCount= 0;
>
else <
// есть данные
if ( letterNum != prevDataNum ) timeOutCount= 0; // новое данное
prevDataNum= letterNum; // перегрузка числа принятых символов
>

if ( timeOutCount > TIME_OUT ) <
// пауза между данными больше тайм-аута

// команда принята, расшифровка

Блок работает по следующему алгоритму:

  • Определяет, поступило ли в порт новое данное.
  • Если данное пришло, то сбрасывает счетчик времени timeOutCount.
  • Если счетчик времени timeOutCount превысил значение TIME_OUT, т.е. данные перестали поступать, то определяет, что команда принята и переходит к расшифровке команды.

По сути, блок выделяет паузы между символами более 30 мс (TIME_OUT). Затем символы считываются из буфера последовательного порта и расшифровываются.

Обратите внимание, что программа драйвера не подвешивает программу. В цикле loop() можно еще выполнять другие задачи параллельно.

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

Проверка работы драйвера.

Загружаем скетч в плату, запускаем монитор последовательного порта Arduino IDE. Проверяем команды. Я указываю параметры для моего двигателя (400 шагов на оборот).

Отправляем Получаем Действие
AT OK Проверка обмена
ATD=20 OK Устанавливаем скорость
ATS=400 OK Сделать оборот против часовой стрелки
ATS=-400 OK Сделать оборот по часовой стрелке
ATS=1 OK Сделать шаг против часовой стрелки
ATS=-1 OK Сделать шаг по часовой стрелки
ATM=1,0 OK Установить полу шаговый режим
ATS=800 OK Сделать оборот против часовой стрелки
ATS=-800 OK Сделать оборот против часовой стрелки
ATS=30000 OK Вращение против часовой срелки
ATR? 3772OK Чтение оставшихся шагов
ATR? 3410OK Чтение оставшихся шагов
ATR? 3052OK Чтение оставшихся шагов
ATS=0 OK Остановка

Как видите, управлять двигателем можно с помощью стандартной программы – монитора последовательного порта. Существует много подобных мониторов, терминалов, с помощью которых можно подавать команды. Только надо установить скорость 9600 и режим добавления в конце команды управляющих символов “возврат каретки”, “перевод строки”. В мониторе последовательного порта режим выбирается справа в низу окна и называется ”NL & CR”.

Программа верхнего уровня StepMotor для управления шаговым двигателем.

Я написал простенькую программу для управления от компьютера шаговым двигателем через драйвер на плате Ардуино. Программа поддерживает все доступные режимы.

Загрузить программу можно по этой ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Подключение, первый запуск, выбор порта происходит так же, как в программе Thermometer из Урока 24. Скажу только, что для начала удобнее использовать виртуальный порт, который формирует драйвер платы Ардуино при подключении платы к компьютеру. Запускать Arduino IDE необязательно. При первом включении в программе StepMotor необходимо выбрать номер порта. Программа запомнит его и будет использовать при последующих запусках.

Основное окно программы выглядит так.

Панель ”Шаги” позволяет инициировать вращение двигателя на заданное число шагов. Шаги задаются ползунком или в редактируемом окошке и отсылаются в драйвер кнопкой ”—>” справа от панели.

С помощью панели ”Скорость” задается значение делителя коммутации шагов, а значит и скорость вращения. Загружается в драйвер кнопкой ”—>” справа от панели.

Читайте также:  Обзор китайских минивэнов и микроавтобусов, цены в России, фото, технические характеристики, видео

Панель ”Режим” позволяет задать режим коммутации фаз и выбрать режим остановки двигателя.

Надо помнить, что параметры, заданные в этих трех панелях посылаются в драйвер при нажатии кнопок ”—>” справа от соответствующих панелей.

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

В панели ”Драйвер” :

  • Отображается число оставшихся шагов. Этот параметр постоянно, в цикле считывается из драйвера.
  • Кнопка ”Стоп” останавливает двигатель в любом режиме.
  • Кнопка ” >” запускает двигатель в режиме непрерывного вращения по часовой стрелке.
  • Кнопка ”+1 шаг” заставляет двигатель сделать один шаг против часовой стрелки.
  • Кнопка ”-1 шаг” заставляет двигатель сделать один шаг по часовой стрелке.
  • Светодиод “Обмен” индицирует состояние связи. Красный цвет означает ошибку, зеленый – нормальную работу.

Программа позволяет легко проверить работу драйвера во всех режимах. Но главная цель – показать принцип управления контроллером Ардуино от компьютера по протоколу AT команд. Мы будем использовать эту программу в последующих уроках о подключении к Ардуино биполярного двигателя и драйвера на основе модуля TB6560-V2.

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

Подключение шагового двигателя к Ардуино

Шаговый двигатель Arduino ► предназначен для перемещения объекта на заданное количество шагов вала. Рассмотрим устройство и схему подключения шагового двигателя.

Шаговый двигатель (stepper motor) предназначен для точного позиционирования или перемещения объекта на заданное количество шагов вала. Плата Arduino может управлять шаговым двигателем с помощью драйвера и библиотеки stepper.h или accelstepper.h. Рассмотрим принцип работы и схему подключения шагового двигателя к Arduino Uno / Nano, а также разберем скетч для управления шаговым мотором.

Принцип работы шагового двигателя

В зависимости от конструкции, сегодня применяются три вида шаговых двигателей: с постоянным магнитом, с переменным магнитным сопротивлением и гибридные двигатели. У двигателей с постоянным магнитом число шагов на один оборот вала доходит до 48, то есть один шаг соответствует повороту вала на 7,5°. Гибридные двигатели обеспечивают не меньше 400 шагов на один оборот (угол шага 0,9°).

Фото. Устройство шагового мотора в разрезе

Подсчитав количество сделанных шагов, можно определить точный угол поворота ротора. Таким образом, шаговый двигатель является сегодня идеальным приводом в 3D принтерах, станках с ЧПУ и в другом промышленном оборудовании. Это лишь краткий обзор устройства и принципа работы stepper motor, нас больше интересует, как осуществляется управление шаговым двигателем с помощью Ардуино.

Драйвер шагового двигателя Ардуино

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

Фото. Виды драйверов для управления шаговым двигателем

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

Схема подключения шагового двигателя 28BYJ-48 к Arduino Uno через драйвер ULN2003 изображена на рисунке ниже. Основные характеристики мотора 28BYJ-48: питание от 5 или 12 Вольт, 4-х фазный двигатель, угол шага 5,625°. Порты драйвера IN1 — IN4 подключаются к любым цифровым выводам платы Arduino Mega или Nano. Светодиоды на модуле служат для индикации включения катушек двигателя.

Как подключить шаговый двигатель к Ардуино

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • драйвер шагового двигателя ULN2003;
  • шаговый двигатель 28BYJ-48;
  • провода «папа-мама».

Схема подключения шагового двигателя к Arduino UNO

Ардуино для начинающих. Урок 5. Кнопки, ШИМ, функции

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

В этом уроке используются следующие детали:

Большая макетная плата на 1600 точек с 4 шинами питания: Купить
Набор резисторов из 100 штук на все случаи: Купить
Набор светодиодов из 100 штук: Купить
5 штук кнопок в удобной форме: Купить
Соединительные провода 120 штук: Купить
Читайте также:  Циркуляционный насос для отопления 12 В технические особенности, плюсы и минусы

Подключение кнопки к Arduino

Как видите, ничего сложно в подключении кнопки к ардуино нет. Обратите внимание, что кнопка установлена так, что каждый ее контакт подключен к разным линиям макетной платы. Так же вы можете заметить резистор на 10 кОм который притягивает контакт к земле. Это нужно для того, что бы мы на 8 контакте не ловили наводок. Попробуйте убрать этот резистор из схемы. Светодиод будет загораться при шевелении проводов или кнопки. Теперь давайте рассмотрим скетч:

В этом уроке, как и прошлом, в самом начале мы объявляем переменные со значениями пинов к которым у нас подключены кнопка и светодиод. Далее в функции setup() мы обозначаем какой пин используется как вход, а какой как выход. В функции loop() мы используем условный оператор if с оператором сравнения и проверяем приходит ли на пин 8 высокий сигнал. Если да то включаем светодиод, если нет то выключаем. Описание функций и операторов вы найдете в справочнике по языку программирования Arduino

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

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

Понравилось? Давайте еще больше усложним наш проект. Теперь мы будем управлять яркостью светодиода. Для этого нам надо немного изменить схему нашего устройства. Для управления яркостью мы будем использовать ШИМ. Значит нам надо подключить светодиод к выходу, который может выдавать ШИМ. Теперь наша схема будет выглядеть вот так:

Подключение светодиода к Arduino

Теперь светодиод подключен к 11 пину ардуино, которой умеет делать ШИМ. И нам пришлось добавить токоограничивающий резистор на 220 Ом перед светодиодом, что бы его не спалить. Это необходимо потому, что светодиоды работают при напряжении 3.3 В, а пин ардуино отдает 5 В. Теперь посмотрим что нужно изменить в скетче:

В этом примере мы изменили значение переменной ledPin на 11. Так же добавили переменную для хранения уровня ШИМ ledLevel. При нажатии на кнопку будем увеличивать эту переменную. Функция debounce() осталась без изменений. В цикле мы теперь используем функцию analogWrite().

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

21 комментариев

Здравствуйте)))
Подскажите пожалуйста новечьку,
Как можно реализовать такой скечь
При нажатии на кнопку светодиод плавно загорается если нажать ещё раз на кнопку то светодиод плавно тухнет…?

Очевидно при нажатии на кнопку в цикле менять значение ledLevel

Денис что такое ledlevel?

//Как можно реализовать такой скечь
//При нажатии на кнопку светодиод плавно загорается если нажать ещё раз на кнопку то светодиод плавно тухнет…?

/*== к примеру, вот так ==*/

// переменные с пинами подключенных устройств
int switchPin = 8;
int ledPin = 11;

// переменные для хранения состояния кнопки и светодиода
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledLevel = 0;

// настройка изменения яркости
int deltaLevel = 5; // Шаг изменения яркости
int sign = 1; // Знак шага
int step_delay = 100; // задержка в шаге изменения яркости светодиода

// настройка сигнализатора окончания изменения яркости
int max_blink = 3; //число морганий светодиода на pin13 (LED_BUILTIN)
int blink_delay = 500; //задержка состояния светодиода на pin13 (LED_BUILTIN)

void setup()
<
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);// потушим светодиод на pin13 (LED_BUILTIN)
>

// функция для подавления дребезга
boolean debounse(boolean last)
<
boolean current = digitalRead(switchPin);
if(last != current)
<
delay(5);
current = digitalRead(switchPin);
>
return current;
>

// При нажатии на кнопку, светодиод медленно увеличивает яркость
// При повторном нажатии на кнопку, светодиод медленно гаснет
void loop()
<
currentButton = debounse(lastButton);
if(lastButton == LOW && currentButton == HIGH)
<
if(ledLevel == 0) sign = 1;
if(ledLevel == 255) sign = -1;
for(int i = 0; i 255) ledLevel = 255;
if(ledLevel
Света 2018-03-12 12:18:59

МУЖЧИНЫ кто согласится написать скетч за вознаграждение,к примеру на телефон.

Здравствуйте. Какой именно скетч вам нужен?

Ссылка на основную публикацию
Универсальный пульт для автомагнитолы на руль адаптер кнопок, управления нештатной, как подключить,
Подключение кнопок на руле к нештатной магнитоле Штатная магнитола, которая устанавливается автопроизводителем на заводе, не всегда отвечает запросам владельца автомобиля....
Удаление вмятин без покраски в ВАО, ремонт и выпрямление вмятин; цены от 500 рублей Garage-style
Самостоятельное удаление вмятин без покраски автомобиля Практически каждому автолюбителю приходилось попадать в такие ситуации, когда на машине появляются незначительные вмятины,...
Удаление вмятин без покраски своими руками
Удаление вмятин без покраски своими руками видео; Все о Лада Гранта Для существования нашего сайта необходим показ рекламы. Просим отнестись...
Универсальный съемник подшипников своими руками как сделать для снятия со ступицы или генератора и д
Универсальный съемник ступичных подшипников своими руками Систематическое передвижение по неровному дорожному покрытию приводит к преждевременному выходу из строя ходовой части...
Adblock detector