作者wtchen (没有存在感的人)
看板LinuxDev
标题[心得] 用Raspberry pi 做四轴飞行器
时间Mon Oct 5 03:31:22 2015
本文同步分享在我的网志:
http://gnitnawtw.blogspot.fr/2015/10/piquadcopter-raspberry-pi.html
(若有违反板规请告知。若是版友想多了解我愿意分享更多。)
PiQuadcopter(掰咖考特) -- 用Raspberry pi 做四轴飞行器
想做四轴很久了。会想用RPi不外乎以下理由:
- 磨练C programming
- 了解kernel programming(虽然最後几乎没用上)
- 想体验Real-Time Linux的威力(虽然还没开始用)
一般来说RPi拿来做四轴有点不太适合,因为作业系统是Linux
(虽然据说可以安装其他的RTOS,不过我暂时不讨论这个),
而属於通用型作业系统的Linux为了能在较短时间内完成较多任务,
其即时性(从系统收到任务的时间到系统开始处理这任务的时间)比较差
(正在处理的任务不能被优先权较高的任务插队)。
我希望用多执行绪程式+抢占式即时核心(Preempt RT Linux kernel)来改善这个问题。
稍微搜寻了一下前人用Rpi做四轴的经验:
RPi only
https://github.com/idavidstory/goPiCopter
使用Go程式语言,sensor更新周期50Hz,控制周期10Hz,9 DOF + PWM(PCA9685)
http://blog.pistuffing.co.uk/
看起来似乎没完成
RPi + Arduino
https://github.com/vjaunet/QUADCOPTER_V2
使用MPU6050,Arduino用来控制SPI介面的硬体和PWM
https://github.com/rpicopter/AvrMiniCopter-wiki/wiki
10 DOF
https://www.raspberrypi.org/forums/viewtopic.php?f=37&t=35746
MPU6050,使用特殊ESC所以不用PWM,sensor更新周期在300-400Hz,以C++编写程式,
不用Real-time OS,Arduino用於RFM12无线模组(与笔电交换讯息控制机体)
RPi + 其他飞控
http://www.instructables.com/id/Autonomous-Cardboard-Rasberry-Pi-Controlled
-Quad/
http://www.botched.co.uk/quadrocopter/
使用dsPIC30F(PWM+I2C),10 DOF
看起来完全用RPi不用其他MCU好像也不是不可能。
四轴的飞行控制需要的硬体有:
- 机架、电池、(无刷马达+螺旋桨)*4 (废话)
- ESC (electronic speed control) :控制马达转速,
需要用四个PWM(Pulse-width modulation,脉冲宽度调变)个别控制
- IMU(Inertial measurement unit,惯性测量单元):三轴加速度计
(测量重力加速度方向+加速度)+三轴角速度计(测量角速度)
+三轴电子罗盘(测知方向)+气压计(换算海拔高度),
3+3+3+1简称10轴 (10 DOF,一般来说6轴勉强够用)。
- 无线通讯模组(wifi 或RF)
- 如果想知道电池电量是不是快到底了,最好加个ADC(类比转数位输出)测量电池电压。
而我手上的RPi model B+上面有:
- I2C * 1 (可接多个装置,支援400kHz以上传输速度)
- SPI * 1 (可接两个装置,支援8MB/s以上传输速度)
- PWM * 1 (不够用...),虽然可以用DMA做软体PWM,
不过更新频率不能太高(~100Hz差不多极限了)
根据以上需求,结论就是我需要买:
- 10轴IMU:GY80(I2C,400kHz,前6轴资料更新可达1600Hz)
- nRF24L01*2:一个给RPi用,一个给Arduino用(操纵四轴),SPI
- ADC:MCP3008:10bit(量电压够用了) ,SPI
- PWM:PCA9685(Adafruit有卖已经设计好的电路,坊间也有类似的),I2C,
12bit,频率可达1526Hz
然後就是程式部份,我选择bcm2835(
http://www.airspayce.com/mikem/bcm2835/ )
而不是比较知名的wiringPi。因为bcm2835比较单纯(找到address->控制),
不需要任何驱动程式,而wiringPi的SPI跟I2C控制是建立在驱动程式上,
我希望能藉此避免驱动程式的介入把操纵单纯化,
这样以後若是用Preempt RT kernel也比较不受影响。
目前我的进度到PID Control(调的好累),希望不久後我的PiQuadcopter能很快飞起来。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 86.200.64.167
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1443987101.A.8A3.html
1F:→ wtchen: 看来没人有兴趣 XD 10/05 22:41
2F:推 bdvstg: 请问目前估计这样硬体总价格大概要多少? 10/06 12:23
3F:推 winken2004: cool 10/06 13:12
4F:→ wtchen: 我人不在台湾所以会贵点。 10/06 18:08
5F:→ wtchen: 能够用淘宝的话应该4000-5000可以搞定 10/06 18:09
6F:推 yshihyu: 请问一下要怎样遥控器? 还有马达? 10/07 00:13
7F:→ wtchen: 如果没违反板规的话我可以多写几篇介绍 10/07 00:26
8F:→ wtchen: 无线遥控我用nRF24L01,接上arduino和摇杆就是阳春遥控器 10/07 00:28
9F:→ bdvstg: 有考虑wifi遥控吗? usb wifi edimax 10/07 08:36
10F:→ bdvstg: (我之前想的时候是考虑用wifi配手机XD) 10/07 08:42
11F:→ bdvstg: ← 不过这个人行动力超低 又被估出来的价格浇熄火焰XD 10/07 08:43
12F:→ wtchen: 我现在测试就是用wifi遥控 10/07 15:24
13F:→ wtchen: 但是我的mt7601信号比较差就是了 10/07 15:24
14F:推 bdvstg: 请问RF会随距离远近 资料传输量逐渐下降吗? 10/07 16:18
15F:→ bdvstg: 还是到一个临界点後突然消失? 10/07 16:19
16F:→ wtchen: 我的设计是四轴先收後发,遥控器先发後收 10/07 17:45
17F:→ wtchen: 在2Mbps的情况下,距离稍微远(2m以上)就开始收不到了 10/07 17:46
18F:→ wtchen: 调到250kbps後就没这问题 10/07 17:46
19F:→ wtchen: 不过我用的是最阳春的type(没外加天线) 10/07 17:47
20F:→ wtchen: 不过CPU load会因为RF增加10%左右(不过才10Hz) 10/07 17:48
21F:→ wtchen: 我还在想要怎麽办 10/07 17:48
22F:→ wtchen: wifi+smartphone就得用萤幕触控,爽度全失阿 10/07 17:53
23F:→ descent: 很厉害,加油 10/07 22:12
24F:推 troylee: Wifi 距离太短了... 玩遥控没意思.. orz 10/11 02:25
25F:推 troylee: 用触控的坏处是没有位置的回馈感.. 10/11 02:29
26F:推 Gonocurrus: 太酷了 10/21 18:50
27F:推 jamyang: 太赞了 希望有一天我也能做这样的专案 05/11 11:15