Шаговый двигатель на l293 своими руками
Шаговый двигатель и Arduino — основы
Шаговые двигатели представляют из себя нечто среднее между обычным двигателем постоянного тока и серводвигателем.
У них есть возможность точного позиционирования ротора в заданном положении, вращаться в обе стороны, по одному «шагу», но при этом могут и вращаться с заданной частотой.
В этом примере мы рассмотрим управление шаговым двигателем с использованием Arduino и чипа L293D, который можно использовать и для управления двигателями постоянного тока.
Драйвер двигателей — L293D, общее описание
Мотор-шильды на основе микросхем L293 и L298N являются самыми популярными драйверами для управления моторами постоянного тока. На фото выше данная плата позволяет подключить 4 DC мотора (либо 2 шаговых двигателя) и два серводвигателя. Помимо этого ещё на борту платы есть несколько аналоговых входов, что позволяет подключить несколько ультразвуковых датчиков. Это очень удобно.
Почему? Потому что таким образом мы можем завязать независимую логику управления трансмиссией робота чисто на Ардуино. Потом передавать необходимые данные в верхние инстанции по каналам связи. основным целевым мозгом является одноплатный компьютер. Неважно, будет ли это Raspberry Pi, или Orange Pi, или Banana Pi.
Я закончил своё лирическое отступление, продолжаем дальше:
В составе этой платы имеются две микросхемы L293D (1). L-ка позволяет управлять слаботочными двигателями с током потребления до 600 мА на канал. Для подключения двигателей используются зажимные клеммы (2).
Использование двух микросхем L293D позволяет одновременно подключить 4 моторчика постоянного тока либо 2 шаговых мотора, либо два моторчика и шаговый. Для управления на прямую выводами L-ки (IN1, IN2, IN3, IN4),отвечающими за выбор направления вращения, необходимо 4 вывода, а для двух микросхем целых 8.
Для уменьшения количества управляющих выводов в игру вступает сдвиговый регистр 74НС595 (3). Благодаря регистру управление сводится с 8-ми пинов к 4-ем.
Так же на шильдике имеются шесть пинов (4) для подключения двух сервоприводов. (Кстати очень полезная и нужная штука, если понадобиться прицепить манипулятор с двумя степенями свободы).
Питание силовой части производится либо от внешнего клеммника (6) либо замыканием джампера (5) ( питание от клеммника моторов +M соединяется с выводом VinArduino).
При замкнутом джампере напряжение для объединенного питания должно лежать в пределах от 6 до 12 Вольт.
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.
Сообщения
Похожие публикации
Всем привет.
Ранее уже выставлял по ошибке фьюзы на тактирование с внешнего резонатора (Ext. Crystal Osc.), но тогда обошелся малой кровью, т.к. удалось затактировать «с пальца» и программатор хотя бы увидел камень. Но в этот раз поставил тактирование с внешнего сигнала (Ext. Clock), и фокус не удался. Программа крутится, светодиоды моргают, а комп не видит. С пальца не вышло, также как и с кварцем на 4Мгц. Подавал просто 1кГц c генератора на XTAL1. Вывести пациента из комы не удалось Вопрос: почему прошлый раз прокатило, и в чем принципиальное отличие от этого режима? Что он ожидает от меня на вход?
Создал секцию:
SECTIONS < .rodata : < . = ALIGN(16); _start_cmdList = .; *(.cmdList) KEEP(*(.cmdList)) _stop_cmdList = .; >> объявил структуру и указатель на начало:
typedef struct < const char *cmdName; const void (*const commandVoid)(uint8_t, char *[], char[]); >CommandHandler; extern const CommandHandler _start_cmdList[]; для теста занёс одну функцию:
const void kek(uint8_t argc, char *argv[], char answ[]) < strcpy_P(answ, PSTR("wow")); >static PROGMEM const char __attribute__((__used__)) kekAlias[] = «lol»; const CommandHandler __attribute__((section(«.cmdList»))) __attribute__((__used__)) CMDHandler_kek = <.cmdName = kekAlias, .commandVoid = kek>; и проверяю:
const CommandHandler *in = &_start_cmdList[0]; const CommandHandler *out = &CMDHandler_kek; if (in == out) uart.println(F(«ok»)); uart.println((unsigned int)(in), HEX); uart.println((unsigned int)(out), HEX); uart.println((unsigned int)out->cmdName); uart.println((unsigned int)out->commandVoid); uart.println((unsigned int)in->cmdName); uart.println((unsigned int)in->commandVoid); Выводит:
1560
1560
124
801
12800
0
МК атмега168.
Platform IO
Avr gcc 11
Линкер скрипт стандартный, с добавкой сверху
Вопрос: как получить первый элемент массива в секции?
Вот сам код программ
Текст программы МК
/*******************************************************
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*******************************************************/
// Alphanumeric LCD functions
#include
// Standard Input/Output functions
#include
#include
float s;
unsigned long int k0=0,k1=0,k2=0,k3=0,k0123=0;
unsigned long int k4=0,k5=0,k6=0,k7=0;//k4567=0;
unsigned long int k8=0,k9=0,k10=0,k11=0;//k891011=0;
unsigned long int k12=0,k13=0,k14=0,k15=0;//k12131415=0;
unsigned long int k16=0,k17=0;
char k=0;
void main(void)
<
// Declare your local variables here
char a,b,c,d,e,f;
// Присваивание переменным a,b,c численные значения 63 05 00 01 CF A1
a=0b01100011;
//63
b=0b00000101;
//05
c=0b00000000;
//00
d=0b00000001;
//01
e=0b11001111;
//CF
f=0b10100001;
//A1
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0«RXC) | (0«TXC) | (0«UDRE) | (0«FE) | (0«DOR) | (0«UPE) | (0«U2X) | (0«MPCM);
UCSRB=(0«RXCIE) | (0«TXCIE) | (0«UDRIE) | (1«RXEN) | (1«TXEN) | (0«UCSZ2) | (0«RXB8) | (0«TXB8);
UCSRC=(1«URSEL) | (0«UMSEL) | (0«UPM1) | (0«UPM0) | (0«USBS) | (1«UCSZ1) | (1«UCSZ0) | (0«UCPOL);
UBRRH=0x00;
UBRRL=0x33;
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS — PORTС Bit 0
// RD — PORTС Bit 1
// EN — PORTС Bit 2
// D4 — PORTС Bit 3
// D5 — PORTС Bit 4
// D6 — PORTС Bit 5
// D7 — PORTD Bit 7
// Characters/line: 20
lcd_init(20);
lcd_clear();
delay_ms(1000);
while (1)
<
printf(«%c%c%c%c%c%c»,a,b,c,d,e,f); // отправка в порт
//принимаем байты
k=getchar(); // 0 байт
if (k==99)
k0=getchar(); // 1 байт Активная энергия+
k1=getchar(); // 2 байт
k2=getchar(); // 3 байт
k3=getchar(); // 4 байт
k4=getchar(); // 1 байт Активная энергия-
k5=getchar();
k6=getchar();
k7=getchar();
k8=getchar(); // 1 байт Реактивная энергия+
k9=getchar();
k10=getchar();
k11=getchar();
k12=getchar(); // 1 байт Реактивная энергия-
k13=getchar();
k14=getchar();
k15=getchar();
k16=getchar();
k17=getchar(); // 19 байт
s=k0123;
sprintf(buffer,»A+=%.4fkWh»,s/2500);
lcd_gotoxy(0,0);
lcd_puts(buffer);
// k4=k4«24;
// k5=k5«16;
// k6=k6«8;
// k4567=k4|k5|k6|k7;
// s=k4567;
// sprintf(buffer,»A-=%.4fkWh»,s/2500);
// lcd_gotoxy(0,1);
// lcd_puts(buffer);
//
// k8=k8«24;
// k9=k9«16;
// k10=k10«8;
// k891011=k8|k9|k10|k11;
//
//
// s=k891011;
// sprintf(buffer,»R+=%.4fkVarh»,s/2500);
// lcd_gotoxy(0,2);
// lcd_puts(buffer);
//
//
// k12=k12«24;
// k13=k13«16;
// k14=k14«8;
// k12131415=k12|k13|k14|k15;
// s=k12131415;
// sprintf(buffer,»R-=%.4fkVarh»,s/2500);
// lcd_gotoxy(0,3);
// lcd_puts(buffer);
Приветсвую!
Кто ни будь работал с микросхемой STLED316S? Это драйвер семисегментонго индикатора.
Можете привести минимальный кусок кода который выводит любую цифру на дисплей. Из документации не пойму как с ней работать.
На форумах инфы почти нет. Из того что есть тоже толку мало. Буду рад любой инфе по этой микросхеме.
Ещё правильно же понимаю биты по SPI передаются младшим вперёд, а такты нужно передавать инверсные?
Пример 35. Плата расширения для двигателей на L293D
Примеры
СБОРНИК ПРИМЕРОВ
ПРИМЕРЫ
- Пример 1. Светодиоды
- Пример 2. Подключение кнопки
- Пример 3. Переключатель
- Пример 4. Активный зуммер
- Пример 5. Пассивный зуммер
- Пример 6. Фоторезистор
- Пример 7. RGB-светодиод
- Пример 8. Семисегментный индикатор и 74HC595N
- Пример 9. Четырехразрядный 7-сегментный индикатор
- Пример 10. Светодиодная матрица
- Пример 11. Светодиодная шкала
- Пример 12. ЖК-дисплей
- Пример 13. Джойстик
- Пример 14. Вольтметр
- Пример 15. Термистор
- Пример 16. Модуль DHT11
- Пример 17. Модуль HC-SR04
- Пример 18. Датчик движения HC-SR501
- Пример 19. Матричная клавиатура
- Пример 20. ИК датчик и пульт
- Пример 21. Модуль часов DS-1302
- Пример 22. RFID-модуль RC522
- Пример 23. Сервопривод
- Пример 24. Модуль реле
- Пример 25. Двигатель постоянного тока
- Пример 26. Шаговый двигатель и драйвер ULN2003
- Пример 27. Драйвер двигателей на L298N
- Пример 28. MP3-плеер DFPlayer Mini
- Пример 29. Датчик уровня воды
- Пример 30. Serial Port
- Пример 31. Симуляция парковки
- Пример 32. Датчик температуры DS18B20
- Пример 33. Bluetooth-модуль HC-06
- Пример 34. Плата расширения с дисплеем и кнопками
- Пример 35. Плата расширения для двигателей на L293D
- Пример 36. Ethernet шилд W5100
- Пример 37. GSM/GPRS шилд SIM900
- Пример 38. GPS модуль Ublox NEO-6M
- Пример 39. Модуль считывания отпечатков пальцев
- Пример 40. Шаговый двигатель NEMA17 и драйвер TB6600
Мотор-шилды на основе микросхем L293D и L298N являются самыми популярными драйверами для управления моторами постоянного тока. Данная плата расширения позволяет подключить 4 DC-мотора (либо 2 шаговых двигателя) и два серводвигателя.
На борту данного шилда имеется две микросхемы L293D (1). Она позволяет управлять слаботочными двигателями с током потребления до 600 мА на канал. На двух пятипиновых клеммниках (2) можно насчитать 4 разъема для подключения двигателей (M1, M2, M3, M4), центральные выводы на пятипиновых клеммниках соединены с землей и служат для удобства при подключении пятипроводных шаговый двигателей. Использование двух микросхем L293D позволяет одновременно подключить 4 моторчика постоянного тока или 2 шаговых двигателя, либо два DC-моторчика и шаговик. Для управления на прямую выводами L-ки (IN1, IN2, IN3, IN4), отвечающимими за выбор направления вращения, необходимо 4 вывода, а для двух микросхем целых 8. Для уменьшения количества управляющих выводов используется сдвиговый регистр 74НС595 (3). Благодаря регистру управление сводится с 8-ми пинов к 4-м. Также, на плату выведены 2 разъема для подключения сервоприводов (4). Управление сервоприводами стандартное с помощью библиотеки Servo.h. Питание силовой части производится либо от внешнего клеммника (5), либо замыканием джампера (6) (питание от клеммника моторов +M соединяется с выводом Vin Arduino). При замкнутом джампере напряжение для объединенного питания должно лежать в пределах от 6 до 12 В.
К минусам данного шилда можно отнести то, что он задействует практически все цифровые пины.
Выводы, отвечающие за скорость вращения двигателей:
- Цифровой вывод 11 – DC Мотор №1 / Шаговый №1
- Цифровой вывод 3 – DC Мотор №2 / Шаговый №1
- Цифровой вывод 5 – DC Мотор №3 / Шаговый №2
- Цифровой вывод 6 – DC Мотор №4 / Шаговый №2
Выводы, отвечающие за выбор направления вращения двигателей:
- Цифровые выводы 4, 7, 8 и 12
Выводы для управления сервоприводами (выведены на штырьки на краю платы):
- Цифровой вывод 9 – Сервопривод №1
- Цифровой вывод 10 – Сервопривод №2
В итоге незадействованными цифровыми выводами остаются только пины 2, 13 и пины интерфейса UART – 0, 1. Однако есть выход из данной ситуации. У нас остались незадействованные аналоговые входы A0 – A6, их можно использовать как цифровые. В коде они будут записываться как цифровые с 14 по 19.
Описание:
В данном примере с помощью мотор-шилда на L293D будем одновременно управлять 4 двигателями постоянного тока (меняя скорость и направление). Для подключения шилда достаточно вставить его в плату Arduino Uno. Для работы с данным шилдом необходимо скачать библиотеку AFMotor.
L293D Драйвер для 2-х двигателей постоянного тока
Драйвер двигателя позволяет пользователю управлять мотором с помощью микроконтроллера. Напрямую соединять вывод микроконтроллера и мотор запрещается, поскольку большое потребление двигателем тока приведет к поломке управляющей платы. Модуль используется при сборке робототехнических устройств, электромагнитов и в других случаях, когда требуется управлять мощной нагрузкой.
Принцип работы
Суть использования драйвера заключается в согласовании уровней напряжения, поскольку имеется логическая низковольтная цепь, она же командная, напряжение в которой не превышает 5 вольт, также имеется цепь питания электродвигателя, потребление которого зависит от типа подключаемого двигателя и может составлять, например, 12 вольт. Также важно знать, что максимальный ток, который способен выдать порт микроконтроллера — 20 мА, тогда как потребляемый ток мотора может составлять, например, 2А, то есть в 100 раз больше. Если попытаться подключить двигатель к контроллеру напрямую — контроллер неизбежно выйдет из строя.
Управление двигателями происходит через некий «переходник» между контроллером и мотором, им слушит драйвер, который обычно выполнен в виде микросхемы. В итоге команда, принятая микросхемой от контроллера, замыкает цепь питания двигателя и он начинает работать.
Этот модуль на микросхеме L293D является самым популярным драйвером для работы с двигателями. L293D более мощный, чем его предшественник, и может не только изменять направление вращения, но скорость. Рабочее напряжение двигателей от 5В до 36 В, рабочий ток достигает 600 мА. На двигатель L293D может подавать максимальный ток в 1,2А.
Микросхема L293D обеспечивает разделение электропитания для микросхемы и для управляемых ею двигателей, что позволяет подключить электродвигатели с большим напряжением питания, чем у микросхемы. Разделение электропитания микросхем и электродвигателей также способствует уменьшению помех, вызванных бросками напряжения, связанными с работой моторов.
Подключение
Подключение осуществляется с помощью макетных проводов. Выводы модуля имеют следующие назначения:
VCC 5V — питание микросхемы драйвера двигателей
MOTOR 2.5 — 36V — питание двигателей
IN3, IN4 — управление направлением вращения и скоростью двигателя М2
GND — земля (общий)
IN1, IN2 — управление направлением вращения и скоростью двигателя М1
GND — земля (общий)
M1, M2 — подключение двигателей постоянного тока
Для контроля скорости вращения с помощью широтно-импульсной модуляции (ШИМ) имеются отдельные входы. Для генерации ШИМ-сигнала можно использовать специальные микросхемы либо платформу Arduino.
Кроме драйвера понадобится контроллер DaVinci, два мотора постоянного тока, соединительные провода и дополнительный источник питания, так как контроллер выдает маленькие токи и на двигатели необходимо подавать питание отдельным источником питания к контакту MOTOR 5-36V.
Управление двигателями производится с помощью ШИМ сигналов через контакты IN1..IN4.
Двигатели подключаются к клеммам М1 и М2. При этом полярность не имеет значения, ее можно поменять программно.
Чтобы начать работу с датчиком его необходимо подключить к микроконтроллеру по схеме ниже.
Программа
Далее необходимо загрузить в микроконтроллер следующую программу, которая будет вращать один из двигателей, меняя направление каждую секунду.
Программу можно усложнить и кроме направления менять еще и мощность.
В итоге сначала мотор вращается с максимальной скоростью, затем замедляется, и повторяет все в обратном направлении.
Для того, чтобы задействовать второй двигатель, необходимо поменять код следующим образом:
Теперь моторы сначала вращаются с небольшой скоростью, затем переходят на увеличенные обороты, и повторяют все в обратном направлении.
![]() | ![]() |
Плата расширения Arduino Motor R3 — вид спереди | Плата расширения Arduino Motor R3 — вид сзади |
Общие сведения
Плата расширения Arduino Motor построена на базе микросхемы L298 (datasheet), представляющей собой двойной мостовой драйвер для управления различной индуктивной нагрузкой, такой, как реле, соленоиды, шаговые двигатели и двигатели постоянного тока. Плата расширения позволяет Ардуино управлять двумя двигателями постоянного тока, контролируя скорость и направление вращения каждого из них независимо друг от друга. Среди прочих возможностей устройства можно выделить возможность измерения тока, потребляемого каждым двигателем. Плата расширения Arduino Motor совместима с устройствами TinkerKit, что позволяет быстро собирать проекты, просто подключив готовые модули TinkerKit к плате.
Характеристики
Рабочее напряжение | от 5В до 12В |
Драйвер двигателя | L298P, позволяет управлять 2 двигателями постоянного тока либо 1 шаговым двигателем |
Максимальный выходной ток | 2А на каждый канал или 4А максимум (при условии использования внешнего источника питания) |
Измерение тока | 1.65В/А |
Возможность естественной остановки и принудительного торможения |
Схема и исходный проект
Питание
Микросхема L298, расположенная на плате расширения, имеет два вывода питания — один из них предназначен для питания цифровых цепей, другой — для питания двигателей. Ток, потребляемый двигателем, зачастую превышает максимальный выходной ток USB, поэтому для питания платы расширения необходимо использовать только внешние источники питания.
В качестве внешнего источника питания (не USB) может использоваться сетевой AC/DC-адаптер либо аккумулятор. Штекер адаптера (диаметр — 2.1мм, центральный контакт — положительный) необходимо вставить в соответствующий разъем питания на основной плате Ардуино, к которой подключена плата расширения, либо подсоединить провода от источника питания к клеммам Vin и GND, соблюдая необходимую полярность.
Для предотвращения выхода из строя Ардуино, через который запитана плата расширения, рекомендуется использовать внешний источник питания, выходное напряжение которого лежит в пределах от 7 до 12В. В том случае, если для работы подключенного двигателя требуется напряжение больше 9В, рекомендуется организовать раздельное питание Ардуино и платы расширения. Для этого достаточно разомкнуть перемычку «Vin Connect», расположенную на обратной стороне печатной платы. Максимальное напряжение Vin, которое можно подавать на винтовые клеммники, составляет 18В.
Ниже перечислены выводы питания, предусмотренные на винтовом клеммнике:
- Vin. Напряжение Vin используется для питания двигателей, подключенных к плате расширения. Напряжение, поступающее на этот вывод от внешнего источника питания, также используется для питания Ардуино, к которому подключена плата расширения. Для того, чтобы данный источник использовался только для питания двигателей, необходимо разомкнуть перемычку «Vin Connect».
- GND. Выводы земли.
Максимальный выходной ток, который способна обеспечить плата расширения, составляет 4А (по 2А на каждый канал).
Входы и выходы
Для управления двигателями в Arduino Motor предусмотрено два независимых канала, A и B, каждый из которых связан с 4 выводами Ардуино. Соответственно, для управления платой расширения всего задействовано 8 выводов. Каждый канал можно использовать отдельно (например, для управления двумя двигателями постоянного тока), либо функционально объединить их в один канал для управления шаговым двигателем.
В нижеследующей таблице перечислены выводы, относящиеся к каждому каналу Arduino Motor:
Функция | выводы канала A | выводы канала B |
Направление вращения | D12 | D13 |
Скорость вращения (ШИМ) | D3 | D11 |
Остановка двигателя | D9 | D8 |
Измерение тока | A0 | A1 |
Иногда установка платы расширения приводит к нехватке выводов для реализации требуемой задачи. Если в вашем проекте не используются функции остановки или измерения тока, то нехватку свободных выводов можно компенсировать за счет отключения неиспользуемых функций. Для этого достаточно разомкнуть соответствующие перемычки на обратной стороне платы расширения.
Ниже перечислены дополнительные разъемы, присутствующие на плате расширения:
- Винтовой клеммник для подключения двигателей и источника питания для них.
- 2 белых разъема TinkerKit — два аналоговых входа; соединены с линиями A2 и A3.
- 2 оранжевых разъема TinkerKit (по центру) — два аналоговых выхода; соединены с ШИМ-выходами D5 и D6.
- 2 белых разъема TinkerKit (четырехконтактных) — интерфейс TWI; один разъем используется в качестве входа, другой — в качестве выхода.
Подключение двигателей
Коллекторный двигатель постоянного тока. Arduino Motor позволяет управлять двумя коллекторными двигателями постоянного тока. Для подключения каждого двигателя к каналу A или B необходимо подсоединить его провода к клеммам (+) и (-) соответствующего канала. При правильном подключении устройство позволяет контролировать направление и скорость вращения каждого двигателя. Для изменения направления вращения достаточно подать высокий (HIGH) или низкий (LOW) уровень сигнала на выводы DIR A или DIR B. Изменение скорости вращения двигателей осуществляется путем изменения коэффициента заполнения ШИМ-сигнала на выводах PWM A и PWM B. Для резкой остановки каждого двигателя необходимо подать высокий уровень сигнала (HIGH) на выводы Brake A и Brake B. Для медленной остановки — достаточно просто прекратить подачу питания. Чтобы узнать величину постоянного тока, потребляемого каждым двигателем, необходимо считать напряжение на выводах SNS0 и SNS1. Для этого можно применить функцию analogRead(), указав ей в качестве параметра аналоговый вход A0 или A1. Напряжение на этих выводах будет пропорционально току, протекающему через каждый канал платы расширения, и ограничено величиной в 3.3В, которое соответствует максимальному току в 2А.
Физические характеристики
Максимальная длина и ширина печатной платы Arduino Motor составляет 6.9 см и 5.4 см соответственно. Четыре крепежных отверстия позволяют закрепить плату в корпусе или на какой-либо поверхности. Обратите внимание, что расстояние между цифровыми выводами 7 и 8 не кратно традиционным 2.54 мм и составляет 4 мм.