|
一、电源与降压模块
细心的你可能会发现树莓派、光耦隔离器、电调、电机都有了,可还是没有电源。没电当然不行了,我们的四轴动力靠的就是电池。对于锂电池的选择也是多种多样的,但是我们将在稍后说明。现在我们要说的是树莓派的供电。我们还要使用一个DCDC降压模块来对锂电池的电源稳压:
由航模电池的电源引出5条线,其中4条为4个电调供电,另外一条接DCDC降压模块的IN端,其OUT端为树莓派供电。接入时暂时不要接树莓派,先用万用表测量OUT端电压, 用螺丝刀旋转金属旋钮逆时针为减小,顺时针为增大(刚开始旋转时电压可能不变,要逆时针旋转七到八圈,电压才会发生变化)并调整到5V,接入时要注意正负极不能接反,最后再接入树莓派的5v和GND。
接下来,看看我们的四轴飞机器供电电池,通常我们使用3节锂电池或4节锂电池为四轴供电,也有使用更多节的比如6节、8节或更多。电源中有几节锂电池,我们就称这样的电源为几S。例如3S表示有3节锂电池,4S有4节锂电池等等。每一节锂电池的电压为3.7v,3S的电压就是11.1v;4S的电压就是14.8;6S的电压就是22.2v。这样的锂电池电源,我们也通常称作“航模电池”。
另外,对于航模电池还有两个重要的参数:电量和放电倍率。电量就是我们所常用的3000mah、4000mah、5300mah或10000mah等等。它表示了电源能够存储的电能的多少。而放电倍率通常是有15C、20C、25C或30C等等。它的意思是说放电的速率。例如:我们手机有一块10000mah 20C的电池。
1、按每小时10000毫安的放电速度持续放电1个小时;
2、以5倍速度放电,即以每小时50000毫安的放电速度持续放电12分钟(60 / 5);
3、以10倍速度放电,即以每小时100000毫安的放电速度持续放电6分钟(60 / 10);
4、以20倍速度放电,即以每小时200000毫安的放电速度持续放电3分钟(60 / 20)。
至于在实际飞行过程中它按多少的倍率放电,主要取决于电调和电机的功率。关于这些功率计算和放电时间的计算不是我们的讨论范畴(如果你有兴趣可以自己查阅相关资料)。我们推荐使用2200mah 3S航模电池:
值得一提的是,不是电池容量越大就越适合四轴,电池的容量大,重量也就大,四轴飞行时的承重也就大,需要的负载也就大。如果你的电池非常重,那四轴能不能飞起来都是个问题,所以还是选择一款适合你的航模电池。
二、无刷电机驱动
接下来我们就来一起编写无刷电机的驱动程序,在前面章节中我们已经学习了如何通过树莓派产生PWM信号,而在本节中我们就来实际操作一下,将电机接入电调,将电调的信号线接入树莓派的GPIO引脚上,通过航模电池为电调和树莓派(加入DCDC降压模块输出5V给树莓派)供电,在这里我们使用wiringPi的1号引脚,接线图如下:
在接线过程中有一处需要注意,电调中的信号线有3根,颜色为红、黑、白。红色为信号电源,黒色为地,白色为PWM信号线,我们只需要接电调的信号线(白色)至树莓派的WiringPi 1号引脚,并将地线(黑色)接入到树莓派的GND引脚即可,电源(红色)不需要接入树莓派。如果你采用了光耦隔离器的话同样只需要接WiringPi 1和GND即可。
关于无刷电调控制电机时,有两个地方需要关注:
1.电调最大行程校准。电调在出厂后如果没有做最大行程校准,我们就需要对其做校准。这样可以保证我们的四轴中4个电机速基本一致,从最低速度到最大速度的基本相同。做电调的最大行程校准的步骤如下:
按上图接线,注意不要为电调上电(暂时不为电调接入电源)。
使用树莓派生成最大PWM占空比值,即产生100%占空比信号,此时高电平持续2ms,低电平0ms,注意要有高低电平变化,如果电平一直是高则此PWM信号无效。
为电调上电,此时电机会发出两声短促的“嘀”声,在3秒之内将PWM信号由100%变为0%,随后电机会发出一声长鸣“嘀”。此时电调最大行程校准完成。
2.电调信号初始化。电调信号初始化相对来说比较简单。为了保证使用安全,电调在上电后是处于保护状态的,此时如果直接为电调发送100%的信号电机是不会转动的。在使用电调之前,首先要对其发送超过3秒的0%的PWM信号,电调才会认为使用者初始化了电调,随后才可以根据PWM信号值来调整电机的转速。电调初始化的过程如下:
按上图接线,并为电调上电,此时电调先会产生一次“do ra mi”,随后每两秒会发出一声短促的“嘀”声,表示未收到任何PWM信号。
使用树莓派生成最小的PWM占空比值,即产生0%占空比信号,持续3秒以上,此时电调会产生3短1长的“嘀”声(3短表示是3S锂电池),此时电调初始化完成。
最后我们来编写一个可以对GPIO引脚产生PWM信号的程序:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringSerial.h>
int port = 1;
int run = 1;
int speed = 0;
void motor_run()
{
while (run)
{
digitalWrite(port, HIGH);
usleep(1000 + speed);
digitalWrite(port, LOW);
usleep(1000 - speed);
}
}
void set_speed()
{
while (run)
{
printf("SPEED = %4d, Enter new speed:\n", speed);
int tmp = 0;
scanf("%d", &tmp);
if (tmp >= 0 && tmp <= 1000)
{
speed = tmp;
continue;
}
speed = 0;
usleep(10 * 1000);
run = 0;
}
}
int main(int argc, char *argv[])
{
wiringPiSetup();
pinMode(port, OUTPUT);
pthread_t p_run;
pthread_t p_set;
pthread_create(&p_run, (const pthread_attr_t*) NULL, (void* (*)(void*)) &motor_run, NULL);
pthread_create(&p_set, (const pthread_attr_t*) NULL, (void* (*)(void*)) &set_speed, NULL);
pthread_join(p_set, NULL);
pthread_join(p_run, NULL);
return 0;
}
注意,这里我们产生的PMW信号是一个0~1000的数值,其实就是千分比0‰~1000‰。这样我们就可以用最简单的0~1000来表示一个比较精确的PWM信号,如果使用百分比来表示的话我们就需要使用浮点数来表示0%、0.10%、12.8%、93.5%这样的数值,而使用千分比则只需要用整型数值0、10、128、935即可表示。
程序中我们创建了两个线程,第一个线程motor_run用于产生PWM信号,第二个线程set_speed用于接收用户输入的值从而修改PWM的值。
SPEED = 0, Enter new speed: 100
SPEED = 100, Enter new speed: 200
SPEED = 200, Enter new speed: 400
SPEED = 400, Enter new speed: 1000
SPEED = 1000, Enter new speed: 0
SPEED = 0, Enter new speed:
到这里,我们的电机驱动部分就完成了,程序非常简单,在我们使用四轴飞控程序时只需要产生4个线程分别对4个GPIO引脚分别产生4路PWM。
|
|