一、舵机180度和270度
Arduino库文件中设置最大180度,如果是270度舵机需要手动修改库文件。
这几个文件夹中都要修改
二、舵机简单正反转运动
1、180度舵机
#include <Servo.h> //加载文件库
int pos = 0;
Servo myservo;
#define MOTOR_IO 46 //舵机引脚void setup()
{Serial.begin(9600); //开启串口,波特率9600 myservo.attach(MOTOR_IO, 500, 2500); //修正脉冲宽度,引脚4
}void loop()
{//舵机正转180度for (pos = 0; pos <= 180; pos += 1) //pos+=1等价于pos=pos+1{ myservo.write(pos);delay(20); } //舵机反转180度for (pos = 180; pos >= 0; pos -= 1) {myservo.write(pos);delay(20); }
}
2、270度舵机正反转
#include <Servo.h> //加载文件库
int pos = 0;
Servo myservo;
#define MOTOR_IO 46 //舵机引脚void setup()
{Serial.begin(9600); //开启串口,波特率9600 myservo.attach(MOTOR_IO, 500, 2500); //修正脉冲宽度,引脚4
}void loop()
{//舵机正转270度for (pos = 0; pos <= 270; pos += 1) //pos+=1等价于pos=pos+1{ myservo.write(pos);delay(20); } //舵机反转270度for (pos = 270; pos >= 0; pos -= 1) {myservo.write(pos);delay(20); }
}
三、PS2手柄控制舵机
Arduino使用PS2手柄控制舵机_arduino ps2手柄-CSDN博客
四、串口控制舵机
接收数据格式
比如:
"180,1000",1000毫秒转动到180度
"0,500",500毫秒转动到0度
库文件最大支持舵机转动到180度
#include <Servo.h> //加载文件库
int pos = 0;
int targetPos=0;
int lastPos=0;
int motorTime=0;
Servo myservo;
#define MOTOR_IO 46 //舵机引脚void setup()
{Serial.begin(9600); //开启串口,波特率9600 myservo.attach(MOTOR_IO, 500, 2500); //修正脉冲宽度,引脚4
}void loop()
{/*//舵机正转180度for (pos = 0; pos <= 180; pos += 1) //pos+=1等价于pos=pos+1{ myservo.write(pos);delay(20); } //舵机反转180度for (pos = 180; pos >= 0; pos -= 1) {myservo.write(pos);delay(20); }
*/
}//串口0中断
void serialEvent()
{ // 检查串口0是否有数据可用if(Serial.available() > 0) {// 读取字符串直到遇到换行符或达到缓冲区大小限制String receivedData = Serial.readStringUntil('\n'); //String data = "hello,world,this,is,arduino";//接收数据格式:"180,100"String data =receivedData;int commaIndex;String result; while ((commaIndex = data.indexOf(',')) != -1) {result = data.substring(0, commaIndex);//Serial.print("Found: ");//Serial.println(result);lastPos=targetPos;targetPos=result.toInt();data = data.substring(commaIndex + 1); // 移除已处理的部分,继续查找下一个逗号}//Serial.print("Last: ");//Serial.println(data); // 输出最后一个元素motorTime=data.toInt();int delayTime=0;delayTime=abs(motorTime/(targetPos-lastPos));if(targetPos>lastPos){for (pos = lastPos; pos <= targetPos; pos += 1) //pos+=1等价于pos=pos+1{ myservo.write(pos);delay(delayTime); } }else{for (pos = lastPos; pos >= targetPos; pos -= 1) {myservo.write(pos);delay(delayTime); }}Serial.print("targetPos: ");Serial.println(targetPos);}else {// 如果没有数据,可以添加一些延时以避免CPU过度占用(可选)delay(10); // 例如延时10毫秒}
}