Arduino控制舵机

一、舵机180度和270度

Arduino库文件中设置最大180度,如果是270度舵机需要手动修改库文件。

Arduino控制舵机_第1张图片

这几个文件夹中都要修改

Arduino控制舵机_第2张图片

二、舵机简单正反转运动

1、180度舵机


#include  //加载文件库
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  //加载文件库
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  //加载文件库
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毫秒
  }
}

你可能感兴趣的:(电子&单片机,Arduino,单片机,嵌入式硬件)