天天看点

arduino舵机代码_第十二享,舵机控制

准备:arduino板,舵机,面包板和杜邦线等。

    就是这个东西

arduino舵机代码_第十二享,舵机控制

 原理与控制方式:

    舵机有三条控制线,分别是电源、地、信号线。电源和地用于提供内部的直流马达及控制线所需的能量,电压通常介于4V-6V,由于舵机内部的马达会产生噪声,所以该电源应该尽可能与处理系统的电源隔离,即舵机最好单独供电。信号线控制为一PWM信号,高电平时间通常在1ms-2ms,低电平时间应在5ms-20ms,舵机每20ms必须收到高电平信号,否则舵机将断电,并且不能维持原来的位置。下图展示了一个典型PWM信号与舵机位置的关系。

arduino舵机代码_第十二享,舵机控制

  当然这是一个大概的对应关系,可根据实际情况调节,其他角度按以上关系控制。

    电路连接图如图

arduino舵机代码_第十二享,舵机控制

    不用多解释,5V、GND、信号线接6号引脚。(哪个引脚都行)

上代码

1,我们根据上面的对应关系,写个最简单的代码,使舵机转动到固定角度。比如比如135°-2ms-2000us。

void setup()

{

  pinMode(6,OUTPUT);

}

void loop()

  delay(15);

  digitalWrite(6,HIGH);

  delayMicroseconds(2000);

  digitalWrite(6,LOW);

  delay(15);

}

2,我们让它在0°和180°之间摇摆

int n;

void setup(){

  pinMode(6,OUTPUT);

}

void loop(){ 

  for(int i=0;i<=50;i++){ //产生PWM个数,等效延时以保证能转到响应角度

    servogo(1);

  }

  for(int i=0;i<=50;i++){ //产生PWM个数,等效延时以保证能转到响应角度

    servogo(18);

  }

}

void servogo(int angle){//angle=1~18 .对应20°~180°

  n=(angle*110)+500;//将角度转化为500-2480 的脉宽值

  digitalWrite(6,HIGH);

  delayMicroseconds(n);

  digitalWrite(6,LOW);

  delay(20-n/1000);//延时周期内剩余时间

}

效果看一下

3,串口控制,输入角度值,转动到指定角度

int n;

int val;//val=0~9 .对应0°~180°

void setup(){

  pinMode(6,OUTPUT);

  Serial.begin(9600);

}

void loop(){ 

  if(Serial.available()){

    val=Serial.read();

    val=val-'0';//将ASCII码转换成数值,例'9'-'0'=0x39-0x30=9

    val=val*2;

  }

  servogo(val);

}

void servogo(int angle){//angle=1~18 .对应20°~180°

  n=(angle*110)+500;//将角度转化为500-2480 的脉宽值

  digitalWrite(6,HIGH);

  delayMicroseconds(n);

  digitalWrite(6,LOW);

  delay(20-n/1000);//延时周期内剩余时间

}

看一下效果

4,串口控制,‘W’、‘S’键盘控制角度增减

int n;

int val;//val=0~18 .对应0°~180°

int a=0;

void setup(){

  pinMode(6,OUTPUT);

  Serial.begin(9600);

}

void loop(){ 

  if(Serial.available()){

    val=Serial.read();

    switch(val){

      case 'W':

        a+=2;

        if(a>18){

          a=18;

        }

        break;

      case 'S':

       a-=2;

       if(a<0){

         a=0;

       }

       break;

       default:

       break;

    }

  }

  servogo(a);

}

void servogo(int angle){//angle=1~18 .对应20°~180°

  n=(angle*110)+500;//将角度转化为500-2480 的脉宽值

  digitalWrite(6,HIGH);

  delayMicroseconds(n);

  digitalWrite(6,LOW);

  delay(20-n/1000);//延时周期内剩余时间

}

看一下效果

代码为什么这样写?for循环有点儿莫名其妙?

我的舵机为什么喜欢抖动?抽搐?

还请听下回分解!