Arduino motor shield r3

advertisement
Arduino Motor Shield R3
Модуль Arduino Motor Shield R3 предназначен для управления различными индуктивными
нагрузками: одновременно двумя двигателями постоянного тока или одним шаговым, соленоидами,
реле, контакторами. Управление происходит по двум каналам мощной коммутации А и В. Модуль
ориентирован на работу совместно с Arduino UNO R3. Устройство прекрасно подходит для
использования в системах не относящихся к категории Arduino. Motor Shield R3 может встраиваться в
различные электромеханические приборы. Позволяет хорошо изучить возможности микросхемы
L298.
Простой пример включения 1
Простой пример включения 2
Управление и контроль
Автоматика прибора, в который входит Motor Shield R3, командует его работой с помощью
цифровых логических сигналов: скорость, направления вращения двигателя, тормоз. Установка
скорости происходит с помощью широтно-импульсной модуляции (ШИМ). Направление вращения
определяет уровень сигнала Direction на соответствующем контакте. Каждый из эти сигналов свой
для каналов А и В. Существует возможность контролировать потребляемый ток в каждом канале.
Электроника модуля включает двигатель, соединяя контакты двигателя с питанием и общим
проводом. Остановка двигателя происходит когда цепь двигателя разомкнута или оба его контакта
соединены с общим проводом, также остановка произойдет если оба контакта соединены с линией
питания – ток не протекает. Для контроля уровня каждого контакта моторов предусмотрена
светодиодная индикация.
Сигналом тормоз можно пользоваться при установке соответствующей перемычки на
обратной стороне платы. Сигнал тормоз останавливает шпиндель двигателя при высоком уровне.
Основные компоненты
Основа модуля – микросхема L298. Она содержит мощные полупроводники, управляющие
нагрузкой. Для контроля тока Motor Shield R3 содержит микросхему операционных усилителей
LMV358MMX. Сигналы управления поступают на L298 через логические элементы микросхемы
4077d. Возле клемм подключения двигателей расположены желтые светодиоды, помогающие
определить уровень напряжений на двигателях. Они светятся при подаче высокого уровня на
соответствующую линию. Имеется кнопка сброса Arduino и всех модулей, входящих в
микроконтроллерную систему. Модуль имеет множество контактов для соединения с Arduino или
другими устройствами, установки поверх Motor Shield R3 модулей Arduino, подключения нагрузок и
питания.
Соединители, контакты и подключение
По краям платы расположены соединители с множеством контактов. Штыри в нижней части
вставляются в соединители Arduino UNO R3.
Модуль использует цифровые контакты Arduino 3, 8, 9, 11, 12, 13 и аналоговые контакты 0 и 1.
Разъемы TinkerKit используют:
Интерфейс TWI (I2C) контакты SCL и SDA
ШИМ контакт 6
ШИМ контакт 5
аналоговый вход контакт 2
аналоговый вход контакт 3
Назначение боковых контактов кроме сигналов TWI.
Сигналы Motor Shield R3 соединены со следующими контактами боковых разъемов:
Сигнал
Контакты канала А Контакты канала В
Скорость вращения, ШИМ управление (PWM)
Направление вращения (Direction)
Тормоз (Brake)
Измерение тока (Current Sensing)
D3
Dir A D12
D9
A0
D11
Dir B D13
D8
A1
Подключение двигателей постоянного тока.
На плате расположены вилки соединителей имеющие 3 или 4 контакта для подключения
устройств TinkerKit. Контакты соединителей кроме информационного сигнала подводят питание к
подключаемому устройству.
1 – сброс
2 – для установки модулей сверху
3 – белые вилки с 4 контактами TinkerKit интерфейса TWI
4 – оранжевые вилки TinkerKit. Их контакты соединены с контактами D5 и D6. На плате они
подписаны – 5, – 6.
5 – белые вилки TinkerKit для подключения датчиков. Они соединены с контактами A2 и A3 для
подключения к аналоговым входам Arduino
6 и 7 – подключение двигателей
8 – питание
TinkerKit – класс датчиков и исполнительных устройств Arduino подключаемых с помощью
соединителей одного типа.
Перемычки
На нижней стороне платы находятся контакты, при замыкании которых с помощью пайки
некоторые сигналы становятся доступными. Перед включением Motor Shield R3 состояние всех
перемычек проверить на соответствие требованиям проекта применения модуля.
Расположение контактов перемычек на нижней стороне платы.
Контакты перемычки
Функция сигнала
BRAKE A
BRAKE B
Тормоз канал A
Тормоз канал B
Контакты Arduino
D8
D9
SNS0
SNS1
Vin Connect
Контроль тока нагрузки А
Контроль тока нагрузки B
Линия питания
A0
А1
Питание
Если торможение и измерение тока нагрузки не используется, то перемычки BRAKE A,
BRAKE B, SNS0, SNS1 должны быть разорванными. Это высвобождает контакты Arduino D8, D9, A0,
А1 для других целей.
Питание
Контакты 3,3 V и 5 V предназначены для соединения с одноименными контактами Arduino
UNO R3. Питание микросхем модуля происходит от напряжения 5 В. Для питания электродвигателей
и других нагрузок используются отдельные линии питания. Подключение производится с помощью
винтовой клеммы в углу платы. Напряжение питания двигателей подается на контакт VIN. Если оно
выше 12 В, то перемычку Vin Connect следует разомкнуть, так как линия VIN соединена с
соответствующим контактом Arduino. Лучше питать двигатели от одного источника, а модули
Arduino от другого при разомкнутой перемычке Vin Connect. Это снизит влияние помех двигателя на
работу АЦП.
Максимальное напряжение питания двигателей 18 В. Каждый из каналов А и В обеспечивает
нагрузку током до 2 ампер. При максимальной нагрузке обоих каналов суммарный ток до 4 ампера.
Характеристики
Питание модуля 7 – 12 В
Питание нагрузки 5 – 18 В
Размеры платы 70 х 54 мм
Тормоз
Для торможения двигателя постоянного тока применяется простое решение. Для этого
используется свойство обратимости. Двигатель работает как генератор если его вал вращается под
действием механической силы. Вращение по инерции после отключения питания вызывает
генерацию постоянного тока. Если в этот момент контакты двигателя замкнуть, то ему придется
генерировать большой ток и провернуть вал будет сложнее, чем при разомкнутых контактах. Это
физическое явление использовано в Arduino motor shield r3 для торможения двигателя.
Команда направления вращения по каналу А поступает на вход DIRA.
Логические элементы микросхемы 4077d упрощают управление сигналами направление вращения и
тормоз.
Уровень сигнала инвертируется на на выходе элемента IС2A и вместе с сигналом #DIRA они
поступают на входы микросхемы L298. Благодаря применению в схеме логического элемента IС2A
одним сигналом DIRA направления вращения происходит управления двумя входами IN1 и IN2
микросхемы L298, причем при работе двигателя уровни на IN1 и IN2 всегда будут иметь разные
уровни. Это означает, что один контакт двигателя подключается к питанию, другой к общему
проводу. При смене направления вращения наоборот.
При поступлении высокого логического уровня по линии BRAKEA эта закономерность
нарушается, инверсии нет, микросхема L298 подключает оба контакта двигателя к одному проводу,
двигатель оказывается замкнут и происходит торможение.
Разработчики не зря установили перемычку активирующую этот сигнал. Прежде чем принять
решение о использовании тормоза нужно разобраться не будет ли генерируемый ток двигателя под
влиянием внешних сил настолько велик, что повредит микросхему L298.
Контроль тока
Напряжение пропорциональное току нагрузки снимается с выхода операционного усилителя
LMV358MMX. Микросхема содержит 2 ОУ для двух каналов.
Схема включения операционного усилителя для контроля тока нагрузки в Arduino motor shield r3.
Входы SNSA и SNSB соединены с резисторами очень малого сопротивления подключенными
к специальным выводам микросхемы L298. Напряжение на резисторах пропорционально току
нагрузки. Сопротивление резисторов и коэффициент усиления подобраны так, что напряжению на
выходе ОУ 3,3 вольта соответствует току через нагрузку 2 ампера. Выходы ОУ соединены с
перемычками SNS0 и SNS1. При замыкании перемычек напряжения с выходов ОУ будут поступать
на аналоговые входы A0 и A1 Arduino UNO R3. Напряжение на аналоговых входах измеряет АЦП
микроконтроллера модуля Arduino UNO R3. Программная обработка результатов измерений
возможна с помощью функции analogRead ().
Программа управления двигателем постоянного тока
Подключите двигатель постоянного тока к винтовой клемме канала А. Загрузите программу.
/*********************************
Motor Shield 1-Channel DC Motor Demo
**********************************/
void setup() {
//Setup Channel A
pinMode(12, OUTPUT); //Initiates Motor Channel A pin
pinMode(9, OUTPUT); //Initiates Brake Channel A pin
}
void loop(){
//forward @ full speed
digitalWrite(12, HIGH); //Establishes forward direction of Channel A
digitalWrite(9, LOW); //Disengage the Brake for Channel A
analogWrite(3, 255); //Spins the motor on Channel A at full speed
delay(3000);
digitalWrite(9, HIGH); //Eengage the Brake for Channel A
delay(1000);
//backward @ half speed
digitalWrite(12, LOW); //Establishes backward direction of Channel A
digitalWrite(9, LOW); //Disengage the Brake for Channel A
analogWrite(3, 123); //Spins the motor on Channel A at half speed
delay(3000);
digitalWrite(9, HIGH); //Eengage the Brake for Channel A
delay(1000);
}
Программа управления шаговым двигателем
Приводими программу для управления шаговым биполярным двигателем, например вот таким
Он имеет четыре провода, две обмотки, подключаемые к каналам А и В. Схему не приводим, так как
незнаем какой именно двигатель окажется в вашем распоряжении. Найти концы обмоток можно
прозвонкой – концы проводов, относящиеся к одной обмотке, будут между собой звониться, а концы,
относящиеся к разным обмоткам – нет. Перед подключением двигателя к Arduino motor shield r3
следует изучить теорию работы шагового биполярного двигателя.
В программе не используется широтно-импульсная модуляция и контроль тока.
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
/***********************************************/
#define TIMEFASE 20
#define DEBUG
#define PWMA 3
#define PWMB 11
#define DIRA 12
#define DIRB 13
/**********************************************************/
int nFase = 0;
/**********************************************************/
void setup() {
#ifdef DEBUG
Serial.begin( 9600 );
Serial.println("Start");
#endif
/**********************************************************/
pinMode(PWMA, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(DIRA, OUTPUT);
pinMode(DIRB, OUTPUT);
/**********************************************************/
}
/**********************************************************/
void loop() {
eseguiStep( 50,true );
stop();
delay( 1000 );
eseguiStep( 100,true );
stop();
delay( 1000 );
eseguiStep( 200,true );
stop();
delay( 3000 );
}
/**********************************************************/
int fase( int nFase ) {
switch( nFase ) {
case 1:
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
digitalWrite(PWMA, HIGH);
digitalWrite(PWMB, LOW);
break;
case 2:
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, HIGH);
digitalWrite(PWMA, LOW);
digitalWrite(PWMB, HIGH);
break;
case 3:
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
digitalWrite(PWMA, HIGH);
digitalWrite(PWMB, LOW);
break;
case 4:
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
digitalWrite(PWMA, LOW);
digitalWrite(PWMB, HIGH);
break;
}
delay(TIMEFASE);
return nFase;
}
/**********************************************************/
int stop() {
delay( 500 );
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
digitalWrite(PWMA, LOW);
digitalWrite(PWMB, LOW);
}
/**********************************************************/
void eseguiStep( int passi, boolean dir ) {
if ( passi <= 0 ) { return; }
if ( dir ) { for ( int p=1; p<=passi; p++) { gira(); } }
else { for ( int p=passi; p>=1; p--) { gira(); } }
}
/**********************************************************/
void gira() {
nFase = (nFase+1);
if ( nFase > 4 ) { nFase=1; }
113
114
fase( nFase );
}
03: определение константы TIMEFASE т.е. время, которое должно пройти между положениями
ротора. Это значение определяет скорость вращения и может повлиять на то, что работает двигатель
или нет
04: определение константы DEBUG для отображения любых отладочных сообщений по
последовательному монитору
13: определение переменной nFase хранящей значение фазы, в которой оказался ротор
20-21: устанавливает связь с последовательным монитором последовательного порта на скорости
9600 бод и выводит "Start"
26-29: определяет режим работы контактов Arduino UNO R3 подключенных к модулю управления
двигателем
39: вызывается функция eseguiStep(step,verso). Она описана в программе далее. В функцию
передаются 2 параметра. Первый – количество шагов и второй параметр вращения: по часовой
стрелке = true, против часовой стрелки = false
40-41: остановить двигатель, вызывая функцию Stop() и подождать секунду, прежде чем пойти далее
42-47: происходит тоже самое, что и в строках 39-41 для нескольких шагов шагового биполярного
двигателя
53-87: функция fase(nFase) перемещает ротор к шагу, переданному через параметр nFase. Функция в
линии 84 это задержка, установленная в TIMEFASE, определенная выше. Строка 86 возвращает nFase
– значение фазы, в которой находится двигатель
91-98: определение функции остановки, ожидание 500 миллисекунд (строка 92), а затем сигнал
низкого уровня формируется на всех контактах управления двигателем модуля Arduino r3
102-106: здесь определяется функция eseguiStep (шаг, направление). Обратите внимание на строки 39,
42, 45. Особенностью является, то что проверяется число шагов более 0.
110-114: определение функции gira(), целью которых является отправить информацию в функцию
fase().
Домашняя страница
Схема электрическая
Программная библиотека
Download