舵机¶
概览¶
MoonBot Kit 主控模块 最多可连接四个 舵机模块 。 在 Arduino 库中,我们也提供了 舵机 库,通过这个库,您可以控制一个或多个舵机同时运动。
舵机库 继承了 Arduino 基础的舵机驱动 class Servo
类,除了基础的 Servo
类成员函数外,我们还提供了舵机校准、多个舵机同时运行等功能的函数。
在 MoonBot.h
头文件中,我们提供了四个变量 m_servo[kServo1]
m_servo[kServo2]
m_servo[kServo3]
m_servo[kServo4]
,以分别驱动主控上对应的四个舵机接口。
基础应用¶
先来看一个舵机的基础应用:
#include <MoonBot.h>
int pos;
void setup() {
m_servo[kServo1].attach(kServo1, true); // attaches servo on servo port 1, and reverse directions
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
m_servo[kServo1].write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
m_servo[kServo1].write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
注解
舵机的初始化函数已改为 attach(moonbot_servo_t servo_port, bool reverse)
,基础的舵机初始化函数 uint8_t attach(int pin)
已不受支持。
多个舵机同时运动¶
我们提供了 void MoonBotServo::setTargetAngle()
和 MoonBotServo::moveAllServoToTarget()
函数来让多个舵机同时运动。
#include <MoonBot.h>
void setup() {
for (int i = 0; i < kServoNum; ++i) {
m_servo[i].attach((moonbot_servo_t)i); // attaches servo
}
}
void loop() {
// in steps of 1 degree
for (int i = 0; i < kServoNum; ++i) {
m_servo[i].setTargetAngle(180, 1); // set all servo to go to position in variable '180', speed 1 degree per pulse(20ms)
}
MoonBotServo::moveAllServoToTarget(); // move all servo to target angle
for (int i = 0; i < kServoNum; ++i) {
m_servo[i].setTargetAngle(0, 1); // set all servo to go to position in variable '0', speed 1 degree per pulse(20ms)
}
MoonBotServo::moveAllServoToTarget(); // move all servo to target angle
}
注解
当使用 MoonBotServo::moveAllServoToTarget();
函数的默认参数时,该函数会等待所有舵机动作运行完成后退出;
当参数不为0时,会在参数指定时间内退出,并返回动作是否完成。我们可以通过调用 bool isMoving(void);
来每隔一段时间检查一次当前的运行状态:
while (!MoonBotServo::moveAllServoToTarget(0)) {
// 当检测到当前有舵机在进行运动时
for (int i = 0; i < kServoNum; ++i) {
if (!m_servo[i].isMoving()) {
// 如果检查到当前端口舵机停止运行,打印舵机状态
Serial.print("Servo");
Serial.print(i);
Serial.println(" Stopped.");
}
}
}
Serial.println("All Servo Stopped.");
改为以上形式后,使用串口调试软件即会接收到类似以下的信息
Servo1 Stopped.
...
Servo1 Stopped.
Servo2 Stopped.
...
Servo2 Stopped.
Servo3 Stopped.
...
Servo3 Stopped.
All Servo Stopped.
API 参考 - 舵机¶
枚举¶
- enum moonbot_servo_t
舵机端口类型
值:
- kServo1
- kServo2
- kServo3
- kServo4
- kServoNum
舵机端口数量
类¶
- class MoonBotServo
MoonBot Kit 舵机驱动库
- 成员函数
- uint8_t attach(moonbot_servo_t servo_port, bool reverse = MOONBOT_SERVO_REVERSE);
初始化舵机至对应的舵机端口
- 参数
servo_port
:舵机端口reverse
:翻转舵机角度
- 返回
NOT_A_PORT
舵机端口无效,其他初始化正确
- uint8_t attach(moonbot_servo_t servo_port, int min, int max, bool reverse = MOONBOT_SERVO_REVERSE);
初始化舵机至对应的舵机端口,并指定舵机的运行范围
- 参数
servo_port
:舵机端口min
:舵机最小运行角度max
:舵机最大运行角度reverse
:翻转舵机角度
- 返回
NOT_A_PORT
舵机端口无效,其他初始化正确
- void detach(void);
断开舵机与对应端口的连接
- void write(int value);
向舵机写入角度
- 参数
value
:角度值,取值范围0~180°
- int read(void);
读取舵机当前角度
- 返回
当前角度值
- void reverse(bool state);
以90°为中心点,翻转舵机角度。
- 参数
state
:状态,true
为翻转角度,否则为默认方向
- void setTargetAngle(int angle, unsigned int speed = 1);
预设舵机角度,需与函数
static bool moveAllServoToTarget()
配合使用。
- 参数
angle
:预设角度speed
:每个脉冲角度的变化量
- void stop(void);
停止舵机动作
- void power(bool state);
开启或断开舵机供电。
- 参数
state
:舵机供电状态,true
为开启供电
- void correction(int angle_offset);
舵机校准
- 参数
angle_offset
:舵机校准角度值,取值范围:±90°
- bool isMoving(void);
读取舵机当前运动状态。
- 返回
true
为当前正在运动,反之为当前没有运动
- bool isPowerOverload(void);
检测当前是否电流过载。
- 返回
true
为当前电流过载,反之为正常
- 静态成员函数
- static bool moveAllServoToTarget(unsigned long timeToWait_ms = 0xFFFFFFFF);
移动所有舵机值预设角度。
- 参数
timeToWait_ms
:等待时间,默认为直至舵机移动到预设角度(无限长)
- 返回
true
完成移动到预设角度动作,反之未完成动作
- static void stopAllServo(void);
停止所有舵机的动作。