飞飞机油 发表于 2022-10-28 08:47:07

树莓派多旋翼无人机制作:航模电池与电机驱动

一、电源与降压模块
       细心的你可能会发现树莓派、光耦隔离器、电调、电机都有了,可还是没有电源。没电当然不行了,我们的四轴动力靠的就是电池。对于锂电池的选择也是多种多样的,但是我们将在稍后说明。现在我们要说的是树莓派的供电。我们还要使用一个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。

      注意,树莓派供电模块由原来的7805稳压器修改为DC-DC电源模块,使用DC-DC电源模块效果更好,发热更小,支持的电压范围更大。
      使用DC-DC时,输入端接入充满电的航模电池,输出端先不要接线,而需要一边调整DC-DC的旋钮,一边用万用表测量OUT端电压,直到OUT端电压为5V时停止。

欢迎关注公众号:编译外星人

xiaojunlfdz 发表于 2022-10-28 08:52:54

应该是升压模块吧

小禹宇鱼 发表于 2022-10-28 09:03:47

油门行程校准用接收机不是更好?

z1413 发表于 2022-10-28 09:09:42

请问,现在一般的飞行器能突破30分钟续航吗?

jctc2011 发表于 2022-10-28 09:20:31

不能

ytyt666 发表于 2022-10-28 09:35:27

请问,自动避障,还有自动转向,自动升降是如何实现的?

bellyoungsmile 发表于 2022-10-28 09:42:58

这30分钟航限是怎么算出来的

trilobite 发表于 2022-10-28 09:51:57

电池效费比

zhoulinchun01 发表于 2022-10-28 10:05:17

找不到这个公众号了

crazyai 发表于 2022-10-28 10:14:59

用的什么型号的降压模块?
页: [1]
查看完整版本: 树莓派多旋翼无人机制作:航模电池与电机驱动