Arduino用串口控制两个270°舵机

驱动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);

用串口控制舵机

我先参考的这个帖子https://blog.csdn.net/m0_46152804/article/details/123517027?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169103029016800215024271%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169103029016800215024271&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-123517027-null-null.142^v92^chatgptT3_1&utm_term=Arduino%E4%B8%B2%E5%8F%A3%E6%8E%A7%E5%88%B6%E8%88%B5%E6%9C%BA%E8%A7%92%E5%BA%A6&spm=1018.2226.3001.4187

但是每次从串口输入完角度后都会回到0

 

查阅资料发现是Serial.parseInt() 函数在没有接收到有效数字时会返回0,这就导致了 angle1 始终为0 的问题。

然后参考了这篇帖子https://blog.csdn.net/ling3ye/article/details/47123683?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-47123683-blog-123517027.235^v38^pc_relevant_sort_base2&spm=1001.2101.3001.4242.1&utm_relevant_index=3

使用了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')读取第二个角度值。这样可以确保正确地接收两个角度值,并且分别将其存储在angle1angle2变量中。

现在,在串口监视器中输入两个角度值,用空格分隔,并在最后以换行符结束(例如:"90 180\n"),两个舵机就可以根据输入的角度值进行控制

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于STM32F407的双舵机控制系统是一种用于控制两个舵机运动的系统。舵机是一种特殊的电机,可以通过电信号控制舵机转动到特定的角度位置。 在该控制系统中,STM32F407是主控芯片,具有较强的处理能力和丰富的外设接口。系统通过接口将STM32F407与双舵机连接,实现对双舵机控制。 首先,系统需要通过某种通信协议(如UART、SPI、I2C等)将STM32F407与一块舵机驱动板连接起来。舵机驱动板为舵机提供所需的电压和电流,并且能够根据STM32F407发送的信号来控制舵机的转动。 接着,STM32F407通过GPIO口输出对应的控制信号,包括舵机的角度和方向等信息。这些控制信号通过舵机驱动板传递到舵机上,从而使舵机按照设定的角度进行转动。 同时,STM32F407通过编程和算法设计,可以实现对舵机的精确控制。可以通过设定不同的角度值、转速和加速度等参数,使得舵机可以按照预期的运动轨迹进行运动。 双舵机控制系统可以应用于很多领域,如机器人、无人机、智能车等。通过控制舵机的转动,可以实现对机器人、无人机等设备的导航、定位、运动等功能。 总之,基于STM32F407的双舵机控制系统是一种用于控制舵机运动的系统,通过STM32F407主控芯片和舵机驱动板的协作,实现舵机的转动控制。该系统具有较高的精度和灵活性,可以应用于不同的领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值