Arduino舵机控制1

来源:互联网 发布:程序员适合写那些博客 编辑:程序博客网 时间:2024/05/01 20:57

Arduino:舵机控制

舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。

舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,请大家注意。


舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。


舵机角度和占空比的关系
下面这个小实验的目标是用电位器控制舵机的角度,正好在前一个实验里,电位器都还没有拆掉。需要特别注意的是供电部分,舵机转动时电流会比较大,Arduino上的电源芯片可能会因过流保护到发热而损坏,电源需要接到外部供电,切不可使用USB供电。
舵机的棕色线接GND,红色线接VIN(我猜这个是直接连到外接电源的正极),黄色是数据线,接在PWM的7号管脚。电位器的连接稍微有点变换,因为管脚们施展不开,我把正极连在3.3V的接口上,这样模拟输入的范围就变成了0到660左右。前面说了,舵机分别用0.5ms到2.5ms之间的脉冲来对应0到180度左右的角度,我们可以用pulsewidth=(angle*11)+500这样的公式,把0到180度的转角映射到500到2480的脉冲时间。

代码:

view plaincopy to clipboardprint?
01.int readPin = 6;   //用来连接电位器  
02.int servopin = 7;    //定义舵机接口数字接口7  
03.
04.void servopulse(int angle)//定义一个脉冲函数  
05.{  
06. int pulsewidth=(angle*11)+500; //将角度转化为500-2480的脉宽值  
07. digitalWrite(servopin,HIGH);    //将舵机接口电平至高  
08. delayMicroseconds(pulsewidth); //延时脉宽值的微秒数  
09. digitalWrite(servopin,LOW);     //将舵机接口电平至低  
10. delayMicroseconds(20000-pulsewidth);  
11.}  
12.
13.void setup()  
14.{  
15.   pinMode(servopin,OUTPUT);//设定舵机接口为输出接口  
16.}  
17.
18.void loop()  
19.{  
20. //读取电位器(传感器)的读数,接到3.3V,值范围从0到660左右  
21. int readValue = analogRead(readPin);  
22. //把值的范围映射到0到165左右  
23. int angle = readValue / 4;  
24. //发送50个脉冲  
25. for(int i=0;i<50;i++)  
26. {  
27.     //引用脉冲函数  
28.     servopulse(angle);  
29. }  
30.}
int readPin = 6;   //用来连接电位器
int servopin = 7;    //定义舵机接口数字接口7

void servopulse(int angle)//定义一个脉冲函数
{
int pulsewidth=(angle*11)+500; //将角度转化为500-2480的脉宽值
digitalWrite(servopin,HIGH);    //将舵机接口电平至高
delayMicroseconds(pulsewidth); //延时脉宽值的微秒数
digitalWrite(servopin,LOW);     //将舵机接口电平至低
delayMicroseconds(20000-pulsewidth);
}

void setup()
{
   pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
}

void loop()
{
//读取电位器(传感器)的读数,接到3.3V,值范围从0到660左右
int readValue = analogRead(readPin);
//把值的范围映射到0到165左右
int angle = readValue / 4;
//发送50个脉冲
for(int i=0;i<50;i++)
{
     //引用脉冲函数
     servopulse(angle);
}
}
实验结果:当旋转电位器的时候,舵机的角度随之改变。不过最终转角并没有达到180度,在某些范围内,电位器旋转时,舵机没有转动。网上舵机的说明也提到了这点,识别的角度范围是有限的。具体的有效角度范围,我还没有测量,等将来开始制作的时候再说。

0 0
原创粉丝点击