经过了几个星期的折腾,四轴飞行器电机控制方式终于有所突破,先上图 哈哈
其实这个电路十分简单,就是两个按钮接入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); }
2,119 total views, 3 views today