6

Руководство по работе с программой-библиотекойArduino-SMD

Добрый день, уважаемые коллеги,


Хотелось бы предложить вашему вниманию наш опыт написания кода для драйвера шагового двигателя типа SMD и SMD-mini отечественного производства.


Это руководство ни в коем случае не является единственно верным мнением, но вполне работоспособно и эффективно. Руководство и сам код написаны "на коленке" в 2016 году и с тех пор не подвергалось редактированию.


Будем рады вашей обратной связи.

Общая информация:

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

Данное пособие включает в себя основные принципы и примеры взаимодействия контроллерной платы Arduino и драйверов шагового двигателя SMD, производства НПФ «Электропривод».

Используемые устройства:

1. Arduino UNO R3 – контроллер;

2. Arduino IDE - среда разработки;

3. SMD2.8mini - драйвер шагового двигателя;

4. FL57STH76-2804А – шаговый двигатель;

5. Источник питания 250Вт, 24В;

6. Текстовый экран 16×2;

7. Плата интегрирования текстового экрана в интерфейс I2C;

8. Тактовая кнопка на блок;

9. Светодиодный индикатор на блок.

Установка Arduino IDE:

1. Для того, что бы скачать Arduino IDE - необходимо зайти на официальный сайт arduino.cc, в разделе Download скачать актуальную версию программы под свою ОС.

2. Установить программу на компьютер.

Краткий принцип работы в Arduino IDE:

После запуска Arduino IDE в открытом окне (рис.1) появится шаблонный код в котором прописано 2 раздела: setup и loop.

В разделе void setup ( ) внутри фигурных скобок прописываются параметры выводов (настройка на считывание или выведение информации), различные формулы и по необходимости установочное состояние выводов контроллера.

В разделе void loop ( ) в фигурных скобках находится весь бесконечный цикл программы управления двигателем.

Над разделом void setup ( ) прописывают глобальные переменные, подключают библиотеки, объявляют директивы, а так же присваивают переменные (имена) выводам контроллера.

С более подробной информацией о программировании в данной среде можно найти на официальном русскоязычном сайте arduino.ru

Принцип подключения устройств к Arduino UNO приведен на рис.2. Более подробные схемы и описания находятся в соответствующих разделах данного руководства.

1. Подключение SMD к Arduino UNO:

Для подключения драйвера SMD любых конфигураций к контроллеру Arduino UNO используется всего 2 сигнальных вывода STEP + и DIR +. Выводы STEP - и DIR – объединяются между собой и подключаются к «общему проводу» рис.3.

При этом направление вращения определяется уровнем сигнала DIR+.

По переднему фронту сигнала «STEP+» вал делает один шаг соответствующий дроблению установленному на драйвере.

В представленной НПФ «Электропривод» программе реализована возможность подключения одновременно трех ШД. Фактически двигателей может быть подключено до шести. В программе Arduino-SMD номера выводов трех ШД определены как:

int stepPin_1 = 2;//шаг по оси Х

int dirPin_1 = 3;//направление по оси Х

int stepPin_2 = 4;//шаг по оси Y

int dirPin_2 = 5;//направление по оси Y

int stepPin_3 = 6;//шаг по оси Z

int dirPin_3 = 7;//направление по оси Z

При этом цифра после знака «=» означает номер цифрового вывода контроллера.

Простейшая программа управления ШД будет выглядеть примерно так:

int stepPin_1 = 2;//шаг по оси Х

int dirPin_1 = 3;//направление по оси Х

int Del; // переменная длительности импульса STEP

int zaderzhka;//переменная определяющая скорость вращения ШД


void setup()

{

pinMode(stepPin_1, OUTPUT);//настройка вывода на выход

pinMode(dirPin_1, OUTPUT);//настройка вывода на выход

Del = 5;// значение переменной равно 5мкс

zaderzhka = 50;// значение переменной равно 50мкс

digitalWrite(dirPin_1, HIGH);// направление вращения

}


void loop()

{

digitalWrite(stepPin_1, HIGH);

delayMicroseconds(Del);

digitalWrite(stepPin_1, LOW);

delayMicroseconds(zaderzhka);

}

По данной программе ШД будет непрерывно вращаться со скоростью порядка 350-400об/мин при дроблении 1/16. Для изменения направления вращения понадобится в разделе SETUP изменить digitalWrite(dirPin_1, HIGH); на digitalWrite(dirPin_1, LOW);

Таким образом, добавив в глобальном разделе переменные с привязкой к цифровым выводам мы имеем возможность управления сразу несколькими двигателям, а манипулируя значением переменной zaderzhka – можно изменять скорость вращения.

Добавив всевозможные циклы и поместив в них строки формирования управляющих импульсов – можно добиться перемещения вала на заданное число градусов.


2. Подключение и принцип работы с кнопкой

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

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

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

int buttonPin = 8;// кнопка на 8 выводе

int stepPin_1 = 2;//шаг по оси Х

int dirPin_1 = 3;//направление по оси Х

int Del; // переменная длительности импульса STEP

int zaderzhka;//переменная определяющая скорость вращения ШД


void setup()

{

pinMode(stepPin_1, OUTPUT);//настройка вывода на выход

pinMode(dirPin_1, OUTPUT);//настройка вывода на выход

Del = 5;// значение переменной равно 5

zaderzhka = 50;// значение переменной равно 50

}


void loop()

{

digitalWrite(dirPin_1, HIGH);// направление вращения

if (digitalRead(buttonPin) == HIGH)

{

for(int i=0; i < 32000; i++)

{

digitalWrite(stepPin_1, HIGH);

delayMicroseconds(Del);

digitalWrite(stepPin_1, LOW);

delayMicroseconds(zaderzhka);

}

}

delay(200);

}

В данной программе – каждые 200мс опрашивается состояние кнопки (buttonPin). Если оно равно «HIGH», то выполняется программа, по которой двигатель отрабатывает 32000 шагов со скоростью примерно 400об/мин, или 10 полных оборотов при дроблении 1/16.

Стандартный шаг двигателя равен 1,8°. Рассчитать число шагов для отработки необходимого кол-ва оборотов достаточно просто. Для этого дробление шага умножаем на число шагов при полно-шаговом режиме и умножаем на число оборотов.

Число шагов = 16*200*10

В приведенном выше примере указан расчет числа шагов для 10 полных оборотов при дроблении 1/16.

В бесконечном цикле в строке:

digitalWrite(dirPin_1, HIGH);

изменяя HIGH на LOW – меняем направление вращения двигателя.

3. Подключение и принцип работы с ЖК экраном 1202 I2C и прочей визуальной индикацией.

3.1 Индикация с применением светодиода

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

Для этого нужно в «глобальном разделе» создать еще одну переменную с привязкой к цифровому выводу. Затем в «разделе установок» настроить его на вывод информации. Ну и собственно в «бесконечном цикле» в нужных местах вписать строки включения диода, либо выключения.

Код такой программы будет выглядеть примерно так:

int ledPinG = 0;//светодиод на 0 выводе

int buttonPin = 8;//кнопка на 8 выводе

int stepPin_1 = 2;//шаг по оси Х

int dirPin_1 = 3;//направление по оси Х

int Del; // переменная длительности импульса STEP

int zaderzhka;//переменная определяющая скорость вращения ШД


void setup()

{

pinMode(ledPinG, OUTPUT);

pinMode(stepPin_1, OUTPUT);//настройка вывода на выход

pinMode(dirPin_1, OUTPUT);//настройка вывода на выход

Del = 5;// значение переменной равно 5

zaderzhka = 50;// значение переменной равно 50

}

void loop()

{

if (digitalRead(buttonPin) == HIGH)

{

digitalWrite(ledPinG, HIGH);//вкл

for(int i=0; i < 32000; i++)

{

digitalWrite(stepPin_1, HIGH);

delayMicroseconds(Del);

digitalWrite(stepPin_1, LOW);

delayMicroseconds(zaderzhka);

}

digitalWrite(ledPinG, LOW);//выкл

}

delay(200);

}

В данном коде светодиод подключен к 0 выводу контроллерной платы, кнопка запуска вращения ШД подключена к 8 выводу. По нажатию кнопки загорается светодиод, двигатель делает 10 полных оборотов со скоростью порядка 400об/мин (при дроблении шага 1/16), после этого светодиод гаснет, а двигатель останавливается.

Схема подключения светодиода в приведенном выше примере изображении на рис.6.

3.2 Индикация с применением символьного ЖК экрана1602 I2C

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

Для экономии числа цифровых пинов в устройстве целесообразней применить дополнительный адаптер-интерфейс I2C. В таком случае будет задействовано всего два аналоговых входа A5-SCL, A4-SDA и выводы питания, а цифровые пины для работы с экраном не используются вообще.

После включения питания экрана – производится настройка яркости изображения путем поворота движка потенциометра на I2C интерфейсе. Затем из общего архива необходимо переместить в папку с библиотеками arduino папки «Wire.h» и «LiquidCrystal_I2C.h».После открытия основного окна arduino IDE, в «глобальном разделе» прописываем привязку этих библиотек:

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);


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


#include <Wire.h>//библиотека экрана

#include <LiquidCrystal_I2C.h>//библиотека управления экраном по I2C

LiquidCrystal_I2C lcd(0x27,16,2);//назначение адреса экрана

int ledPinG = 0;

int buttonPin = 8;//кнопка

int stepPin_1 = 2;//шаг по оси Х

int dirPin_1 = 3;//направление по оси Х

int Del; // переменная длительности импульса STEP

int zaderzhka;//переменная определяющая скорость вращения ШД

long x = 0;//переменная отображения кол-ва оборотов оси х


void setup()

{

pinMode(ledPinG, OUTPUT);

pinMode(stepPin_1, OUTPUT);//настройка вывода на выход

pinMode(dirPin_1, OUTPUT);//настройка вывода на выход

Del = 5;// значение переменной равно 5

zaderzhka = 50;// значение переменной равно 50

lcd.begin();//инициализация вывода информации на дисплее

lcd.backlight();//инициализация вывода информации на дисплее

lcd.print(" Electroprivod ");//вывод этого текста на дисплей

lcd.setCursor(0, 1);//перенос курсора на нижнюю строку

lcd.print(" Arduino + SMD ");//вывод этого текста на дисплей

delay(4000);//задержка 4 секунды

lcd.clear();//очистка экрана

LCD_X();

}

void loop()

{

if (digitalRead(buttonPin) == HIGH)

{

digitalWrite(ledPinG, HIGH);//вкл

int l = 32000;

for(int i=0; i < 32000; i++)

{

digitalWrite(stepPin_1, HIGH);

delayMicroseconds(Del);

digitalWrite(stepPin_1, LOW);

delayMicroseconds(zaderzhka);

}

digitalWrite(ledPinG, LOW);//выкл

x = x + l;

l = LOW;

LCD_X();

}

delay(200);

}

void LCD_X()

{

lcd.setCursor(0, 0);

lcd.print("X: ");

lcd.setCursor(2, 0);

lcd.print(x);

lcd.setCursor(0, 1);

lcd.print(" ");

}


Итак, рассмотрим подробнее приведенный выше код.

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

Подключаем библиотеки управления экраном и назначаем адрес на шине I2C.

lcd.begin();//инициализация вывода информации на дисплее

lcd.backlight();//инициализация вывода информации на дисплее

lcd.print(" Electroprivod ");//вывод этого текста на дисплей

lcd.setCursor(0, 1);//перенос курсора на нижнюю строку

lcd.print(" Arduino + SMD ");//вывод этого текста на экран

delay(4000);//задержка 3 секунды

lcd.clear();//очистка дисплея

LCD_X();

Далее инициализируем вывод информации на экран, печатаем на первой строке слово «Electroprivod» с заданными интервалами отмеряемыми пробелами, переносим курсор в нулевой символ второй строки и печатаем «Arduino + SMD» по аналогии с первой строкой. Далее информация отображается в течение 4 секунд, и дисплей очищается, после чего на экране отображается информация из класса под названием LCD_X. Далее в бесконечном цикле, по нажатию кнопки двигатель делает 10 оборотов, останавливается и на экране отображается кол-во отработанных шагов. По следующему нажатию кнопки происходит всё то же самое, но к предыдущему числу шагов прибавляется еще 3200 шагов. Таким образом можно отследить, на сколько, был перемещен объект, который вращает двигатель.


КОНЕЦ 1 ЧАСТИ.

0
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

показать ответы
0
Автор поста оценил этот комментарий

Ясно. Цена на пару порядков выше адекватной.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Если у Вас есть техническая потребность в оборудовании, Вы заказываете расчет и решаете, устраивает ли Вас данная цена.

показать ответы
0
Автор поста оценил этот комментарий

Что за ерунда? Вас спросили сколько стоит, вы предлагаете гуглить. А вот стоимость-то производитель в секрете держит. Или вы позвонить предлагаете? Я почитал, погуглил, цены не нашел. Вы тоже в секрете держите? Трудно написать? Или она неадекватная?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Уважаемые друзья, коллеги! Цена по умолчанию указывается в интернет-магазинах. В промышленно-производственных организациях на своих сайтах цены обычно (обычно!) не указываются, цена предоставляется по запросу вместе с консультациями технических специалистов, т.к. у каждого заказчика свои технические задачи.

показать ответы
0
Автор поста оценил этот комментарий

а цены? как выглядит модуль, размеры? распиновка, как настраивать микрошаг?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

а смысл? тем более в качестве демонстрационного примера?

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

показать ответы
0
Автор поста оценил этот комментарий

Дело в том, что для программирования Ардуино-платформы используется специальная среда программирования Arduino - IDE. Код написан на языке этой среды.

1
Автор поста оценил этот комментарий

Наверное в какое-то сообщество нужно перенести пост?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Возможно)))

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества