====== Motor Shield (SmartElements) ======
===== Описание =====
Плата расширения Motor Sheld, выполненная на базе микросхемы L298P, позволяет управлять моторами и дополнительными устройствами. Является незаменимой платой при конструировании и сборке роботов, а также других устройств, использующих коллекторные и шаговые моторы. Motor Shield совместим со всеми типами контроллеров Arduino, совпадающих по форм-фактору (в том числе совместим с контроллерами Smart Uno, Smart Mega и Smart Leonardo).

Плата имеет два канала для управления моторами и позволяет подключить два коллекторных мотора или один шаговый. Допускается параллельное подключение нескольких моторов в один канал. Такой вариант подключения будет удобен, например, для четырехколесных роботов. Motor Shield позволяет подключать моторы мощностью до 2 А на каждый канал. При необходимости использования более мощного мотора - каналы можно объединить, получив при этом суммарно до 4 А. Обратите внимание, при работе платы с моторами потребляющими большой ток, микросхема сильно нагревается. Во избежании ожога, не прикасайтесь к микросхеме в процессе работы.

Для управления направлением вращения моторов используются выводы М1 и М2, по умолчанию с помощью перемычек использующие выводы 5 и 6 контроллера и шилда. Для управления скоростью вращения моторов используются выводы Е1 и Е2, по умолчанию с помощью перемычек использующие выводы 4 и 7 контроллера и шилда. Вы можете использовать другие выводы контроллера и шилда для управления моторами - для этого соедините выводы шилда М1, М2, Е1 и Е2 с другими цифровыми выводами посредством гибких проводов "мама-мама" (обратите внимание, для регулировки скорости вращения моторв выводы Е1 и Е2 должны подключаться к выводам, поддерживающим ШИМ).

Плата совмещает в себе возможности Motor Shield и Sensor Shield. Для подключения периферии на плату выведены трехконтактные разъемы для подключения модулей и датчиков (13 цифровых и 6 аналоговых).  Кроме того, на плате предусмотрены следующие дополнительные разъемы: UART, I2C, а также DIST и INDICATOR.

Разъем DIST позволяет подключить ультразвуковой дальномер (HC-SR04 или US-015) или другой датчик или модуль, использующий аналогичную распиновку. Для работы данный разъем использует цифровые выводы 12 и 13 контрллера и шилда.

Разъем INDICATOR позволяет подключить модуль 4-х разрядного индикатора или другой модуль или датчик, использующий аналогичную распиновку. Для работы данный разъем использует цифровые выводы 8 и 9 контрллера и шилда.

Светодиод на плате отображает состояние питания Motor Shield: если светодиод горит - шилд получает питание, если не горит - питание на шилд не поступает.

Перемычка JOIN на плате отвечает за режим питания. Если перемычка установлена - внешнее питание от разъема PWR поступает и на шилд и на контроллер через пин Vin. Рекомендуемое напряжение в таком случае должно быть 7-12 В. Если перемычка снята - внешнее питание поступает только на Motor Shield (для питания контроллера требуется дополнительный источник питания). Рекомендуемое напряжение в таком случае может быть 5-24 В. В качестве внешнего питания можно использовать Power Shield, установив его между контроллером и Motor Shield.

==== Схема платы ====
{{ :главная:шилды:motor_shield_map.png?nolink |}}

На схеме обозначены:
  - Цифровые выводы (D0 - D13)
  - Выводы управления направлением движения (М1 и М2) и скоростью (Е1 и Е2)
  - Клеммные колодки для подключения моторов
  - Клеммные колодки для подключения внешнего питания
  - Перемычка управления режимом питания
  - Аналоговые выводы (A0 - A5)
  - Выводы для подключения дальномера
  - Выводы для подключения по интерфейсу I2C
  - Выводы для подключения индикатора
  - Выводы для подключения по интерфейсу UART

==== Физические размеры ====
  * Шилд (Д х Ш х В): 60 х 53 х 20 мм

==== Плюсы использования ====
  * Удобное подключение устройств
  * Имеет отдельные выводы для подключения по интерфейсам I²C и UART
  * Разъём для внешнего питания (со светодиодом-индикатором)
  * Совмещает в себе два шилда - шилд для управления моторами и сенсор шилд

===== Пример подключения и использования =====
**Пример:** Для демонстрации работы шилда используется простейший робот, который движется по четырём направлениям (вперед, назад, вправо и влево). Робот собирается очень просто - берётся трёхколёсное шасси с двумя моторами, на платформу шасси крепится контроллер Smart Uno, на контроллер прикрепляется Power Shield, в свою очередь на Power shield прикрепляется Motor shield.

Для этого нам понадобится:
^ Что нужно:                                                                                                                                       ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер SmartUno]]| 1           |
| [[http://smartelements.ru/product/shassi-2wd-smartelements|Шасси 2WD SmartElements]]| 1           |
| [[http://smartelements.ru/product/motor-shield|Motor Shield]]                                                      | 1           |
| [[http://smartelements.ru/product/power-shield|Power Shield]]                           | 1           |


**Подключение:**
  - Закрепите на верхней площадке шасси контроллер Smart Uno с помощью винтов и гаек M2, как указано в инструкции к шасси. 
  - На контроллере закрепите плату Power Shield, путём совмещения контактов платы расширения с контактами конроллера. 
  - Сверху, на Power Shield закрепите плату Motor shield, путём совмещения контактов Motor shield с контактами платы Power Shield.
  - Подключите моторы к плате расширения Motor shield, к клеммным колодкам М1 и М2 (на схеме сверху выделены оранжевым прямоугольником с номером 3). Правый мотор подключите к клеммной колодке M1, красный провод к контакту "+", чёрный к контакту "-". Аналогично подключите левый мотор к клеммной колодке М2.

**Скетч для загрузки:**
<file Arduino>
#define E1 6 //Вывод платы расширения Motor Drive Shield, используемый для контроля скорости мотора А.
#define E2 5 //Вывод платы расширения Motor Drive Shield, используемый для контроля скорости мотора В.
#define M1 7 //Вывод платы расширения Motor Drive Shield, используемый для контроля направления вращения мотора А.
#define M2 4 //Вывод платы расширения Motor Drive Shield, используемый для контроля направления вращения мотора В.

int motorSpeed = 255;    //Переменная для хранения скорости вращения моторов (вы можете задать свою скорость вращения колес).
int delay_time = 1500;

void motor_drive_config() //Инициализация выводов платы расширения Motor Drive Shield.
{
  pinMode(M1, OUTPUT);    //Назначение вывода M1 выходом.
  pinMode(M2, OUTPUT);    //Назначение вывода M2 выходом.
  pinMode(E1, OUTPUT);    //Назначение вывода E1 выходом.
  pinMode(E2, OUTPUT);    //Назначение вывода E2 выходом.
}

void move_forward() //Движение робота вперед.
{
  digitalWrite(M1, HIGH);       //Левые колеса вращаются вперед.
  digitalWrite(M2, HIGH);       //Правые колеса вращаются вперед.
  analogWrite(E1, motorSpeed);  //Скорость вращения правых колес.
  analogWrite(E2, motorSpeed);  //Скорость вращения левых колес.
}

void move_right() //Движение робота вправо.
{
  digitalWrite(M1, LOW);        //Левые колеса вращаются назад.
  digitalWrite(M2, HIGH);       //Правые колеса вращаются вперед.
  analogWrite(E1, motorSpeed);           //Скорость вращения левых колес.
  analogWrite(E2, motorSpeed);  //Скорость вращения правых колес.
}

void move_left() //Движение робота влево.
{
  digitalWrite(M1, HIGH);       //Левые колеса вращаются вперед.
  digitalWrite(M2, LOW);        //Правые колеса вращаются назад.
  analogWrite(E1, motorSpeed);  //Скорость вращения левых колес.
  analogWrite(E2, motorSpeed);           //Скорость вращения правых колес.
}

void move_stop() //Остановка робота.
{
  digitalWrite(M1, LOW);  //Левые колеса вращаются назад.
  digitalWrite(M2, LOW);  //Правые колеса вращаются назад.
  analogWrite(E1, 0);     //Скорость вращения колес снизить до 0.
  analogWrite(E2, 0);     //Скорость вращения колес снизить до 0.
}

void move_back() //Движение робота назад.
{
  digitalWrite(M1, LOW);        //Левые колеса вращаются назад.
  digitalWrite(M2, LOW);        //Правые колеса вращаются назад.
  analogWrite(E1, motorSpeed);  //Скорость вращения левых колес.
  analogWrite(E2, motorSpeed);  //Скорость вращения правых колес.
}

void setup() // Задание начальных параметров системы.
{
  motor_drive_config();       //инициализация выводов платы расширения Motor Drive Shield.
  move_stop();                //начальная позиция робота — робот стоит.  
}

void loop() //Основной цикл
{
  move_forward();     //движение вперёд
  delay(delay_time);  //задержка
  move_right();       //движение вправо
  delay(delay_time);  //задержка
  move_left();        //движение влево
  delay(delay_time);  //задержка
  move_back();        //движение назад
  delay(delay_time);  //задержка
  move_stop();        //остановка
  delay(delay_time);  //задержка
}
</file>