Руководство по работе с программой-библиотекой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 ЧАСТИ.





