数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

Cura是著名的3D打印切片和控制软件。新的版本采用Qt和Python进行了重构,界面变化也非常大,目前还在开发中,运行问题还有不少。这里介绍如何从源代码进行Cura的编译,可以抢先体验新版的界面设计和根据需要进行订制。
这个把相关的脚本都集成到一起了。做了几个重要的改进,基本可以成功运行了。
官方原脚本在这里: https://github.com/Ultimaker/cura-build
主要的改进包括:
1、可以自动判断目录,如没有自动创建,如有则进行源码更新。原脚本安装后更新需要手工一步步进行,很麻烦。
2、改变gtest的安装源到github,原来的是从google下载,由于国内访问不到会导致编译出错。
3、合并 plugins目录,将Uranium\plugins复制到Cura\plugins下,避免找不到插件的错误。
注意:
1、进libArcus将Cmakelists.txt里的add_subdirectory(examples)这一行注释掉,要不编译不过去。
2、目前CuraEngine编译还有些问题,无法执行切片操作。
把下面的内容保存到cura.sh,然后sudo chmod +x cura.sh添加执行权限,然后./cura.sh就Ok了。需要的软件会自动下,时间较长,需要耐心等待。
#!/bin/bash # This is a script which get the latest git repo and build them. # # Tested under ubuntu 15.04, lower versions don't have PyQT 5.2.1 which is required by cura cd ~ if [ ! -d "dev" ]; then mkdir dev fi cd dev sudo apt-get install -y git cmake cmake-gui autoconf libtool python3-setuptools curl python3-pyqt5.* python3-numpy qml-module-qtquick-controls #protobuf. #https://github.com/google/protobuf.git echo "=================================" echo "Install Protobuf." if [ ! -d "protobuf" ]; then git clone https://github.com/Ultimaker/protobuf.git cd protobuf else cd protobuf git pull fi echo "=================================" echo "get gtest." if [ ! -d "gtest" ]; then git clone https://github.com/kgcd/gtest.git else git pull fi echo "=================================" echo "get gmock." if [ ! -d "gmock" ]; then git clone https://github.com/krzysztof-jusiak/gmock.git else git pull fi echo "Build Protobuf." ./autogen.sh ./configure --prefix=/usr make -j4 sudo make install sudo ldconfig cd python python3 setup.py build sudo python3 setup.py install cd ../.. echo "=================================" echo "Install libArcus." if [ ! -d "libArcus" ]; then git clone https://github.com/Ultimaker/libArcus cd libArcus else cd libArcus git pull fi if [ ! -d "build" ]; then mkdir build fi cd build #cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DPYTHON_SITE_PACKAGES_DIR=/usr/lib/python3.4/dist-packages cmake .. -DPYTHON_SITE_PACKAGES_DIR=/usr/lib/python3.4/dist-packages make -j4 sudo make install cd ../../ echo "=================================" echo "Install CuraEngine." if [ ! -d "CuraEngine" ]; then git clone https://github.com/Ultimaker/CuraEngine.git cd CuraEngine else cd CuraEngine git pull fi if [ ! -d "build" ]; then mkdir build fi cd build #cmake .. -DCMAKE_INSTALL_PREFIX=/usr cmake .. make -j4 sudo make install cd ../../ echo "=================================" echo "Install Uranium." if [ ! -d "Uranium" ]; then git clone https://github.com/Ultimaker/Uranium.git cd Uranium else cd Uranium git pull fi if [ ! -d "build" ]; then mkdir build fi cd build #cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DPYTHON_SITE_PACKAGES_DIR=/usr/lib/python3.4/dist-packages -DURANIUM_PLUGINS_DIR=/usr/lib/python3.4/dist-packages cmake .. -DPYTHON_SITE_PACKAGES_DIR=/usr/lib/python3.4/dist-packages -DURANIUM_PLUGINS_DIR=/usr/lib/python3.4/dist-packages sudo make install cd ../.. echo "=================================" echo "Install Cura." if [ ! -d "Cura" ]; then git clone https://github.com/Ultimaker/Cura.git cd Cura else cd Cura git pull fi cd .. echo "Build finished." echo "============================================================================" echo "Merge Resource into Cura/resources/" cp -rv Uranium/resources/* Cura/resources/ echo "Merge Plugins into Cura/plugins/" cp -rv Uranium/plugins/* Cura/plugins/ echo "Link:"$PWD"/CuraEngine/build/CuraEngine" sudo ln -s $PWD/CuraEngine/build/CuraEngine /usr/bin/CuraEngine echo "Starting Cura......" cd Cura python3 cura_app.py echo "You need add to /etc/profile:export PYTHONPATH=/usr/lib/python3/dist-packages" echo "============================================================================="

硬件开发
2015-08-06 10:58:00
感谢 星原 的投递
2015年5月29日的下午接到了顺丰快递投递员关于包裹收 取的电话通知,心中窃喜我的龙芯3B1500开发计算机到了!可以用一路狂奔这个词来形容当时收件的状态,迫不及待的打开了包裹大大的外包装盒,露出了一 个立人牌立式迷你小机箱的包装,然而这里承载的却是一个龙芯爱好者沉甸甸的希望和追求,是心觅知音久未谋面的故人。
回到办公室接上显示器、电源、键盘和鼠标开机,蜂鸣器的声音非常响亮,3B1500开发机搭载的是昆仑V 2.0固件和普华V 3.0桌面开发版系统,WPS的办公软件及一些专业配套软件,解决办公应用,火狐浏览器浏览网页较为顺畅。
龙芯3B1500迷你电脑昆仑固件
主板型号为:Sugon 3B6C-780E-1W-V2-A1310
内存:4GB DDR3(2条2GB)
固件版本:昆仑V2.0.R1(0422)
龙芯3B1500迷你电脑预装普华操作系统
打开机箱,一块itx170*170mm迷你主板印入眼帘,两条2G华芯内存和一块金士顿120G固态硬盘的配置,主板在设计上取消了键盘和鼠标的PS/2接口,结构小巧紧凑、精致有余。
龙芯3B1500迷你电脑ITX主板
拆下主板CUP风扇和散热器,露出焊接于主板上的龙芯3号CPU,上面大大的“龙芯3号”汉字标识格外醒目。
考虑到普华操作系统应用和学习测试的系统安全性方面的问题,保留了原有的金士顿120G固态硬盘系统数据,另外准备了一块西数的500G机械硬盘,开始尝试着为龙芯3B1500开发机安装新的操作系统,以此用于应用体验和测试,而不会伤害到我的龙芯。
龙芯3B1500主板结构布局与官网公布的略有不同, SPI_FLASH芯片 的布置做了优化,主板CMOS的CR1220电池改为在右侧设置了纽扣电池卡座。
在 我的龙芯硬件调整完成后,便开始了龙芯3B1500开发机的新系统安装。在这里需要说明的是,据悉目前可以在龙芯平台运行的操作系统有:官方社区 debian、龙芯开源的fedora和centos、普华、中标麒麟、Deepin等等(debian暂不支持龙芯3B1500),但是我目前可以获取 的系统源仅有龙芯开源社区的fedora和centos。( http://www.loongnix.org/index.php/ )
龙芯操作系统下载页面
我下载准备fedora13-20150427桌面操作系统、fedora19-20150429桌面操作系统和centos6.4-20150424服务器操作系统的安装源,采用live USB方式安装操作系统。
按 照操作要求在龙芯开源站点的liveUSB下载目录中,下载目录下文件拷贝到U盘(ext2格式)中,必须下载boot和live目录及目录下的全部内 容; 然后将需要安装的操作系统(fedora、centos)tar包复制到U盘的live目录中,插上U盘启动计算机后按下delete键,进入昆仑 固件主操作界面,设置启动管理中的第一启动选项为USB ,按ESC退出后选择固件维护选项下的重启计算机,此时昆仑固件将引导计算机由USB启动寻找U 盘根目录下boot/vmlinux内核和boot/initrd文件并运行,从而进入menu安装目录,选择"install system"安装系 统。
龙芯3B1500迷你电脑fedora系统安装界面
与 X86下的fedora安装方法和操作界面有所不同(个人理解为龙芯开源社区移植fedora时所做的必要简化修改),安装过程是全英文的显示,没有了 X86安装下的图形界面,也没有了磁盘分区中“/”、“/boot”、“swap”的分区设置,更没有安装过程中的语言种类和应用程序包的选择过程,只需 要选择硬盘分区设置一个大小适宜的分区(30GB),保存分区设置后退出,确认安装系统的硬盘分区,便开始了操作系统自动安装的过程,直到安装结束提示 “reboot”,此时就可以拔出U盘,按下回车键重启,进入新操作系统的首次登录界面,此后的操作步骤与X86下的fedora安装操作无异,系统安装 过程约15分钟左右。
安装系统首次登录界面
需要说明的是这个fedora13-20150427安装包在安装结束后,设置非超级用户登录时默认的显示界面是English,可在登录时的界面用户名和用户密码下方的语言选择栏选择汉语,登录后界面便是中文界面。
值 得庆幸的是以上正常的操作步骤,不是总能得到同样的操作结果,经反复操作测试龙芯3B1500安装不同版本的操作系 统,fedora13-20150427桌面操作系统、fedora19-20150429桌面操作系统和centos6.4-20150424服务器操 作系统的安装均以失败而告终,昆仑固件引导USB启动报错提示“找不到boot/initrded文件”。为此,作为一个龙芯忠实的粉丝,我纠结了三天两 夜,终究未能解决这个问题。在彷徨与困惑之际,我有幸得到了“PowerVR” 老师的耐心指导和悉心帮助,受益匪浅,有了不小的进步,捋清了龙芯 3B1500开发机系统安装方面的一些特点,最终解决了系统安装和调试方面的问题。让龙芯3B1500开发机成为了我日常工作和学习的有效平台,并可以愉 快的让他在这里整理写下这篇记录稿。
经指点后得知,目前龙芯平台下的软件兼容性和稳定性有待增强,偶尔会因兼容性方面的问题诱发一些操作运 行故障。在软件方面主要有昆仑固件、PMON和系统程序,在引导安装龙芯系统时偶尔会出现报错,致使系统引导故障或安装失败。在硬件方面有一些计算机外围 设备的兼容性较差,如光驱、U盘、存储卡等,在龙芯3B1500平台下不能被识别,无法读取有效的数据信息,导致引导安装失败。
于是,我开 始着重检查昆仑固件、U盘兼容和操作系统源的问题。亲自测试了多款U盘,其中,金士顿U盘USB3.0有兼容问题不能被识别,且会诱发计算机键盘失效故障 导致死机;金士顿SD存储卡经读卡器与机器相连也不能被识别;台电的U盘在龙芯3B1500上兼容性尚可。采用了台电U盘尝试着龙芯开源USB启动盘制作 方法安装系统依然报错失败,后改为在linux下 的普通用户命令行模式下dd命令直接将操作系统源镜像文件写入U盘,重启电脑安装系统。测试了以上三个 版本的操作系统,居然得到了不一样的结果;其中,fedora13-20150427桌面操作系统和centos6.4-20150424服务器操作系统 的安装报错提示“找不到boot/initrded文件”失败,然而fedora19-20150429桌面操作系统安装却顺利的完成了。
接 下来在老师的指导下准备将昆仑固件升级为PMON,来观察系统软件和硬件之间兼容识别等状态的变化。下载了PMON的gzrom- a1310-1.0.8.fd安装包到U盘根目录下,重启计算机进入昆仑固件的固件维护操作界面下,选择从USB更新昆仑固件回车确认,固件成功升级。原 有普华V3.0操作系统和新安装的fedora19-20150429桌面操作系统均可以在PMON固件引导下可正常运行。
现在开始测试龙 芯3B1500在PMON下的USB兼容性,将台电U盘在linux下 的普通用户命令行模式下dd命令直接将操作系统源镜像文件写入U盘,重启计算机安 装操作系统;然而没能进入安装界面,却进入PMON界面报错“找不到安装文件”。当输入命令:PMON>devls列出计算机所有的存储磁盘硬件, 系统是可以检测到USB0设备;输入命令:PMON>dir (USB0)列出U盘根目录下所有文件,系统提示“找不到USB0设备”。同时,在更 换多种USB存储设备后进行测试,得出了以上相同的结果。
于是,我继续开始了PMON升级工作,由于该龙芯3B1500开发机是桌面版本的 6核处理器,龙芯3B1500服务器却是8核芯的CPU,为什么会是这样呢?(个人理解)由于必要的技术操作的缘故,PMON将8核心的龙芯锁闭了2个核 心,所以登录界面才会出现6只小企鹅。在得到了老师的帮助,准备升级POMN固件给龙芯3B1500“开核”,将6核龙芯CPU升级为“龙芯 3B1500/8核心”处理器。
下载浪潮3B1500/8核服务器PMON的PMON-A1310-1.0.9-8cores- dma64.bin安装包到U盘根目录下,重启计算机进入PMON的命令界面下,输入命令 PMON>load -r -f 0xbfc00000 (USB0,0)/PMON-A1310-1.0.9-8cores-dma64.bin 回车。
升级POMN固件
OK, 升级界面提示升级成功!8核心的龙芯3B1500诞生啦,输入命令:PMON>reboot回车,重启计算机,悲剧就这样在我的身上发生了,重启计 算机没有听到主板蜂鸣器清脆的那声“嘀”,更没有等来我那8只可爱的“小企鹅”,等来的却是一块没有任何反映的“砖头块”。这意味着PMON升级烧写 spi flash芯片失败,需要拆下主板的spi flash芯片到电脑维修点用专用烧写设备将PMON-A1310-1.0.9-8cores- dma64.bin文件重新烧写到芯片中。为安全方便考虑重新订购了spi flash芯片,型号为cFeon_EN25F80-100QCP,找电脑维 修店烧写了新旧不同PMON版本的两片spi flash芯片方便测试比对。写好spi flash芯片装机,重新开机进入PMON命令界面下,输入命 令:PMON>devls列出计算机所有的存储磁盘硬件,系统是可以检测到USB0设备;输入命令:PMON>dir (USB0,0)列出 U盘根目录下所有文件,系统依然提示“找不到USB0,0设备”,也就是说8核版本的PMON识别USB disk与在6核版本上的结果一样;意味着采用 USB disk安装龙芯3B1500操作系统是暂时行不通的,只能测试sata接口光驱刻盘安装系统了。
为简易方便考虑,我选择在 windows7下的软碟通软件分别刻录了fedora13-20150427桌面操作系统、fedora19-20150429桌面操作系统和 centos6.4-20150424服务器操作系统,放入刻录好的系统光盘重启计算机,menu安装目录界面出现了,选 择"install system"安装系统,久违的8只小企鹅终于出现了,安装过程十分顺畅,分别测试了以上不同的三个版本的系统安装,均可正常安装和 系统登录。
龙芯3B1500迷你电脑f edora系统登陆系统界面
龙芯3B1500计算机DIY 8核系统界面
龙芯3B1500迷你电脑DIY 8核打开编辑word文档
龙芯3B1500迷你电脑Foxit Reader打开pdf文件
龙芯3B1500迷你电脑打开编辑幻灯片文件
龙芯3B1500迷你电脑打开浏览器浏览新浪军事新闻
龙芯3B1500迷你电脑打开央视新闻网观看在线直播节目
十 多年来,从诞生之处到后来一个又一个关键技术节点的突破,龙芯一直都处于众人的质疑和不解之中;但龙芯人凭着一股不怕苦、不服输的倔劲,顶着国外的技术垄 断和国内的种种指责的巨大压力,愣是给我们中国人的信息安全扎下了那最稳固的一块基石。十多年来的成长呵护,当年小小的龙芯,如今已不再是那稚嫩、幼小的 蚕蛹,他即将破茧成蝶,迎来一个属于中国人的“芯”天地。我谨作为一个龙芯爱好者,由衷感谢那些为龙芯的成长,保驾护航的劳动者,感谢他们的辛劳付出,使 我们的国人可以自由、自在、无限“芯”动。
龙芯3A2000 设计版图
看 到最近龙芯会发布基于最新GS464E处理器架构的新型号芯片的消息,得知性能会比我这台采用老核心的3B1500性能有很大的提高,感到非常高兴。龙芯 是国内独立自主设计CPU内核微架构的团队,与直接采用国外先进CPU内核的芯片相比,走的是一条自由但却艰难的路线。毕竟在CPU微架构的设计上我们是 后来者,英特尔、ARM已经是市场的霸主,每年的开发投入数十亿计美元,远超龙芯十多年的投入,更不要说技术和人才的积累。龙芯在这样的投入对比悬殊的情 况下,能一直坚持到现在,非常的不容易。欣慰的是长期坚持的努力已经有了回报。新一代北斗导航卫星已经采用龙芯芯片,基于龙芯最新GS464E处理器微架 构的3A2000/3B2000也已流片成功,测试性能与老的架构有了成倍的提高。相信随着龙芯性能的不断提高和软件生态的完善,会有更多的像我这样的普 通人用上龙芯电脑。
硬件开发
2015-08-04 21:34:00
在前面已经介绍过芯片制造的过程就如同用乐高盖房子一样,先有晶圆作为地基,再层层往上叠的芯片制造流程后,就可 产出必要的 IC 芯片。然而,没有设计图,拥有再强制造能力都没有用,因此,建筑师的角色相当重要。但是 IC 设计中的建筑师究竟是谁呢?本文接下来要针对 IC 设计做介绍。
在 IC 生产流程中,IC 多由专业 IC 设计公司进行规划、设计,像是联发科、高通、Intel 等知名大厂,都自行设计各自的 IC 芯片,提供不同规格、效能的芯片给下游厂商选择。因为 IC 是由各厂自行设计,所以 IC 设计十分仰赖工程师的技术,工程师的素质影响着一间企业的价值。然而,工程师们在设计一颗 IC 芯片时,究竟有那些步骤?设计流程可以简单分成如下。
设计第一步,订定目标
在 IC 设计中,最重要的步骤就是规格制定。这个步骤就像是在设计建筑前,先决定要几间房间、浴室,有什么建筑法规需要遵守,在确定好所有的功能之后在进行设计, 这样才不用再花额外的时间进行后续修改。IC 设计也需要经过类似的步骤,才能确保设计出来的芯片不会有任何差错。
规格制定的第一步便是确定 IC 的目的、效能为何,对大方向做设定。接着是察看有哪些协定要符合,像无线网卡的芯片就需要符合 IEEE 802.11 等规范,不然,这芯片将无法和市面上的产品相容,使它无法和其他设备连线。最后则是确立这颗 IC 的实作方法,将不同功能分配成不同的单元,并确立不同单元间链接的方法,如此便完成规格的制定。
设计完规格后,接着就是设计芯片的细节了。这个步骤就像初步记下建筑的规画,将整体轮廓描绘出来,方便后续制图。在 IC 芯片中,便是使用硬件描述语言(HDL)将电路描写出来。常使用的 HDL 有 Verilog、VHDL 等,藉由程序码便可轻易地将一颗 IC 地功能表达出来。接着就是检查程序功能的正确性并持续修改,直到它满足期望的功能为止。
▲ 32 bits 加法器的 Verilog 范例。
有了电脑,事情都变得容易
有了完整规画后,接下来便是画出平面的设计蓝图。在 IC 设计中,逻辑合成这个步骤便是将确定无误的 HDL code,放入电子设计自动化工具(EDA tool),让电脑将 HDL code 转换成逻辑电路,产生如下的电路图。之后,反覆的确定此逻辑闸设计图是否符合规格并修改,直到功能正确为止。
▲ 控制单元合成后的结果。
最后,将合成完的程序码再放入另一套 EDA tool,进行电路布局与绕线(Place And Route)。在经过不断的检测后,便会形成如下的电路图。图中可以看到蓝、红、绿、黄等不同颜色,每种不同的颜色就代表着一张光罩。至于光罩究竟要如何运用呢?
▲ 常用的演算芯片- FFT 芯片,完成电路布局与绕线的结果。
层层光罩,叠起一颗芯片
首先,目前已经知道一颗 IC 会产生多张的光罩,这些光罩有上下层的分别,每层有各自的任务。下图为简单的光罩例子,以集成电路中最基本的元件 CMOS 为范例,CMOS 全名为互补式金属氧化物半导体(Complementary metal–oxide–semiconductor),也就是将 NMOS 和 PMOS 两者做结合,形成 CMOS。至于什么是金属氧化物半导体(MOS)?这种在芯片中广泛使用的元件比较难说明,一般读者也较难弄清,在这里就不多加细究。
下图中,左边就是经过电路布局与绕线后形成的电路图,在前面已经知道每种颜色便代表一张光罩。右边则是将每张光罩摊开的样子。制作是,便由底层开始,依循上一篇 IC 芯片的制造中所提的方法,逐层制作,最后便会产生期望的芯片了。
至此,对于 IC 设计应该有初步的了解,整体看来就很清楚 IC 设计是一门非常复杂的专业,也多亏了电脑辅助软件的成熟,让 IC 设计得以加速。IC 设计厂十分依赖工程师的智能,这里所述的每个步骤都有其专门的知识,皆可独立成多门专业的课程,像是撰写硬件描述语言就不单纯的只需要熟悉程序语言,还需 要了解逻辑电路是如何运作、如何将所需的演算法转换成程序、合成软件是如何将程序转换成逻辑闸等问题。
在了解 IC 设计师如同建筑师,晶圆代工厂是建筑营造厂之后,接下来该了解最终如何把芯片包装成一般使用者所熟知的外观,也就是“封装”。在下一篇中,将介绍 IC 封装是什么以及几个重要的技术。
(首图来源: Flickr/Rob Bulmahn CC BY 2.0)
硬件开发
2015-08-04 21:11:00
在介绍过 矽晶圆是什么东西 后,同时,也知道制造 IC 芯片就像是用乐高积木盖房子一样,藉由一层又一层的堆叠,创造自己所期望的造型。然而,盖房子有相当多的步骤,IC 制造也是一样,制造 IC 究竟有哪些步骤?本文将将就 IC 芯片制造的流程做介绍。
层层堆叠的芯片架构
在开始前,我们要先认识 IC 芯片是什么。IC,全名集成电路(Integrated Circuit),由它的命名可知它是将设计好的电路,以堆叠的方式组合起来。藉由这个方法,我们可以减少连接电路时所需耗费的面积。下图为 IC 电路的 3D 图,从图中可以看出它的结构就像房子的梁和柱,一层一层堆叠,这也就是为何会将 IC 制造比拟成盖房子。
▲ IC 芯片的 3D 剖面图。(Source: Wikipedia )
从上图中 IC 芯片的 3D 剖面图来看,底部深蓝色的部分就是上一篇介绍的晶圆,从这张图可以更明确的知道,晶圆基板在芯片中扮演的角色是何等重要。至于红色以及土黄色的部分,则是于 IC 制作时要完成的地方。
首先,在这里可以将红色的部分比拟成高楼中的一楼大厅。一楼大厅,是一栋房子的门户,出入都由这里,在掌握交通下通常会有较多的机能性。因此,和其 他楼层相比,在兴建时会比较复杂,需要较多的步骤。在 IC 电路中,这个大厅就是逻辑闸层,它是整颗 IC 中最重要的部分,藉由将多种逻辑闸组合在一起,完成功能齐全的 IC 芯片。
黄色的部分,则像是一般的楼层。和一楼相比,不会有太复杂的构造,而且每层楼在兴建时也不会有太多变化。这一层的目的,是将红色部分的逻辑闸相连在 一起。之所以需要这么多层,是因为有太多线路要链接在一起,在单层无法容纳所有的线路下,就要多叠几层来达成这个目标了。在这之中,不同层的线路会上下相 连以满足接线的需求。
分层施工,逐层架构
知道 IC 的构造后,接下来要介绍该如何制作。试想一下,如果要以油漆喷罐做精细作图时,我们需先割出图形的遮盖板,盖在纸上。接着再将油漆均匀地喷在纸上,待油漆 干后,再将遮板拿开。不断的重复这个步骤后,便可完成整齐且复杂的图形。制造 IC 就是以类似的方式,藉由遮盖的方式一层一层的堆叠起来。
制作 IC 时,可以简单分成以上 4 种步骤。虽然实际制造时,制造的步骤会有差异,使用的材料也有所不同,但是大体上皆采用类似的原理。这个流程和油漆作画有些许不同,IC 制造是先涂料再加做遮盖,油漆作画则是先遮盖再作画。以下将介绍各流程。 金属溅镀:将欲使用的金属材料均匀洒在晶圆片上,形成一薄膜。 制造光阻:先将光阻材料放在晶圆片上,透过光罩(光罩原理留待下次说明),将电子束打在不要的部分上,破坏光阻材料结构。接着,再以化学药剂将被破坏的材料洗去。 蚀刻技术:将没有受光阻保护的金属,以蚀刻液洗去。蚀刻液通常是具有高腐蚀性的强酸。 光阻去除:使用去光阻液皆剩下的光阻溶解掉,如此便完成一次流程。
最后便会在一整片晶圆上完成很多 IC 芯片,接下来只要将完成的方形 IC 芯片剪下,便可送到封装厂做封装,至于封装厂是什么东西?就要待之后再做说明啰。
▲ 各种尺寸晶圆的比较。(Source: Wikipedia )
最后,附上一段 Intel 的简易 IC 制造流程,看完这部影片应该会对 IC 制造的流程更有感觉喔。
https://www.youtube.com/embed/JDROPMoNZpk
(Source: YouTube )
(首图来源: Flickr/Rob Bulmahn CC BY 2.0)
硬件开发
2015-08-04 21:05:00
在半导体的新闻中,总是会提到以尺寸标示的晶圆厂,如 8 寸或是 12 寸晶圆厂,然而,所谓的晶圆到底是什么东西?其中 8 寸指的是什么部分?要产出大尺寸的晶圆制造又有什么难度呢?以下将逐步介绍半导体最重要的基础——“晶圆”到底是什么。
何谓晶圆?
晶圆(wafer),是制造各式电脑芯片的基础。我们可以将芯片制造比拟成用乐高积木盖房子,藉由一层又一层的堆叠,完成自己期望的造型(也就是各 式芯片)。然而,如果没有良好的地基,盖出来的房子就会歪来歪去,不合自己所意,为了做出完美的房子,便需要一个平稳的基板。对芯片制造来说,这个基板就 是接下来将描述的晶圆。
(Souse: Flickr/Jonathan Stewart CC BY 2.0)
首先,先回想一下小时候在玩乐高积木时,积木的表面都会有一个一个小小圆型的凸出物,藉由这个构造,我们可将两块积木稳固的叠在一起,且不需使用胶 水。芯片制造,也是以类似这样的方式,将后续添加的原子和基板固定在一起。因此,我们需要寻找表面整齐的基板,以满足后续制造所需的条件。
在固体材料中,有一种特殊的晶体结构──单晶(Monocrystalline)。它具有原子一个接着一个紧密排列在一起的特性,可以形成一个平整 的原子表层。因此,采用单晶做成晶圆,便可以满足以上的需求。然而,该如何产生这样的材料呢,主要有二个步骤,分别为纯化以及拉晶,之后便能完成这样的材 料。
如何制造单晶的晶圆
纯化分成两个阶段,第一步是冶金级纯化,此一过程主要是加入碳,以氧化还原的方式,将氧化矽转换成 98% 以上纯度的矽。大部份的金属提炼,像是铁或铜等金属,皆是采用这样的方式获得足够纯度的金属。但是,98% 对于芯片制造来说依旧不够,仍需要进一步提升。因此,将再进一步采用西门子制程(Siemens process)作纯化,如此,将获得半导体制程所需的高纯度多晶硅。
▲ 矽柱制造流程(Source: Wikipedia )
接着,就是拉晶的步骤。首先,将前面所获得的高纯度多晶硅融化,形成液态的矽。之后,以单晶的矽种(seed)和液体表面接触,一边旋转一边缓慢的 向上拉起。至于为何需要单晶的矽种,是因为矽原子排列就和人排队一样,会需要排头让后来的人该如何正确的排列,矽种便是重要的排头,让后来的原子知道该如 何排队。最后,待离开液面的矽原子凝固后,排列整齐的单晶矽柱便完成了。
▲ 单晶矽柱(Souse: Wikipedia )
然而,8 寸、12 寸又代表什么东西呢?其实指的是晶柱,也就是上方图片中长得像铅笔笔杆部分的直径。至于制造大尺寸晶圆又有什么难度呢?如前面所说,晶柱的制作过程就像是 在做棉花糖一样,一边旋转一边成型。有制作过棉花糖的话,应该都知道要做出大而且扎实的棉花糖是相当困难的,而拉晶的过程也是一样,旋转拉起的速度以及温 度的控制都会影响到晶柱的品质。也因此,尺寸愈大时,拉晶对速度与温度的要求就更高,因此要做出高品质 12 寸晶圆的难度就比 8 寸晶圆还来得高。
只是,一整条的矽柱并无法做成芯片制造的基板,为了产生一片一片的矽晶圆,接着需要以钻石刀将矽晶柱横向切成圆片,圆片再经由抛光便可形成芯片制造 所需的矽晶圆。经过这么多步骤,芯片基板的制造便大功告成,下一步便是堆叠房子的步骤,也就是芯片制造。至于该如何制作芯片呢?就待下一篇再解释。
硬件开发
2015-08-04 20:56:00
经过BPI team 的艰苦工作,BPI-M1,BPI-M1+,BPI-M2的源代码已经上传到GITHUB,
github: https://github.com/bpi-sinovoip
所有镜像,在中英文论坛中都有下载。
BPI-WiringPi 官方支持已经发布 (BPI-GitHub)
测试结果
Banana Pi GPIO Python test is OK. Code uploaded to Github
测试结果:
硬件开发
2015-08-04 18:29:00
1.错误:Project facet Java version 1.7 is not supported.
解决方法:项目右键[属性]-搜索facet-然后修改java的版本号-应用,之后重新编译运行即可。
2.eclipse快捷键失效的问题:
解决方法:操作系统中存在于该快捷键重复的用法,修改其他快捷键(比较常见的事搜狗输入法的),或者修改eclipse的快捷键。
eclipse快捷键修改:【菜单栏】-【windows】-【references】-搜索【keys】-搜索【format】-选中需要修改的快捷键操作,在快捷键输入框删除原来的快捷键,直接在键盘上按新快捷键。-【apply】。修改完成,即可使用。
3.修改eclipse中java代码花括号为换行的
【菜单栏】-【windows】-【references】-【java】-【code style】-【formatter】
【new】 --名称为 Braces --编辑【brace】--为换行-【apply】-【ok】。
4.
具体出错信息如下:
java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
解决:在项目lib中添加jta.jar
jta.jar 下载地址:
1, http://java.sun.com/products/jta/ 下载类文件 Class Files,然后自己打包成jar文件,或者直接修改后缀名zip为jar
2,CSDN下载 http://download.csdn.net/source/337356

硬件开发
2015-08-04 14:36:00
banana pi 支援中国偏远省市的乡村教育:左旗蒙中,右旗蒙小的 二间Banana Pi 香蕉派电脑教室正式建立,采用专为banana pi 定制的教育系统 ezgo 系统简体中文版本
让我们一起为台湾真理大学志工团队加油 !!

投入使用的香蕉派电教室
准备就绪
台湾真理大学志工团队加班建议banana pi 电教室
硬件开发
2015-08-01 11:37:00
楼主在这边给大家介绍下如何使用PopMetal的GPIO。先讲过程,再讲原理吧,
该驱动需要涉及到的知识点:1,DTS设备树的作用,2,platform虚拟总线驱动的编写。
第一步,添加DTS节点
在/kernel/arch/arm/boot/dts/rockchip.dts下添加如下内容。
下图rockchip-leds-gpio这部分的内容,修改保存,

第二步,在kernel/drivers下创建个LED文件夹,然后加入如下几个文件驱动文件leds.c,Makefile和Kconfig.如下图
源码:
/***********************************************************************************
* driver for led0
*
**********************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static int leds_probe(struct platform_device *pdev)
{ int ret =-1
int i
int led
enum of_gpio_flags flag
struct device_node *led_node = pdev->dev.of_node
led = of_get_named_gpio_flags(led_node,"led-gpios",0,&flag)
printk("get gpio id successful\n")
if(!gpio_is_valid(led)){
printk("invalid led-gpios: %d\n",led)
return -1
}
if(gpio_request(led,"led_gpio")){
printk("led gpio request failed!\n")
return ret
}
gpio_direction_output(led,1)
for(i=0 i < 10 i++)
{
gpio_set_value(led,1)
mdelay(500)
gpio_set_value(led,0)
mdelay(500)
printk("it's %d\n",i)
}
return 0

}
static int leds_remove(struct platform_device *pdev)
{
return 0
}

static struct of_device_id leds_of_match[] = {
{ .compatible = "rockchip-leds-gpio" },
{ }
}
MODULE_DEVICE_TABLE(of, leds_of_match)
static struct platform_driver leds_driver = {
.driver = {
.name = "leds-drivers",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(leds_of_match),
},
.probe = leds_probe,
.remove = leds_remove,
};

/*static int __init leds_init(void)
{
printk(KERN_INFO "Enter %s\n", __FUNCTION__)
return platform_driver_register(&leds_driver)
return 0
}

static void __exit leds_exit(void)
{
platform_driver_unregister(&leds_driver)
printk("close leds\n")
}*/module_platform_driver(leds_driver)
module_platform_driver(leds_driver)

MODULE_DESCRIPTION("leds Driver")
MODULE_LICENSE("GPL")
MODULE_ALIAS("platform:leds-drivers")
/***********************************************************************************
* driver for led0
*
**********************************************************************************/
Kconfig:

Makefile:

第三步,修改drivers下的Kconfig和Makefile,修改内容如下
在Kconfig末尾添加:source “drivers/led/Kconfig”
在Makefile末尾添加: obj-$(CONFIG_LED0_TEST) +=led/
第四步,编译新的kernel与resource并烧写进板子里,
然后DTS中定义的引脚就会按照驱动的内容,进行高低电平的变化。
需要源码可下载: led.zip
好了,现在我们来介绍下原理,首先是DTS,和另一块开发板PX2不一样,PopMetal并没有写相应的mach-*****文件,而是通过设备树的方式获取引脚的编号,设备树的引入可减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux支持包的开发,使得单个内核镜像能支持多个系统。简单来说,它就是给内核的一个参数,这些参数会启动相应的驱动,这样参数不一样,内核源码支持的系统就不一样。
而在这里我们要清楚的是我们要用相应的引脚就必须创建相应的节点,并且赋上一些参数。
而驱动又是怎么识别到这些参数的呢?这里我们先讲讲platform虚拟总线驱动,这个总线跟IIC,SPI等总线不一样,是由内核虚拟出来的,我们就以上面的代码为例,给大家讲讲他是怎么工作的,
首先这个驱动的核心是:
static struct platform_driver leds_driver = {
.driver = {
.name = "leds-drivers",//驱动名
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(leds_of_match),//匹配设备树
},
.probe = leds_probe,//探测函数,检测硬件上是否存在设备,检测到便执行
.remove = leds_remove,//移除函数,硬件移除时,执行
};
在这里我们只给部分内容赋予了值,本身这个结构体还有别的子项,需要了解的同学可以在这编博客看看:http://blog.sina.com.cn/s/blog_53c733350100zdav.html
在这个结构体中,我们就是通过.of_match_table = of_match_ptr(leds_of_match),来匹配设备树上的参数,而即系统会根据设备树种定义的compatible参数比较驱动中的leds_of_match中定义的 .compatible 参数,
来为参数找到相应的驱动,而定义的probe和remove函数则是对探测到设备做出反应,及移除设备时做出反应,而module_platform_driver(leds_driver)是将驱动挂到总线上去,
现在我们看看probe是怎么获取到GPIO的值的,其中它的主要函数如下:
struct device_node *led_node = pdev->dev.of_node
led = of_get_named_gpio_flags(led_node,"led-gpios",0,&flag)
功能就是将led_node节点上的led-gpios的值取下,而我们之前在rockchip.dts中队led-gpios的定义如下:
led-gpios=&GPIO6 GPIO_A6 GPIO_ACTIVE_LOW,意思就是选择引脚gpio6_a6,且该引脚低电平有效。
上面这句赋值便已经将引脚的编号赋给了led-gpios,故接下来我们就可以用GPIO_requset_one GPIO_set_value,等函数去操作这个GPIO了,像gpio_set_value(led-gpios,1)将该引脚设置为高电平。
当然这些操作只是相对于引脚没复用的GPIO口,引脚如果有复用功能,我们还得进行一些别的操作把引脚的功能选好。
硬件开发
2015-08-03 18:07:00
 为了能够帮助用户设计出美观、简洁的思维导图, XMind 6 本身提供了丰富的图标可以嵌入各种导图,用户能够将常用的图标直接添加到 XMind 图标库中,提高工作效率。为了满足用户更多样化的需求,还提供了导入、导出功能。下面我们就看看如何在 XMind 6 中对图标组进行导入。
  打开 XMind 6 思维导图后,我们打开图标界面,可以在右上角看到 “ 导入 ”“ 导出 ” 的按钮。
  点击导入按钮,跳出如下的导入对话框。
  我们可以在导入中选择你所拥有的 .xmp 文件,可以是你曾经保存或从人处获得。 或者在浏览中添加图片文件,而且所选文件夹中的子文件夹将不会进行导入。
  需要注意的是,包括 .xmp 文件都是以文件夹包的形式进行上传,不能够单独上传,想要单独添加图标可参考如何在 XMind 6 中建立自己的图标组。
  那么我们在图标板块中就可以看到我们导入的图标组了。
  我们也可以去显示图标设置中修改图标组的名称。
以上就是关于 xmind6 图标组导入的全部教程,更多可以访问 xmind 中文官网
硬件开发
2015-07-28 13:49:00
Arduino + XXD 电调 +1000KV电机、 使用PID来调节稳定性,今天上午终于调节 x,y轴稳定。 回想遇到的问题,真的是试出来的值。
PID算法很简单,写的话不需要10分钟就能写出来,不过要想找对P,I,D三个参数的值 运气好的话自不用说,运气不好调一个月都不一定能调稳。 使用MPU6050调试,在室内是一个轴一个轴地调试,就是架在凳子上,让一个轴能够自由旋转,类似下面这样

使用欧拉角来调节PID三个参数,一开始遇到一个这个问题,就是当我设定值为0度的时候也就是水平放置的时候表现的还算可以,一直小幅震荡,也没有太大发散的现象,可是当我设定值不是0度而是偏转一定角度的时候就表现的啥也不是。 导致这个问题的原因是: 我的油门太小了,。。 因为一开始调的时候扇叶转的很快,不敢将油门加大,只用了 1100的油门(满量程是1900,就是程序中的占空比),油门太小导致飞行器还没有摆脱重力的影响,所以根本都不可能调对。这是放不开的第一个地方。

接下来的时候我们就将基础油门加大了,至少可以摆脱重力的影响了,然后又是几天的P、I、D参数整定。
先调P,如果能摆到平衡位置而且还发散震荡 ,说明P调大了,缩小一些,缩小到能够小幅等幅震荡为止 , 这里给大家说个小技巧,就是先用手将轴转到大约设定的角度,看看轴是不是小幅等幅震荡,如果小幅震荡说明P调好了,反之,如果轴转的过猛,太大了,如果力度感觉不足,那就是太小了 。 这个时候我们肯定不能要求快速性和静态误差。
静态误差的消除,调I。 P调的可以了,就缓慢增加 I ,我们的I都是0.01的增加,具体的做法是I先加一个比较大的值,这个时候四轴反应跟吃x药一样剧烈,然后再缓慢缩小,直到四轴开始平静下来,关于平静下来我也没有一个标准,当然如果你降低的过程中能够快速摆到平衡位置而且还不震荡不超调那说明你走运了。不走运的做法是,I往下降的时候能够等幅震荡,即使这个等幅震荡的幅度还是很大只要能够等幅震荡就可以了,反正只要不发散就已经可以了,等不等幅都是主观感应,也不需要太准,毕竟人又不是仪器。
上面两个参数调好了已经很不容易了,然后开始调D (有的开源飞控都不需要D啊,但是对于我们粗略调试来说不用D上面两个值简直就是没法用)。 刚开始调D,惯例又是没放开,因为调P,调I的时候得出的经验是我能预计到正切值的范围肯定在这附近。但是D完全不是这一回事啊,我一次 +1 +5 +10 仍然有震荡,而且快速性根本不好地说,调平稳需要5~10s !! 直到我都怀疑程序写错算法不对了,然后又是查资料又是开别人的飞控。看了匿名飞控,蔡大代码的PID部分之后发现,那几行核心代码都大差不差啊,为什么就是不行呢! 直到今天早上吧,放开了又调了一次,D生生被我加到了200 -)_(- ,稳了! 曲线大概是这个样子


上升时间不超过 0.5s 而且还能稳定在设定值那里,达到了网上成熟的飞控平稳效果。

PID算法本身而言很简单,背后的理论虽然都在课堂上交给老师了,但在用起来这么爽之后反而激发了自己的求知欲望。 PID核心算法摘自维基,如下伪代码
previous_error = 0 integral = 0 start: error = setpoint - measured_value integral = integral + error*dt derivative = (error - previous_error)/dt output = Kp*error + Ki*integral + Kd*derivative previous_error = error wait(dt) goto start

总结除了关键的地方就是被一些潜在的意识所束缚,调试飞行器的过程中理论分析也是必不可少。

硬件开发
2015-07-28 11:33:00
出售Sam-ba批量烧写软件。
软件可同时烧写上百台电路板,nor flash或者nor flash均可
有意者可以联系 扣扣号:二四一七零七七四零一。
硬件开发
2015-07-25 22:21:00
由于官方文件没有说明esp8266的启动特点,本文根据sdk内的flash map文档,sdk makefile, ld文件及flash image 生成的python脚本文件,简要分析esp8266的启动和运行,及flash镜像的构成特点。这里使用的sdk和编译时配置项见 esp8266 rtos sdk在小黄板上的使用
##sdk生成的elf文件 这里主要分析sdk根目录下的makefile文件就可以得到elf相关信息。
在执行make前我们已经选择好编译的配置项,这里直接给出: boot=none app=0 freqdiv=0 mode=0 size_map=4 flash=4096
从makefile内可以分析到使用的ld文件是: LD_FILE = $(LDDIR)/eagle.app.v6.ld
eagle.app.v6.ld可以看到 MEMORY { dport0_0_seg : org = 0x3FF00000, len = 0x10 dram0_0_seg : org = 0x3FFE8000, len = 0x14000 iram1_0_seg : org = 0x40100000, len = 0x8000 irom0_0_seg : org = 0x40240000, len = 0x3C000 }
sdk编译过程中会先生成eagle.app.v6.out,然后dump出段信息和符号文件 @$(RM) -r ../bin/eagle.S ../bin/eagle.dump @$(OBJDUMP) -x -s $< > ../bin/eagle.dump @$(OBJDUMP) -S $< > ../bin/eagle.S
从eagle.dump中可以找到对实际运行有效的5个section: Idx Name Size VMA LMA File off Algn 0 .data 00000634 3ffe8000 3ffe8000 000000e0 2**4 1 .rodata 000008b0 3ffe8640 3ffe8640 00000720 2**4 2 .bss 00006bc8 3ffe8ef0 3ffe8ef0 00000fd0 2**4 3 .text 0000776a 40100000 40100000 00000fd0 2**2 4 .irom0.text 00030928 40240000 40240000 00008740 2**4
结合ld文件的memory信息可以看到 .data, .rodata, .bbs都是放到dram0_0_seg中,.text是放到iram1_0_seg中,.irom0.text是放到irom0_0_seg中。
##将elf文件转化为烧写镜像 ###makefile将以上各section copy成单个文件 $(OBJCOPY) --only-section .text -O binary $< eagle.app.v6.text.bin $(OBJCOPY) --only-section .data -O binary $< eagle.app.v6.data.bin $(OBJCOPY) --only-section .rodata -O binary $< eagle.app.v6.rodata.bin $(OBJCOPY) --only-section .irom0.text -O binary $< eagle.app.v6.irom0text.bin
###将section打包 然后使用gen_appbin.py脚本将eagle.app.v6.text.bin,eagle.app.v6.data.bin,eagle.app.v6.rodata.bin三个文件打包成一个 eagle.app.flash.bin , 命令为: python ../tools/gen_appbin.py $< 0 $(mode) $(freqdiv) $(size_map)
这里直接给出gen_appbin.py的各项参数 elf_file = sys.argv[1] >eagle.app.v6.out boot_mode = sys.argv[2] >0 flash_mode = sys.argv[3] >0 flash_clk_div = sys.argv[4] >0 flash_size_map = sys.argv[5] >4 BIN_MAGIC_IROM = 0xEA TEXT_ADDRESS = 0x40100000
打包过程简要: 通过nm -g eagle.app.v6.out 产生eagle.app.sym,在sym文件中找出section地址和入口地址 call_user_start --> entry_addr >40100004 入口地址 _data_start --> data_start_addr >3ffe8000 .data段开始地址 _rodata_start --> rodata_start_addr >3ffe8640 .rodata段开始地址 按照如下格式打包成eagle.app.flash.bin
HEAD0 = BIN_MAGIC_FLASH
HEAD1 = 3
HEAD2 = flash_mode
HEAD3 = flash_size_map<<4 | flash_clk_div
ENTRY = entry_addr 入口地址
TEXTADDR = TEXT_ADDRESS
TEXTLEN = eagle.app.v6.text.bin的文件长度4字节对齐
TEXT = eagle.app.v6.text.bin 的数据,4字节对齐,最后不对齐的补0
DATAADDR = data_start_addr
DATALEN = eagle.app.v6.data.bin的文件长度4字节对齐
DATA = eagle.app.v6.data.bin 的数据,4字节对齐,最后不对齐的补0
RODATAADDR = data_start_addr
RODATALEN = eagle.app.v6.data.bin的文件长度4字节对齐
RODATA = eagle.app.v6.data.bin 的数据,4字节对齐,最后不对齐的补0
ALIGMENT = 对齐数据,保证sum前的数据16字节对齐,不对齐这里补0
CHKSUM = eagle.app.flash.bin的校验和 将生成的文件重命名为要烧写到flash的镜像名 @mv eagle.app.flash.bin ../bin/eagle.flash.bin @mv eagle.app.v6.irom0text.bin ../bin/eagle.irom0text.bin
##FLASH MAP 在数据下载后会写到SPI Flash内: eagle.flash.bin下载到0x00000处 eagle.irom0text.bin下载到0x40000处
##irom说明 从前面可以看.text放到idram0中执行,但指令内存空间有限32K,所以在C代码中,使用ICACHE_FLASH_ATTR定义的函数将会放到irom0内,最后也就是放到了eagle.irom0text.bin,被放到SPI flash上的0x40000处。 #define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text")))
##启动和运行 现在可以来猜启动和运行的过程了: 芯片上电后会先运行片上的ROM,完成必要初始化 片上ROM读取SPI Flash 0x00000处的flash.bin,并解析出text,data,rodata在内存中的位置,并将这3部分加载到片上内存中 text加载到iram1上,因此text最大不能操过32K(0x8000), 可见内存加载的代码有限 data和rodata加载到dram0上,因此这二者和不能大于80K(0x14000) 在dram0上还有bbs,stack,heap,要注意使用量,在目前的状况下:data+rodata+bbs = 634+8b0+6bc8 = 7AAC,因此stack和heap能用的内存只有50K左右(0x14000-0x7AAC) 片上固化rom加载flash.bin完毕后跳到入口地址entry_addr处执行 当执行到irom1上的代码时(通过ICACHE_FLASH_ATTR定义的函数),会将它们从SPI Flash上读到 cache 中运行。**注意:**不要在 GPIO 或 UART 中断处理函数中调用带有 "ICACHE_FLASH_ATTR" 宏的函数,否则将进入异常。
由于片上ROM我们不能更改,因此编写代码时要遵循FLASH MAP地址和大小。
硬件开发
2015-07-25 17:40:00
首先Arduino默认的I2C地址是7位地址,手册上说明有,7位地址为0X1E,读地址为0x3D = (7位地址<<1 +1),写地址为0X3C (7位地址 << 1)
如果要想与HMC5883L进行通信,则需要在HMC5883L上电5ms之后进行。 所以一般写入配置时需要先延时5ms再进行通信。


连入设备后对传感器进行测试、识别的操作与 识别寄存器A、 识别寄存器B、识别寄存器C有关,所以想知道传感器是否正常工作就读取他们的值验证一下,因为他们三个都是只读寄存器,科技静态测试
识别寄存器A 地址 0x0A 默认值为 0x48
识别寄存器B 地址 0x0B 默认值为 0x34
识别寄存器C 地址 0x0C 默认值为 0x33
读取寄存器的值以确保设备正常通信。

对于传感器我们最关心的还是如何读取它的值和如何处理读出来的值。
传感器的测量值放在X,Y,Z 16位寄存器中,关于测量模式有两种 连续测量和单次测量,单次测量我用了一下,感觉不太好,所以下面主要介绍连续测量。
配置成连续测量方式很简单,就是上面的模式寄存器,地址0x02






可以看到,配置成连续测量模式只需要给模式寄存器写入0x00就行。

配置成连续,配置成连续读取模式之后有一个很重要的地方需要记住: 读取XYZ,一次一定要读取6个字节,也就是全部读取,不然的话数据不更新! 手册上没有给出具体的解释,不过我猜测应该是 写地址与读地址公用了一个地址导致这个现象 。
数据处理:
X,Y,Z 16位数据读取完毕后需要用到转换出角度,刚开始转换出的角度一直不对,而且很纳闷因为看到网上现成的代码中都是那一套公式,atan2(y,x)*180/pi+180 可是自己计算的就是不对。
原来是手册上的X,Y,Z寄存器并不是指的实际的X,Y,Z导致的
实际上的X,Y,Z 是 X,Z,Y存储在数据区域的,伪代码表示为
requestFrom(0x3D,6);
x = Wire.read()<<8 | Wire.read()
z = Wire.read()<<8 | Wire.read()
y = Wire.read()<<8 | Wire.read()
double degree=atan2(y,x) *180/PI+180
这样得出的degree才是HMC5883L与磁北方向的夹角。 我测试的结果为,基本上与iphone自带的传感器数值一致,误差在3-5度之间,这可能是干扰或者我的人工误差引起的,所以做出来的效果还算满意。

下面是测试代码;
#include #include #define ADDRESS 0x1e const int led_Pin=13; const int rady=22; void setup() { pinMode(rady, INPUT); pinMode(led_Pin, OUTPUT); Serial.begin(115200); delay(5); Wire.begin(); Wire.beginTransmission(ADDRESS); Wire.write(0x02); Wire.write(0x00); Wire.endTransmission(); Wire.beginTransmission(ADDRESS); Wire.write(10); Wire.endTransmission(); Wire.requestFrom(ADDRESS,1); if(Wire.available()==1&&Wire.read()==0x48){ Serial.println("connect success"); }else Serial.println("connect failure"); Wire.beginTransmission(ADDRESS); Wire.write(0x02); Wire.endTransmission(); Wire.requestFrom(ADDRESS,1); if(Wire.available()==1) { switch(Wire.read()) { case 00: Serial.println("sequence measure"); break; case 01: Serial.println("single measure"); break; default: Serial.println("other measure"); break; } } } void loop() { Wire.beginTransmission(ADDRESS); Wire.write(0x03); Wire.endTransmission(); Wire.requestFrom(ADDRESS,6); //delay(10); if(Wire.available()==6&&digitalRead(rady)){ Serial.print("receive:"); int x=Wire.read(); x=x<<8|(Wire.read()); int z=Wire.read(); z=z<<8|(Wire.read()); int y=Wire.read(); y=y<<8|(Wire.read()); float rot=atan2(y,x)*180/PI+180; Serial.println(rot); } else{ Serial.print("rady is "); Serial.println(digitalRead(rady)?"HIGH":"LOW"); } delay(1000); }

硬件开发
2015-07-13 16:36:00
总结一下无线模块调试的体会。Arduino上已经有人做了这个模块的库了,但是自己根据手册写的也有一定的参考意义。
无线模块是我认为比较难调试的模块之一,因为是双方互动的一种模块,通信失败有两方面的原因,不能从单一代码中找。代码写好了,也将各种信息写进去了,但就是收不到或者接收不到数据。首先想到的是检查设备的连线。因为是SPI通信,所以使用的是mega2560自带的SPI通道口,查看上篇文章介绍。
除此之外CC1101有个GDO0 我连接在了板子上的48引脚、

确认连线。
其次就是测试SPI是否正常工作,在状态寄存器的0x31地址为0x14,如果你读取结果为0x14那么基本上SPI为静态工作的,查看芯片手册说这个Version状态寄存器的复位值为0x04,可能为手册的一处笔误。因为我们读取了3个模块,用了不同的代码都为这个值。
我的检测CC1101的代码是这样写的
bool CC1101::selftest() { return readstatus_by_addr(0x31)==0x14; } //然后在setup中使用下面代码片段判断CC1101是否正常工作 //根据这些信息就可以完成自检 if(cc1101.selftest()) Serial.println("cc1101 connect success"); else Serial.println("cc1101 connect failure");


另外我们在测试的工程中常常用的是写Addr寄存器来测试读写是否正常,Addr寄存器地址为0x09,先写入后读出,如果前后一致,则你与芯片的通信基本上是没问题了。


测试这些后如果你还是无法两个无线通信,那么确认信道是否一致。
手册上建议IO电流不要超过10ma,但是经测试我直接用io口读取,电流为50mA也还正常工作。而且还有个很重要的一点,CC1101手册上说明是用3.3V供电,但是实际中发现直接连接5V也可以,而且效果更好! 用了两三天了5V没有出现问题


源码工程地址
硬件开发
2015-07-09 17:04:00
之前楼主在论坛中已经分享了简单驱动的编写,现在楼主再来教刚接触板子的新手们如何引用调用GPIO,不过这里楼主并没有将GPIO口的函数封装成库,然后在eclipse上调用,楼主这边的例子,只是简单的用adb工具进入板中,然后用一个测试程序使用端口,有兴趣想要在安卓界面调用端口的,可以参考楼主之前写的那编jni调用的帖子。
首先我们依旧来简单地说下步骤,
1.在/kernel/drivers下建个文件夹,自己创建并添加Kconfig和makefile,内容如下,




2.在该目录下写个gpio驱动,内容在最后
3.返回drivers目录,在目录下修改Kconfig和makefile,修改内容如下



4.进入内核,打开已写好的驱动。

驱动内容如下,
/***********************************************************************************
* driver for GPIO
*
**********************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define DEVICE_NAME "rkpx2_GPIO" //定义设备名


#define RKPX2_GPIO_MAJOR 101 //定义设备号

static struct class *dev_class//定义设备结构体


static int gpio_open(struct inode *inode, struct file *file)
{
int i
int err
i=0

err = gpio_request(RK30_PIN4_PD1, "GPIO4_D1")//申请端口gpio4_1,成功返回0,失败返回负的错误值

if(err)
{
printk(KERN_ERR "RK_PX2 failed to request GPIO4_D1 \n")
return err
}//若申请失败,则报错,然后推出,

err = gpio_request(RK30_PIN4_PD2, "GPIO4_D2")//申请端口gpio4_2,成功返回0,失败返回负的错误值

if(err)
{
printk(KERN_ERR "RK_PX2 failed to request GPIO4_D2 \n")
return err
}
err = gpio_request(RK30_PIN4_PD3, "GPIO4_D3")//申请端口gpio4_3,成功返回0,失败返回负的错误值

if(err)
{
printk(KERN_ERR "RK_PX2 failed to request GPIO4_D3 \n")
return err
}
err = gpio_request(RK30_PIN4_PD4, "GPIO4_D4")//申请端口gpio4_4,成功返回0,失败返回负的错误值

if(err)
{
printk(KERN_ERR "RK_PX2 failed to request GPIO4_D4 \n")
return err
}
printk(KERN_INFO "RK_PX2 GPIO opened 4 !\n")

gpio_direction_output(RK30_PIN4_PD1,1)//决定GPIO的方向,为输出
gpio_direction_output(RK30_PIN4_PD2,1)
gpio_direction_output(RK30_PIN4_PD3,1)
gpio_direction_output(RK30_PIN4_PD4,1)

return 0

}

static int gpio_close(struct inode *inode, struct file *file)
{
gpio_free(RK30_PIN4_PD1)
gpio_free(RK30_PIN4_PD2)
gpio_free(RK30_PIN4_PD3)
gpio_free(RK30_PIN4_PD4) //释放端口,
printk(KERN_INFO "RK_PX2 GPIO driver successfully close\n")
return 0
}

static int gpio_read(struct file *file, char *buffer, size_t size, loff_t *pos) //从内核中读取GPIO引脚的值
{
int ret
char key_buf[4]
if (gpio_get_value(RK30_PIN4_PD1)==0){
key_buf[0]=0
}else{
key_buf[0]=1
}
if (gpio_get_value(RK30_PIN4_PD2)==0){
key_buf[1]=0
}else{
key_buf[1]=1
}
if (gpio_get_value(RK30_PIN4_PD3)==0){
key_buf[2]=0
}else{
key_buf[2]=1
}
if (gpio_get_value(RK30_PIN4_PD4)==0){
key_buf[3]=0
}else{
key_buf[3]=1
}
ret=copy_to_user(buffer,key_buf,4)//拷贝数据到用户区 ,成功为 0,失败为字节数

return ret
}

static long gpio_ioctl(struct file *file ,unsigned int cmd,unsigned long arg){

switch(cmd){//改变引脚的电平值
case 00: gpio_set_value(RK30_PIN4_PD1,0)
printk("GPIO_D1 is low!\n")
break
case 01: gpio_set_value(RK30_PIN4_PD1,1)
printk("GPIO_D1 is high!\n")
break
case 10: gpio_set_value(RK30_PIN4_PD2,0)
printk("GPIO_D2 is low!\n")
break
case 11: gpio_set_value(RK30_PIN4_PD2,1)
printk("GPIO_D2 is high!\n")
break
case 20: gpio_set_value(RK30_PIN4_PD3,0)
printk("GPIO_D3 is low!\n")
break
case 21: gpio_set_value(RK30_PIN4_PD3,1)
printk("GPIO_D3 is high!\n")
break
case 30: gpio_set_value(RK30_PIN4_PD4,0)
printk("GPIO_D4 is low!\n")
break
case 31: gpio_set_value(RK30_PIN4_PD4,1)
printk("GPIO_D4 is high!\n")
break

}

return 0
}

/*驱动接口设置*/
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
//.unlocked_ioctl = tq210_gpio_ioctl,
.open = gpio_open,
.release = gpio_close,
.read = gpio_read,
.unlocked_ioctl = gpio_ioctl,
}

/*初始化设备,配置对应的IO,以及注册设备*/
static int __init dev_init(void)
{
int ret
ret=0
ret = register_chrdev(RKPX2_GPIO_MAJOR,"rkpx2_GPIO",&dev_fops)//注册
if (ret<0) {
printk("rkpx2 GPIO for test unable to get major%d \n",ret)
return ret
}
dev_class = class_create(THIS_MODULE,"rkpx2_GPIO")//初始化
if (IS_ERR(dev_class)){
unregister_chrdev(RKPX2_GPIO_MAJOR,"rkpx2_GPIO")
return PTR_ERR(dev_class)
}
device_create(dev_class,NULL,MKDEV(RKPX2_GPIO_MAJOR,0),NULL,"rkpx2_GPIO")//创建设备
printk(KERN_INFO "RKPX2 GPIO driver successfully probed!\n")

return ret
}

/*注销设备*/
static void __exit dev_exit(void)
{
//misc_deregister(&dev_misc)
gpio_free(RK30_PIN4_PD1)
gpio_free(RK30_PIN4_PD2)
gpio_free(RK30_PIN4_PD3)
gpio_free(RK30_PIN4_PD4)
printk(KERN_INFO "RKPX2 gpio driver successfully exit\n")
}

module_init(dev_init)
module_exit(dev_exit)

MODULE_AUTHOR("Rayeager cyl")
MODULE_DESCRIPTION("rkpx2 gpio Driver")
MODULE_LICENSE("GPL")

然后测试程序内容如下:


#include
#include
#include
#include

#define DEVICE_NAME "/dev/rkpx2_GPIO"
#define LED_OFF 0
#define LED_ON 1

int main(int argc,char **argv){

int fd
int ret
int flag
int pin
int ch
printf("\n start test gpio_drivers\n")
if(strcmp(argv[1],"open")==0){
fd=open(DEVICE_NAME,O_RDWR)
if (fd==-1){
printf("open devices %s error\n",DEVICE_NAME)
}


printf("input the pin you want to operate")
scanf("%d",&pin)
printf("\n")
printf("it will be set ?(1=on or 0=off):")
scanf("%d",&ch)

switch(pin){
case 0: (ch==1?ioctl(fd,1):ioctl(fd,2))break
case 1: (ch==1?ioctl(fd,3):ioctl(fd,4))break
case 2: (ch==1?ioctl(fd,5):ioctl(fd,6))break
case 3: (ch==1?ioctl(fd,7):ioctl(fd,8))break


}
}



if(strcmp(argv[1],"close")==0){
fd=open(DEVICE_NAME,O_RDWR)
close(fd)
}


return 0

}
Android.mk的内容
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=\

test.c

LOCAL_MODULE:=gpioapp

include$(BUILD_EXECUTABLE)
编译测试程序的方法:在源码任意位置建个目录,把Android.mk和测试程序全扔进去,然后执行mm(现在根目录执行source build/envsetup.sh)




实际操作,过程就不说了,亲测可行,正常操作的端口为GPIO4_1234
硬件开发
2015-07-08 17:41:00
连线篇
板子 arduino mega2560,非此型号的板子可查看官网说明 传送门
mosi 对应 51脚
miso 对应 50脚
sck 对应52脚
csn、ss 对应53脚,使能信号脚
代码篇
在arduino sketch中加入头文件 SPI.h 内置libiary就有,无需另外下载
#include
SPI使用前arduino惯例代码 setup中先执行
SPI.begin();
因为SPI是双向传输数据,所以只有一个传输数据的接口
receive=SPI.transfer(data); 这里送入data,送出receive

在与SPI设备通信时需要利用上面的函数加上包装即可。
一般常用的SPI读写寄存器操作,需要在setup中先配置好io口状态
pinMode(csn,OUTPUT);
pinMode(miso,INPUT); unsigned char wr_reg_by_addr(unsigned char addr,unsigned char data) { digitalWrite(csn,LOW); while(digitalRead(miso)); //等待信号线可用 SPI.transfer(addr); unsigned char value=SPI.transfer(data); digitalWrite(csn,HIGH); return value; }
硬件开发
2015-07-08 16:50:00
Sinovoip 与富士康集团(Foxconn)全力打造第三代香蕉派开发板:banana pi BPI-M3,形成了双核,四核,八核开源硬件开发板的全系列产品,现在BPI-M3,已经完成了工程样机阶段,很快将进入中试阶段。Banana PI BPI-M3 是一款8核高性能单板计算机,Banana PI BPI-M3是一款比树莓派更强悍的八核Android 5.1产品。Banana PI BPI-M3 兼容性强大,可以跑android系统,Debian linux,Ubuntu linux, Raspberry Pi系统 和 cubieboard 系统.Banana PI BPI-M3硬件:1Ghz ARM7 8核处理器,2GB LPDDR3内存,千兆以太网口,2 USB 接口 流畅运行Android5.1。Banana PI BPI-M3体积如信用卡大小,与BPI-M1+尺寸一样,但接口有不同,轻松运行《雷神之锤三:竞技场》这样的游戏,支持2K高清视频输出,GPIO兼容Raspberry PiB+并能运行其ROM Image。BPI-M3在八核处理器上,采用了全志科技的A83T 处理器。全志A83T采用台积电最新的28nm HPC工艺,基于8个ARMCortex-A7 CPU内核, 最高频率可达2.0GHz, 8核心可同时全速运行;在图像处理方面, A83T沿用A31/A31s的PowerVR SGX544 GPU, 运行频率最高可达700MHz左右,图像处理性能十分强劲,确保了极致的游戏体验及UI流畅度。 内存方面,DDR工作频率可达800MHz左右,能够流畅完美带动1920×1200高清分辨率屏幕。 多媒体处理方面, A83T八核可完美支持多格式1080p@60fps视频编解码, 支持H.265 1080P@30fps视频处理,足以满足终端用户日常视听娱乐需求。 A83T内置ISP图像信号处理器,可支持800万像素摄像头。此外, A83T还集成全志最新的丽色显示技术来提升图像显示质量,不仅能为终端用户带去更愉悦的视觉体验,同时在色彩柔和度等方面进行优化,增强对终端用户尤其是儿童用户的视力保护。集成全硬件的安全系统是A83T的另一大特色。A83T支持数字版权保护方案,包括高等级的Widevine Level 1,用于Miracast的HDCP 2.X, 支持secure boot/secure storage功能,确保系统与数据的安全。28nm的先进工艺、超高能效的Cortex-A7架构、性能功耗最均衡的PoweVR series 5 GPU以及软件方面的持续优化等,让A83T在功耗方面的表现也十分突出,A83T八核的功耗将比四核更低。完善的硬件规格: 1, 八核CPU. 性能远超树莓派2, 40 PIN 兼容树莓派 2 代。3, 2G LPDDR3,4, 板载SDIO 接口无线WIFI & 蓝牙BT4.0。5, 板载8G eMMC flash 6, 提供CSI,DSI ,Audio,2*USB接口,1*OTG接口7, 支持TF 卡启动与eMMC启动。8, 灵活的WIFI天线,可以外接,也可以采用贴片天线。
硬件SPEC:
经过近两年的发展,香蕉派banana pi 已经形成了全系列产品线,从双核,四核,到最新的8核开源单板计算机。配合BPI-G1 物联网网关,BPI-D1 开源摄像头,BPI-R1开源智能路由器板。极大的方便了创客进行二次开发,DIY工作。灵活应用在行业应用,物联网开发,智能家居开发。
完善的配件产品线:
关于SINOVOIP
深圳市源创通信技术有限公司(SINOVOIP)创立于2003年,12年专业嵌入式软硬件开发及生产经验,为硬件产品创新者提供研发和制造的支持,公司软硬件人员50多人。工厂人员近400人,工厂占地约10000平方米,总部设在深圳。源创通信在世界近80个国家有业务关系,并在40多个国家设有代理商。
在开源硬件兴起的今天,成功的运作香蕉派开源硬件项目,在一年多的时间内已经累积销售400000片以上,并形成了BPI系列产品,专注在开源硬件开发与物联网相关的软硬件开发。香蕉派97以上的产品出口海外。?


公司情况:
1、基本情况:2003年成立,近500余人,互联网、科技与制造结合,提供开源硬件及产品的定制开发服务。
2、10000多平方的工厂,有60多台高速SMT贴片机,24条SMT生产线,80%以上的业务来自日本。以高品质服务客户。
3、10多年的OEM&ODM产品开发与定制服务,公司有精通嵌入式软硬件开发人员,有完善的研发,品质管理流程。
4、2013年开始开源硬件与物联网的软硬件开发,所做香蕉派开源硬件,累积销量达到400000片以上,并为客户进行了相关产品的定制开发服务,拥有完善的研发,生产,物流体系。
我们的业务:
为了配合开源硬件与物联网的发展,成立了广东比派科技有限公司,专注开源硬件项目与物联网项目,服务全球创客。 新公司位于国家级高新技术产业园: 松山湖国家高新技术产业园。





您的创意,我们帮您实现。
1,有志于BPI开源硬件项目的,我们坦开胸怀,欢迎您的加入。
2,您的创意,我们帮您完成设计与生产,快速实现您的创意。
3,您的设计,提供硬件生产资料,我们快速为您实现产品生产与批量。

硬件开发
2015-07-08 11:21:00
BeagleBone Black教程之BeagleBone Black使用到的Linux基础
BeagleBone Black涉及到的Linux 基础
在许多没有 Linux 相关经验的人看来, Linux 看起来非常可怕。一些“好”发行版会给你配备华丽的桌面(例如 OpenSUSE 使用的 KDE 和 Ubuntu 使用的 Unity ),“差一些”的就配备一些朴素的桌面(例如 Xfce ),而“没人性”的就只有命令行界面了。实际上 Linux 并不可怕,可怕的是连尝试的勇气都没有。本章就带你了解一下 Linux 最基础的命令行和文件系统。在你亲自尝试了其中的每个命令之后,你就会了解到命令行的魔力,同时也为之后的学习打下基础。
BeagleBone Black的 命令行
在第 2 章中,我们的主要任务就是连接 BeagleBone ,并且得到命令提示符。在命令提示符下,你可以输入命令来执行启动程序、管理文件、更新系统以及编译程序等等的操作。默认情况下, BeagleBone 的命令提示符类似这样: root@beaglebone:~#
这看似是一串没规律的字符串,但其中大有文章,下面就来一一解释其中的各个部分: q root :这部分用来表示当前的登录用户,这里是 root 。 root 用户是一个特殊的用户,它存在于每一个 Linux 系统中。它也被称作超级用户( superuser )或者系统管理员。当然,越大的能力对应越大的责任——你可以操作操作系统中的任何部分,当然包括修改系统配置以及删除整个系统。这也就印证了计算机界的一句话:再强大的系统也扛不住猪一样的管理员。 q beaglebone :这部分用来表示主机名( hostname )。这是网络中其他计算机可以使用这个名字访问到 BeagleBone 。当然,这个名字并不是固定的,在本章之后的部分将会介绍如何修改它。 q ~ :这部分用来指示当前工作目录。它是你当在所在文件系统的路径。如果你不指定路径地使用创建文件的命令,那么文件就会创建在这个目录下。波浪号( ~ )在文件系统中并不存在,它是登录用户 home 路径的简写方式。例如,如果使用 root 用户登录,那么它代表路径 /root ;如果使用 debian 用户登录,则代表 /home/debian 。 q # :这部分是输入提示符。同时也表示登录的用户是超级用户。如果你使用普通用户登录,它将变为 $ ,如图 3.1 所示是使用普通用户 debian 登录时的提示符。

图 3.1 普通用户登录
BeagleBone Black 文件系统
与其他操作系统类似的, Linux 文件系统用来组织文件或文件夹。文件系统的根目录(最高层目录)使用“ / ”来表示。在根文件系统中,有一些主要的目录被包含在绝大多数 Linux 系统中,如图 3.2 所示是 BeagleBone 上的 Debian 系统根目录下的子目录。
图 3.2 Debian 的文件系统
其中几个主要目录的介绍在表 3.1 中。
表 3.1 根文件系统中的主要目录
在介绍了基本的目录结构之后,我们就可以开始探索 BeagleBone 中 Linux 的文件系统了。你需要学习的第一个命令是 pwd ,它用来输出当前工作目录以指示你当前在文件系统中的位置: debian@beaglebone:~$ pwd /home/debian
上面的输出表明了你当前在所在的目录名为 debian 。这个目录在 home 目录下,而 home 目录在根( / )目录下。
BeagleBone Black 改变路径
改变路径使用的命令是 cd ,例如将当前目录改为根目录: debian@beaglebone:~$ pwd # 输出当前工作目录 /home/debian debian@beaglebone:~$ cd / # 进入根目录 debian@beaglebone:/$ pwd # 再次输出当前工作目录 /
在执行 cd 命令之后再执行 pwd 可以看到当面目录已经变为了根目录( / ),同时你应该注意到命令提示符 $ 前面的“ ~ ”变成了“ / ”。当然想要回到用户目录,可以使用“ ~ ”也可以使用用户目录的绝对路径“ /home/debian ”: debian@beaglebone:/$ cd ~ # 进入用户目录 debian@beaglebone:~$ pwd # 输出当前工作目录 /home/debian debian@beaglebone:~$ cd /home/debian/ # 进入 /home/debian 目录 debian@beaglebone:~$ pwd # 再次输出当前工作目录 /home/debian
符号“ ~ ”是用户目录的简写, cd 命令使用它可以方便地回到用户目录。但 cd 命令还提供了一种回到用户目录的最简单方式——不指定参数: debian@beaglebone:~$ cd / # 进入根目录 debian@beaglebone:/$ pwd # 输出当前工作目录 / debian@beaglebone:/$ cd # 进入用户主目录 debian@beaglebone:~$ pwd # 再次输出当前工作目录 /home/debian
要切换到当前目录的父目录也非常容易,使用“ .. ”作为 cd 的参数即可: debian@beaglebone:~$ pwd # 输出当前工作目录 /home/debian debian@beaglebone:~$ cd .. # 进入当前目录的父目录 debian@beaglebone:/home$ pwd # 再次输出当前工作目录 /home debian@beaglebone:/home$ cd .. # 进入当前目录的父目录 debian@beaglebone:/$ pwd # 再次输出当前工作目录 /
从上面的一系列命令可以看出,我们使用两次“ cd .. ”从用户目录返回到了根目录( / )。当然,“ .. ”同样可以像使用普通目录那样使用: debian@beaglebone:~$ pwd # 输出当前工作目录 /home/debian debian@beaglebone:~$ cd ../../tmp # 进入当前工作目录父目录的父目录下的 tmp debian@beaglebone:/tmp$ pwd # 再次输出当前工作目录 /tmp
“ cd ../../tmp ”的含义就是向上走两个目录,然后进入同一目录下的 tmp 目录。
BeagleBone Black中 列出目录下的内容
列出目录下的内容使用 ls 命令。现在将当前目录导航到根目录,然后使用 ls 即可查看根目录下的所有子目录: debian@beaglebone:/tmp$ cd / # 进入根目录 debian@beaglebone:/$ ls # 列出目录下的内容 bin dev home lost+found mnt proc run selinux sys usr boot etc lib media opt root sbin srv tmp var
这些目录中的绝大部分都在表 3.1 中有说明。如果你还想了解这些目录的更多信息,那么可以为 ls 传递 -l 参数: debian@beaglebone:/$ ls -l total 76 drwxr-xr-x 2 root root 4096 May 15 10:34 bin drwxr-xr-x 3 root root 4096 May 15 10:27 boot drwxr-xr-x 14 root root 3640 May 15 10:19 dev drwxr-xr-x 106 root root 4096 Nov 10 15:53 etc drwxr-xr-x 3 root root 4096 May 15 10:52 home drwxr-xr-x 15 root root 4096 May 13 21:30 lib drwx------ 2 root root 16384 May 15 10:19 lost+found drwxr-xr-x 2 root root 4096 Oct 30 13:31 media drwxr-xr-x 2 root root 4096 Apr 20 2014 mnt drwxr-xr-x 5 root root 4096 May 15 10:27 opt dr-xr-xr-x 111 root root 0 Jan 1 1970 proc drwx------ 4 root root 4096 Oct 30 17:27 root drwxr-xr-x 23 root root 740 May 15 10:19 run drwxr-xr-x 2 root root 4096 May 15 10:39 sbin drwxr-xr-x 2 root root 4096 Jun 10 2012 selinux drwxr-xr-x 2 root root 4096 May 15 10:13 srv dr-xr-xr-x 12 root root 0 Jan 1 2000 sys drwxrwxrwt 8 root root 4096 Nov 10 15:17 tmp drwxr-xr-x 10 root root 4096 Feb 21 2014 usr drwxr-xr-x 12 root root 4096 May 15 10:32 var
这个列表给出了更全面的信息,包括权限、所有者、大小、修改时间等。
BeagleBone Black 创建文件和目录
为了避免破坏文件系统,在继续学习之前我们应该回到我们的用户目录: debian@beaglebone:/$ cd debian@beaglebone:~$ pwd /home/debian
如果你是以 root 用户登录的,那么可以使用 su 命令切换到其他用户。 BeagleBone 使用的 Debian 系统默认已经创建了一个名为 debian 的用户,可以使用如下的命令切换: su debian
在切换用户之后首先查看当前目录下的内容: debian@beaglebone:~$ ls bin Desktop
可以看到,在 debian 用户的目录下已经有两个文件了。
创建目录可以使用 mkdir 命令。下面的命令在当前目录下创建名为 myDir 的目录: debian@beaglebone:~$ mkdir myDir debian@beaglebone:~$ ls bin Desktop myDir
再次使用 ls 后,可以看到新目录已经被创建。如果你想创建一个新文件,并且向其中写入一些简单的内容,使用如下的命令可以方便地完成: debian@beaglebone:~$ echo 'Hello, world!' > hello.txt
上面的语句使用大于符号( > )将“ Hello, world! ”重定向到了 hello.txt 文件。由于 hello.txt 之前并不存在,所以这条命令会创建这个文件,使用 ls 命令可以看到这个新文件: debian@beaglebone:~$ ls bin Desktop hello.txt myDir
需要特别注意的是,如果 hello.txt 文件已经存在,那么前面的命令会清空文件中的内容。 cat 命令可以将文件中的内容输出: debian@beaglebone:~$ cat hello.txt Hello, world!
如果你只是想在原来文件内容的基础上追加一些内容,那么需要使用“ >> ”符号重定向。下面的命令将“ Yes! ”追加到 hello.txt 文件中: debian@beaglebone:~$ echo 'Yes!' >> hello.txt
使用 cat 命令再次查看 hello.txt 文件: debian@beaglebone:~$ cat hello.txt Hello, world! Yes!
可以看到,“ Yes! ”已经被正确地添加进去。如果你只是想创建一个空文件而不进行任何操作,那么可以使用如下的命令: debian@beaglebone:~$ > empty.txt
是的,直接使用重定向符“ > ”即可,上面的命令在当前目录下建立了名为 empty.txt 的空文件。使用 ls 命令即可看到新建的文件: debian@beaglebone:~$ ls bin Desktop empty.txt hello.txt myDir
当然,重定向符号不仅仅可以重定向 echo ,还可以重定向 cat 的输出,如下的命令就将 hello.txt 中的内容输入到 empty.txt 文件中去: debian@beaglebone:~$ cat hello.txt > empty.txt
使用 cat 查看 hello.txt 和 empty.txt 的内容: debian@beaglebone:~$ cat hello.txt Hello, world! Yes! debian@beaglebone:~$ cat empty.txt Hello, world! Yes!
可以看到,这两个文件中的内容是完全一致的。前面介绍的这些命令可以创建文件并简单地写入一些内容。如果你想要查看并编辑内容的话,还是使用一个编辑器比较好。在 Linux 系统中,通常都带有 nano 编辑器。下面的命令使用 nano 打开 empty.txt 文件: debian@beaglebone:~$ nano empty.txt
nano 是字符界面下的文本编辑器,如图 3.3 是打开 empty.txt 文件后的效果。
图 3.3 nano 编辑器
当然,这个编辑器是不支持鼠标操作的,一切操作都使用键盘完成,一些常用的操作都在屏幕下边做了提示,其中符号“ ^ ”表示键盘上的 Ctrl 键。移动光标可以使用方向键;保存文件使用 Ctrl+O ;退出 nano 则使用 Ctrl+X 。当然, nano 可以完成的功能远不像看起来那么简陋,它还可以执行搜索、剪贴板操作以及拼写检查。使用 Ctrl+G 组合键可以查看更多关于 nano 的信息。
BeagleBone Black 复制、移动(剪切)和重命名文件
在命令行下复制文件使用的命令是 cp ,在 3.2.3 节中我们创建了 myDir 文件夹。下面的命令将 hello.txt 复制一份到 myDir 中: debian@beaglebone:~$ cp hello.txt myDir
使用 ls 命令查看 myDir 目录下的内容: debian@beaglebone:~$ ls myDir hello.txt
使用 cat 命令查看 hello.txt 中的内容: debian@beaglebone:~$ cat myDir/hello.txt Hello, world! Yes!
可以看到 hello.txt 中的内容与 myDir 目录外的 hello.txt 中的内容是一致的。
移动文件的命令与复制命令类似,只不过直接移动文件而不进行复制,使用的命令是 mv 。在使用这个命令前我们列出当前用户目录下的文件: debian@beaglebone:~$ ls bin Desktop empty.txt hello.txt myDir
下面的命令将 empty.txt 文件移到 myDir 文件夹中: debian@beaglebone:~$ mv empty.txt myDir
执行完成后再次查看当前目录下的文件: debian@beaglebone:~$ ls bin Desktop hello.txt myDir
可以看到, empty.txt 文件已不复存在。查看 myDir 目录下的文件: debian@beaglebone:~$ ls myDir empty.txt hello.txt
可以看到, empty.txt 出现在了 myDir 目录下。
mv 命令的一个技巧用法就是重命名文件。在操作之前先确认当前目录下的文件: debian@beaglebone:~$ ls bin Desktop hello.txt myDir
下面的操作将 hello.txt 重命名为 yes.old : debian@beaglebone:~$ mv hello.txt yes.old
再次查看当前目录下的文件: debian@beaglebone:~$ ls bin Desktop myDir yes.old
可以看到, hello.txt 已经被重命名为 yes.old 。
BeagleBone Black 删除文件和目录
rm 命令用来删除文件。例如删除 yes.old 可以使用如下的命令: debian@beaglebone:~$ rm yes.old
如果你想删除一个目录以及其中的所有文件,那么可以使用 -r 选项。下面的命令删除 myDir 及其下面的所有文件: debian@beaglebone:~$ rm -r myDir
需要注意的是,删除后的文件无法恢复,请三思而后行。
BeagleBone Black 系统设置
就想其他计算机一样,你可能设置一些选项来符合你的口味,如设置壁纸、设置语言、设置时区等。下面就介绍一些你可能想要设置的项目,其中包括日期和时间、软件安装和更新、修改主机名以及设置密码。
BeagleBone Black 日期和时间
现在的绝大多数计算机中都有一个实时时钟,它通过一个后备电池来在电脑关机的时候保持正确的时间。但是不幸的是在 BeagleBone 中并没有配备这样的设备。也就是说在你刚启动 BeagleBone 后,它并不知道当前的时间。查看系统中的时间可以使用 date 命令: debian@beaglebone:~$ date Mon Nov 10 17:29:34 CST 2014
当然,在系统启动之后就可以正确地计时了,你只需要手动为他设置一个正确的时间即可。但是,每次系统启动都这样做是任何人受不了的。幸运的是,如果将 BeagleBone 接入互联网,它就可以通过 NTP 来设置时间。当然,你可能发现你的 BeagleBone 已经联网了,但是时间还是不正确的。这是因为你还需要进行一些设置。
1. 设置时区
你需要做的第一件事情就是设置时区( Timezone )。板子上已经预置了时区的数据库,你需要做的就是将对应的时区链接到 /etc/localtime 。首先,你应该备份原来的配置,将 localtime 重命名为 localtime.old : root@beaglebone:~# mv /etc/localtime /etc/localtime.old
如果你使用的是普通用户,则需要在命名前加上 sudo : debian@beaglebone:~$ sudo mv /etc/localtime /etc/localtime.old
现在我们就可以查看数据库中允许的时区了: debian@beaglebone:~$ ls /usr/share/zoneinfo/ Africa Chile Factory Iceland MET posix UCT America CST6CDT GB Indian Mexico posixrules Universal Antarctica Cuba GB-Eire Iran MST PRC US Arctic EET GMT iso3166.tab MST7MDT PST8PDT UTC Asia Egypt GMT0 Israel Navajo right WET Atlantic Eire GMT-0 Jamaica NZ ROC W-SU Australia EST GMT+0 Japan NZ-CHAT ROK zone.tab Brazil EST5EDT Greenwich Kwajalein Pacific Singapore Zulu Canada Etc Hongkong Libya Poland SystemV CET Europe HST localtime Portugal Turkey
需要注意的是,一些时区可能包含在以洲命名的文件夹中,例如上海,就包含在 Asia 中: debian@beaglebone:~$ ls /usr/share/zoneinfo/Asia/ Aden Choibalsan Irkutsk Kuwait Qyzylorda Tokyo Almaty Chongqing Istanbul Macao Rangoon Ujung_Pandang Amman Chungking Jakarta Macau Riyadh Ulaanbaatar Anadyr Colombo Jayapura Magadan Saigon Ulan_Bator Aqtau Dacca Jerusalem Makassar Sakhalin Urumqi Aqtobe Damascus Kabul Manila Samarkand Ust-Nera Ashgabat Dhaka Kamchatka Muscat Seoul Vientiane Ashkhabad Dili Karachi Nicosia Shanghai Vladivostok Baghdad Dubai Kashgar Novokuznetsk Singapore Yakutsk Bahrain Dushanbe Kathmandu Novosibirsk Taipei Yekaterinburg Baku Gaza Katmandu Omsk Tashkent Yerevan Bangkok Harbin Khandyga Oral Tbilisi Beirut Hebron Kolkata Phnom_Penh Tehran Bishkek Ho_Chi_Minh Krasnoyarsk Pontianak Tel_Aviv Brunei Hong_Kong Kuala_Lumpur Pyongyang Thimbu Calcutta Hovd Kuching Qatar Thimphu
接下来需要做的就是建立 localtime 到期望时区的符号链接,这里以 Shanghai 为例: root@beaglebone:~# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
如果你使用的是普通用户登录,则需要在命令前加上 sudo : debian@beaglebone:~$ sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
符号链接就类似 Windows 操作系统下的快捷方式。
2. 同步时间
在设置完时区以后,就可以手动触发一次时间同步了。在 Debian 下使用的命令是 ntpdate-debian : root@beaglebone:/home/debian# ntpdate-debian 10 Nov 17:55:25 ntpdate[3536]: adjust time server 202.112.31.197 offset -0.448913 sec
再次执行 date 即可查看同步后的时间: debian@beaglebone:~$ date Mon Nov 10 17:57:11 CST 2014
现在,只要 BeagleBone 上电,时间就会被追踪。 BeagleBone 同时也将 NTP 同步设置为每小时执行一次,这就会导致 BeagleBone 在上电的一段时间内时间不正确。你可以使用上面的命令来强制进行同步。
BeagleBone Black 软件安装和更新
如果你的 BeagleBone 接入和互联网,那么安装或者更新软件和代码库是非常容易的。软件是以包的形式分发的,在 Debian 下,使用 apt-get 来进行软件包管理。
apt-get 保存了一份最新软件版本的数据库,但是随着时间的推移,这个数据库就过期了。所以,在安装软件包之前,首先需要更新这个数据库。更新的命令非常简单,如下: root@beaglebone:~# apt-get update
此时,屏幕会滚动一些字符串以表示正在执行的步骤。如果你想将你安装的软件全部更新到最新版本,则可以执行 upgrade 命令: root@beaglebone:~# apt-get upgrade
这个命令依赖于你的网络状况以及需要更新的软件包的数量,整个处理过程可能会经历相当长的一段时间。
如果你想安装确定的软件或者代码库,你可以使用 install 参数以及相应软件包的名字,例如安装 VIM 可以使用如下的命令: root@beaglebone:~# apt-get install vim
如果你不想进行 upgrade 整个系统而只是想升级某个软件,那么可以为 upgrade 指定要升级的软件包的名字。如下是升级 Python 的命令: root@beaglebone:~# opkg upgrade python
BeagleBone Black 修改主机名
默认情况下, BeagleBone 使用 beaglebone 来标识自己,所以你可以在浏览器中使用 http://beaglebone.local 或者在 SSH 客户端中使用 ssh root@beaglebone.local 来访问它。在大多数情况下是不需要修改它的。但是如果在你的路由器中同时接入多个 BeagleBone ,你就不知道这个主机名对应的板子了。这就需要为他们分别指定一些个性化的名字。
主机名保存在 /etc/hostname 中,你可以使用 cat 查看其中的内容: root@beaglebone:~# cat /etc/hostname beaglebone
要修改主机名非常容易,只需要将你想要的主机名写入 hostname 即可,可以使用 nano 也可以使用 echo ,这里以使用 echo 演示: root@beaglebone:~# echo 'mybeaglebone' > /etc/hostname
上面的命令将板子的主机名改为“ mybeaglebone ”。需要注意的是主机名只可以包含字母、数字和下划线,不可以包含 @ 、 # 、 $ 等这些特殊符号。
为了 Beaglebone 可以认出自己的主机名,还需要修改 hosts 文件: root@beaglebone:~# nano /etc/hosts
hosts 文件的内容如图 3.4 所示。
图 3.4 hosts 文件
我们需要将其中的“ beaglebone ”改为对应的主机名,之后保存修改并退出 nano 。修改完之后,你需要重启 Beaglebone 。在登录系统之后,就可以看到修改后的主机名了。
BeagleBone Black 设置密码
在默认情况下, Debian 的 root 用户是没有设置密码的,如果你只通过 USB 的方式连接或者在自己的私有网络中使用 Beaglebone ,那么有没有密码都无所谓。但是如果你将 Beaglebone 接入公共的互联网,最好还是为它设置一个唯一的密码。
在 Linux 中,设置和修改密码均使用 passwd : root@beaglebone:~# passwd Enter new UNIX password: # 输入的密码不回显 Retype new UNIX password: # 输入的密码不回显 passwd: password updated successfully
root 用户想要设置其他用户的密码可以为 passwd 命令指定参数,例如下面的命令为 debian 用户设置密码: root@beaglebone:~# passwd debian Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
BeagleBone Black 关机
虽然直接切断 Beaglebone 的电压也可以关机,但是可能会造成数据丢失或者损坏文件系统。正确关闭 Beaglebone 的方法是执行 shutdown 命令: root@beaglebone:~# shutdown -h now
上面的命令会使板子立即执行关机命令,当然关机过程需要持续一定的时间。当用户 LED 不再闪烁并且电源指示灯熄灭的时候,你就可以安全地拔下电源了。当再次将电源接入,板子会再次启动。如果你只是想让板子重启,则只需要执行 reboot 命令即可: root@beaglebone:~#reboot
本文选自: BeagleBone Black快速入门教程大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
硬件开发
2015-07-06 15:36:00
BeagleBone Black教程之BeagleBone Black设备的连接
BeagleBone Black开发前 需要准备的材料
经过上面的介绍,相信你已经对 BeagleBone 有了大致的了解,你需要注意到完成一件事情可能有多种不同的方式。所以,依赖于你要完成的项目,需要的材料也会不同,下面的材料可以助你完成本书的大部分项目,但不是必须的: q BeagleBone 或者 Beaglebone Black q 5V 直流适配器 q 网线 q USB A 到 mini B 线 q 面包板 q 跳线 q LED 若干 q 各规格电阻 q 按钮 q 开关 q 电位器 q 温度传感器 q MicroSD 卡
如果你用的是 BeagleBone Black ,你可能还需要准备下面的材料: q HDMI 监视器(或者 VGA 监视器) q Micro HDMI 线(或者 Micro HDMI 到 VGA 适配器) q 键盘 q 鼠标 q USB HUB q 3.3V FTDI 线或者兼容线
BeagleBone Black的 操作系统
和一个计算机一样, BeagleBone 也有一个操作系统,它默认使用的是开源、免费的 Linux 操作系统。当然, BeagleBone 官方提供了多种操作系统可供选择: q Debian q Ångström q Android q Ubuntu
除了官方支持的几个系统之外,社区还提供了非常多的系统可供选择: q Nintendo q ArchLinux q LinuxCNC q Minix q Kali q XNU q Asterisk q TI EZSDK q Beaglemnt (仅 BeagleBone Black )
在出厂的时候, BeagleBone Black 板载内存中安装的是 Debian Linux 。如果你使用的是 BeagleBone ,则安装在 Micro SD 卡中。因为在这个系统的开发非常迅速,所以使用这个系统可以随时保持最新版本(附录 A 提供了更新系统映像的方法)。笔者推荐使用默认的 Debian Linux 系统,因为这个操作系统被官方支持,系统的开发和测试都在 BeagleBone 上进行,这使得系统更加健壮,并且在 Debian Linux 上管理软件包也非常方便。
连接你的 Beaglebone
就像前面提到过的,完成一件事情可以有多种不同的方法,在本节中这句话显得特别应景。本节将带领大家连接到 BeagleBone 的命令行终端,而连接的方式就有 5 种。在命令行中,你可以创建和执行命令、管理系统以及获取板子信息等操作。在通常情况下,我们使用 Ethernet 接口连接就可以,但如果出现了网络连接不可用的情况,我们就需要使用一些其他方法了。
通过 USB 连接与驱动安装 BeagleBone Black
在 BeagleBone 的板载存储中其实已经存放了文档和驱动,它们可以帮助你更容易地连接 BeagleBone 。使用 USB 连接 BeagleBone 主要分为如下的几个步骤:
( 1 )如果你使用的是 BeagleBone ,确保写入最新版本系统的 MicroSD 卡已经插入卡槽。
( 2 )通过 USB A 到 mini B USB 将 BeagleBone 连接到你的电脑。
( 3 )大约 20 秒后,一个名为可移动存储设备会出现在你的磁盘列表中,如图 2.8 所示。打开这个设备,并且双击其中的 START.htm 在你的默认浏览器中打开 START HTML 文档,文档的内容如图 2.9 所示。

图 2.8 可移动设备
图 2.9 START HTML 文档 图 2.10 安装对应的驱动
( 4 )在 Install drivers 步骤中选择相应系统的驱动并安装,如图 2.10 所示。
( 5 ) . 在你的浏览器中输入地址 http://192.168.7.2/ 以访问 BeagleBone 101 ,如图 2.11 所示。这个页面的服务器就是 BeagleBone ,包含了关于板子的大量信息,其中还有一些使用 Bonescript 的交互式示例,如图 2.12 所示。
图 2.11 BeagleBone 101 图 2.12 Bonescript 的示例
如果你感兴趣的话,想必这一节对你来说非常轻松。我们将会在第 7 节返回来使用 Bonescript ,现在,我们需要学习一种使用命令行的连接方式。
通过 USB 使用 SSH 连接 BeagleBone Black
这种连接方式仍然只需要将 BeagleBone 和电脑使用 USB 线连接起来即可,接着执行下面的步骤:
( 1 )打开终端并连接到 BeagleBone 。 q 如果你使用的是 Mac ,打开终端应用程序(在实用工具中),并在命令行提示符后输入 ssh root@192.168.7.2 ,如图 2.13 所示。
图 2.13 Mac 下的 SSH 连接 图 2.14 Linux 下的 SSH 连接 q 如果你使用的是 Linux ,在终端中输入命令 ssh root@192.168.7.2 ,如图 2.14 所示。 q 如果你使用的是 Windows 操作系统,那么需要安装 PuTTY (官网 http://www.putty.org/ )。之后在“ Host Name ”中输入 root@192.168.7.2 ,确保“ Connection type ”为 SSH 后,单击 Open 按钮,如图 2.15 所示。
图 2.15 在 Windows 下通过 PuTTY 连接
( 2 )如果是第一次连接以 SSH 方式连接,则会提示你连接到未知的主机,你可以安全地忽略这个消息;
( 3 )在默认情况下 root 用户是没有设置密码的,如果提示你输入密码,则只需要直接按回车即可;
( 4 )如果你看到如下的提示信息,则说明你成功连接了:
root@beaglebone:~#
通过 Ethernet 使用 SSH 连接 BeagleBone Black
估计你很早就有使用网线连接 BeagleBone 的想法了,下面我们就把想法付诸实践:
( 1 )如果你使用的是 BeagleBone ,确保已经写入系统的 MicroSD 卡插入卡槽。
( 2 )使用网线将 BeagleBone 连接到路由器,接着将 5V 直流适配器插入板载电源插孔。
( 3 )通过 SSH 连接: q 如果你使用的是 Mac ,在终端应用程序(参考 2.5.2 )中输入 ssh root@beaglebone.local 。 q 如果你使用的是 Linux ,在终端(参考 2.5.2 )中输入 ssh root@beaglebone.local 。 q 在 Windows 中,你需要下载 PuTTY 和 Bonjour Print Services for Windows ,之后将 root@beaglebone.local 作为主机名输入“ Host Name ”,并且确保“ Connection type ”为 SSH ,最后单击 Open 按钮,如图 2.16 所示。
图 2.16 在 Windows 下使用 PuTTY 连接 图 2.17 成功连接后的提示信息
( 4 )如果是第一次连接以 SSH 方式连接,则会提示你连接到未知的主机,你可以安全地忽略这个消息。
( 5 )在默认情况下 root 用户是没有设置密码的,如果提示你输入密码,则只需要直接按回车即可。
( 6 )如果你看到如图 2.17 所示的信息,则说明你成功连接了。
BeagleBone Black 连接键盘、鼠标以及显示器
如果你使用的是 Beaglebone Black ,那么你可以直接为他连接键盘、鼠标以及 HDMI 监视器。由于在 Beaglebone 上只有一个 USB 口,所以你需要使用 USB HUB 来连接键盘和鼠标。当 Beaglebone Black 启动之后,呈现在你眼前的是 LXDE 桌面环境,如图 2.18 所示。
图 2.18 GNOME 桌面环境 图 2.19 终端路径
可以通过 Accessories->LXTerminal 打开终端,如图 2.19 所示。
在本书中,绝大多数的操作集中在命令行。当然,像创建、修改以及移动文件等操作都可以在桌面环境下执行,所有这些操作都类似于 Windows 或者 Mac 操作系统。
使用串口通过 USB 连接 BeagleBone Black
在 2.2.8 节中我们介绍过串行插头,通过它就可以以串行方式与板子传输数据,这当然包括控制系统。在你网络出现问题的时候,使用串行方式连接是非常方便的,而且系统会将启动信息都从串口输出,这些信息有助于有能力的读者调试系统,如图 2.18 所示。
图 2.18 系统启动时输出的信息 图 2.19 FTDI USB 到串行适配器
当然,如果你使用 SSH 方式就可以轻松地连接,那就不必要通过这种方式连接,但是你一定要将它记在脑子里以备不时之需。这种连接方式在 BeagleBone 和 BeagleBone Black 之间有些许的不同。如果你使用的是 BeagleBone ,那么你只需要使用 USB A 到 Mini B 线即可。而如果你使用的是 BeagleBone Black ,那么就需要使用到 FTDI USB 到串行适配器(如图 2.19 所示)或者 Prolific PL2303 USB 到串行适配器(如图 2.20 所示)了,这些工具可没有 USB 那么常见。
图 2.20 PL2303 USB 到串行适配器 图 2.21 PuTTY 的设置
下面就分别介绍 BeagleBone 和 BeagleBone Black 在 OS X 、 Linux 以及 Windows 下的操作。
1. 在 OS X 或 Linux 下通过串行方式连接 BeagleBone
( 1 )如果之前没有连接过,则需要参考 2.5.1 节安装驱动。
( 2 )插入 Micro SD 卡,并使用 USB 线将板子连接到电脑。
( 3 )打开终端应用程序,然后输入以下命令: screen `ls /dev/{tty.usb*B,beaglebone-serial}` 115200
注意:如果 screen 命令不可用,则需要首先通过软件包管理器安装 screen 。
( 4 )此时,会出现一个空屏幕加一个闪烁的光标。按下回车出现登录界面。
( 5 )使用 root 用户名登录。
( 6 )默认状态是没有设置密码的,遇到提示输入密码的信息之间按回车即可。
( 7 )要退出和断开到 BeagleBone 的连接,只需要输入 Control A 然后输出 K 即可。
2. 在 Windows 下通过串行方式连接 BeagleBone
( 1 )如果之前没有连接过,则需要参考 2.5.1 节安装驱动。
( 2 )插入 Micro SD 卡,并使用 USB 线将板子连接到电脑。
( 3 )下载并安装 PuTTY (参考 2.5.1 ),并启动 PuTTY 。
( 4 )连接类型选择 Serial ,如图 2.21 所示。
( 5 )从设备管理器中获取到串口号。按下 Windows+R 键,输入 devmgmt.msc 并单击“确定”按钮。在设备管理器中找到端口号,如图 2.22 所示(图中为 COM3 )。
图 2.22 查看端口号 图 2.23 设置串口号和传输速率
( 6 )将端口号填入 PuTTY 的 Serial line ,并将传输速率设置为 115200 ,如图 2.23 所示。
( 7 )其余设置保持默认即可,然后单击 Open 按钮。
( 8 )此时,会出现一个空屏幕加一个闪烁的光标。按下回车出现登录界面。
( 9 )使用 root 用户名登录。
( 10 ) . 默认状态是没有设置密码的,遇到提示输入密码的信息之间按回车即可。
3. 在 OS X 或 Linux 下通过串行方式连接 BeagleBone Black
( 1 )如果之前没有连接过,则需要参考 2.5.1 节安装驱动。
( 2 )将 USB 口连接到你的电脑。
( 3 )如果你使用的是 FTDI 线,则将 GND 朝向接近网络接口的一端插入串行插头 J1 。如果你使用的是 Prolific PL2303 USB 到串行适配器则需要将黑色线( GND )连接在 1 号(规定接近网络接口的一端第一个针脚为 1 )针脚、绿色线( RXD )连接在 4 号端口、白色线( TXD )连接在 5 号端口。
( 4 )打开终端应用程序,在 OS X 中,输入以下命令: screen `ls /dev/tty.usbserial-*` 115200
在 Linux 中,需要先通过 dmsg 命令查看设备名称,如图 2.24 所示。
图 2.24 查看设备名 图 2.25 登入系统
图 2.24 中所示的设备名为 ttyUSB0 ,所以在 Linux 终端中执行如下的命令: screen `ls /dev/ttyUSB*` 115200
注意:如果 screen 命令不可用,则需要首先通过软件包管理器安装 screen 。
( 5 )此时,会出现一个空屏幕加一个闪烁的光标。按下回车出现登录界面。
( 6 )使用 root 用户名登录。
( 7 )默认状态是没有设置密码的,遇到提示输入密码的信息之间按回车即可,如图 2.25 所示。
( 8 )要退出和断开到 BeagleBone 的连接,只需要输入 Control A 然后输出 K 即可。
4. 在 Windows 下通过串行方式连接 BeagleBone Black
( 1 )如果之前没有连接过,则需要参考 2.5.1 节安装驱动。
( 2 )将 USB 口连接到你的电脑。
( 3 )如果你使用的是 FTDI 线,则将 GND 朝向接近网络接口的一端插入串行插头 J1 。如果你使用的是 Prolific PL2303 USB 到串行适配器,则需要将黑色线( GND )连接在 1 号(规定接近网络接口的一端第一个针脚为 1 )针脚、绿色线( RXD )连接在 4 号端口、白色线( TXD )连接在 5 号端口。
( 4 )下载并安装 PuTTY (参考 2.5.1 ),并启动 PuTTY 。
( 5 )连接类型选择 Serial ,如图 2.26 所示。
图 2.26 PuTTY 的设置 图 2.27 确定端口号
( 6 )从设备管理器中获取到 串口号:按下 Windows+R 键,输入 devmgmt.msc 并点击 OK ,在设备管理器中找到端口号,如图 2.27 所示(图中为 COM8 )。
( 7 )其余设置保持默认即可,然后单击 Open 按钮。
( 8 )此时,会出现一个空屏幕加一个闪烁的光标。按下回车出现登录界面,如图 2.28 所示。
( 9 )使用 root 用户名登录。
( 10 ) . 默认状态是没有设置密码的,遇到提示输入密码的信息之间按回车即可,如图 2.29 所示。
图 2.28 登录界面 图 2.29 登入系统
至此,各种连接方式已经介绍完毕。在接下来的部分,还会介绍到连接 BeagleBone 的另外一种方式——使用 Cloud9 IDE 。当然,最好的方式就是将你的 BeagleBone 连入因特网,这种方式下,你可以通过 SSH 使用命令行、使用 SFTP 管理文件以及在 BeagleBone 上访问互联网,这些内容将在第 4 章节介绍。
本文选自: BeagleBone Black快速入门教程大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
硬件开发
2015-07-06 11:14:00
在PX2开发板上有个已引出的的ttys3,大家如果用PX2来开发或者学习,时不时总是会需要用到这个串口的,而在android系统中,使用串口的方式也很简单,因为在PX2的源码中已经有了ttys3的驱动,我们只需要将起编译进内核(编译fangshihttp://bbs.chipspark.com/forum.p ... =%E4%B8%B2%E5%8F%A3)就可以像操作文件一样,操作这个串口,然后操作这个串口的时候,我们需要做的也只有先做个初始的配置,就是设置波特率,停止位,数据位,奇偶校验。
注:ttys3的连接如果是DB9脚的,理论上只连接RX ,TX,GND便可工作。楼主便是用这个的
1.串口的配置,
串口的配置是利用POSIX终端的termios结构
termios 结构定义如下
struct termios
{
tcflag_t c_iflag /* 输入选项标志 */
tcflag_t c_oflag /* 输出选项标志 */
tcflag_t c_cflag /* 控制选项标志 */
tcflag_t c_lflag /* 本地选项标志 */
cc_t c_cc[NCCS] /* 控制特性 */
}
而部分参数的作用参考附件中的内容 Linux下串口编程-非常全面-精品.txt.zip
核心主要配置波特率,校验位,数据位,停止位,
而楼主自己写的驱动如下,其中的设置为波特率115200,无效验,八位数据位,一位停止位,

#include /*标准输入输出定义*/
#include /*标准函数库定义*/
#include /*Unix 标准函数定义*/
#include
#include
#include /*文件控制定义*/
#include /*PPSIX 终端控制定义*/
#include /*错误号定义*/
#include

int OpenDev(char *Dev){

int fd = open( Dev, O_RDWR )
if (-1 == fd){
perror("Can't Open Serial Port")
return -1
}
else
return fd
}
int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop){
struct termios newios,oldios
if(tcgetattr(fd, &oldios)!=0){ //获取之前定义的终端值
perror("setupserial 1")
return -1
}
bzero(&newios,sizeof(newios))//将newios结构体里的数据重新设置为0
newios.c_cflag|=CREAD//使能读和
newios.c_cflag&=~CSIZE//字符长度掩码
switch(nBits){
case 7:newios.c_cflag|=CS7break
case 8:newios.c_cflag|=CS8break


}
switch(nEvent){
case '0':
newios.c_cflag|=PARENB
newios.c_cflag|=PARODD
newios.c_cflag|=(INPCK|ISTRIP)//偶校验
break
case '1':
newios.c_cflag|=PARENB
newios.c_cflag&=~PARODD//奇校验
break
case 'N':
newios.c_cflag&=~PARENB//无校验
break

}
switch(nSpeed){//设置波特率
case 2400:
cfsetispeed(&newios,B2400)
cfsetospeed(&newios,B2400)
break
case 4800:
cfsetispeed(&newios,B4800)
cfsetospeed(&newios,B4800)
break
case 9600:
cfsetispeed(&newios,B9600)
cfsetospeed(&newios,B9600)
break
case 115200:
cfsetispeed(&newios,B115200)
cfsetospeed(&newios,B115200)
break
default:
cfsetispeed(&newios,B115200)
cfsetospeed(&newios,B115200)
break
}
if(nStop==1)
newios.c_cflag&=~CSTOPB//一停止位
else if (nStop==2)
{
newios.c_cflag|=CSTOPB//两停止位
newios.c_cc[VTIME]=0//无延时
newios.c_cc[VMIN]=0//无附加
tcflush(fd,TCIOFLUSH)//刷新输出队列
}

newios.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO)//原始数据输入
newios.c_oflag &= ~OPOST//原始数据输出
if(tcsetattr(fd,TCSANOW,&newios)!=0)//将配置赋予POSIX终端
{
perror("com set error")
return -1

}

printf("set done\n")
return 0

}
int main(int argc, char **argv){
int fd
int nread,nwrite
char buff[8]
char *dev = "/dev/ttyS3" //串口3
char bufsend[8]
fd = OpenDev(dev)

if (set_opt(fd,115200,8,'N',1) == FALSE) {
printf("Set Parity Errorn")
exit (0)
}
memset(buff,0,8*sizeof(char))
if(strcmp(argv[1],"receive")==0)
{
while(1){
while((nread = read(fd, buff, 8))>0) //读数据,在死循环中不断等待,输出数据,
{
printf("receive %d ",nread)
printf( "\n%s", buff)
}}}
memset(bufsend, 0,8*sizeof(char))//清空数据栈
if(strcmp(argv[1],"send")==0){//发送数据,类型字符
printf("send message: ")
fgets(bufsend,8,stdin)
printf("\n%s",bufsend)

nwrite=write(fd,bufsend,8)

}

close(fd)
exit (0)
}

2.程序测试,
确认连接无误后,楼主开始发送数据,但是,虽然正常实现串口的通信,但是发送的数据却是乱码,一开始楼主发送了111111111111,而接受到的数据是ggggggggggg,其接收到的即不是ascii码,而对应的十六进制是67,具体的问题楼主还在研究,估计还得过段时间,才能解决这个问题,按楼主的估计可能性有两个,一个是楼主是使用DB9接口的,只连了三根线,并没有VCC,会不会是这个有影响,二,楼主配置串口时,只做了基本配置,或许是某个配置出错了。这里先放到论坛上分享给大家,后续再继续补充,与大家共勉。
串口调试助手
sscom32.rar
硬件开发
2015-07-02 17:25:00
ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge
Arduino 环境与 Linux 环境的桥梁—— Bridge
在第一章中介绍 Arduino Yun 硬件的时候提到过,它上面有两个处理器 ATmega32U4 和 Atheros 9331 。 20 个 IO 口和 Micro USB 口是连接在 ATmega32U4 上的,而 WiFi 、 Ethernet 、 SD 卡槽和 USB 口是连接在 Atheros 上的。如果这两个处理器只能独立工作,那么把他们集成到 Yun 中也就没有意义了。所以, ATmega32U4 和 Atheros 9331 之间是可以通讯的,而这个通讯的主体部分就是 Bridge 库,它们之间的关系可以用图 3.38 表示。
图 3.38 ATmega32U4 、 Atheros 与 Bridge 之间的关系
什么是 Bridge
正如库名 Bridge (中文含义为桥)所预示的,它是 ATmega (代表 Arduino 环境)和 Atheros9331 (代表 Linux 环境)之间的桥梁。 Bridge 库允许 ATmega 和 Atheros 之间的双向通讯,即可以信息从 Atheros 到 ATmega 也可以从 ATmega 到 Atheros 。以 Bridge 库为基础还衍生出了几个特别的类库,下面分别对他们进行简单地介绍。
1.Process
Process 库用来在 Linux 处理器上启动一个进程(通常是运行一个 Shell 命令),它的使用方式类似 Shell 脚本。
2.Console
Console 库使得可以使用 Arduino IDE 的串口监视器通过来与 Yun 中的程序交互。例如,你可以使用串口监视器来远程打开或关闭一个照明灯。
3.FileIO
FileIO 库是 Linux 文件系统的接口,它可以用来在 SD 卡上读写文件。例如,使用它可以完成将日志记录文件保存到 SD 卡。
4.HttpClient
这个库可以在 Linux 中创建一个 HTTP 客户端。实质上, HttpClient 是 Process 的扩展,它将一般的 CURL 命令进行了封装,使得它更容易使用。
5.Mailbox
Mailbox 是 Linux 环境和 Arduino 环境之间通讯的一个异步、无会话( sessionless )的接口。
6.YunClient 和 YunServer
YunClient 是基于 Arduino 的 HTTP 客户端而 YunServer 是对应的服务器端。这个库是仿照 EthernetServer 库创建的。
7.Temboo
Temboo 库是 Temboo 的接口,使用它可以很容易地连接到 Temboo 提供的各种类型的在线工具。例如,在国内比较熟悉的有雅虎天气、 Dropbox 以及 GITHUB 等在 Temboo 中都有对应的接口。
使用 Bridge 编程
到现在为止,我们接触 Yun 的时间也不算短了,可以说是将它里里外外翻了个遍。但是我们一直没有感受到它和其他的板子有何区别。在本节中,我们将带大家来使用 Yun 来获取你当地的天气信息。下面我们就开始吧。
Temboo 是什么
有许多读者一定会诧异自己现在可能连写好的代码都看不懂,怎么能写出这么高级的程序呢?其实,这要感谢 Temboo 了。
Temboo 可以说是一个资源库,它集合超过 80 个网站的 100 多个 API ,之后在这些 API 的基础上创建了超过 2000 个 Choreos 。这些代码可以被程序员直接使用,大大提高了工作的效率。而我们之所以介绍 Temboo ,最特别的地方是 Arduino Yun 正是 Temboo 公司和 Arduino 公司合作开发的。所以, Temboo 对 Arduino Yun 的支持力度是非常大的——各个 API 针对 Arduino Yun 的代码都是完整的代码,用户需要做的只是复制、粘贴而已。
2. 在 Temboo 上注册账号
在了解了 Temboo 之后,为了生成符合我们需求的代码,需要在 Temboo 上注册一个账号。这个账号的注册和使用都是免费的(但是有 API 调用次数和流量限制,用户可以按需要购买增值服务)。注册地址为 https://temboo.com/ 。
3. 选择你需要使用的 API
在注册完成后,你就可以开始寻找你想要使用的功能了。我们将要做的是一个天气预报系统,雅虎天气就可以满足我们的需求,所以我们需要在左侧的树状表中找到它,如图 3.39 所示。
图 3.39 雅虎天气
雅虎天气提供了三种获取天气的方式,我们选择基于地址的方式,即 GetWeatherByAddress 。
4. 打开 IoT 模式
在选择了 GetWeatherByAddress 之后,会出现如图 3.40 所示的界面。
图 3.40 GetWeatherByAddress
默认情况下, Choreos 的代码是针对指定的编程语言生成的,如 Java 、 PHP 、 Python 以及 Ruby 。而我们需要的是针对 Arduino Yun 的,这就需要我们打开 IoT 模式,如图 3.41 所示。
图 3.41 IoT 模式
IoT 模式下默认选择的开发板就是 Arduino Yun 。
5. 指定自定义值
在 Temboo 中,大多数 Choreos 都需要指定一个或多个自定义的量来实现对应的需求。由于我们要实现的是针对地址的天气预报,所以在这个 Choreos 中需要正是地址信息,所以我们需要将我们要获取天气信息的地址输入到 INPUT 区域的 Address 中,如图 3.42 所示。
图 3.42 输入指定的地址
6. 生成代码
在输入了你期望的地址之后,你就可以点击右下角的 Run 按钮来生成代码了。在代码成功生成之后将出现在网页的 CODE 区域,如图 3.43 所示。
图 3.43 生成的代码
生成的代码就是可以直接使用的代码了,而且是为你指定的地址量身定制的。
7. 将代码复制到 Arduino IDE
生成的代码可以直接点右下角的 COPY 复制并粘贴到你的 Arduino IDE 中,也可以点击右上角的 Download 下载下来之后使用 Arduino IDE 打开。在将代码的主体部分复制到 Arduino IDE 中之后,我们还需要为程序添加头文件。头文件在网页的 HEADER FILE 区域,如图 3.44 所示。
图 3.44 头文件
在粘贴头文件之前,我们首先需要在 Arduino IDE 中新建一个标签。在 Arduino IDE 的一个 Sketch 中新建标签可以使用快捷键 Ctrl+Shift+N 或者点击 IDE 右上角的 图标,然后在弹出菜单中选择新建标签,如图 3.45 所示。
图 3.45 新建标签
在新建标签的过程中 IDE 要求你输入文件名,这个文件名可以从主体代码的文件包含部分找到,如下为主体代码的文件包含部分: #include #include #include "TembooAccount.h" // contains Temboo account information, as described below
其中,双引号中间的部分即为头文件的名称。在确定创建文件之前一定要注意文件名需要明确指定后缀,如图 3.46 所示。
图 3.46 新建头文件
在头文件建成以后,就可以将复制的头文件代码粘贴进去了。
7. 上传代码
在完成头文件和主体文件之后,现在就是时候将代码上传到 Yun 中了——连接 Arduino Yun 和电脑、在 Arduino IDE 中选好端口、单击按钮 上传代码。
8. 查看结果
等待 Arduino IDE 显示“上传完成”之后,我们就可以通过串口监视器来查看输出的结果了。串口监视器可以通过组合键 Ctrl+Shift+M 或者单击按钮 打开。打开串口监视器之后,我们就可以看到这个 Sketch 输出的结果了,如图 3.47 所示。
图 3.47 Sketch 的输出结果
这个 Sketch 的输出结果并不是我们熟悉的图形形式,而是以 XML 形式输出的。这样的好处是可以供其他程序非常容易地解析出需要的信息,当然对于不熟悉 XML 的读者来说就不那么友好了。但是,这些内容中确实包含了气象信息的,如下是输出信息的一部分:
这部分显示了这次结果的位置、温度单位、风速以及空气质量等信息。而如下的这条语句则是说明的当前的天气状况:
而下面的 5 条信息则是对未来 5 天的天气预报:
经过笔者以上的介绍,此时读者应该相信虽然这很让人难以置信,但是这千真万确的是天气预报。而关于如何解析这些 XML 信息则在本书的范畴之内,读者需要参考其他相关书籍。
至此,我们已经成为了 Arduino Yun 真正的主人,并且它非常听话地按照我们的要求完成了天气预报的项目。在接下来的内容中,我们就需要自己动手来实现一些好玩的项目了。不过在此之前,首先要了解一下 Arduino 所用的编程语言与你所熟悉的语言之间的差别。
本文选自: Arduino Yun快速入门教程大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
硬件开发
2015-07-02 15:17:00
创客经常要干的事情都是从无到有,都将经历一个从创意、草图到模型、实体,然后电子电路开发、软件设计、作品集成这样一个完整的过程,才能将最初的创意实现出来,这里收集的软件包括:1、二维设计,2、三维设计与数字建模,3、3D打印控制软件,4、GIS地图与空间数据处理,5、机器人操作系统,6、开源硬件平台与软件工具集。这些工具基本能够满足准专业级别的软硬件融合的智能产品开发的需要,而且是完全免费、开源的。
最近做的一些东西,用到很多工具,有时候虚拟机出问题需要重装,消耗大量的时间。以前还有一些版本不太兼容,就放到了多个虚拟机里,但使用起来还是不方便,就产生了一个想法,把各种常用的工具放到一个操作系统的版本之中,做一个专用的操作系统版本。使用UbuntuKylin15.04,马上开干。
涉及到的软件全部为开源软件,包括二维设计、三维设计、3D打印、GIS、机器人操作系统等等。安装过程如下(工程浩大,一步步验证,遇到问题会把攻略记录下来,供大家参考):
1、二维设计
1.1、Inkscape,矢量绘图软件
这个主要做前期创意的记录和草图绘制。
# sudo add-apt-repository ppa:inkscape.dev/stable sudo apt-get install inkscape
1.2、GIMP,影像处理软件
媲美PhotoShop的开源影像处理软件。需要拍一些照片,经过处理,激发灵感。就是这个了。
#www.gimp.org sudo apt-get install gimp
1.3、DarkTable,暗桌-摄影后处理软件
专业级的摄影后处理工具。在 http://www.darktable.org/
#DarkTable wget https://github.com/darktable-org/darktable/releases/download/release-1.6.7/darktable-1.6.7.tar.xz tar -vxf darktable-1.6.7.tar.xz cd darktable-1.6.7 ./build.sh
编译中发现缺少XSLT和LENFUN的支持,使用sudo synaptic进去,搜索安装xlst-java和liblenfun-dev等库,再次运行build.sh即可。如下: 需要安装: openjdk-8-jre,xslt,lenfun,librsvg2-dev,libgphoto2-dev,libexiv2-dev lcms2,库里没找到,要到 ./configure make sudo make install 其它需要源码的,可以照猫画虎。
2、三维设计与数字建模
2.1、OpenSCAD,轻量而强大的模型构建工具
可以通过脚本进行模型的构建,非常方便构建三维原型。可以快速转为STL,通过3D打印机呈现出来。
#OpenSCAD,http://www.openscad.org/
sudo add-apt-repository ppa:openscad/releases sudo apt-get install openscad
2.2、Blender,强大的交互建模与动画制作软件
完成设计模型的精细修改,制作动画,演示作品的特征等。
可以用Python脚本来自动化和编写插件,开源多平台支持,强悍无比。
#Blender, #下载 wget http://ftp.nluug.nl/pub/graphics/blender/release/Blender2.75/blender-2.75a-linux-glibc211-x86_64.tar.bz2 tar -vxf blender-2.75a-linux-glibc211-x86_64.tar.bz2 cd blender-2.75a-linux-glibc211-x86_64 #运行,这个是绿色软件,下载完可以直接运行,不需安装。 blender

3、3D打印控制软件
控制3D打印机的输出过程,以及实现打印前的一些处理,如放缩、旋转等等。
#Cura,https://ultimaker.com/en/products/cura-software # #下完了,直接安装即可。
4、GIS地图与空间数据处理
将地图、影像、DEM等数据抓取下来,与作品融合在一起,或者从中获取创意灵感。
#QGIS, #安装需要的依赖软件,这个是大块头。GIS就这么复杂,没办法!要想简单用SuperMap。 sudo apt-get install bison cmake doxygen flex git graphviz grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl0-dev libopenscenegraph-dev libosgearth-dev libpq-dev libproj-dev libqscintilla2-dev libqt4-dev libqt4-opengl-dev libqt4-sql-sqlite libqtwebkit-dev libqwt5-qt4-dev libspatialindex-dev libspatialite-dev libsqlite3-dev lighttpd locales pkg-config poppler-utils pyqt4-dev-tools python-all python-all-dev python-pyspatialite python-qscintilla2 python-qt4 python-qt4-dev python-sip python-sip-dev qt4-doc-html spawn-fcgi txt2tags xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb cmake-curses-gui
进行安装:
#sudo gedit /etc/apt/sources.list #编辑软件源列表,然后加入下面两行: #系统版本 #sudo add-apt-repository 'deb http://qgis.org/debian vivid main' #sudo add-apt-repository 'deb-src http://qgis.org/debian vivid main' #安装最新版本 sudo add-apt-repository 'deb http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu vivid main' #注意:vivid是Ubuntu15.04的版本号代码,如果是其它的,需相应修改。 #然后,加入源的认证码: gpg --keyserver keyserver.ubuntu.com --recv DD45F6C3 gpg --export --armor DD45F6C3 | sudo apt-key add - #最后,执行安装操作。 sudo apt-get updatesudo apt-get install qgis python-qgis qgis-plugin-grass #大功告成,进控制台,运行之。 #qgis
5、机器人操作系统
这里主要考虑ROS,是源于斯坦福的一个项目,现在由OSRF( http://www.osrf.org ,开源机器人基金会)管理,相关项目的有Gazebo( http://gazebosim.org/download )机器人仿真平台和原型机器人硬件(由项目贡献者创建的)。现在有很多专业的机器人企业已经加入该基金会和这个项目了,这也是目前唯一的一个做类似事情的项目。
5.1 ROS安装
ROS是嵌入到Robot的运行硬件中的支持软件。
#ROS, http://www.ros.org #加入软件源到系统软件仓库列表 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' #加入软件仓库的认证码 sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116 #执行软件仓库列表更新 sudo apt-get update #安装全部桌面应用软件 sudo apt-get install ros-jade-desktop-full #安装依赖的软件部件 sudo rosdep initrosdep update echo "source /opt/ros/jade/setup.bash" >> ~/.bashrc source ~/.bashrc sudo apt-get install python-rosinstall
5.2 Gazebo安装
Gazebo是用于Robot的设计和仿真的。与ROS之间是开发平台和运行时的关系。
wget http://osrf-distributions.s3.amazonaws.com/gazebo/gazebo5_install.sh sudo ./gazebo5_install.sh
运行: gazebo
6、开源硬件平台与软件工具集
6.1 低功耗计算平台
重量级一点的支持Android,如CubieBoard\香蕉派\Radxa\MTiles等等,足以构建一个低功耗的小型服务器。
稍轻一点的主要是支持Lubuntu及其衍生的操作系统如Raspberry等,最佳非树莓派莫属。
这两个都是可以运行原生的Linux应用的,当然Android要封装一下,Lubuntu就可以直接运行。QT可以作为一个很好的界面开发工具,再混搭HTML5,功能足够强悍。
移动端的混合编程框架使用Cordova,可以支持本地调用和HTML5的混合使用。可以编写一次,到多个移动OS上运行。
6.2 智能路由器平台
这两年智能路由器已经满天飞了,但你可能不知道,无论是小米还是极路由,这里头基本上全部来自于一个叫OpenWRT( http://www.openwrt.org )的开源操作系统软件。国内有个WRTNode,是专门基于OpenWRT做智能路由器的开发板,现在还可以拿来控制机器人、无人机、小车模型等等,演示也是蛮炫的。WRTNode自带一个300M的WiFi数据链路,这个就秒杀了那些个小小的MCU了。
6.3 Arduino开源电子平台
更小的传感器、机电控制类的最佳自然是Arduino,没有之一。从这里获得IDE: http://www.arduino.cc ,这是各种现在流行的智能硬件的祖师爷了,即便不用,也需要去拜一拜,领会一下这些牛人的设计思想。
6.4 ESP8266无线微控制器平台
这两年做智能家居、传感器应用还有一个ESP8266的芯片,也非常火,是中国人搞的的,值得一试。这个芯片直接集成了WiFi功能,是今年MCU设计的最新趋势。ESP8266来自于xTensa这个知名的芯片设计团队的方案,在国内外大虾的努力下,已经搞定开源的固件开发环境了,而且一帮哥们还在上面搞了开发板和运行LUA的动态固件-NodeMCU。这里收集了很多基于ESP8266的固件项目: https://git.oschina.net/supergis/ESP8266App ,也欢迎加入改进。
6.5 3DRobotics-无人机航模平台
传奇的创客Anders和3DRobotic搞的,参考 https://github.com/3drobotics 。不要跟DJI去比,搭建开放平台、构建生态体系的和追求卖东西的数量最多的不是一路人,对不?可以直接git clone代码下来参考。



硬件开发
2015-07-21 17:20:00
adb(Android Debug Bridge)是Android提供的一个通用的调试工具,借助这个工具,我们可以管理px2开发板, 在window下打开cmd命令,进入到adb tools所在的文件夹可以执行下面这些命令 下面我为大家列了一些常用的命令
1.进入设备或模拟器的shell:
adb shell 通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux 的命令,另外如果只想执行一条shell命令,可以采用以下的方式: adb shell [command] 如:adb shell dmesg会打印出内核的调试信息。
2.复制文件 :
可向一个设备或从一个设备中复制文件, 复制一个文件或目录到设备或模拟器上: adb push 如:adb push test.txt /tmp/test.txt 从设备或模拟器上复制一个文件或目录: adb pull 如:adb pull /addroid/lib/libwebcore.so .
3.搜索模拟器/设备的实例:
取得当前运行的模拟器/设备的实例的列表及每个实例的状态: adb devices
4.查看bug报告:
adb bugreport : adb工具的下载
硬件开发
2015-07-20 17:04:00
ROS( http://www.ros.org/about-ros/ )是一个机器人操作系统,源于斯坦福,现在由开源机器人基金会( http://www.osrfoundation.org /)进行发展。目前最新的版本是Jade。ROS并不是完整的操作系统,而是一个应用层的运行环境,支持很多种宿主操作系统,如Ubuntu,也支持Mac OS X,支持ARM上的Ubuntu和Android。设想的生态链如下所示:


一、安装编译好的版本的脚本
完整的说明请参阅: http://my.oschina.net/u/2306127/blog/480585 #加入软件源到系统软件仓库列表 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' #加入软件仓库的认证码 sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116 #执行软件仓库列表更新 sudo apt-get update #安装全部桌面应用软件 sudo apt-get install ros-jade-desktop-full #安装依赖的软件部件 sudo rosdep init rosdep update echo "source /opt/ros/jade/setup.bash" >> ~/.bashrc source ~/.bashrc sudo apt-get install python-rosinstall
二、获取源代码和编译脚本
完整的说明请参阅: http://my.oschina.net/u/2306127/blog/480604 #源码和工具安装. sudo apt-get install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential #创建编译的源码工作空间 mkdir ~/ros_catkin_ws cd ~/ros_catkin_ws #获取源码相关的软件包 rosinstall_generator desktop_full --rosdistro jade --deps --wet-only --tar > jade-desktop-full-wet.rosinstall wstool init -j8 src jade-desktop-full-wet.rosinstall #更新源码和相关的包 #wstool update -j 4 -t src #安装源码编译需要的依赖包 rosdep install --from-paths src --ignore-src --rosdistro jade -y #执行编译操作 ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
ROS的新版使用了Catkin作为编译工具,跟Linux上一般的cmake\make不太一样,需要转换一下思路,有一个过程去熟悉。


硬件开发
2015-07-20 10:41:00
ROS-Installing from source
Install from source requires that you download and compile the source code on your own. ROS Jade supports Trusty, Utopic, and Vivid. Other platforms are possible to use but are not expected to work out of the box. Target platforms are defined in REP 3
目录 Installing from source Update the workspace Rebuild your workspace Building the catkin Packages Installing bootstrap dependencies Initializing rosdep Prerequisites Installation Maintaining a Source Checkout
Prerequisites
Installing bootstrap dependencies
Install bootstrap dependencies (Ubuntu):
These tools are used to facilitate the download and management of ROS packages and their dependencies, among other things.
Ubuntu: $ sudo apt-get install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential
If you have trouble installing the packages in the command above, make sure you have added the packages.ros.org debian repository to your apt source lists as described starting here: jade/Installation/Ubuntu#jade.2BAC8-Installation.2BAC8-Sources.Setup_your_sources.list
If apt complains that the python-support package is not installable, make sure that you have the Ubuntu universe repositories enabled in your /etc/apt/sources.list
Fedora: $ sudo yum install python-rosdep python-rosinstall_generator python-wstool python-rosinstall @buildsys-build
Some packages used in ROS are not currently available in the Fedora RPM repositories. Most of the other packages are available in RPM Fusion. See RPM Fusion Command Line Setup .
Any packages not available in RPM Fusion are staged in the SDSM&T ROS RPM staging repository, which is available from csc.mcs.sdsmt.edu .
Generic (pip): If you are using a non-Debian system you need to make sure that you have all build tools (compiler, CMake, etc.) installed. You can install all ROS Python tools via PIP: $ sudo pip install -U rosdep rosinstall_generator wstool rosinstall
If there are errors with this or the rosdep step below, your system's version of pip may be out-of-date. Use your system's package management to update it, or use it to update itself: $ sudo pip install --upgrade setuptools
Note that on many platforms such as OSX you may want to install the above packages and use ROS inside a virtualenv so as to make sure not to collide with system dependencies.
Initializing rosdep $ sudo rosdep init$ rosdep update
Installation
Start by building the core ROS packages.
Building the catkin Packages
ROS is in the process of converting to a new build system, catkin , but not all of the packages have been converted and the two build systems cannot be used simultaneously. Therefore it is necessary to build the core ROS packages first (catkin packages) and then the rest.
Create a catkin Workspace
In order to build the core packages, you will need a catkin workspace. Create one now: $ mkdir ~/ros_catkin_ws$ cd ~/ros_catkin_ws
Next we will want to fetch the core packages so we can build them. We will use wstool for this. Select the wstool command for the particular variant you want to install:
Desktop-Full Install: ROS, rqt , rviz , robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception $ rosinstall_generator desktop_full --rosdistro jade --deps --wet-only --tar > jade-desktop-full-wet.rosinstall$ wstool init -j8 src jade-desktop-full-wet.rosinstall
Desktop Install (recommended): ROS, rqt , rviz , and robot-generic libraries $ rosinstall_generator desktop --rosdistro jade --deps --wet-only --tar > jade-desktop-wet.rosinstall$ wstool init -j8 src jade-desktop-wet.rosinstall
ROS-Comm: (Bare Bones) ROS package, build, and communication libraries. No GUI tools. $ rosinstall_generator ros_comm --rosdistro jade --deps --wet-only --tar > jade-ros_comm-wet.rosinstall$ wstool init -j8 src jade-ros_comm-wet.rosinstall
This will add all of the catkin or wet packages in the given variant and then fetch the sources into the ~/ros_catkin_ws/src directory. The command will take a few minutes to download all of the core ROS packages into the src folder. The -j8 option downloads 8 packages in parallel.
In addition to the 3 variants above, more are defined in REP 131 such as robot, perception, etc. Just change the package path to the one you want, e.g., for robot do: $ rosinstall_generator robot --rosdistro jade --deps --wet-only --tar > jade-robot-wet.rosinstall$ wstool init -j8 src jade-robot-wet.rosinstall
If wstool init fails or is interrupted, you can resume the download by running: wstool update -j 4 -t src
Resolving Dependencies
Before you can build your catkin workspace you need to make sure that you have all the required dependencies. We use the rosdep tool for this: $ rosdep install --from-paths src --ignore-src --rosdistro jade -y
This will look at all of the packages in the src directory and find all of the dependencies they have. Then it will recursively install the dependencies.
The --from-paths option indicates we want to install the dependencies for an entire directory of packages, in this case src. The --ignore-src option indicates to rosdep that it shouldn't try to install any ROS packages in the src folder from the package manager, we don't need it to since we are building them ourselves. The --rosdistro option is required because we don't have a ROS environment setup yet, so we have to indicate to rosdep what version of ROS we are building for. Finally, the -y option indicates to rosdep that we don't want to be bothered by too many prompts from the package manager.
After a while (and maybe some prompts for your password) rosdep will finish installing system dependencies and you can continue.
Building the catkin Workspace
Once it has completed downloading the packages and resolving the dependencies you are ready to build the catkin packages. We will use the catkin_make_isolated command because there are both catkin and plain cmake packages in the base install, when developing on your catkin only workspaces you should use catkin/commands/catkin_make .
Invoke catkin_make_isolated: $ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
Note: You might want to select a different CMake build type (e.g. RelWithDebInfo or Debug, see http://cmake.org/cmake/help/v2.8.12/cmake.html#variable:CMAKE_BUILD_TYPE ).
Note: The default catkin installation location would be ~/ros_catkin_ws/install_isolated, if you would like to install some where else then you can do this by adding the --install-space /opt/ros/jade argument to your catkin_make_isolated call.
For usage on a robot without Ubuntu, it is recommended to install compiled code into /opt/ros/jade just as the Ubuntu packages would do. Don't do this in Ubuntu, as the packages would collide with apt-get packages. It is also possible to install elsewhere (e.g. /usr), but it is not recommended unless you really know what you are doing.
Please see REP 122: Filesystem Hierarchy Layout for more detailed documentation on how the installed files are placed.
Note: In the above command we are running the catkin_make_isolated command from the catkin source folder because it has not been installed yet, once installed it can be called directly.
Now the packages should have been installed to ~/ros_catkin_ws/install_isolated or to wherever you specified with the --install-space argument. If you look in that directory you will see that a setup.bash file have been generated. To utilize the things installed there simply source that file. Lets do that now before building the rest of ROS: $ source ~/ros_catkin_ws/install_isolated/setup.bash
Maintaining a Source Checkout
If we want to keep our source checkout up to date, we will have to periodically update our rosinstall file, download the latest sources, and rebuild our workspace.
Update the workspace
To update your workspace, first move your existing rosinstall file so that it doesn't get overwritten, and generate an updated version. For simplicity, we will cover the *destop-full* variant. For other variants, update the filenames and rosinstall_generator arguments appropriately. $ mv -i jade-desktop-full-wet.rosinstall jade-desktop-full-wet.rosinstall.old$ rosinstall_generator desktop_full --rosdistro jade --deps --wet-only --tar > jade-desktop-full-wet.rosinstall
Then, compare the new rosinstall file to the old version to see which packages will be updated: $ diff -u jade-desktop-full-wet.rosinstall jade-desktop-full-wet.rosinstall.old
If you're satified with these changes, incorporate the new rosinstall file into the workspace and update your workspace: $ wstool merge -t src jade-desktop-full-wet.rosinstall$ wstool update -t src
Rebuild your workspace
Now that the workspace is up to date with the latest sources, rebuild it: $ ./src/catkin/bin/catkin_make_isolated --install
If you specified the --install-space option when your workspace initially, you should specify it again when rebuilding your workspace
Once your workspace has been rebuilt, you should source the setup files again: $ source ~/ros_catkin_ws/install_isolated/setup.bash
硬件开发
2015-07-20 10:09:00
Ubuntu install of ROS Jade
We are building Debian packages for several Ubuntu platforms, listed below. These packages are more efficient than source-based builds and are our preferred installation method for Ubuntu.
If you need to install from source ( not recommended ), please see source (download-and-compile) installation instructions .
If you rely on these packages, please support OSRF.
These packages are built and hosted on infrastructure maintained and paid for by the Open Source Robotics Foundation , a 501(c)(3) non-profit organization. If OSRF were to receive one penny for each downloaded package for just two months, we could cover our annual costs to manage, update, and host all of our online services. Please consider donating to OSRF today .
目录 Ubuntu install of ROS Jade Obtain source code of the installed packages Configure your Ubuntu repositories Setup your sources.list Set up your keys Installation Initialize rosdep Environment setup Getting rosinstall Build farm status Installation Tutorials
Installation
Configure your Ubuntu repositories
Configure your Ubuntu repositories to allow "restricted," "universe," and "multiverse." You can follow the Ubuntu guide for instructions on doing this.
Setup your sources.list
Setup your computer to accept software from packages.ros.org. ROS Jade ONLY supports Trusty (14.04), Utopic (14.10) and Vivid (15.04) for debian packages. sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
Mirrors
Set up your keys sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116
Installation
First, make sure your Debian package index is up-to-date: sudo apt-get update
For more information on this issue see this answers.ros.org thread or this launchpad issue Do not install these packages if you are using 14.04, it will destroy your X server : sudo apt-get install xserver-xorg-dev-lts-utopic mesa-common-dev-lts-utopic libxatracker-dev-lts-utopic libopenvg1-mesa-dev-lts-utopic libgles2-mesa-dev-lts-utopic libgles1-mesa-dev-lts-utopic libgl1-mesa-dev-lts-utopic libgbm-dev-lts-utopic libegl1-mesa-dev-lts-utopic
Do not install the above packages if you are using 14.04, it will destroy your X server sudo apt-get install libgl1-mesa-dev-lts-utopic If you are using Ubuntu Trusty 14.04.2 and experience dependency issues during the ROS installation, you may have to install some additional system dependencies.
Alternatively, try installing just this to fix dependency issues:
There are many different libraries and tools in ROS. We provided four default configurations to get you started. You can also install ROS packages individually. Desktop-Full Install: (Recommended) : ROS, rqt , rviz , robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception
Desktop Install: ROS, rqt , rviz , and robot-generic libraries
ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools.
Individual Package: You can also install a specific ROS package (replace underscores with dashes of the package name): sudo apt-get install ros-jade-PACKAGE
e.g. sudo apt-get install ros-jade-slam-gmapping sudo apt-get install ros-jade-ros-base
or click here sudo apt-get install ros-jade-desktop
or click here sudo apt-get install ros-jade-desktop-full
or click here
To find available packages, use: apt-cache search ros-jade
Initialize rosdep
Before you can use ROS, you will need to initialize rosdep. rosdep enables you to easily install system dependencies for source you want to compile and is required to run some core components in ROS. sudo rosdep init rosdep update
Environment setup
It's convenient if the ROS environment variables are automatically added to your bash session every time a new shell is launched: echo "source /opt/ros/jade/setup.bash" >> ~/.bashrc source ~/.bashrc
If you have more than one ROS distribution installed, ~/.bashrc must only source the setup.bash for the version you are currently using.
If you just want to change the environment of your current shell, you can type: source /opt/ros/jade/setup.bash
Getting rosinstall
rosinstall is a frequently used command-line tool in ROS that is distributed separately. It enables you to easily download many source trees for ROS packages with one command.
To install this tool on Ubuntu, run: sudo apt-get install python-rosinstall
Build farm status
The packages that you installed were built by ROS build farm . You can check the status of individual packages here .
Tutorials
Now, to test your installation, please proceed to the ROS Tutorials .
Obtain source code of the installed packages
If you know the location of the repository of each package, you know you can obtain all the code there. But it's often hard even for experienced developers to reach the correct maintained repository of certain packages. Also, in some situations you just want to get the source of the released, installed version of a package. The methods described here the best for these cases. In earlier days of ROS (supposedly electric or earlier) you can obtain by the way noted in this question . Now just apt-get source (sudo not needed) as following. You don't even need to explicitly specify deb-src entry etc. This downloads from the server all the files in the released version of the package (i.e. things not installed in the installation rule (e.g. CMakeLists.txt) are also included). $ apt-get source ros-jade-laser-pipeline
A drawback might be that you have to specify a single, exact package name (asterisks do not work).
硬件开发
2015-07-20 09:44:00
买的MPU6050自带姿态解算大大减轻了上层处理器所做的工作。 通过熟悉了一下processing之后做了一个小例子更是感觉这个传感器的奇妙。
Arduino部分
主要是读取MPU6050数据并将采集到的欧拉角通过串口打印到上位机,采集数据很简单,MPU6050接到arduino mega2560的serial1上便可接收数据,然后通过serial传输到电脑上。MPU6050自带了卡尔曼滤波,所以上层更是直接使用了数据,观测得误差确实很少,很实用的传感器。
注: MPU6050使用的是串口模式,配置时掉电保存的,波特率为9600
#include byte A[11]; void setup() { Serial.begin(115200); Serial1.begin(9600); Serial.println("initial ..."); Serial1.write(0xff); Serial1.write(0xaa); Serial1.write(0x52); Serial1.flush(); Serial.println("end"); } static int counter=0; char buffer[20]; void loop() { if(counter==0&&A[0]==0x55) { int index=2; switch(A[1]) { case 0x53: { float xa=(A[index]|(A[index+1]<<8))/32768.0*180; float ya=(A[index+2]|(A[index+3]<<8))/32768.0*180; float za=(A[index+4]|(A[index+5]<<8))/32768.0*180; //if(abs(temp-97.77)<3) break; //sprintf(buffer,"%lf,",xa); Serial.print("x="); Serial.println(xa); //sprintf(buffer,"%lf,",ya); Serial.print("y="); Serial.println(ya); //sprintf(buffer,"%lf",za); Serial.print("z="); Serial.println(za); A[0]=0; delay(50); } break; default: break; } } } void serialEvent1() { while(Serial1.available()) { A[counter]=Serial1.read(); if(counter==0&&A[counter]!=0x55) return; counter=(counter+1)%11; } } void serialEvent() { char buf[255]; int i=0; while(Serial.available()) buf[i++]=Serial.read(); buf[i]=0; if(strcmp("stop",buf)==0) Serial1.end(); else if(strcmp("run",buf)==0) Serial1.begin(115200); }



MPU6050的四根线连到arduino后便可源源不断地接收到数据,上传到电脑上的格式为:
x=12.44
y=56.01
z=67.34
下面的processing程序会根据这个来解析收到的数据并且调整姿态。
Processing部分
processing这个程序昨天第一次听说,看到国外视频里有人做的模型看着实在舒服,所以也想尝试一下。虽然官网上称Processing为一门语言,不过个人感觉语法就是java+opengl+p3d+c++混合而成。 传送门
通过arduino串口发送出来的消息,在processing接收处理,没有太多可说的,大致感觉下
processing
import processing.serial.*; import processing.opengl.*; Serial myserial; float value[]=new float[4]; String rf[]=new String[4]; PGraphics graphics1; PGraphics graphics2; PGraphics graphics3; PGraphics graphics4; void setup() { size(600,600,P2D); String name="COM5"; myserial=new Serial(this,name,115200); smooth(); for(int i=0;i<4;++i) value[i]=0; graphics1=createGraphics(298,298,OPENGL); graphics2=createGraphics(298,298,OPENGL); graphics3=createGraphics(298,298,OPENGL); graphics4=createGraphics(298,298,OPENGL); textMode(MODEL); textSize(32); } long lasttime=0; void draw() { frameRate(60); drawRect(graphics1,0,0,1,0); //FONT drawRect(graphics2,90,0,1,0);//lLEFT drawRect(graphics3,-90,1,0,0);//TOP drawRect(graphics4,90,1,1,0);//RANDOM image(graphics1,0,0); image(graphics2,300,0); image(graphics3,0,300); image(graphics4,300,300); fill(248,147,147); text("FONT VIEW",10,50); text("LEFT VIEW",310,50); text("TOP VIEW",10,350); text("RANDOM VIEW",310,350); lasttime=millis(); } void drawRect(PGraphics pg,float rot,int x,int y,int z) { pg.beginDraw(); pg.lights(); pg.background(126); pg.textSize(20); pg.fill(3,60,244); long framerate=1000/(millis()-lasttime); pg.text("fps:"+framerate,200,20); pg.fill(246,225,65); pg.translate(100,100,-100); pg.rotate(rot*PI/180,x,y,z); pg.rotateY(value[2]*PI/180); pg.rotateZ(-value[1]*PI/180); pg.rotateX(value[0]*PI/180); pg.box(50,50,100); pg.endDraw(); } String st; void serialEvent(Serial p) { st=p.readStringUntil(10); if(st==null) return; if(st.indexOf("x=")!=-1) { value[0]=float(st.substring(2)); } else if(st.indexOf("y=")!=-1) { value[1]=float(st.substring(2)); } else if(st.indexOf("z=")!=-1) { value[2]=float(st.substring(2)); } }
另外做了一个演示视频 click


硬件开发
2015-07-18 16:58:00
目前桌面使用google默认使用Launche2,源代码位置为:sdk/packages/apps/Launcher2,
桌面快捷方式在:sdk/packages/apps/Launcher2/res/xml/default_workspace.xml中修改。如图:
其中:
launcher:screen="1"为:第几屏;
launcher:x="0"
launcher:y="3" 为:x/y坐标;
launcher:spanX="4"
launcher:spanY="1" Widget占用x/y;
Favorite项为桌面快捷方式,appwidget项为widget设置;
电池图标位置位于/frameworks/base/core/res/res/drawable-mdpi/中,如果希望更换显示电量的图标,直接用相应分辨率的同名图标替换即可。
版本更改如下代码:

更多详情点击:http://chipspark.com/
硬件开发
2015-07-17 17:32:00
void USART2_IRQHandler() { if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志 Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2); //把数据存储到缓冲数组 Uart2_Rx++; Uart2_Rx &= 0xFF; } if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //如果收到的是 0x5A 则下面就是有效数据 Uart2_Tx = Uart2_Rx-1; if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //检测到头的情况下检测到尾 { Uart2_Len = Uart2_Rx-1- Uart2_Tx; //长度 Uart2_Sta=1; //标志位 } if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出 { USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR USART_ReceiveData(USART2); //读DR } } main.c################################################################### if( Uart2_Sta )//数据帧接收完毕 { for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++) USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据 Uart2_Rx = 0; //初始化 Uart2_Tx = 0; Uart2_Sta = 0; } 比如数据帧为 5A 00 11 65 33 22 23 43 A5 此为一帧


硬件开发
2015-07-17 09:04:00
首先介绍yeelink,这嘛,是一个开放的云服务器平台,大家都可以去注册一个自己的账号,然后就可以使用它的服务器就是,只要你的设备能够联网,无论你人在哪里,就能从网络上控制你的设备,而它就提供各种API接口,我们只要熟悉一点tcp的编程我们就可以简单使用了,另外值得注意的一点是,yeelink也可以在微信公众号上查看,修改我们的设备,十分简便。
官网是这个,http://www.yeelink.net/ ,注册完之后我们进入用户中心就可以看到这样的界面

而在账户中找到我们的apikey,这个值在编程时会用到,另外在设备管理中,我们可以创建自己的设备,选择在设备里创建个自己的传感器,可选择数值型和开关型等,如下,可以在传感器的这个位置,看到设备的ID,和传感器的ID,这两个值也是需要的

然后我们先测试下通信是否能成功,可以使用网络助手作为一个服务器端,作为一个设备向yeelink服务器发送命令
下面两个命令中一个是发送数值到服务器,一个是从服务器获取数值,通信成功的效果如下,若通信失败的话,可以尝试重新获取下apikey的值,在账户那边可以重新获取。(记得将下面的ID值和apikey值改为自己的)

然后我们就可以写个tcp通信程序,并且将设备的开启加入其中了,楼主这里就简单用个GPIO口做个例子,如果想的话,我们也可以写个温度检测的程序,然后通过微信实时检测家里或某个地方的温度。
程序如下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define portnumber 80//yeelink的服务器端口
#define DEVICE_NAME "/dev/rkpx2_GPIO"//gpio的设备,提供的kernel已包含,里面定义里gpio4的1234四个引脚,这里用到1引脚
int main(int argc,char *argv[])
{
int sockfd//tcp进程号
int fd//gpio的设备号
int recdata//收到的数据长度
char *addr//一个字符型指针,用来找数据value的位置,后面的值即是网站上按键的值
int offset//value的长度,以便找到按键值
char *yeelink//yeelink服务器ip地址
char recv_data[1024]//收到数据的内存
char flag//按键值
yeelink="42.96.164.52"
struct sockaddr_in server_addr
struct sockaddr_in cilent_addr
char send_data1[300] = "GET /v1.0/device/××××××××/sensor/×××××××/datapoints HTTP/1.1\r\nHost: api.yeelink.net\r\nContent-Length: 11\r\nU-ApiKey:××××××××××××(这里请用自己的APIKEY代替包括前面的ID)\r\n\r\n{\"value\":0}\r\n" /* 发送用到的数据 */
struct hostent *host
fprintf(stderr,"start")
while(1){//循环起来,每隔5s读一次按键值
if((host=gethostbyname(yeelink))==NULL)//获取服务器地址
{fprintf(stderr,"gethostname Error:%s\a\n",strerror(errno))
exit(1)
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//建立socket
{
fprintf(stderr,"socketError:%s\a\n")
exit(1)}
bzero(&server_addr ,sizeof(server_addr))//堆栈初始化,全部化为0
server_addr.sin_family=AF_INET
server_addr.sin_port=htons(portnumber)
server_addr.sin_addr=*((struct in_addr *)host->h_addr)
if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof( struct sockaddr))==-1)//申请连接
{
fprintf(stderr,"connect Error:%s\a\n",strerror(errno))
exit(1)
}
send(sockfd,send_data1,sizeof(send_data1),0)//将http文件头发过去
recdata = recv(sockfd, recv_data, sizeof(recv_data), 0)//接受服务器返回的数值
recv_data[recdata]=' '//加上结束符
addr = strstr(recv_data,"\"value\"")//在接受到的数据中找到按键值的位置,即value,收到数据的样式如下{“value”:key}
offset=strlen("\"value\":")//判断value的长度,
flag = *(addr + offset) //找到按键的值,赋值给flag
fprintf(stderr,"the value is %c \n")
close(sockfd)//关闭socket,记住,这里得提前关闭,不然会发生段错误。
fd=open(DEVICE_NAME,O_RDWR)//打开GPIO设备
if (fd==-1){
fprintf(stderr,"open devices %s error\n",DEVICE_NAME)
}
if(flag=='1'){//判断flag的值,然后执行相应的操作
ioctl(fd,1)
fprintf(stderr,"the value is %c \n",flag)
}
else
{
ioctl(fd,0)
fprintf(stderr,"the value is %c \n",flag)
}
fprintf(stderr,"please wait 5s\n")
sleep(10)//延时10s,让实验效果更明显
close(fd)
}
exit(0)
}
因为是用GPIO口的,用的是板上的GPIO4_1楼主也不好加图片,所以效果就不演示了,但是已验证可行,楼主用的使用的kernel和程序文件如下,都放压缩包里了,有兴趣可以下载过去研究下,压缩包中的文件一个是kernel,这个是支持VGA显示的,而且包含了楼主的一个GPIO驱动,在程序中会用到,一个是源码,我们可以在源码包中编译出可执行文件,最后一个是可执行文件,可以用adb工具push进板中,然后执行起来就可以了,当然,这里是楼主自己的帐号,ID ,APIKEY都是楼主帐号的,所以你们想用的话,就得修改下,只需要在程序中改这三个值便行,然后就可以使用自己帐号的设备 控制,
yeelink.zip
测试时的部分图片如下,按那个开关会改变GPIO端口的值,而改变端口时,debug口也会有提示,这里也会有提示,大家可以使用这个端口电平的改变,控制灯,蜂鸣器之类的。


现在说说程序中楼主遇到的几个错误。
1.发送过去的http文件头,在{"value":**}的前面要有两个回车,这个别漏了,这是格式要求,漏了就没法正常把值放到服务器了
2.获取服务器的值的时候,我们得在服务器中的值处理,因为他发过来的值时没有结束符的,所以我们得手动加上结束符。
硬件开发
2015-07-16 17:54:00
void Time_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3); //复位TIM3定时器 TIM_TimeBaseStructure.TIM_Period =7999; //设置自动重装载寄存器锁存值,1ms溢出 TIM_TimeBaseStructure.TIM_Prescaler = 799800; //9分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时钟分频因子 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数模式 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //写TIM3各寄存器参数 TIM_ClearFlag(TIM3,TIM_FLAG_Update); //清除TIM3的标志位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能TIM中断 TIM_Cmd(TIM3,ENABLE); //使能TIM外设 }
以上为stm32定时器设置代码
TIM_Period
TIM_Period 设置了在下一个更新事件装入活动的 自动重装载寄存器周期的值 。它的取值必须在 0x0000 和
0xFFFF 之间。
TIM_Prescaler
TIM_Prescaler 设置了用来作为 TIMx 时钟频率除数的 预分频值 。它的取值必须在 0x0000 和 0xFFFF 之间
首先设置预分频值,
Td = Ti / ( TIM_Prescaler + 1 )
Td 定时器的计数频率
Ti 内部时钟源频率(APB1的倍频器送出时钟)
TIM_Prescaler 用户设定的预分频系数,取值范围0~65535。
例如:RCC中AHB=72MHZ、APB1=36MHZ、APB2=72MHZ,则CK_INT=72MKZ。
假如用的是 TIM3 TIM3属于APB1 则 Ti=36MHZ 取TIM_Prescaler=7199
则 Td = 36Mhz / 7200 = 5000hz 故 则定时器的计数周期=1/5000HZ=0.2ms
则如果想定时1s TIM_Period = 5000
5000 * 0.2 ms = 1s



硬件开发
2015-07-15 13:39:00
要想让树莓派方便操作,肯定需要配置无线网卡,这样可以大大增强树莓派的移动性和便利性,其实配置无线网卡基本就是和普通linux平台下配置无线网卡一样,几种方法大同小异,具体如下:
确认网卡已经成功安装
在树莓派上 建议使用RTL8188CUS芯片的USB无线网卡 (不需额外安装驱动),使用下面的指令查看是否成功安装: lsusb #如果无效,查看驱动是否加载 lsmod #如果未加载,进行加载 modprobe xxx
第一种方法:通过配置 /etc/network/interfaces 文件实现
sudo nano /etc/network/interfaces
修改后文件内容如下: auto lo iface lo inet loopback iface eth0 inet dhcp auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-ssid “你的wifi名称” wpa-psk “你的wifi密码”
具体各行配置的意思如下: auto lo //表示使用localhost iface eth0 inet dhcp //表示如果有网卡ech0, 则用dhcp获得IP地址 (这个网卡是本机的网卡,而不是WIFI网卡) auto wlan0 //表示如果有wlan设备,使用wlan0设备名 allow-hotplug wlan0 //表示wlan设备可以热插拨 iface wlan0 inet dhcp //表示如果有WLAN网卡wlan0 (就是WIFI网卡), 则用dhcp获得IP地址 wpa-ssid “你的wifi名称”//表示连接SSID名 wpa-psk “你的wifi密码”//表示连接WIFI网络时,使用wpa-psk认证方式,认证密码
上述定义后,如果有网线连接,则采取DHCP自动连接获得地址,使用命令 sudo /etc/init.d/networking restart sudo service networking restart #跟上面行的作用一样。
成功后,用 ifconfig 命令可以看到 wlan0 设备,且有了IP地址(已连接)。
有时需要执行sudo ifdown wlan0和sudo ifup wlan0才能发生作用,如果还不行,sudo reboot吧。
如果做服务器,建议设置静态IP
要做服务器的话,最好开机启动设置静态IP地址,在上面加上下面的部分:
iface default inet static #将上面的iface wlan0 inet dhcp改为这一行。 address 192.168.1.2 #静态IP地址。 netmask 255.255.255.0 #IP掩码,为0的部分地址可通过。 gateway 192.168.1.1 #网关,一般就是路由器的主地址。 dns-nameservers x.x.x.x #你的本地dns地址
第二种方法:修改sudo nano /etc/wpa_supplicant/wpa_supplicant.conf实现 ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 ap_scan=2 network={ ssid=“WIFI名称“ proto=WPA2 key_mgmt=WPA-PSK pairwise=TKIP group=TKIP psk=”WIFI密码“ }
然后修改文件sudo nano /etc/network/interfaces,修改后的文件内容如下: auto lo iface lo inet loopback iface eth0 inet dhcp.auto wlan0 iface wlan0 inet dhcp pre-up wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf post-down killall -q wpa_supplicant
修改完成后,使用以下命令重启网络 sudo /etc/init.d/networking restart
成功后,用 ifconfig 命令可以看到 wlan0 设备,且有了IP地址(已连接)。
附注:上述两种方法我们都是使用的DHCP动态IP,如果要设置静态ip方法和以及连接隐藏SSID AP的方法:
(1)设置静态ip
修改文件sudo nano /etc/network/interfaces auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet static address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers x.x.x.x #你的本地dns地址
(2)连接WIFI不广播隐藏SSID
在ssid=”XXXX”下面加一行scan_ssid=1后重启,具体如下: sudo nano /etc/wpa_supplicant/wpa_supplicant.conf ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 ap_scan=2 network={ ssid=“网络id“ scan_ssid=1 proto=WPA2 key_mgmt=WPA-PSK pairwise=TKIP group=TKIP psk=”密码“}
重启后就可以连上这个不广播SSID的无线网络。
硬件开发
2015-03-26 21:30:00
Beaglebone Black的启动
第 1 章 准备开始
Beaglebone Black 上最显眼的恐怕就是板子两侧的扩展端口,一侧有 46 个端口,共 92 个端口 Beaglebone Black的启动 。并且,每个数字端口有 8 种不同的模式供选择。通常许多人对这样一个灵活并且集多种功能于一身的设备会显得无从下手。在之后的学习中,你无时无刻都会体会到完成一件不会只有一种方式:有许多不同的方式可以得出相同的结果。暂且不提端口的 8 种模式,就连连接方式都有多种不同的方式本文选自 BeagleBone Black项目实训手册大学霸 。
1.1 启动你的 Beaglebone Black
你有多种连接 Beaglebone Black 开发板的不同方式——更准确地说,你有多种不同的方式访问到它并开始使用 BoneScript 编程。 Beaglebone Black 最容易使用的编程软件是基于 Web 的 Cloud9 IDE ,它已经内建在操作系统中了。当然,在本节中也会介绍到其他的编程方式 本文选自 BeagleBone Black项目实训手册大学霸 。
1.1.1 使用 USB 连接
Beaglebone Black 已经将驱动和帮助页面内建在了操作系统中,这可以使你很方便地将 Beaglebone Black 连接到你的电脑。最新版本的 Beaglebone Black 拥有 4GB eMMC 闪存,它已经预装了 Debian 操作系统,不需要像 Beaglebone 一样需要一个系统 Micro SD 卡。
使用 USB 连接方式非常简单直接,将 Mini USB 线的一端插在 Beaglebone Black 的 Mini USB 口,另一端插在你电脑的 USB 口即可,如图 1.1 所示。
图 1. 1 使用 USB 连接 Beaglebone Black
这会导致 Beaglebone Black 板子启动,当然也提供了开发接口来供你编程。 Beaglebone Black 会从板载的 eMMC 中启动 Debian OS 。当 Beaglebone Black 上电的时候,电源 LED ( 5V 筒形插座旁边)会点亮, Mini USB 插口上方的 4 个 LED 开始闪烁。这 4 个 LED 被称为 USER LED ,它们的功能可以被用户配置,默认他们被配置为如下的功能:
q USR0 被配置为“心跳模式”,只要系统在运行,它就以固定的频率闪烁;
q USR1 被配置为访问 Micro SD 卡时候闪烁;
q USR2 被配置为在 CPU 活动时候闪烁;
q USR3 被配置为访问 eMMC 时候闪烁。
提示:在为 Beaglebone Black 插入电源之前按住 boot 开关会使系统从 Micro SD (如果有的话)卡启动 本文选自 BeagleBone Black项目实训手册大学霸 。
硬件开发
2015-03-26 15:12:00
源码编译是玩转树莓派的终极修炼,下面我们开始闯关。
1、获取升级所需源码
1)下载地址:
官方网址:
上面列出了树莓派所有的开源软件:
firmware:树莓派的交叉编译好的二进制内核、模块、库、bootloader linux:内核源码 tools:编译内核和其他源码所需的工具——交叉编译器等
我们只需要以上三个文件即可,下面的工程可以了解一下
documentation:树莓派离线帮助文档,教你如何使用、部署树莓派(树莓派官方使用教程) userland:arm端用户空间的一些应用库的源码——vc视频硬浮点、EGL、mmal、openVG等 hats:Hardware Attached on Top,树莓派 B+型板子的扩展板资料 maynard:一个gtk写成的桌面环境 scratch:一个简易、可视化编程环境 noobs:一个树莓派镜像管理工具,他可以让你在一个树莓派上部署多个镜像 weston:一个应用程序 target_fs:树莓派最小文件系统,使用busybox制作 quake3:雷神之锤3有线开发源码firmwareb
2)下载方法:
a、网页直接下载:
点到所需要下载的工程,左上角选版本,右方有一个download ZIP按钮可直接下载(笔者下载完成后,在linux中解压提示出错,windows又非常慢切内核建议不要在windows环境解压,所以笔者不建议使用这种办法)
b、使用git下载
$ mkdir raspeberrypi_src $ cd raspberrypi_src $ git clone git://github.com/raspberrypi/firmware.git $ git clone git://github.com/raspberrypi/linux.git $ git clone git://github.com/raspberrypi/tools.git
会得到三个文件夹:firmware、linux、tools。
2、编译、提取内核及其模块
1)获得内核配置文件
在运行的树莓派中运行:
$ls /proc/
可看到一个叫config.gz的文件,他是当前的树莓派配置选项记录文件,我们将他拷出,放入我们的内核源码目录树下
$cp /proc/config /home/pi
我们这里使用前面交过的samba拷出并拷入内核源码目录下,不熟悉的人可参考前面文章
在linux内核源码下执行:
$zcat config.gz > .config
2)配置、编译内核
a、修改内核源码makefile ARCH类型和编译器路径
$vi Makefile +195
找到以上类似代码,改为如图所示
b、查看、修改配置选项
$make menuconfig
可出现以下界面
如果不做修改,直接选中exit即可(注意使用键盘操作)
c、编译内核镜像
$make
在arch/arm/boot目录下可以看到一个叫zImage的文件,就是我们新的内核
但是树莓派需要另外一种格式的镜像,需要进行处理一下,执行以下命令 $cd tools/mkimage $./imagetool-uncompressed.py ../../linux/arch/arm/boot/zImage
即可在当前文件夹下看到一个叫:kernel.img的文件,就是我们需要的新内核了
d、提取modules
上一步其实不但编译出来了内核的源码,一些模块文件也编译出来了,这里我们提取一下
$cd raspberrypi_src $mkdir modules $cd linux $ make modules_install INSTALL_MOD_PATH=../modules
即可在modules得到我们需要的模块文件
2、升级RPi的kernel、Firmware、lib
将SD卡拔下插在电脑上(可使用读卡器)
1)升级内核
将新编好的内核拷入SD卡,改名为:kernel_new.img
打开boot目录下
找到config.txt文件,加入:kernel=kernel_new.img这一行
2)升级boot
将firmware/boot/目录下 以下文件拷入SD卡boot目录:fbootcode.bin fixup.dat fixup_cd.dat start.elf
3)更新vc库及内核modules
将第3步d步中编译出来的modules/lib/modules拷入树莓派文件系统/lib下

硬件开发
2015-03-23 17:00:00
使用OUYA第一次启动OUYA
1.4 使用 OUYA
初次使用 OUYA 时,其启动以后的设置过程耗时较长,也比较繁琐,因此本节将会对其做个详细介绍,让读者的使用过程更加顺利些!好的开端总归是一个不错的体验本文选自 OUYA游戏开发快速入门教程 。
1.4.1 第一次启动 OUYA
确认 OUYA 主机上的电源接口、网线接口和 HDMI 接口,都已正确连接了以后,就可以按下 OUYA 主机上唯一的一个开关按钮了。 OUYA 主机上首次出现的画面如图 1-10 所示,表示此时要首先确认有游戏操作杆与其配对,然后才会进入接下来的设置界面 使用OUYA第一次启动OUYA系统更新 。
提示:只需要轻按一下即可,无需长时间按下。

图 1-10 OUYA 操纵杆与 OUYA 主机配对 1
确认游戏控制杆的 2 节 5 号电池已经正确安装以后,按下游戏控制杆上的主菜单按钮,无需长时间按下,确认按钮被按下,然后弹起即可!当 OUYA 主机确认了与之配对的游戏控制杆以后,就会进入接下来的设置界面。
1.4.2 系统更新
OUYA 官方网站始终在维护着 OUYA 系统,因此有时会有系统更新发布。而 OUYA 主机在完成了与游戏控制杆的配对以后,在有网络接入的情况下,会自动检测系统是否需要更新。有更新则会自动下载、安装,重启 OUYA 系统,如图 1-11 、图 1-12 和图 1-13 所示。
图 1-11 下载系统更新画面
图 1-12 下载完毕,准备安装更新
提示:在安装更新的过程中,不要关闭 OUYA ,或者断开其电源。
图 1-13 OUYA 的启动画面
系统更新完毕,并重新启动后的 OUYA 系统,会再次请求与游戏操纵杆配对,然后才会进行接下来的设置操作,如图 1-14 所示。同样,按下游戏操纵杆上的主菜单按钮即可,成功配对后,游戏控制杆上的指示灯会亮起 使用OUYA第一次启动OUYA系统更新 本文选自 OUYA游戏开发快速入门教程 !
图 1-14 OUYA 操纵杆与 OUYA 主机配对
硬件开发
2015-03-23 15:34:00
QT和PyQT安装的完整脚本: #!/bin/sh sudo apt-get update sudo apt-get upgrade sudo apt-get install python-dev sudo apt-get install qt4-dev-tools mkdir pyqt cd pygt echo Install SIP wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.16.6/sip-4.16.6.tar.gz tar vxf sip-4.16.6.tar.gz cd sip-4.16.6 python configure.py make sudo make install cd .. echo Istall PyQt-4.10.4 wget http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.10.4/PyQt-x11-gpl-4.10.4.tar.gz/download cp download PyQt-x11-gpl-4.10.4.tar.gz tar vxf PyQt-x11-gpl-4.10.4.tar.gz cd PyQt-x11-gpl-4.10.4 python configure.py make sudo make install cd .. echo ========================================= echo QT4 and PyQT 4.10.4/SIP 4.16.6 Installed. echo =========================================




硬件开发
2015-03-22 12:52:00
/etc/rc.local
:加入自己的执行命令。
/etc/inittab
:初始状态的设置。
/etc/init.d/
:编写一个脚本,放着里面,需设为执行权限。
以svn为例:
1.制作开机启动脚本svn_serve #!/bin/sh ### BEGIN INIT INFO # Provides: svn_serve # Required-Start: $remote_fs # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start or stop the HTTP Proxy. ### END INIT INFO case $1 in start) svnserve -d -r /home/pi/svn_repository ;; stop) killall svnserve ;; *) echo "Usage: $0 (start|stop)" ;; esac
如果不加上面的注释,执行下面步骤3时,update-rc.d会报如下的警告信息 update-rc.d: warning: /etc/init.d/proxy missing LSB informationupdate-rc.d: see
2.启动关闭服务 sudo service svn_serve startsudo service svn_serve stop
3.让svn_serve开机启动 sudo update-rc.d svn_serve defaults
4.取消svn_serve的开机自动启动 sudo update-rc.d -f svn_serve remove

./config/autostart/my.desktop
:编写个这样的文件,放进去。只能用于图形界面程序。 [Desktop Entry] Name=ScanTest Comment=My Python Program Exec=python /home/pi/ScanTest/Scan.py Icon=/home/pi/ScanTest/Scan.png Terminal=false MultipleArgs=false Type=Application Categories=Application;Development; StartupNotify=true
只要有type和exec两行即可。
有的行,有的不行,可能是权限和运行状态的问题,需要摸索、测试。
硬件开发
2015-03-22 10:46:00
近来公司想做一款PM2.5检测设备,大概研究了一下PM2.5相关知识,以及夏普 DN7C3A006 传感器的应用。
对其简单介绍如下。
1、自身无尘电压(noDust_V)、标称温度(base_Temp),此两个值通过二维码扫描得到,如我们购买的扫描得到的 “149190104F 1.31 **** 25.8”, 可得出 noDust_V = 1310mv , base_Temp = 25.8℃ (但此两值只起到一定参考作用,但不绝对准确);

2、要根据以上两值,再测得当下环境温度 Temp 来求得基准电压 Vs , 具体参照下图 :
3、再周期性AD采样得到输出电压 Vo ,时序如下:
4、初步估算PM2.5浓度测量值:
PM2.5 level (ug/m3) = 0.6 × ⊿ mV ( ⊿ mV = Vo – Vs ; )
其中 α为0.6 是经验值,可能需要调整 ,

5、PM2.5浓度测量值还受到大气湿度的影响,还需再加一个校正系数β,其中β为湿度传 感器检测到的值 ,具体参考如下:
通过以上,可得到PM2.5浓度测量值:
PM2.5 level (μg/m3) = α × β ×(Vo[mV] – Vs[mV]) ;
6、但此时与标准还有可能存在一定误差,还需校正:

此处官方没有再提供什么参考,但一般校正做法是通过查表修正 ;
但Temp、β是实时变动的,α是经验值,noDust_V和base_Temp只是参考值,实际中也可能需要修正,且每个传感器器器件都不同;
当以上变量同时在变化,如何适应各个环境并都能得到精确值就存在问题;

7、此外,官方文档给出其测量范围存在局限:
精度如下说明如下:

注意到他们之前文档,是没有给出精度的,以上的精度权威性是个问题 ,如下:
8、对于SHARP DN7C3A006 传感器检测PM2.5利用的是射线法,且为一般的红外射线。这种方法还受到检测颗粒颜色、材质等的影响,比如二氧化硅和金 属粉尘测试结果就会存在较大差异 ;

得出此传感器,要商用,做到精确测量,个人认为还需考虑,要做应还需要做很多校正工作。

以上仅代表个人观点,如有仔细研究过PM2.5相关检测或相关传感器的,欢迎指点,将非常感谢。


硬件开发
2015-03-20 16:01:00
由于我的手里的机智云开发版式第二代,网上所有的开发版资料都是一代的,一代和二代的长得都不一样,而且很多时候文档和开发板资料都不完全,所以,这里很有必要给大家写写这方面的文章以供参考。
首先,先请大家看看机智云的一代和二代长什么样子
一代,如图所示
二代,如图所示
通过以上的两个图片,大家应该看得出有什么差别了吧,具体的等大家拿到开发版就知道了!,就目前来说,这个开发版是可以免费申请的,大家感兴趣的话,可以到 http://www.gizwits.com/zh-cn/index/ 去找对应的地方去申请。
下面是继承开发的开发工具:
先上个图

请注意:所有的二代的开发版程序,都必须要用Keil5才能打开。所以 你如果没有这个软件,请自行搜索“MDK514.exe”效果如图所示
请记住,在框框中表示的压缩包中有破解机,他可以让你的代码下载没有容量大小的限制。所以,最好还是先破解一下(请勿用于商业用处)
这个软件安装好了以后,就可以完成进行开发了!
有试用于2代的DEMO,请进入如下目录打开该DEMO
源码下载请到机智云论坛自行查找!!

2、代码文件下载到开发至开发板中
在下载程序之前,请确保一下几点
1、驱动程序安装正常
2、Gokit2代的底板(也就是下面的那一层板子)的波动开关被拨到了System这个档位上。
3、Usb链接线插在了UsbToUART这个口子上面,因为二代有两个usb插口。
重要:先确保你的驱动安装完成,使板子能顺利的链接到你的电脑上,如下图所示

我们使用一个USB连接线直接下载程序,需要的工具如下
下载地址:
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257525#

选择好对应的PortName然后Next,一直到最后,有让你选择下载文件的那个地方,如图所示
下载成功界面
保证以上操作都正常以后,你就可以顺利下载程序了!!
程序下载好了以后,你就可以按照说明书的操作来进行操作,需要注意的是,如果要体验手机控制开发板,你首先要让开发板联网,长按KEY2只到绿灯亮起(大概需要KEY2被按住4S以后才能亮)
有时候会因为网络问题,连接失败,那就多试几次,我在设置的时候,也试了好几次才搞好的!!
硬件开发
2015-03-20 13:38:00