LMotorShield

Содержание:

Эта библиотека реализует программный интерфейс к L-MotorShield - плате расширения для Arduino на базе микросхемы L293, предоставляя удобный доступ к подключенным к ней моторам и сервомашинкам. К плате L-MotorShield может быть подключено до 2 моторов и до 4 сервомашинок, и доступ из библиотеки к ним может быть как одиночным, так и пакетным, по несколько сразу.

Для сервомашинок используется стандатное управление через библиотеку Servo, а моторы управляются двумя обязательными сигналами - PWM (ШИМ, скорость) и DIR (направление), и одним опциональным - BRK (резкое торможение).

Пины Arduino для управления по умолчанию
PWMDIRBRK
Мотор 11184
Мотор 2372
Серво 110
Серво 29
Серво 36
Серво 45

Классы

Для работы с платой служит класс LMotorShield. Так как плат на Arduino может быть установлено больше одной, число экземпляров класса не ограничено - можно создавать по экземпляру на каждый L-MotorShield.

Методы

void remapMotorPins(uint8_t motor_num, uint8_t pwm_pin, uint8_t dir_pin, uint8_t brk_pin);
void remapServoPins(uint8_t servo_num, uint8_t signal_pin);
Переназначают пины L-MotorShield на указанные. Полезно, если ву вас вдруг оказались занятыми пины, указанные в таблице выше. Сервомашинки и моторы нумеруются с единицы - так же, как они подписаны на плате.

void begin(unsigned selected_units);
void end();
Метод begin() принимает в качестве аргумента битовую комбинацию подключаемых устройств. Описание соответствующих констант смотрите ниже в соотвествующем разделе. Метод end() добавлен пока просто для симметрии, так как в данный момент он ничего не делает.

void motorSpeed(uint8_t motor, uint8_t speed);

void motorDirection(uint8_t motor, LMS_Direction direction);
void motorForward(uint8_t motor);
void motorBackward(uint8_t motor);

void motorBreak(uint8_t motor, bool on);
void motorStop(uint8_t motor);
void motorRun(uint8_t motor);
Основные функции для работы с моторами: задать скорость от 0 до 255 - motorSpeed(), направление вперёд/назад - motorDirection() и застопорить/дать газу - motorBreak(). Для пущего удобства есть также motorForward() и motorBackward() в качестве обёрток вокруг motorDirection(), а также motorStop() и motorRun() в качестве обёрток покруг motorBreak().

void multipleMotorSpeed(unsigned selected_motors, uint8_t speed);

void multipleMotorDirection(unsigned selected_motors, LMS_Direction direction);
void multipleMotorForward(unsigned selected_motors);
void multipleMotorBackward(unsigned selected_motors);

void multipleMotorBreak(unsigned selected_motors, bool on);
void multipleMotorStop(unsigned selected_motors);
void multipleMotorRun(unsigned selected_motors);
Всё то же самое, но можно задать одинаковые параметры сразу нескольким моторам, передав в метода соответствующую битову маску. См. раздел Константы

void servoWrite(uint8_t servo, uint8_t angle);
void multipleServoWrite(unsigned selected_servos, uint8_t angle);
Вызов servoWrite() аналогичен вызову write() для объекта класса Servo из соответствующей библиотеки - тоже задаёт угол поворота, только номер сервы нужно передать в метод. multipleServoWrite(), соответственно, для задания угла сразу нескольким сервам.

uint8_t getMotorLastSpeed(uint8_t motor);
LMS_Direction getMotorDirection(uint8_t motor);
bool getMotorBreak(uint8_t motor);
uint8_t getServoLastAngle(uint8_t servo);
Эти методы возвращают последние заданные параметры для указанного мотора или сервомашинки: getMotorLastSpeed() - скорость вращения мотора, getMotorDirection() - направление его вращения, getMotorBreak() - признак установки стопора, getServoLastAngle() - угол поворота сервомашинки.

Константы

LMS_MOTORS_QUANTITY = 2
LMS_SERVOS_QUANTITY = 4
блаблабла

LMS_FIRST_MOTOR = 1 << 0
LMS_MOTOR1 = LMS_FIRST_MOTOR
LMS_MOTOR2 = LMS_FIRST_MOTOR << 1
LMS_MOTORS = LMS_MOTOR1 | LMS_MOTOR2
Битовые маски для использования в методах multiple*()., которые работают с моторами - в том числе begin().

LMS_FIRST_SERVO = LMS_FIRST_MOTOR << LMS_MOTORS_QUANTITY
LMS_SERVO1 = LMS_FIRST_SERVO << 0
LMS_SERVO2 = LMS_FIRST_SERVO << 1
LMS_SERVO3 = LMS_FIRST_SERVO << 2
LMS_SERVO4 = LMS_FIRST_SERVO << 3
LMS_SERVOS = LMS_SERVO1 | LMS_SERVO2 | LMS_SERVO3 | LMS_SERVO4
Битовые маски для использования в методах multiple*()., которые работают с сервомашинками, включая begin(). Битовые маски легко комбинировать - например, если нужно включить все сервы, кроме третьей, это можно сделать так:
LMotorShield lms;
lms.begin(LMS_SERVOS & ~LMS_SERVO3);
Здесь мы сбросили бит, соответствующий третьей серве, в маске для всех серв, тем самым исключив её из инициализации

LMS_Direction
{
LMS_FORWARD = HIGH
LMS_BACKWARD = LOW
}
Вращение мотора вперёд/назад.

Примеры

#include <Servo.h>
#include <LMotorShield.h>

LMotorShield lms;

void setup()
{
  /* Задействуем все моторы и все сервы */
  lms.begin(LMS_MOTORS | LMS_SERVOS);
}

void loop()
{
  lms.motorSpeed(1, 30); // первому двигателю ставим скорость 30
  lms.motorDirection(1, LMS_FORWARD); // и задаём направление вращения - прямо
  
  lms.motorSpeed(2, 30); // второму двигателю ставим скорость 30
  lms.motorBackward(2);  // и запускаем его назад

  lms.multipleServoWrite(LMS_SERVOS, 90); // все сервы повернуть на 90 градусов

  delay(2000);

  lms.multipleMotorSpeed(LMS_MOTORS, 60); // обоим моторам задаём скорость 60
  
  /* Выставляем сервы по-одной, на разные углы */
  lms.servoWrite(1, 30);  // первую на 30 градусов
  lms.servoWrite(2, 60);  // вторую на 60 градусов
  lms.servoWrite(3, 120); // ...
  lms.servoWrite(4, 150); // ну, вы поняли =)

  delay(2000);

  lms.multipleMotorStop(LMS_MOTORS); // затормаживаем оба мотора сразу
  lms.multipleServoWrite(LMS_SERVO1 | LMS_SERVO2, 0); // первую и вторую сервы в 0 градусов
  lms.multipleServoWrite(LMS_SERVO3 | LMS_SERVO4, 180); // 3 и 4 на 180

  delay(2000);

  lms.motorRun(1); // растормаживаем 1 мотор (поедет со скоростью 60 вперёд)
  lms.motorRun(2); // растормаживаем 1 мотор (поедет со скоростью 60 назад)
}
Copyright (C) 2011 Artem Borisovskiy (bytefu@gmail.com), http://robocraft.ru
This library is licensed under the terms of GNU Lesser General Public License (GPL) version 2.1