驱动270°舵机的方法
驱动舵机一般是用脉冲宽度500~2500us的PWM方波,所以对于270度舵机,则需要将0~270°映射到这个脉冲宽度。
angle1 = constrain(angle1, 0, 270); // 限制角度在0到270之间
int pulseWidth1 = map(angle1, 0, 270, minPulseWidth, maxPulseWidth);//将0~270°映射到脉冲宽度
servo1.writeMicroseconds(pulseWidth1);
用串口控制舵机
但是每次从串口输入完角度后都会回到0
查阅资料发现是Serial.parseInt()
函数在没有接收到有效数字时会返回0,这就导致了 angle1
始终为0 的问题。
使用了Serial.read()函数,解决了这个问题
以下是用串口控制1个270°舵机的代码
#include <Servo.h> // 引入lib
Servo myservo; // 创建一个伺服电机对象
char inByte = 0; // 串口接收的数据
int angle = 0; // 角度值
String temp = ""; // 临时字符变量,又或者说是缓存用的吧
void setup()
{
myservo.attach(9); // 定义舵机的引脚为9,舵机只能是10,或者9引脚
Serial.begin(9600); // 设置波特率
Serial.println("Please input serial data.");
}
void loop()
{
while (Serial.available() > 0) // 判断串口是否有数据
{
inByte = Serial.read(); // 读取数据,串口一次只能读1个字符
temp += inByte; // 把读到的字符存进临时变量里面缓存,
// 再继续判断串口还有没有数据,直到把所有数据都读取出来
}
if (temp != "") // 判断临时变量是否为空
{
angle = temp.toInt(); // 把变量字符串类型转成整型
angle = constrain(angle, 0, 270); // 限制角度在 0 到 270 之间
Serial.print("Set servo angle: ");
Serial.println(angle); // 输出数据到串口上,以便观察
}
temp = ""; // 清空临时变量
int pulseWidth = map(angle, 0, 270, 500, 2500); // 将角度映射到舵机控制信号的脉冲宽度范围
myservo.writeMicroseconds(pulseWidth); // 控制舵机转动相应的角度
delay(100); // 延时100毫秒
}
用串口控制两个270°舵机
然后我想用串口控制两个270舵机,(但要注意,Arduino板子给两个舵机供电比较吃力,需要外接电源才行)于是我又升级了代码。
以下是用串口控制两个270度舵机的程序
#include <Servo.h>
#define PIN_SERVO_1 9
#define PIN_SERVO_2 10
Servo servo1;
Servo servo2;
const int minPulseWidth = 500; // 对应0度位置
const int maxPulseWidth = 2500; // 对应270度位置
void setup() {
servo1.attach(PIN_SERVO_1);
servo2.attach(PIN_SERVO_2);
Serial.begin(9600); // 启动串口通讯,传输波特率9600
Serial.println("Please input servo angles (0~270) separated by a space.");
}
void loop() {
if (Serial.available() > 0) {
int angle1, angle2;
String input = Serial.readStringUntil(' ');
angle1 = input.toInt();
Serial.print("Angle 1: ");
Serial.println(angle1); // 输出angle1的值
input = Serial.readStringUntil('\n');
angle2 = input.toInt();
Serial.print("Angle 2: ");
Serial.println(angle2); // 输出angle2的值
angle1 = constrain(angle1, 0, 270); // 限制角度在0到270之间
angle2 = constrain(angle2, 0, 270); // 限制角度在0到270之间
int pulseWidth1 = map(angle1, 0, 270, minPulseWidth, maxPulseWidth);//将0~270°映射到脉冲宽度
int pulseWidth2 = map(angle2, 0, 270, minPulseWidth, maxPulseWidth);
servo1.writeMicroseconds(pulseWidth1);
servo2.writeMicroseconds(pulseWidth2);
}
}
使用Serial.readStringUntil(' ')
读取第一个角度值,并使用Serial.readStringUntil('\n')
读取第二个角度值。这样可以确保正确地接收两个角度值,并且分别将其存储在angle1
和angle2
变量中。
现在,在串口监视器中输入两个角度值,用空格分隔,并在最后以换行符结束(例如:"90 180\n"),两个舵机就可以根据输入的角度值进行控制