四轴飞行器进展

经过了几个星期的折腾,四轴飞行器电机控制方式终于有所突破,先上图 哈哈

photo

其实这个电路十分简单,就是两个按钮接入Arduino,然后Arduino输出PWM信号到电调,电调再输出电流到电机,从而就行成了按钮控制电机的一个装置。

不过,在完成这样一个小小的系统也经历了很多挫折。

首先,舵机还是电调都是通过PWM波进行控制的,比如下面这张图当中

photo

这个就是一般航模用的遥控器,接收机接收到射频信号后,将信号解调成PWM输出到舵机或者是电调中。所以电调和舵机都能够接收PWM信号,且信号格式是统一的。

但是,PWM信号到底是什么格式,频率多少,占空比多少,在网上查了查,却没有一个确切的数据。有个数据比就是futata的标准,pwm频率是50Hz, 脉冲宽度为920usec到2120usec,这样对应了舵机的0度到180度。

对于这个数值,我用51做了一个PWM的发生器,通过在电脑上输入角度(0到180度),然后产生一个特定的PWM波输出到舵机,就是下面这张图中的。

photo

可是结果发现,舵机行程明显不足180度,只能勉强算是90左右,看来920usec-2120usec并不是对于舵机确切的控制数据,或者说对于除futaba以外的舵机的控制格式。
经过调试,发现要使舵机达到0度到180度的行程,PWM波的脉冲宽度要在800usec到2800usec之间。同时也有个有趣的现象。如果给舵机的信号线一个脉冲信号,宽度在800usec到2800usec之间,然后持续低电位,舵机会保持在该脉冲所对应角度不变,也就是说,PWM的频率是可以低于 50Hz的。

回到Arduino上,Arduino自带Servo的库,可以编程实现从特定的角度输出特定的PWM波。就可以是用这样的PWM信号来控制电调,从而控制电机。这里有必须介绍一下电调的特点。我们是用的电调是比较廉价的新西达电调,但是它也带模式设定的功能,可以根据不同的场合来设定电调的工作模式。设定的过程就是,PWM信号为最高时,给电调上电。具体的设定过程可以在网上查到。经过实验发现Arduino输出角度为0的PWM信号根本不会对电调有任何影响,电调完全无视这个信号的存在-_-b。经过仔细思考后发现,会不会是因为电调是用的是futaba的PWM格式,而800usec或者 Arduino最低的pwm信号对于电调来说过低,导致电调不能够辨认。

以下就是能够控制电机速度的程序代码

#include <Servo.h>

Servo myservo;
int pos = 0;
int buttonState = 0;
int lastButtonState = 0;

int currentAngle;
int MAX_ANGLE = 140;
int MIN_ANGLE = 100;
void setup()
{
 myservo.attach(9);
 pinMode(13, OUTPUT);
 pinMode(2, INPUT);
 pinMode(3, INPUT);
 currentAngle = 100;
}

void loop()
{
 buttonState = digitalRead(2);
 if (buttonState == HIGH)
 {
 digitalWrite(13, HIGH);
 if (currentAngle < MAX_ANGLE)  {  currentAngle = currentAngle + 1;  }  }  else  {  buttonState = digitalRead(3);  if (buttonState == HIGH)  {  digitalWrite(13, HIGH);  if (currentAngle > MIN_ANGLE)
 {
 currentAngle = currentAngle - 1;
 }
 }
 }
 if (buttonState == LOW)
 {
 digitalWrite(13, LOW);
 }
 myservo.write(currentAngle);
 delay(30);

}

2,078 total views, 4 views today

Leave a Reply