基于stm32f103c8t6+mpu6050+nrf24l01的分体小四轴

今天介绍一个小玩意是一个开源小四轴。

我考虑过基于之前做的stm32飞控来做一个小四轴,对于新手来说比较安全,然后就上网找一样芯片的小四轴看看能不能在不画板子情况下,把软件移植上去。后来我找到了这一款小四轴。它的主要部件stm32f103c8t6和mpu6050和我的stm32飞控是一模一样的。我的stm32飞控还多了一些传感器,但是那些额外的传感器并不是必须的。传感器里面只有陀螺仪是必须的,加速度计也比较重要,这些都是由mpu6050实现的,而这个小四轴正好也用了这个传感器芯片,其实mpu6050早在ymfc-al里就用上了。

而且,这个小四轴还有一个优点,它是机架和飞控板分体的,也就是说,万一哪天我连硬件也想做了,我也可以用我自己的飞控小板子,只保留它的机架+电机+螺旋桨部分,pcb和smt我可以自己找嘉立创搞定。

不过,nrf24l01和我习惯用的无线模块不一样,之前用的都是专用遥控器配套的接收机,输出ppm或者pwm波,nrf24l01有点像串口透传模块,我接触的不多,只是用过,代码不熟悉。需要慢慢对接。

(其实我在github上找到一个第三方爱好者改的ymfc-3d,姿态传感器用了mpu6050(本来是l3g4200),无线芯片用了nrf24l01,我过段时间看看能否直接用吧。)

用nrf24l01还有一个好玩的地方,我之前做的portapack蓝牙解调,其实也可以改一改来解nrf24l01,因为他们都是fsk调制的,而且我找的解码btle的那个开源项目里本来就带nrf24l01的解码了,也就是说我有可能直接用portapack来解小四轴遥控器命令,当然用portapack发命令给小四轴也是可能的,这个发射不是简单的重放,而是想发什么命令就发什么。

其实我以前用hackrf重放过nrf24l01,可以重放控制的,说明这个模块确实是比较简单的。

重放攻击演示视频:https://v.youku.com/v_show/id_XMTU4MjY5ODM5Mg==.html

不过我拿到手后碰到一个问题,它的遥控器是右手油门的,貌似左手油门的卖光了,我很不习惯。

扫描二维码关注公众号,回复: 11810290 查看本文章

后来我想到个办法,把遥控器像下面这样反着拿,然后改了改遥控器程序,就当熟悉它的开发环境了。

它的开发环境是keil,下载器是jlink,串口只用来输出调试信息(printf),不下载固件。跟着卖家教程也挺方便,唯一我不习惯的地方是不跨平台,必须用windows,而且在ubuntu下,代码注释也是乱码。

这里贴一些我自己改的代码,由于不是我写的,所以我只能贴一部分。

我下载了左手油门的代码,然后在/HAL/remote.c文件里,把1000+adc值都改为了2000-adc就行了,另外我根据传感输出,改了一下throttle和yaw的误差,因为微调按钮只支持roll和pitch,另两个通道我目前只能在代码里改。

//原代码
Remote.thr = (uint16_t)(0.25f*ADC_ConvertedValue[1])+1000 + offset.thr;//油门
last_thr = Remote.thr = Remote.thr*0.25f + 0.75f*last_thr;
Remote.pitch = 1000 + (uint16_t)(0.25f*ADC_ConvertedValue[3]) + offset.pitch;//
last_pitch = Remote.pitch = Remote.pitch*0.25f + 0.75f*last_pitch;
Remote.yaw = 1000 + (uint16_t)(0.25f*ADC_ConvertedValue[0]) + offset.yaw;//方向
last_yaw = Remote.yaw = Remote.yaw*0.25f + 0.75f*last_yaw;
Remote.roll = 1000 +(uint16_t)(0.25f*ADC_ConvertedValue[2]) + offset.roll;//副翼
last_roll = Remote.roll = Remote.roll*0.25f + 0.75f*last_roll;


//我反过来拿遥控器时要做的修改
Remote.thr = 2000 - (uint16_t)(0.25f*ADC_ConvertedValue[1]) + offset.thr;//油门
last_thr = Remote.thr = Remote.thr*0.25f + 0.75f*last_thr;
Remote.pitch = 2000 - (uint16_t)(0.25f*ADC_ConvertedValue[3]) + offset.pitch;//
last_pitch = Remote.pitch = Remote.pitch*0.25f + 0.75f*last_pitch;
Remote.yaw = 2000 - (uint16_t)(0.25f*ADC_ConvertedValue[0]) + offset.yaw;//方向
last_yaw = Remote.yaw = Remote.yaw*0.25f + 0.75f*last_yaw;
Remote.roll = 2000 - (uint16_t)(0.25f*ADC_ConvertedValue[2]) + offset.roll;//副翼
last_roll = Remote.roll = Remote.roll*0.25f + 0.75f*last_roll;

我实际的飞行体验:起飞基本上保持离地20~30cm(可能充电没冲足,因为一直没显示充满,但是我不敢冲太久,怕鼓包),另外自动回中的遥感不太好操作,很容易一个动作导致过度修正,我还是习惯航模遥控器。

前段时间,热心模友NEXT,给了我一个小四轴,也是基于stm32c8t6+mpu6050,接收机使用了ppm接收机rx2a,而不是nrf24l01,飞机上面已经烧录了他改写的ymfc-32飞控代码(主要是引脚不同)。

我拿到手后飞了一下,发现效果还挺好。

视频:https://www.bilibili.com/video/BV19K4y1t7cx

yaw轴解锁与标准代码不同,是他自己改了解锁方式。

另外roll轴pitch轴交换的问题是因为小飞机上的箭头方向不是正前方,要以mpu6050上的小点为准。

飞了这个小四轴,更加坚定了我的信心。接下来就是照着红色小飞机的原理图画板子了。不过由于生产电机麻烦,我还是不打算生产一整个Pcb飞机,而是继续用前面说的小飞控板+小机架的方式。

小四轴飞控板子生产好了,发现几个问题:

1.pb2没拉低,这样无法用串口下载程序到stm32里,哪怕boot0跳线帽插上去也是不行的,所以我就用白色飞线解决了这个问题,就可以拉低了。

2.开关关机后,电机还会转,这是因为我电机的正极直接从电池上引出,而不是接在开关上,这样开关控制不了电机电源,mos上只要有一个小干扰就会打开电机。

3.只接usb线,没接电池时,电机也能转,这个不算大问题,但是一般小四轴都不是这样的。我发现LDO的vout会反向给vin供电,所以我串接了一个二极管解决了这个问题。(实际没增加二极管,只是调整了电机正极和二极管的顺序就行了)

4.我发现有时候stm32接电池时会跑飞,usb供电时不会,后来发现是因为接电池时要用LDO同时给单片机和遥控接收机的3.3v供电,用usb时这个3.3v是电脑usb口提供的。LDO的供电电流不够。后来我把遥控接收机直接接电池正极就解决了这个问题。

5.飞机一切测试正常就是飞不起来,跟两个因素有关,一个是飞机太重(用原来的飞控就只能离地10cm,不能真的飞到任意高度),另一个是我代码里的pwm波范围是0~2000ms(周期4000ms),最大只用到50%占空比。我打算先换一体飞控降低重量,再考虑改代码。

6.我还做了一些修改,比如电机电源线加粗,另外零件尽量使用嘉立创库里的(可以降低打样成本)。

下面的电源部分修改,解决了第2点和第3点的问题。

然后我又打了5个板子,但是这5个板子下单的时候,我来不及改接收机部分了(第4点问题),所以接收机供电我还是飞线接到电池上的。整机做出来比较轻,基本能解决第5点问题,请看后面的视频。

这是首次试飞视频:https://www.bilibili.com/video/BV185411Y7Xf

可以看到飞机油门开启后,能离地10cm左右,这是没增加最大占空比的情况下就能实现的,说明减轻重量确实有帮助。

但是我后来还是提高了最大占空比,我修改了pwm范围为0~3000ms(4000ms周期)这样最大占空比是75%就能完全飞起来了。

关于接收机,我后来测试了几种情况,如果我直接焊接在原来设计的位置,确实stm32还是会跑飞。如果我把正负极都接电池附近,那就完全没问题。但是如果我把正极接电池,负极接原来位置。stm32虽然不会跑飞,但是感觉飞机好像不太听话,感觉地如果不直接连电池负极会有干扰,虽然我设计的地最终也是接在电池负极的,但是经过电路板上别的元器件了。所以下一版本,我会直接把正负极尽量靠近电池。

另外,下一个版本还会修改电机孔大小,现在大小刚合适放电机,不能赛那个橡皮圈,这样必须要打胶固定有点麻烦。下一版本会加大这个孔。

猜你喜欢

转载自blog.csdn.net/shukebeta008/article/details/105187580