DIY机器人系列:工程师自制蓝光呼吸WIFI机器人

你是否在新闻中见过各式各样的遥控机器人?它们上天入地,排爆侦查,几乎无所不能。给再土气不过的无线路由换个“头脑”,装上“手脚”,它就能忠实执行茫茫网海另一端的指令,为不能亲身亲临的你拍下难得一见的场景。
首先需要解释一下什么是“shy ”:
“shy ”是一个采用linux开源系统-openwrt制作的wifi机器人,它支持pc端,android端,web端的无线控制和无线视频传输,apple端的视频传输,甚至还可以当作你的电脑高清免驱动摄像头使用。
技术上来说,它大致分为三个部分,首先是加载openwrt系统的liunx平台,它连接摄像头,并通过wifi接收控制命令。然后此平台通过串口连接单片机,再由单片机控制各种感应,驱动电路。你可以在手机上指挥它到处跑,然后拍下想要的照片。
值得注意的是,openwrt系统是开源的,我们可以在pc机上编译自己的openwrt系统和自己的软件,另外单片机的扩展应用成千上万,因此这架机器人具有相当高的可玩性与非常广泛的应用。
shy的原型来自于《star wars》中的r2d2。
机器人的主题是“呼吸”,缓慢变化的蓝光使它们成为你卧室中最酷的装置。
1linux平台:线路连接与摄像头驱动
1.1准备硬件
首先要选择能够加载openwrt平台的硬件设备,其实能加载linux系统的设备非常常见,比如我们家庭用的路由器。
这里要注意的是路由器的选择,首先,路由器要能够加载openwrt系统,其次,要具有usb口以及ttl接口。
一般来讲,我们选择的型号是db120或者rg100a-aa,我选择的型号是rg100a-aa。
1.2刷系统
得到路由器后,首先要做的事是给路由器换个系统,即通俗所说的“刷机”,关于网络上rg100a-aa刷机的教程很多,这里不再赘述,不过需要补充的是,对于拥有单片机的爱好者,大可不必专门购买usb-ttl线,我们手中的单片机的开发板就可以为路由器与个人pc进行连接,下面给出开发板与路由器ttl线的连线图,,路由器从左到右依次是:vcc ,gnd ,tx ,rx,这里注意一定不要接vcc线。
我的系统是openwrt backfire 10.03.1 rc6
测试单片机的开发板是否连接正确,可以通过putyy的串口连接方式进行连接,注意这里的波特率是:115200
com口的选择要查看个人pc中的设备管理器,以连接的为准。
1.3设置局域网络
刷完系统后,设置个人pc的网络ip:192.168.1.x,以及子网掩码255.255.255.0。这里的x是除1之外的任意,当然不能大于255
然后连接个人pc与路由的lan3口,用putyy进行shh连接,输入用户名root ,以及密码admin ,设置以及连接正确后进入。
1.4安装摄像头
设置ip的目的是为了上传摄像头的驱动文件,我采用的摄像头是ov519芯片的sony摄像头,因此驱动文件为:
kmod-video-gspca-ov519_2.6.32.27-1_brcm63xx.ipk
运行winscp,将ipk包上传到根目录下,注意,这里要选择scp方式。
成功连接后。
winscp非常方便,拖拽文件即可,跟ftp方式完全一样。
我的摄像头。
上传完毕后,运行putty,进行安装,安装口令:opkg install xxx.ipk
安装完毕后可以用dmesg命令进行查看是否安装完成,或者直接在浏览器中输入192.168.1.1以图形化的方式进行查看。
安装完驱动后,安装mjpg-streamer,这是一个用于查看视频ipk程序,可以直接在浏览器中查看摄像头捕捉到的图像,注意安装完毕后要开启服务,或者也可以设置为自自动,这里不再赘述。
这里我采用了网络上研究智能机器人的前人liuviking的程序来捕捉mjpg-streamer的图像,运行此程序要先安装,dotnet3.5,运行后成功便如图所示:
至此,摄像头的安装结束。
2linux平台:安装与串口调试
2.1什么是ser2net.ipk软件包
首先解释一下什么是ser2net.ipk软件包。
这是一个可以通过个人pc向路由的指定端口发送数据,然后路由原封不动的将数据发送到路由的ttl接口的程序。
当安装完这个程序后,我们就可以通过编制的程序向路由的ttl口发送串行数据,意义在于:单片机就可以接受路由发送的串行数据进行各种控制。
2.2安装ser2net.ipk软件包
下面简略的讲解如何在openwrt下进行软件包ser2net.ipk的安装
有两种方法:
方法一是在路由已经联结上互联网的情况下,可以由网络进行安装。非常的方便,但我并未采用。
方法二是利用winscp连接上路由,上传ser2net.ipk,然后运行putty,登陆路由执行
opkg update opkg install 软件包地址
同昨日安装ov519驱动。
安装完毕ser2net后,需要进行一定的设置,在命令行界面下输入
cd /
进入路由根目录,再输入
cd etc
进入ect 目录后执行
vi ser2net.conf (当安装成功后才会出现此设置文件)
找到
2001:raw:600:/dev/ttys0:9600 none 1stopbit 8databits xonxoff local -rtscts
#2002:raw:600:/dev/ttys1:9600 none 1stopbit 8databits xonxoff local -rtscts
注意,这里#代表的是屏蔽,我们修改的是非屏蔽语句,可以看到,上位机发送的端口是2001,这就是我们需要发送的端口号,波特率是9600,其它的略。
设置完毕后记得保存退出,然后这里要执行一次ser2net,以开启服务。
一切设置妥当后,我们再次借用liuviking的程序进行串口通讯的测试,运行liuviking的程序,然后再运行“串口调试助手”,在程序中点击发送串口数据,可以看到在“串口调试助手”,有正确的数据输出,至此,shy的串口连接部分设置完毕。
3linux平台:openwrt系统中添加自启动
添加自启动项的目的是为了在shy启动的时候能够自动启动更多的服务,配合uci命令。
在/etc/init.d里添加需要启动的shell脚本,假设名字为my-plugin。接下来模仿该目录下其他启动脚本的格式,添加你的代码。
[cpp] view plaincopyprint? 1. #!/bin/sh /etc/rc.common 2. # /init.d/my-plugin 3. start=50 #启动顺序 4. 5. start() { 6. #启动项执行的代码 7. } 8. 9. stop() { 10. killall my-plugin 11. }
之后还需要在rc.d目录下做一个链接,启动时系统会按顺序启动rc.d目录下的脚本链接,对应执行init.d目录下的启动脚本。
链接命令如下:ln -s ../init.d/my-plugin /etc/rc.d/s50my-plugin
4单片机模块
4.1构建stc11f02e最小系统
我们选用stc11f02e单片机作为shy的控制芯片电路部分,关于stc11f02e的参数如下:
stc11f02e单片机为增强型的8051内核,具有2kb的片内flash程序存储器、2kb的eeprom存储器和256kb的片内sram数据存储器。
这款单片机的uart(universal asynchronous receiver/transmitter,通用异步收发器)模块的最大特点就是通过配置特殊功能寄存器auxr1中的第7位uart_p1的状态可以使uart模块的两个引脚(rxd、txd)接到p3端口的p3.0、p3.1引脚,或者接到p1端口的p1.6、p1.7引脚,从而可以充当两个串口使用。
因为制作shy需要的引脚并不是很多,所以我们只需要20引脚的单片机即可。这片stc11f02e
符合20引脚,小巧,作为增强型stc芯片,功耗小。
有两个串口通讯接口,可一个用于下载,一个用于openwrt路由通讯。
从datasheet中得到stc11f02e 的芯片管脚图
在这里,我们需要用到:
p1.7 作为串口的tx(transmit) 传送 接口
p1.6 作为串口的rx(recive) 接收 接口
p1.5 - p1.0 用于控制l298n驱动电路
p3.7 用于pwm控制led灯
p3.6/rst 用于复位电路
xtal2
xtal1 用于11.0592mhz晶振
rxd
txd 用于在线下载线路
复位电路图
rst保持两个机器周期以上的高电平时自动复位
晶振,复位电路,vcc,gnd,连接好后
至此,stc11f02e最小系统完成。
4.2中断方式接收串口数据
接收串口数据的目的是为了与openwrt路由完成通讯,stc11f02e要准确无误的辨识出openwrt路由发过来的指令,编制测试程序如下:
#include #include #define uchar unsigned char #define uint unsigned int unsigned char receive(void) { unsigned char dat; while(ri==0); //只要接收中断标志位ri没有被置“1” 当接收完毕时,中断标志ri被置1 //等待,直至接收完毕(ri=1) ri=0; //为了接收下一帧数据,需将ri清0 dat=sbuf; //将接收缓冲器中的数据存于dat return dat; } void main (void) { scon = 0x50; //ren=1允许串行接受状态,串口工作模式2 tmod|= 0x20; //定时器1工作方式2 th1 = 0xfd; //baud /* 波特率9600、数据位8、停止位1。效验位无 (11.0592m) tl1 = 0xfd; tr1 = 1; ren=1; while(1) { if(receive() == 'w') p1=~p1; } }
以上程序有一个缺点是,并没有使用串口中断,其实在在这个程序上,用不用中断处理程序对于单片机都是一样的,因为使用的是一样的开销。但是,我们在前面提到过,完成shy的一个目的是学习,所以我们要使用串口中断完成这个程序的编制 完成串口中断的编写,如下:
#include #include #define uchar unsigned char #define uint unsigned int void inituart (void) { scon = 0x50; tmod|= 0x20; th1 = 0xfd; tl1 = 0xfd; tr1 = 1; ren=1; es=1; //允许串行口中断 ea =1; //单片机中断允许 } unsigned char receive(void) { unsigned char dat; while(ri==0); ri=0; dat=sbuf; return dat; } void main (void) { inituart(); while(1){} } void serial (void) interrupt 4 using 3 { if(receive() == 'w') p1=~p1; }
可以看到,程序被精简,并且模块化,主函数中几乎没有代码。经过测试,能够正常使用。
在这里:
interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断; using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;
51单片机的中断编号如下:
51单片机的中断功能号如下:
几个比较重要的概念如下:
ea、ex0、et0、ex1、et1、es、et2
中断名称、中断号、入口地址
中断允许控制寄存器(interrupt enable)
中断优先级控制寄存器(interrupt priority)
shy的中断方式接收串口数据部分完毕。
4.3pwm调光编程
正规的解释如下:
脉冲宽度调制(pwm),是英文“pulse width modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
随着电子技术的发展,出现了多种pwm技术,其中包括:相电压控制pwm、脉宽pwm法、随机pwm、spwm法、线电压控制pwm等,而在镍氢电池智能充电器中采用的脉宽pwm法,它是把每一脉冲宽度均相等的脉冲列作为pwm波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整pwm的周期、pwm的占空比而达到控制充电电流的目的。
可以看到,以上的解释非常抽象。
在我的单片机开发板中,有pwm的示例程序,但不是以函数的形式,改写为函数的形式如下:
unsigned int cycle=600,pwm_low=0;//pwm-定义周期并赋值 void pwm_led (void) { led0=1; delay(60000); //特意加延时,可以看到熄灭的过程 for(pwm_low=1;pwm_low0;pwm_low--){ //与逐渐变亮相反的过程 led0=0; delay(pwm_low); led0=1; delay(cycle-pwm_low); } }
示例程序的流程图
图片来源:《ly-51s开发板说明书v1.1.pdf》
烧制入单片机后演示
此刻,在官方的解释中“是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术”此句,是否以不再抽象?
基本上来说,在这个led应用中,是采用时分法,用时差来进行电压连续变化量的模拟。因为在单片机中,管脚的输出不是1就是0
如何输出一定电压范围的模拟量,pwm就是解决这个问题的一种方式。
此刻,相信我们已经可以猜测到了,shy呼吸灯的变幻方式。
5电机驱动模块
5.1用l298n制作电机驱动电路
l298n的管脚图。
l298n芯片是常用于驱动直流电机和步进电机的一种芯片,我们用于驱动shy的两个直流减速电机,在单片机的控制下完成前进,转向,后退的操作。
从网络上下载到l298n的线路连接图。
但是这张图是有光耦的线路连接图,对于shy目前来说并不需要用光耦进行电气上的隔离,我们需要的是一个简单,高效的l298n电路连接。
图中分析l298n可以看到,其实l298的电路非常简单,只需要两个滤波电路进行电源滤波和八个in4007防止电源回流,因此我们这里选择自己绘制电路图
打开dxp 2004,从元件库中选择出适当的元件,关于l298n在dxp 2004中已经带有,因此只要搜索出即可,另外找出八个in4007,两个100uf的有极性电容,两个104电容,如图:
参照有光耦的l298n电路图或者l298n的datasheet进行线路连接,如图,虽然线路比较简单,但是尽量也不要出错
连接完毕后参照此schdoc在元件箱中找出对应的元件,这里我们用小面包板代替pcb板,一是小面包板比较容易连接,二是这种类型的小面包板可以几个一起组合,在以后添加模块的时候比较方便,不过面包板的缺点是可能连线不牢固,在这里我用了许多in4007剪下的管脚进行了连接
连接好了如图所示,连接的时候先进行电源的连接,再进行管脚的连接,总之分成几部分进行连接,这样若发生错误的时候能够很快排错
经过测试,此l298n能够正常工作。
6功能演示
百闻不如一见,接下来的功能演示就上图来解决吧。

Maxim推出40V、1MHz DC-DC控制器
库卡与TÜV莱茵合作引领移动机器人行业高质量发展
全国调频频率表
win7 ISO镜像安装win7后怎么激活,步骤是怎样的
无人机反制设备为什么越来越受欢迎
DIY机器人系列:工程师自制蓝光呼吸WIFI机器人
4G TD-LTE测试解决方案全方位解读
安世半导体致力于为中国汽车半导体保驾护航
特斯拉加州弗里蒙特工厂的Model 3生产线,将停产两周
电吹风发热丝电阻丝点焊机特点的介绍
plc时序图分析方法
ADI收购Innovasic,由传感器迈向未来工业物联网之路
微电网的定义是什么?储能在微电网中有什么作用?
米粉对小米6的期待:多些现货少些广告
云计算与大数据的关系
激光锡焊在医疗行业中的应用
对于高价主板和低价主板,它们有什么区别
一款适合于智能家居使用的的智能镜面显示屏
FPGA的数字信号处理:重写FIR逻辑以满足时序要求
端到端自动驾驶到底是什么?