树莓派主控的微信君

来源:互联网 发布:三相不平衡调整算法 编辑:程序博客网 时间:2024/04/29 04:05
目录


0 引言
1 本项目创新点
2 系统设计与需求分析
2.1 系统设计原则
2.1.1 可靠性
2.1.2 伸缩性
2.1.3 扩展性
2.1.4 复杂性
3 背景介绍
3.1 综述
3.2 互联网硬件的特性和发展
3.2.1 互联网思维
3.2.2 互联网硬件向传统行业的渗透
3.3 树莓派 (Raspberry PI)
3.3.1 基本环境分析
3.3.2 个人操作系统
3.3.3 模块使用
3.4 微信公共平台
3.4.1 云服务器
3.4.2 微信公共处理平台
3.4.3 数据链路分析
3.5 远程监控
3.5.1 远程监控的特点和概念
3.5.2 移动拍摄与传统监控方式的比较
3.6 web基本知识
3.6.1 B/S( Browser/Server)架构
3.6.2 C/S( Client/Server)架构
3.6.3 HTML,CSS,JavaScript
3.7 Android手机控制端
3.7.1 Socket 编程
4 项目构成
4.1 综述
4.2 主控中心
4.3 运动系统
4.3.1 L298N外部电路图
4.3.2 L298N模块定义
4.3.3 运动系统的控制方式——树莓派GPIO口
4.3.3.1 树莓派GPIO口的调用
4.3.3.2 用GPIO库控制GPIO逻辑输出
4.3.3.3 树莓派GPIO口的定义
4.3.3.4 GPIO库和编程语言的选择
4.3.3.5 IO库——RPi.GPIO
4.3.3.6 RPi.GPIO控制运动系统
4.4 微信信息平台
4.4.1 云服务器(基于BAE)
4.4.2 微信公众平台处理系统
4.4.3 微信(Weixin)客户端
4.5 Web远程视频控制
4.5.1 驱动移植:
4.5.2 基于Video4Linux的视频采集
4.5.3 JavaScript图像获取
5结束语
拓扑


结构拓扑图
0 引言
互联网正在重塑人们的生活,而互联网产品创新这个看起来阳光灿烂的词汇,其后的乐趣和艰辛则是一种无法分割的思想理念。2013年是互联网硬件的元年,每天我们都能看到有新意硬件的新闻,他们有着统一的特性:用互联网的思维重新打造硬件。无论是路由,电视,智能车载终端还是母婴类产品,可以看到的一个清晰的趋势是:科技正在跨界,互联网行业正在向传统行业渗透,而不同行业的交融意味着新的结合方向及巨大的潜在财富[1]。
除此之外,在产品的开发过程中,系统的复杂性和不确定性总是为人诟病。针对以上现象,我们结合实际情况和用户需求,通过系统设计完成这个项目计划。本项目适时扣住互联网硬件热点和创新方向,选用了微信作为信息反馈平台,树莓派作为主控机,同时建设web前端监控平台,具有广泛平台适应性及互联网特性。搭建了实现多平台的远程监控和反馈系统。
1 本项目创新点
微信订阅号通过调用微信开发者平台API接口调用订阅用户AGPS数据来了解其地理位置信息,同时通过调用开放API接口获取周围的天气及温度信息,并发送给订阅用户,贴近互联网时代热点,Web App平台新颖独特。
利用新的开源硬件平台树莓派进一步整合整个系统的层次结构,进一步将系统层次化,结构化,提高系统可靠性。
使用web作为远程监控方式,结合前端开发技术,具有跨平台的优点,可以使用移动设备登陆,较好的满足了系统设计的需求。
除此之外,对该项目进行引申可以发现其具有良好的平台适应性:可以在各种己搭建的局域网或互联网的环境下运行,作为个人可以放在家中对家中的宠物或小孩远程监控,防止宠物的丢失和保证小孩的安全,也可添加蜂鸣器作为防盗设备使用,当然如果作为一种娱乐方式,博得亲朋好友的喝彩和惊讶也是不错的选择。
2 系统设计与需求分析
2.1 系统设计原则
2.1.1 可靠性
使用良好的Raspbian操作系统作为中间层,经过验证可以长时间的稳定运行,具有硬件看门狗功能(WatchDog),即便异常重启也可恢复系统。
2.1.2 伸缩性
可以根据不同的需要在不同用户需求的情况下添加或减少组件构建不同规模的系统。
2.1.3 扩展性
该系统应该有足够的接口或多数量的可使用模块以方便系统的改建与日常维护,并且满足未来发展的需要。
2.1.4 复杂性
系统设计时应该考虑减少系统复杂性的需求,主要方式为以下三点:
模块化:减少模块的数量和模块的互联可以提高系统的健壮度,增强系统的稳定性。
层次化:在实现相同功能的基础上减少系统的层级,加强系统的逻辑性,易维护性。
分级化:使结构更加清晰,通常采用单链的形式降低系统的复杂性[2]。
2.2 用户需求分析
我们希望实现一个远程监控和信息反馈系统,这个系统具有一定的平台适应能力和实现信息的广泛传播。鉴于监控目标有时会移动,我们添加了一套运动系统拟实现对目标的跟踪和定位,使系统能在一定的范围内移动。
3 背景介绍
3.1综述
3.2 互联网硬件的特性和发展
3.2.1 互联网思维
从洞察客户需求到提供定制化的产品和服务,这一种观念,实际上实现了产品从生产主导(生产者到消费者的生产流程主导产品形态),向消费主导(从消费者到生产者的消费流程主导产品形态)的逆转。更好的避免产品设计和使用者需求的脱离。是以用户需求为目标的设计理念。
3.2.2 互联网硬件向传统行业的渗透
互联网企业以互联网模式逆袭硬件领域,传统厂商正在受到极大的侵袭。渗透主要特点为:发现用户的真实需求,解决用户刚需,使用户易于分享产品新特性,产品对用户有着极强的粘性。现有的模式拓扑图通常是:


3.3 树莓派 (Raspberry PI)
3.3.1 基本环境分析
树莓派是英国Raspberry Pi 公益基金会发起的项目,其是卡片大小的微型计算机。树莓派的想法来自于剑桥大学的教授 Eben Upton(现为博通工程师)。树莓派是以Broadcom BCM2835 Soc 为核心的嵌入式开源硬件。CPU隶属ARM11家族,采用了ARMv6指令集。GPU为 VideoCore IV 。配备512MB的SDRAM,以SD卡作为存储介质和操作系统的载体。基本输入输出接口结合嵌入式和微型计算机的部分接口,包括:GPIO (General Purpose Input/Output)包含I2c,UART,PWM等,LEDs,RCA,HDMI,USB,LAN[3]。
3.3.2 个人操作系统
树莓派的操作系统与常见嵌入式Linux有所区别:嵌入式Linux系统定制性强不允许用户安装软件,是系统得到简化,其编码多使用C,开发需要一定的基础;而树莓派的操作系统使用的是桌面级的操作系统简化版,可以借鉴成熟的Linux软件包,由于ARMv6的指令集较老,大部分软件包并不支持,Raspberry Pi的开发者社区于是花费大量的精力对软件包进行重编译。
官方支持界面上提供了多种操作系统以供选择,目前树莓派支持的操作系统有 Raspbian(Debian内核),The ArchLinux,Debian for Raspberry Pi[4]。
3.3.3 模块使用
树莓派的使用模块有:
无线网络适配器(Edup黄金版):Linux下免驱,电流消耗小,提供网络连接功能。
高清摄像头(罗技 C270):支持硬件解码,分辨率1280×720,提供拍照和摄像的功能。
供电电源(电小二M5000B):树莓派提供必需的电流,同时供给模块电流
3.4 微信公共平台
3.4.1 云服务器
3.4.2 微信公共处理平台
3.4.3 数据链路分析
3.5 远程监控
3.5.1 远程监控的特点和概念
远程监控是指本地计算机通过网络系统对远端的设备进行监测与控制,包括设备的 远程数据采集、远程监控和远程维护
通过远程监控,管理人员不必亲临现场或恶劣的环境就可以对现 场的工作情况进行监视,完成参数设置与调整,进行故障恢复等[5]。
3.5.2 移动拍摄与传统监控方式的比较
传统监控方式:普遍采用拨号方式进行数据传输,GSM也有涉及,使用成本较高,传输数率被限,无法适应数据量大的情况。多采用RS232或RS485方式组网 组网,作用距离短,适应性差。系统专用性较高 ,偏向使用自己的通讯协议和系统平台[6]。
移动拍摄: 充分运用互联网的思想,数据使用802.11 b/g/n进行传输连接,使用http协议,以帧数据流的方式传输。并且采用了广泛使用的Linux系统,加之广泛的平台扩展性,Web界面的查看,App的使用,与社交网络的结合,打断了传统行业缓慢前行的脚步,努力挣脱传统行业的抵制行为,在传统硬件的基础上焕发了新的青春。
3.6 web 基本知识
3.6.1 B/S( Browser/Server)架构
B/S( Browser/Server)架构, 即浏览器和服务器的通信连接模式。它是随着Internet技术的兴起, 对C /S结构的一种变化或者改进的结构。在这种结构下, 客户端是通过Web浏览器来实现的, 极少部分任务在浏览器端实现, 主要任务都是在服务器端实现。这样就大大简化了客户端的任务, 减轻了系统维护与升级的成本, 为用户的使用带来方便。但是, 该方案有着系统运行速度和稳定性不够高的局限性。
3.6.2 C/S( Client/Server)架构
C/S( Client/Server)架构, 即客户机和服务器的通信连接模式。它属于应用软件系统, 充分利用客户端和服务器端的硬件环境, 具体的运算和数据的处理被放在客户端, 从而使客户端变得很“胖”, 一般称为“胖客户机”; 相对地, 服务器端的任务较轻, 称为/ 瘦服务器, 这样将任务合理分配到Client端和Server端来实现, 降低了系统的通讯开销。C /S架构的优势表现为专用性、交互性强, 存取数据安全及网络通讯量大、速度快等优点。另一方面, C /S系统又同时具有明显的缺点, 即无论客户端还是服务器端都需要特定的软件支持, 这样就使得系统维护复杂, 升级麻烦, 不利于推广使用等[7]。


3.6.3 HTML,CSS,JavaScript
HTML:HTML是网页超文本标记语言,也是全球广域网上描述网页内容和外观的标准。标记语言是通过浏览器的解释和变译来反映HTML标记语言的内容。
CSS:CSS是网页布局方式,是实现Web标准的基础,在制作主页时采用CSS技术,可以有效的改变页面的各项参数。
JavaScript:JavaScript是一种解释型的,基于对象的脚本语言,包含的对象主要有两个组成部分,即变量和函数,也称属性和方法。
三者的紧密结合,构成网页的基本制作。
3.7 Android手机控制端
3.7.1 Socket 编程
套接字( Socket)是一个通用的网络编程接口, Socket提供了网络间不同主机中的进程通信端点, C /S架构的应用程序使用它来实现网络间的通信。Linux 操作系统中TCP / IP协议族的套接字有3种类型: 流式套接字、数据报套接字和原始套接字。流式套接字采用TCP协议通信, 提供可靠的、面向连接的通信流, 所以C /S架构的监控系统采用流式套接字通信。
4 项目构成
4.1 综述
项目由三个层次组成:硬件层,中间服务器层,客户层。拓扑图
4.2 主控中心
主控中心主要实现了图像的实时显示,控制和管理功能,借助桌面级的操作系统,还可以管理系统和配置系统设备和实现管理系统用户和设置用户权限,适合于多用户管理。除此之外还通过C/S模式传输信息至云服务器,GPIO接口控制运动系统,搭建B/S模式web远程监控平台。这一切都是在一张仅有信用卡大小的嵌入式Linux系统上实现的。
4.3运动系统
运动系统的组成为:L298N驱动板2块,四路直流减速电机,电源模块和小车骨架。 整体拓扑图
4.3.1 L298N外部电路图
L298N外部电路图如图


四路直流减速电机所需的电流较大,而通常GPIO口的输出电流远远不够加负载的减速电机使用,因此我加上L298N驱动板作为功率放大设备。每块L298N驱动板控制两路直流减速电机,我们加上两块驱动板控制四路电机。
4.3.2 L298N模块定义
L298N驱动板提供了13个基本输入输出口,其中三个为电源正极输入电源负极输入和接地端,四个为直流电机输出控制端,四个为逻辑控制输入端,最后两个提供PWM接口以供接入PWM输入。
驱动板上有4个输入口:IN1~IN4,并且我们还要关心电源接口(VCC、GND)接口(5V)以及两个电机的接口。
根据查阅L298N的相关文档,电机转动状态编码:


模块接口定义如下:
IN1-IN4:
逻辑输入端,其中IN1、IN2控制电机M1;IN3、IN4控制电机M2。例如IN1输入高电平1,IN2输入低电平0,对应电机M1正转;IN1输入低电平0,IN2输入高电平1,对应电机M1反转,调速就是改变高电平的占空比。
ENA、B:
L298N使能端(高电平有效,常态下用跳线帽接于VCC),可通过这两个端口实现PWM调速(使用PWM调速时取下跳线帽),具体可以参考L298N芯片手册。
VCC/GND:L298N自身芯片供电,需要从外部接进5V电源(最好取逻辑部分的电压供电).
VIN/GND:电机供电电源接口,官方资料显示电源电压范围为2.5-47V,在电压范围内的输出电源均可,电源正极接VIN,负极接GND。
M1:电机1接口,没有正负之分,如果发现电机转向不对,将电机两线调换即可。
M2:电机2接口,没有正负之分,如果发现电机转向不对,将电机两线调换即可[7]。
4.3.3 运动系统的控制方式——树莓派GPIO口
4.3.3.1 树莓派GPIO口的调用
L298N的驱动板的逻辑输入由树莓派上的GPIO口提供,现对树莓派的GPIO口进行详细解释:
GPIO接口由ARM直接引出,可以作为IO口,也可以作为SPI,I2C,wire,串口使用,[80]相对而言更面向底层,需要注意的是:由于使用的是Linux的版本,你无法预计资源回收的时间,又由于其不一定有更高的优先级,其不一定是实时的,如果一定要保证实时,那么可以使用Arduino作为下位机控制硬件,连接方式可以使用GPIO作为串口(需要外接电阻确保电压相同)。
那么我们如何控制GPIO呢?
根据Linux系统的 文件管理,每个设备都是一个文件,那么我们可以认为,每一个GPIO口都有一个相对应的文件,我们通过调用这个文件来控制他的电平输出,
举例
root@raspberrypi:/sys/class/gpio/gpio25# echo out > direction
我们到gpio25 处。调用文件direction,为 input方式。
调用value 为output方式。
root@raspberrypi:/sys/class/gpio/gpio25# echo 1 > value
root@raspberrypi:/sys/class/gpio/gpio25# echo 0 > value[8]


这样通过Linux文件方式,我们可以更简单的使用硬件了!!!
4.3.3.2 用GPIO库控制GPIO逻辑输出
树莓派的GPIO库并不像常规嵌入式系统使用C语言作为编程语言,其编程语言多样功能实现范围不齐。
国外的Geek和Programer将这些GPIO口调用进行了封装,理论上各式高级函数都有相应的GPIO库,主流的函数库有
C语言 :Wiring
Python:RPi.GPIO webiopi
Node.js :pi-gpio
WiringPI-GO :Go语言
4.3.3.3 树莓派GPIO口的定义
在这里,不得不提对针脚的定义,在这里只讨论B版的raspberry PI。
目前为止针脚的接口定义还没有形成统一的规范,目前有几种主流方式定义:
Board ,BCM, wiring PI Pin,GPIO name
Board :是板子上的物理编号,相对而言更直观;
BCM :Broadcom的编号方法,
Wiring PI pin:C语言函数库的专有pin值赋值方式。
GPIO name:树莓派基金会给出的BCM编号到GPIO口的映射。
见编号示意图:
wiringPi Pin NameBoard Pin BCM GPIO
0 GPIO 0 11 17
1 GPIO 1 12 18
2 GPIO 2 13 21
3 GPIO 3 15 22
4 GPIO 4 16 23
5 GPIO 5 18 24
6 GPIO 6 22 25
7 GPIO 7 7 4
8 SDA 30
9 SCL 51
10 CE0 24 8
11 CE1 26 7
12 MOSI 19 10
13 MISO 21 9
14 SCLK 23 11
15 TXD 8 14
16 RXD 10 15


Rev.2 新增的引脚:
wiringPi Pin NameBoard Pin BCM GPIO
17 GPIO 8 28
18 GPIO 9 29
19 GPIO10 30
20 GPIO11 31
直观图展现如下:


物理左排针脚说明
Pin Raspberry PiBroadcom names
1 3.3V 3.3V
3 SDA0 I2C0 SDA
5 SCL0 I2C0 SCL
7 GPIO 7 GPIO 4
9 DNC DNC
11 GPIO 0 GPIO 17
13 GPIO 2 GPIO 21 (rev2) / GPIO 27 (rev1)
15 GPIO 3 GPIO 22
17 DNC DNC
19 SPI MOSI SPI MOSI
21 SPI MOSO SPI MOSO
23 SPI SCLK SPI SCLK
25 DNC DNC


物理右排针脚说明
Pin Raspberry PiBroadcom names
2 5V 5V
4 DNC DNC
6 GND GND
8 TX UART TxD
10 RX UART RxD
12 GPIO 1 GPIO 18
14 DNC DNC
16 GPIO 4 GPIO 23
18 GPIO 5 GPIO 24
20 DNC DNC
22 GPIO 6 GPIO 25
24 SP10 CEO N SP10 CEO N
26 SP10 CE1 N SP10 CE1 N


在了解了直流减速电机,L298N驱动板和GPIO口之后,我们需要一门编程语言的函数库来控制GPIO口,这有助于减少工作量,无需专门的编写GPIO口驱动来调用GPIO口的输入和输出。
4.3.3.4 GPIO库和编程语言的选择
在语言选择上,我在代码托管网站Github,SourceForge寻找到了不少方案,其中比较可行的有Python,C,PHP,Node.js等多种高级语言考虑到资料收集的难度,我们放弃了PHP,Node.js的GPIO库,主要原因是GPIO库的函数较少,且作者已经停止更新。在Python和C的语言中,又有多个IO库以供选择,权衡再三,我们选择了:RPi.GPIO。
4.3.3.5 IO库——RPi.GPIO
RPi.GPIO是基于python的专适用于树莓派(Raspberry Pi)的IO函数库,python在Linux系统上使用广泛,结构严谨,是所有Linux操作系统发行版的系统附带语言,有与系统的良好兼容性,树莓派基金会选用RPi.GPIO作为官方推荐的语言之一,在Amazon.com上较多的关于树莓派的书也是使用RPi.GPIO作为开发语言。
4.3.3.6 RPi.GPIO控制运动系统
程序由三个部分构成:car.py driver.py wheel.py
Car.py:定义方向函数,逻辑电平的高低。
Driver.py:建立Socket连接,定义监听IP和端口范围,接收来自外部的指令。
Wheel.py:定义使用GPIO针脚的范围。


4.4 微信信息平台:
4.4.1 云服务器(基于BAE)
4.4.2 微信公众平台处理系统
4.4.3 微信(Weixin)客户端


4.5 Web远程视频控制
Web远程控制采用B/S(Browser/Server)架构,与C/S模式相比,开发和维护任务完全集中于服务器端,少数脚本语言在浏览器中实现,无需安装客户端,减轻了系统维护和升级的成本,有较好的扩展能力和平台适应性。在树莓派上搭建一个Server(服务器)后,通过http协议连接视频控制端和树莓派,视频控制端可以是支持浏览器浏览的设备,包括手机,平板,电脑,甚至是触控手表等新兴体感硬件设备。


4.5.1 驱动移植:
1.先检查摄像头驱动模块 使用dmesg命令:
root@raspberrupihome~#dmesg
2.选择视频编码格式,apt-get方式添加uvcdyctrl软件包:
root@raspberrypihome~# apt-get install uvcdyctrl
3.选择JPEG和V4L编码方式:
root@raspberrypihome~ #apt-get install libjpeg8-dev libv4l-dev
4.下载MJPG-streamer
root@raspberrypihome~#
wget http://mjpg-streamer.svn.sourceforge.net/viewvc/mjpg-streamer/mjpg-streamer/?view=tar -O mjpg-streamer.tar. gz
5.解压编译安装
tar –xvf mjpg-streamer.tar.gz
cd mjpg-streamer
6.安装libjpeg-dev开发库
root@raspberrypihome~ #apt-get install libjpeg-dev
7.make后提示出错信息
linux/videodev.h: No such file or directory
8.建立linux/videodev.h到linux/videodev2.h的符号链接
root@raspberrypihome~ # ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
9.测试运行start.sh
root@raspberrypihome~ # ./start.sh
4.5.2 基于Video4Linux的视频采集
Video4Linux(简称V4L)是Linux内核中支持视频设备的内核驱动,他为针对视频设备的应用程序提供了一系列的API,用户调用V4L提供的API即能实现视频设备的操作和控制。基于V4L的视频采集常用的视频数据结构有:
Video_capability:包括摄像头的基本信息,如name[32](设备名称) , maxwidth , maxheight , minwidth , minheight(支持的最大最小分辨率) , channels(信号源信息)等。
Video_picture包括摄像头采集图像的各种信息,brightness (亮度),colour(色度),whiteness(灰度),depth(深度), contrast (对比度),huc(色调)。
Video_window 包括捕获区域的信息,包括width,height,flags(捕获标志)等。
Video_mmap用于内存映射。
Video_mbuf利用mmap进行映射的帧信息,实际就是输入到摄像头存储器缓冲区的帧信息,包括size(帧大小),frames(最大支持帧数),offsets(每帧相对基址的偏移)。


4.5.3 JavaScript图像获取
JavaScript的图像获取由三个函数构成:function createImageLayer(),function imageOnload(),function imageOnclick()
createImageLayer:定义图像阵列 var finished = new Array();
imageOnload:创建图像图层位置和图像相关参数,定义Z轴位置在一定时间改变图片编号(编号随时间+1)。
imageOnload:删除先前的图像以节省空间。
imageOnclick:点击图像暂停传输。


5结束语
本项目以互联网模式为指导思想,实现远程视频,移动控制,长时间录像保存,简单的操作控制方式,通过微信与多用户交互,看门狗防死机等功能。采用人机交互技术,使硬件智能化,带来新颖的操控方式和体验。通过尚未使用的GPIO接口,可以添加多种传感器实现室内空气质量检测,婴幼儿监控,编程实现定制路线巡逻等其他功能,适应不同场景需求。


引用文献资料:
[1]极客公园,从InnoAwards2013看今年互联网产品趋势. 极客公园,2013.11.14 http://www.geekpark.net/read/view/192515
[2] Jerome H.Saltzer,M.Frans Kaashoek, Principles of Computer System Design 译本:计算机系统设计原理,陈文光,张广艳,陈康等译,2012年12月第一版,北京,清华大学出版社,2012,4-16.
[3] Stefan Sjogelid,Raspberry Pi for Secret Agents, April 2013:First Editon, Birmingham B3 2PB, Packt Publishing Ltd.2013,7-11.
[4]ndrew K. Dennis,Raspberry Pi Home Automation with Arduino,February 2013:First Edition,
Birmingham B3 2PB, UK,Packt Publishing Ltd.2013,7-12.
[5]基于http协议的嵌入式远程监控系统的研究
[6] 李恒超, 张家树,基于嵌入式Web的远程监控研究,四川,成都,西南交通大学计算机与通信工程学院,2003,38(3).
[7] 刘媛, 张伟, 王知学,基于B/S和C/S架构的嵌入式远程监控系统,
[8] Matt Richardson,Shawn Wallace,Getting Started With Raspberry Pi,December 2012: First Edition,the United States of America,O’Reilly Media, Inc.,2012.
[9]北大OSKI开源项目
0 0
原创粉丝点击