四轴飞行器进展

December 30th, 2010 § 3 comments § permalink

其实这个电路十分简单,就是两个按钮接入Arduino,然后Arduino输出PWM信号到电调,电调再输出电流到电机,从而就行成了按钮控制电机的一个装置。 不过,在完成这样一个小小的系统也经历了很多挫折。 首先,舵机还是电调都是通过PWM波进行控制的,比如下面这张图当中 这个就是一般航模用的遥控器,接收机接收到射频信号后,将信号解调成PWM输出到舵机或者是电调中。所以电调和舵机都能够接收PWM信号,且信号格式是统一的。 但是,PWM信号到底是什么格式,频率多少,占空比多少,在网上查了查,却没有一个确切的数据。有个数据比就是futata的标准,pwm频率是50Hz, 脉冲宽度为920usec到2120usec,这样对应了舵机的0度到180度。 对于这个数值,我用51做了一个PWM的发生器,通过在电脑上输入角度(0到180度),然后产生一个特定的PWM波输出到舵机,就是下面这张图中的。 可是结果发现,舵机行程明显不足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);
}
]]>

Hacking Quadcopter, Shanzhai Style!

December 16th, 2010 § 1 comment § permalink

the one designed by kinderkram. It uses gyros from Wii Motion Plus and accelerometer from Shanzhaied Nunchuk. Read More…]]>

Where Am I?

You are currently browsing the quadcopter category at 新车间 [XinCheJian].