Arduino IDE библиотека, от компании SparkFun Electronics, в  статье рассматривается в качестве обобщенного примера подключения и использования библиотек сторонних производителей в среде программирования Arduino IDE.

Кроме того, для лучшего понимания и усвоения темы Arduino IDE библиотека мы рассматриваем пример устройства под которое и будем использовать код уже написанный кем — то, в нашем случае инженерами известной компании SparkFun Electronics. Запомните данную компанию, она Вам пригодится.

Задача программирования — создать и отладить программу управление микроконтроллером (Arduino, ESP8266, ESP32 и др.) через  контроллер (драйвер) моторами TB6612FNG (мотор-редукторами, сервоприводами и  др.)

TB6612FNG можно использовать для привода в действие одного или двух моторов, имеющих  диапазон питания по напряжению 2,5 В до 13,5 В, по номинальному  постоянному току 1,2 А, и пиковому току 3,2 А (на канал), т. е. это потребляемый ток, когда вы удерживаете кратковременно мотор в неподвижном состоянии, такая ситуация происходить очень часто при движении робота. Микросхема собрана на двух стандартных H-образных мостах на полевых транзисторах, позволяющих не только контролировать направление (против часовой стрелки /по часовой) и скорость вращения моторов, а также тормозить и останавливать их.

Две пары входных сигналов (AIN1, AIN2 и BIN1, BIN2) могут использоваться для управления двумя двигателями в одном из четырех функциональных режимов — CW, CCW, короткое торможение и останов. Два выхода двигателя (A и B) могут управляться отдельно, скорость каждого двигателя регулируется с помощью входного сигнала PWM с частотой до 100 кГц. Чтобы вывести двигатель из режима ожидания, на вывод STBY следует подать высокий логический уровень.

Кроме того необходимо учитывать,  какой тип моторов Вы собираетесь использовать,  существуют различные типы двигателей (шаговые, постоянного тока, бесщеточные), поэтому необходимо знать, а подойдет ли драйвер к Вашему типу моторов.

В Интернете хватает  уже готовых программ (скетчей) для работы Arduino с микросхемой TB6612FNG, но мы не ищем легких путей, нам нужна универсальная программа на все случаи жизни Заодно вспомним как подключается библиотека в нашей незабвенной ArduinoIDE. В процессе решения задачи, выучим язык С++ .

Библиотека — это универсальная программа, уже кем то для нас с Вами написанная, с уже готовыми функциями предназначенными для решения конкретной задачи. Нам остается загрузить библиотеку в ArduinoIDE и указать ей куда мы её загрузили. Ну и конечно, при самостоятельном написании программы (скетча) в самом начале скетча, подключить библиотеку в виде файла с расширением .h , например так:  #include <SparkFun_TB6612.h>

  1. для начала загружаем библиотеку от компании SparkFun Electronics по этой ссылке,  или качаем последнюю версию из их же репозитория  на GitHub, в любую папку на Вашем компьютере, главное не забыть в какую, в дальнейшем понадобится.

arduinoIDE 0

2.  Запускаем  ArduinoIDE. Жмем: Скетч (1) -> Подключить библиотеку(2) -> Добавить ZIP Библиотеку . . .(3)

arduinoIDE Sparkfun 1

3. В левой части (Folders), появившегося окна, ищем ту самую папку в которую мы загрузили  библиотеку от компании SparkFun Electronics (см. пункт 1.) . В правой части (Files) находим и       подсвечиваем заархивированный (.ZIP) файл: SparkFun_TB6612FNG_ Arduino_ Library_master.zip, нажимаем OK (стрелка 1)

arduinoIDE Sparkfun 2

4. В нижней части следующего появившегося окна (черная часть для сообщений), читаем сообщение: Библиотека добавлена. Проверьте меню «Подключить библиотеку»

arduinoIDE Sparkfun 3.jpg

5. Проверяем меню «Подключить библиотеку». Жмем: Скетч (1) -> Подключить библиотеку(2) — в раскрывшемся длинном списке, почти в самом конце обнаруживаем библиотеку  SparkFun TB6612FNG Мотор Driver Library(3).

arduinoIDE Sparkfun 5

6. Запускаем пример программы (скетча) от SparkFun TB6612FNG Мотор Driver. Жмем: Файл (1) -> Примеры(2) -> в раскрывшемся длинном списке, почти в самом конце, обнаруживаем библиотеку SparkFun TB6612FNG Мотор Driver Library(3) -> и пример МоторTestRun(4)

arduinoIDE Sparkfun 6

7. Получаем пример программы (скетча) от SparkFun  МоторTestRun. Она состоит из изменяемых входных данных и функций библиотеки SparkFun_TB6612.h

Правая сторона

  • VM — плюс аккумуляторной батареи электродвигателей (2,5 В -13,5 В по номинальному  постоянному току 1,2 А, и пиковому току 3,2 А)
  • VCC — напряжение питания логики от микроконтроллера для питания микросхемы и интерфейса с микроконтроллером  (2,7 В — 5,5 В).
  • GND — общая земля для напряжения двигателя и логического напряжения (все контакты GND подключены вместе)
  • AO1 — Выход на (-) вывод двигателя A .
  • AO2 — выход на (+) вывод двигателя A .
  • BO2 — выход на (+) вывод двигателя B . 
  • BO1 — выход на (-) вывод двигателя B .
  • GND — минус аккумуляторной батареи электродвигателей.

Левая сторона

  • PWMA — вход управлением скоростью вращения электродвигателем A подключается к выходу PWM (ШИМ) микроконтроллера
  • AIN2    — вход 2, определяющий направление вращения двигателя А, подключается к одному из цифровых выходов микроконтроллера
  • AIN1    — вход 1, определяющий направление вращения двигателя А, подключается к одному из цифровых выходов микроконтроллера
  • STBY — вход  ожидания    цифровой вывод на микроконтроллере или привязка к VCC
  • BIN1 —  вход 1, определяющий направление вращения двигателя B, подключается к одному из цифровых выходов микроконтроллера
  • BIN2 —  вход 2, определяющий направление вращения двигателя B, подключается к одному из цифровых выходов микроконтроллера
  • PWMB — вход управлением скоростью вращения электродвигателем B подключается к выходу PWM (ШИМ) микроконтроллер
  • GND — минус питания GND микроконтроллера и управления микросхемы TB6612FNG

Каждый вывод и его функции описаны в таблице ниже.

AIN1 / BIN1 AIN2 / BIN2 PWMA / PWMB A01 / B01 A02 / B02 Режимы работы электромоторов
HIGH HIGH HIGH/LOW LOW LOW Short brake — Торможение на небольшой промежуток времени, обычно указывается время в миллисекундах (1/1000 секунды)
LOW HIGH HIGH LOW HIGH CCW — Вращение по часовой стрелке
LOW HIGH LOW LOW LOW Short brake — Торможение на небольшой промежуток времени, обычно указывается время в миллисекундах (1/1000 секунды)
HIGH LOW HIGH HIGH LOW CW — Вращение против часовой стрелке
HIGH LOW LOW LOW LOW Short brake — Торможение на небольшой промежуток времени, обычно указывается время в миллисекундах (1/1000 секунды)
LOW LOW HIGH OFF OFF Stop —  Стоп
TestRun.ino
TB6612FNG H-Bridge Motor Driver Example code
Michelle @ SparkFun Electronics
8/20/16
https://github.com/sparkfun/SparkFun_TB6612FNG_Arduino_Library

Программа предназначена для управления 2 моторами, чтобы показать примеры функций в библиотеке. Ваш
робот, по заданной программе, выполнит каждое движение в прямом и противоположное направлении,
поэтому, если ваши моторы сбалансированы, робот должен оказаться в том же месте, где и
начинал движение.

Resources:
TB6612 SparkFun Library

Development environment specifics:
Developed on Arduino 1.6.4
Developed with ROB-9457
******************************************************************************/

// Подключаем библиотеку SparkFun_TB6612.h которая содержит class Motor и все 
// функции для этого класса
#include <SparkFun_TB6612.h>
// #define DEFAULTSPEED 255 
// Определяем контакты для всех входов/выходов,(не забудьте сравнить номера контактов на схеме и в программе они различаются) 
// Самое главное, чтобы входы PWMA PWMB на микросхеме TB6612FNG были соединены с выходами ШИМ на стороне Arduino, 
// обычно кроме номера имеют тильду "~" в своем обозначении. Эти выводы управляют скоростью вращения моторами.
#define AIN1 2
#define BIN1 7
#define AIN2 4
#define BIN2 8
#define PWMA 5
#define PWMB 6
#define STBY 9

// Если, после сборки Вашего робота, моторы вращаются не в том направлении, например при выполнении функции forward, чтобы не перепаивать 
// провода на моторах, проще изменить значения этих констант. Значение констант могут быть 1 или -1.
const int offsetA = 1;
const int offsetB = 1;

// Инициализация моторов. Создаём ОБЪЕКТЫ motor1 и motor2 КЛАССА Motor, прописанного в библиотеке SparkFun_TB6612.h
Motor motor1 = Motor(AIN1, AIN2, PWMA, offsetA, STBY);
Motor motor2 = Motor(BIN1, BIN2, PWMB, offsetB, STBY);

void setup()
{
//Здесь ничего
}


void loop()
{
 // К объекту motor1 применим метод drive() с аргументами: скорости от -225 до 225                 
 // и продолжительности (этот аргумент не обязателен) вращения в миллисекундах. Отрицательная скорость переключает мотор
 // на вращение в обратном направлении. 
 // Тормозим функцией brake(). И делаем паузу delay() в 1 секунду.
   motor1.drive(255,1000);
   motor1.drive(-255,1000);
   motor1.brake();
   delay(1000);
   
   //Аналогичные действия применим к объекту motor2.
   motor2.drive(255,1000);
   motor2.drive(-255,1000);
   motor2.brake();
   delay(1000);
   
   // Для движения вперед используем функцию  forward(), у которой в качестве аргументов два объекта motor1, motor2
   // и скорость (аргумент не обязателен). Если для скорости используются отрицательные числа,
   // то получим движение назад
   forward(motor1, motor2, 150);
   delay(1000);
   
   // Для движения назад используем функции back(), с аргументами аналогичными функции forward()
   // если значение скорости отрицательно, то получаем движение назад.
   back(motor1, motor2, -150);
   delay(1000);
   
  // Использование функции торможения, которая принимает в качестве аргументов два двигателя.
  // Обратите внимание, что функции не останавливают двигатели сами по себе.
   brake(motor1, motor2);
   delay(1000);
    
 // Для поворота или разворота на месте классической двухколесной тележки робота, используем функции поворот на лево left()
 // и поворот на право right(), которые принимают в качестве аргументов два
 // мотора и скорость. Эти функции заставляют оба двигателя вращаться в разных направлениях со скоростью в 2 раза меньшей указанной в
 // этих функциях. 
   left(motor1, motor2, 100);
   delay(1000);
   right(motor1, motor2, 100);
   delay(1000);
   
   //Use of brake again.
   brake(motor1, motor2);
   delay(1000);
   
}
Для тех кто хочет подробнее разобраться с примером МоторTestRun прилагаем листинг библиотеки SparkFun_TB6612.h
SparkFun_TB6612.h
TB6612FNG H-Bridge Motor Driver Example code
Michelle @ SparkFun Electronics
8/20/16
https://github.com/sparkfun/SparkFun_TB6612FNG_Arduino_Library
 /******************************************************************************
Uses 2 motors to show examples of the functions in the library. This causes
a robot to do a little ‘jig’. Each movement has an equal and opposite movement
so assuming your motors are balanced the bot should end up at the same place it
started.
Resources:
TB6612 SparkFun Library
Development environment specifics:
Developed on Arduino 1.6.4
Developed with ROB-9457
******************************************************************************/
#ifndef SPARKFUN_TB6612_h
#define SPARKFUN_TB6612_h
#include <Arduino.h>
//used in some functions so you don’t have to send a speed
#define DEFAULTSPEED 255
class Motor
{
public:
// Constructor. Mainly sets up pins.
Motor(int In1pin, int In2pin, int PWMpin, int offset, int STBYpin);
// Drive in direction given by sign, at speed given by magnitude of the
//parameter.
void drive(int speed);
// drive(), but with a delay(duration)
void drive(int speed, int duration);
//currently not implemented
//void stop(); // Stop motors, but allow them to coast to a halt.
//void coast(); // Stop motors, but allow them to coast to a halt.
//Stops motor by setting both input pins high
void brake();
//set the chip to standby mode. The drive function takes it out of standby
//(forward, back, left, and right all call drive)
void standby();
private:
//variables for the 2 inputs, PWM input, Offset value, and the Standby pin
int In1, In2, PWM, Offset,Standby;
//private functions that spin the motor CC and CCW
void fwd(int speed);
void rev(int speed);
};
//Takes 2 motors and goes forward, if it does not go forward adjust offset
//values until it does. These will also take a negative number and go backwards
//There is also an optional speed input, if speed is not used, the function will
//use the DEFAULTSPEED constant.
void forward(Motor motor1, Motor motor2, int speed);
void forward(Motor motor1, Motor motor2);
//Similar to forward, will take 2 motors and go backwards. This will take either
//a positive or negative number and will go backwards either way. Once again the
//speed input is optional and will use DEFAULTSPEED if it is not defined.
void back(Motor motor1, Motor motor2, int speed);
void back(Motor motor1, Motor motor2);
//Left and right take 2 motors, and it is important the order they are sent.
//The left motor should be on the left side of the bot. These functions
//also take a speed value
void left(Motor left, Motor right, int speed);
void right(Motor left, Motor right, int speed);
//This function takes 2 motors and and brakes them
void brake(Motor motor1, Motor motor2);
#endif