Эта библиотека реализует программный интерфейс к L-MotorShield - плате расширения для Arduino на базе микросхемы L293, предоставляя удобный доступ к подключенным к ней моторам и сервомашинкам. К плате L-MotorShield может быть подключено до 2 моторов и до 4 сервомашинок, и доступ из библиотеки к ним может быть как одиночным, так и пакетным, по несколько сразу.
Для сервомашинок используется стандатное управление через библиотеку Servo, а моторы управляются двумя обязательными сигналами - PWM (ШИМ, скорость) и DIR (направление), и одним опциональным - BRK (резкое торможение).
PWM | DIR | BRK | |
---|---|---|---|
Мотор 1 | 11 | 8 | 4 |
Мотор 2 | 3 | 7 | 2 |
Серво 1 | 10 | ||
Серво 2 | 9 | ||
Серво 3 | 6 | ||
Серво 4 | 5 |
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);
void begin(unsigned selected_units);
void 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);
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);
uint8_t getMotorLastSpeed(uint8_t motor);
LMS_Direction getMotorDirection(uint8_t motor);
bool getMotorBreak(uint8_t motor);
uint8_t getServoLastAngle(uint8_t servo);
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
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
LMotorShield lms; lms.begin(LMS_SERVOS & ~LMS_SERVO3);Здесь мы сбросили бит, соответствующий третьей серве, в маске для всех серв, тем самым исключив её из инициализации
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