你是否在新闻中见过各式各样的遥控机器人?它们上天入地,排爆侦查,几乎无所不能。给再土气不过的无线路由换个“头脑”,装上“手脚”,它就能忠实执行茫茫网海另一端的指令,为不能亲身亲临的你拍下难得一见的场景。今天小编就教大家制作会呼吸的WIFI机器人。
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线。
▲我的系统是Openwrtbackfire10.03.1RC6。
▲测试单片机的开发板是否连接正确,可以通过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,进行安装,安装口令:opkginstallxxx.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,登陆路由执行
opkgupdate
opkginstall软件包地址
同昨日安装ov519驱动。
安装完毕ser2net后,需要进行一定的设置,在命令行界面下输入
cd/
进入路由根目录,再输入
cdetc
进入ect目录后执行
viser2net.conf(当安装成功后才会出现此设置文件)
找到
2001:raw:600:/dev/ttyS0:9600NONE1STOPBIT8DATABITSXONXOFFLOCAL-RTSCTS
#2002:raw:600:/dev/ttyS1:9600NONE1STOPBIT8DATABITSXONXOFFLOCAL-RTSCTS
注意,这里"#"代表的是屏蔽,我们修改的是非屏蔽语句,可以看到,上位机发送的端口是2001,这就是我们需要发送的端口号,波特率是9600,其它的略。
设置完毕后记得保存退出,然后这里要执行一次ser2net,以开启服务。
一切设置妥当后,我们再次借用liuviking的程序进行串口通讯的测试,运行liuviking的程序,然后再运行“串口调试助手”,在程序中点击发送串口数据,可以看到在“串口调试助手”,有正确的数据输出,至此,Shy的串口连接部分设置完毕。
3Linux平台:openwrt系统中添加自启动
添加自启动项的目的是为了在SHY启动的时候能够自动启动更多的服务,配合UCI命令。
在/etc/init.d里添加需要启动的shell脚本,假设名字为my-plugin。接下来模仿该目录下其他启动脚本的格式,添加你的代码。
[cpp]viewplaincopyprint?
1.#!/bin/sh/etc/rc.common
2.#/init.d/my-plugin
3.START=50#启动顺序
4.
5.start(){
6.#启动项执行的代码
7.}
8.
9.stop(){
10.killallmy-plugin
11.}
之后还需要在rc.d目录下做一个链接,启动时系统会按顺序启动rc.d目录下的脚本链接,对应执行init.d目录下的启动脚本。
链接命令如下:ln-s../init.d/my-plugin/etc/rc.d/S50my-plugin
参考地址:
http://blog.csdn.net/dodolzg/article/details/6279986
附:
/etc/rc.d/init.d和/etc/init.d联系区别
地址:http://www.cnblogs.com/balaamwe/archive/2012/01/16/2323665.html
4单片机模块
4.1构建STC11F02E最小系统
我们选用STC11F02E单片机作为SHY的控制芯片电路部分,关于STC11F02E的参数如下:
STC11F02E单片机为增强型的8051内核,具有2KB的片内Flash程序存储器、2KB的EEPROM存储器和256KB的片内SRAM数据存储器。
这款单片机的UART(UniversalAsynchronousReceiver/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
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharReceive(void)
{
unsignedchardat;
while(RI==0);//只要接收中断标志位RI没有被置“1”当接收完毕时,中断标志RI被置1
//等待,直至接收完毕(RI=1)
RI=0;//为了接收下一帧数据,需将RI清0
dat=SBUF;//将接收缓冲器中的数据存于dat
returndat;
}
voidmain(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()==
P1=~P1;
}
}
以上程序有一个缺点是,并没有使用串口中断,其实在在这个程序上,用不用中断处理程序对于单片机都是一样的,因为使用的是一样的开销。但是,我们在前面提到过,完成Shy的一个目的是学习,所以我们要使用串口中断完成这个程序的编制完成串口中断的编写,如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
voidInitUART(void)
{
SCON=0x50;
TMOD|=0x20;
TH1=0xFD;
TL1=0xFD;
TR1=1;
REN=1;
ES=1;//允许串行口中断
EA=1;//单片机中断允许
}
unsignedcharReceive(void)
{
unsignedchardat;
while(RI==0);
RI=0;
dat=SBUF;
returndat;
}
voidmain(void)
{
InitUART();
while(1){}
}
voidserial(void)interrupt4using3
{
if(Receive()==
P1=~P1;
}
可以看到,程序被精简,并且模块化,主函数中几乎没有代码。经过测试,能够正常使用。
在这里:
interrupt0指明是外部中断0;
interrupt1指明是定时器中断0;
interrupt2指明是外部中断1;
interrupt3指明是定时器中断1;
interrupt4指明是串行口中断;
using0是第0组寄存器;
using1是第1组寄存器;
using2是第2组寄存器;
using3是第3组寄存器;
51单片机的中断编号如下:
51单片机的中断功能号如下:
几个比较重要的概念如下:
EA、EX0、ET0、EX1、ET1、ES、ET2
中断名称、中断号、入口地址
中断允许控制寄存器(interruptenable)
中断优先级控制寄存器(interruptpriority)
SHY的中断方式接收串口数据部分完毕。
4.3PWM调光编程
正规的解释如下:
脉冲宽度调制(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。
以上参考地址:http://baike.baidu.com/view/168039.htm
可以看到,以上的解释非常抽象。
在我的单片机开发板中,有PWM的示例程序,但不是以函数的形式,改写为函数的形式如下:
unsignedintCYCLE=600,PWM_LOW=0;//PWM-定义周期并赋值
voidPWM_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的线路连接图。
(审核编辑: 小王子)