树莓派 Zero作为飞控图传
前言
原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。
本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:
http://www.cnblogs.com/sjqlwy/p/zero_fpv.html
虽然可以买到商品成品,且会比我们做出来的东西更美观,性能指标更强,但是在折腾中学习,按照自己的需求进行优化改动,享受创造的喜悦,不正是创客精神嘛。
本项目使用手头现有的硬件,旨在将树莓派Zero作为飞控图传使用,本以为会很简单,但是软件适配方面遇到一些问题,困扰了很久。
1. 硬件部分
我们首先来看看硬件列表:
- Raspberry Pi Zero v1.3
- otg table & usb wifi dongle (Xiaomi wifi)
- Raspberry Pi Camera Module v1.3
- LattePanda With LCD Display
1.1 RPi Zero介绍
Zero体积小巧 (可以当钥匙扣),性能足够,兼容树莓派软硬件资源,这几点让它非常适合做一些硬件相关的创意项目。如果把它当做一个小号的树莓派使用,那真是买椟还珠?我们看看它的相关配置:
- 1GHz单核CPU
- 512MB 内存
- Micro-USB OTG 接口(可用于供电)
- Micro-USB 电源接口
- 树莓派 40-pin GPIO引脚
- CSI 摄像头接口 (仅支持 v1.3)
这里我们准备通过GPIO接口供电,OTG接口连接USB无线网卡与胖哒通讯,搭建Web服务器向LattePanda传输视频流。写这篇文章的时候新版的RPi Zero W(ireless)已经发布,增加了蓝牙无线模块,更加方便,但是我没有,而且很难买T_T。
1.2 Zero 供电
“要有电——《创世纪》”
虽然官方仅说明使用Micro USB PWR接口供电,但是使用过程中可以发现OTG接口和GPIO引脚也可以但是不推荐(缺少保护电路)。OTG供电可以参考我之前写的文章《一根数据线玩转树莓派Zero》,不再赘述。因为飞控上不能搞个充电宝弄根数据线,所以准备通过杜邦线连接GPIO接口进行反向供电,这里需要稳定的5v电压,否则可能有损害zero的风险!
如图所示,引脚2接+5v,引脚6接地。
更多讨论与电路原理图等请移步:
当然也可以使用专门的供电拓展模块,比如Pimoroni Zero LiPo:
1.3 RPi Camera Module
Zero仅支持RPi Camera v1.3,彼时zero发布时并没有v2的摄像头模块。关于RPi摄像头模块的详细信息务必阅读eLinux的页面。
v1.3采用OmniVision OV5647摄像头组件,支持500万像素,实测效果还不错,比较清晰。
需要注意的是,RPi和RPi Zero CSI摄像头接口大小是不一样的,v1.3默认只有适用尺寸较大的RPi接口排线,相用在Zero上的话需要额外购买排线。我是在阿里巴巴上购买的,¥7.5供参考,并额外购买了亚克力支架。
1.4 Wireless Communication
因为在室外操作,信号衰减较小,这里我们的方案是otg线+小米随身wifi(采用mt7601u芯片)进行无线传输。使用小米wifi的原因是因为mt7601u功耗很小,稳定性/发热/传输速度距离都可以接受,后期可能会换用模块或者加装天线。
当然也可以选用现成的模块,比如Red Bear IoT pHAT:
2. 软件部分
2.1 Zero操作系统选择
操作系统是相当于开车的司机,为zero选择一个合适、方便的系统如虎添翼。由于项目需要,我们选择headless模式进行操作,不需要图形界面,这里讲两个系统:Raspbian和DietPi。
2.1.1 DietPi
一直以来使用的且十分推崇的树莓派操作系统,有些过相关介绍,很久没更新了,现在又增加了很多新特性。其特色包括性能优化,可以快速方便地自动安装配置各种软件,无痛学习上手树莓派,另外作者的脚本写的很棒,可以学到很多东西。
虽然DietPi支持Zero,但是对OTG 虚拟网卡支持并不好,所以最近一直在尝试进行适配,也遇到了很多问题,卡在这里很久,记录如下。
按照《一根数据线玩转树莓派Zero》的方法,分别更改boot
分区下cmdline.txt
和config.txt
文件,启用usb gadget ether功能,并在/etc/network/interfaces
里预增加usb0虚拟网卡相关设置文件。使用MicroUSB连接Host后,正常上电可以识别到LAN连接,但是
- 使用ssh登录zero,即使开启了网络共享zero也无法上网;
- windows可以ping通zero,反向ping则无响应。
以上问题在使用Raspbian Lite时并不存在,经群里枫大的提醒,使用Wireshark软件进行局域网抓包分析和USB2TTL串口模块直接调试的方式寻找分析问题。结果如下:Wireshark可以捕获主机ping zero的ICMP协议包,反向无任何响应。最后尝试关闭Windows防火墙解决,怀疑是Raspbian正常使用,没有测试ping命令,所以默认为无需关闭防火墙,这里绕了很大弯路。
注意,开启网卡混淆模式进行监听数据包时,ping命令会返回(DUP!),提示数据包重复。
此时仍然无法上网,ping www.baidu.com
提示unknown host
,直接ping IP地址ok,cat /etc/resolv.conf
没有发现正确的DNS服务器地址。手动在interfaces
文件增加dns-nameservers 114.114.114.114
后解决,可以正常联网并更新系统。
注意,插拔zero后可能会无法联网,此时关闭|重新开启主机网卡网络共享稍等即可。
完成以上设置之后,安装Lighttpd网页服务器、php等之后,重启失败,串口无任何输出。如此这般,屡试不爽。长久的沉默与崩溃,遂放弃。经历阅读DietPi脚本源码,完善修改相关设置,查看了很多Gadget相关驱动说明和其他文档资料,都准备向github上提交commit了,然后又回到原点,个中滋味,百般无奈,于是怒打了几把王者荣耀平复心情。。。话说之前玩DOTA的,对王者荣耀这种小学生游戏嗤之以鼻,某日和师弟们玩了下,发现我凑上瘾了---
注意,使用otg时推荐使用Raspbian,在正式环境(GPIO供电+USB无线网卡),DietPi是没问题的。
2.1.2 Raspbian Jessie Lite
平复一下心情之后,我们回到树莓派基金会官方推荐的Raspbian Lite,无图形界面,没有预装各种Bloatware。之前的文章是以此为基础进行演示的,各方面比较完善。安装使用过程中比较顺利,这次没有出什么幺蛾子了,泪目。。。
2.2 RPi Cam Web Interface
Camera 图像传输与控制首先想到的是使用RPi Cam Web Interface来管理Camera和传输图像:
Web based interface for controlling the Raspberry Pi Camera, includes motion detection, time lapse, and image and video recording。控制树莓派摄像头的网页前端,支持motion运动检测、定时拍摄以及图像、视频录制。
- eLinux wiki 介绍:http://elinux.org/RPi-Cam-Web-Interface
- GitHub项目主页:https://github.com/silvanmelchior/RPi_Cam_Web_Interface
- 相关讨论:http://www.raspberrypi.org/forums/viewtopic.php?f=43&t=63276
项目架构如下,主要包括motion——负责运动检测、raspimjpeg——图像捕获与视频流传输、Web Server (Apcahe|Ngnix|Lighttpd)——网页控制界面。受限于zero的性能,以及并不需要多少高级特性,这里Web Server选用更轻量的Lighttpd。
原本执着于DietPi就是因为可以一键安装配置好各种软件,RPi-Cam-Web-Interface也在其中。因为存在问题没解决,所以按照Daniel Knight的脚本手动操作,仍然失败。。。最终在Raspbian上按照官网的方法安装成功。
启用RPi Camera:
sudo raspi-config
命令正确连接Camera:金手指朝下(LattePanda也是如此)
安装RCWI:
# 更新系统并安装git
sudo apt update && sudo apt dist-upgrade && sudo apt install git
# 下载源码并进行安装
git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
cd RPi_Cam_Web_Interface
chmod u+x *.sh
sudo ./install.sh
期间会跳出一个命令行对话框:
使用Backspace键删除,无法使用Del。如图所示,则可以通过在浏览器里输入
[pi_ip]:80/rcam
访问Web Interface,且开机自动运行。这里[pi_ip]填入树莓派的ip地址,我这里是192.168.137.2
。注意:
- 关闭camera上的红色led可以在
/boot/config.txt
文件增加disable_camera_led=1
- 只想要最简洁的图像界面可以访问
[pi_ip]/rcam/min.php
- 关闭camera上的红色led可以在
Zero 图像传输部分
分别是a. OTG线+USB无线网卡(RT3070为例,小米WIFI没找着); b. Zero本体; c. RPi Camera + 排线; d. CH340G TTL转USB模块,可以进行调试同时通过GPIO引脚为树莓派提供5v供电。正式版仅需要两根线为Zero供电即可。
LattePanda 获取Zero实时图像(网页)
帧率和清晰度都相当可以,拍得比较糊,大家凑合着看,看不清的想象一下。只需要在LattePanda里打开网页,地址填[pi_ip/dietpicam]即可。注意在System里设置为Default Steam比MJPEG Steam流畅。
移动设备获取Zero实时图像(网页)
和PC版基本相同,注意似乎同时只支持串流到一个设备。
移动设备获取Zero实时图像(APP)
这里可以使用免费版的IP Cam Viewer Lite(支持Android和iPhone),当然你也可以购买Pro版,不过Lite版足够使用了。ICVL内置支持RPi-Cam-Web-Interface,如图添加摄像头,修改相关参数。
PC软件获取Zero实时图像(待补充)
因为RPi-Cam-Web-Interface支持视频串流,我们可以使用VLC或者自己写软件(比如QT编写的图形界面程序)直接播放视频流,由于遇到一些问题,后面再完善相关内容。
总结
以上通过多种方式获得树莓派Zero传输过来的实时图像,并且清晰度和帧率都相当不错,符合我们的项目预期。在室外可以让树莓派或者LattePanda建立无线热点,提供两者通讯的手段,当然,WiFiDirect也可以,待求证。
进一步阅读
- 模块成品化比较高的Pi Cam by WMAGNER|hackmypi.com
- 给大家讲讲什么是FPV|tieba
树莓派 Zero作为飞控图传的更多相关文章
- 使用DroneKit控制无人机
DroneKit-Python是一个用于控制无人机的Python库.DroneKit提供了用于控制无人机的API,其代码独立于飞控,单独运行在机载电脑(Companion Computer)或其他设备 ...
- 除了Web和Node,JavaScript还能做什么
前言 提起JavaScript,我们也许经常会想到的是,可以用来写Web页面嘛,又或者,会想起Node.js 这个服务端环境,搞前后端同构. 那么,除此之外, JavaScript还可以做什么? ...
- 【.NET 与树莓派】六轴飞控传感器(MPU 6050)
所谓"飞控",其实是重力加速度计和陀螺仪的组合,因为多用于控制飞行器的平衡(无人机.遥控飞机).有同学会问,这货为什么会有六轴呢?咱们常见的不是X.Y.Z三轴吗?重力加速度有三轴, ...
- 极客DIY:使用树莓派制作一架四轴无人机
如果你想DIY一台属于自己的无人机,那么接下来可以阅读这篇文章,阅读完毕之后也许对你会有启发. 这个项目主要用到的零件主要来自Erle Robotics(一个使用Linux系统的开源四轴飞行器项目). ...
- 树莓派+花生棒+leanote搭建自己的笔记服务器
背景 对于一个程序猿来说.女朋友可以(暂时)没有,但是不能没有一个很好的记笔记的应用.因为记笔记可以帮助自己积累学习提升自己.每一次回头看自己记得笔记,你都会有新的理解. 也许有人会说,用有道云啊,有 ...
- APM飞控学习之路的资料
飞控学习之路的资料 https://blog.csdn.net/u010682510 博客资料 https://blog.csdn.net/qq_26573899/article/category/7 ...
- DIY一个基于树莓派和Python的无人机视觉跟踪系统
DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站差点儿已经是标配.假设想来点高级的--在无人机上直接处理拍摄的图像并实现自己主动控制要怎么实现 ...
- 使用树莓派实现(山寨)高清视频叠加(HDMI OSD)
项目需要在HDMI上叠加一些字符包括汉字和数值,要求不能使用台式机,本身也没有HDMI采集卡驱动开发能力,所以通过海思的HDMI编码器将HDMI编码为h.264网络视频流,然后通过树莓派解码显示,做字 ...
- 树莓派、 Arduino 、传统单片机开发板该如何选择?
几十年前的电子爱好者,最喜欢的就是电烙铁.面包板和收音机:十几年前,出现了单片机,于是玩具就成了电烙铁.面包板和单片机:到了2015年,贴片技术的不断普及,让面包板不再那么有用武之地,经济的发展也让现 ...
随机推荐
- Jmeter Cluster
Jmeter 是开源软件,100%纯java应用程序,专门为负载测试和性能测试. Jmeter的特性包括: 1.负载测试和性能测试许多不同的服务器/协议类型: Web - HTTP, HTTPS SO ...
- [git 学习篇]删除文件
1 现在本地文件管理器删除了readme.txt(这个readme.txt已经在创库存在的) rm -rf readme.txt 2 此时git status查看 $ git status # On ...
- rsa Round #71 (Div. 2 only)
Replace A Time limit: 1000 msMemory limit: 256 MB You are given a string SS containing only letter ...
- Spring 4.3.11.RELEASE文档阅读(一):overview
一.宏观概述中的体会和发现 Spring是组件式的框架,它允许我们只使用其一小部分.Spring所做的工作,就是不断的简化我们的操作.比如它的IOC容器,当我们自己应用设计模式,比如说:建造者.工厂. ...
- 九度oj 题目1513:二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个 ...
- BZOJ3098 Hash Killer II 【概率】
挺有意思的一题 就是卡一个\(hash\) 我们先取L大概几十保证结果会超出\(10^9 + 7\) 然后就随机输出\(10^5\)个字符 由题目的提示我们可以想到,如果我们有\(n\)个数,选\(k ...
- P2134 百日旅行 (斜率优化,DP)
题目链接 Solution 斜率优化\(DP\). 今天下午才打的第一道题 QwQ... \(90\) 分很简单,一个简单的递推. 令 \(f[i]\) 为最后一天旅游的花费, \(g[i]\) 为最 ...
- Linq技巧3——何时及怎么使用预先加载
通常情况在你的应用程序中,一旦你要查询完数据的的时候,你知道使用实体来做什么. 假如你打印一份订单给顾客,你知道不包括组成订单的Items和Products信息,打印的信息是不完整的,所以查询时也需要 ...
- Android 4.4 不休眠+不锁屏+默认中文+去除导航栏
1.不休眠 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 里面60000改成-1,就是不进入休眠. 这个文件还保存 ...
- 数据库SQL Server 2014 设置自动备份(维护计划和作业)
前言 1.SQL Server数据库自动备份可以有两种操作 第一种是在SQL控制台下的服务器名称展开,展开“管理”--选择“维护计划”,右键“新建维护计划”即可. ...