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(). Домашняя страница Схема электрическая Программная библиотека