DIYer: | sfwer |
制作时间: | 2天 |
制作难度: | ★★★★☆ |
GEEK指数: | ★★★★☆ |
首先需要解释一下什么是“Shy ”:
“Shy ”是一个采用LINUX开源系统-Openwrt制作的WIFI机器人,它支持PC端,android端,web端的无线控制和无线视频传输,apple端的视频传输,甚至还可以当作你的电脑高清免驱动摄像头使用。
技术上来说,它大致分为三个部分,首先是加载Openwrt系统的Liunx平台,它连接摄像头,并通过WIFI接收控制命令。然后此平台通过串口连接单片机,再由单片机控制各种感应,驱动电路。你可以在手机上指挥它到处跑,然后拍下想要的照片。
值得注意的是,openwrt系统是开源的,我们可以在PC机上编译自己的openwrt系统和自己的软件,另外单片机的扩展应用成千上万,因此这架机器人具有相当高的可玩性与非常广泛的应用。
双向电梯
首先要选择能够加载Openwrt平台的硬件设备,其实能加载LINUX系统的设备非常常见,比如我们家庭用的路由器。
这里要注意的是路由器的选择,首先,路由器要能够加载openwrt系统,其次,要具有USB口以及TTL接口。
COM口的选择要查看个人PC中的设备管理器,以连接的为准。
设置IP的目的是为了上传摄像头的驱动文件,我采用的摄像头是OV519芯片的SONY摄像头,因此驱动文件为:
kmod-video-gspca-ov519_2.6.32.27-1_brcm63xx.ipk
winscp非常方便,拖拽文件即可,跟FTP方式完全一样。
上传完毕后,运行PUTTY,进行安装,安装口令:opkg install xxx.ipk
安装完毕后可以用dmesg命令进行查看是否安装完成,或者直接在浏览器中输入192.168.1.1以图形化的方式进行查看。
安装完驱动后,安装MJPG-STREAMER,这是一个用于查看视频IPK程序,可以直接在浏览器中查看摄像头捕捉到的图像,注意安装完毕后要开启服务,或者也可以设置为自自动,这里不再赘述。
至此,摄像头的安装结束。
首先解释一下什么是ser2net.ipk软件包。
这是一个可以通过个人PC向路由的指定端口发送数据,然后路由原封不动的将数据发送到路由的TTL接口的程序。
当安装完这个程序后,我们就可以通过编制的程序向路由的TTL口发送串行数据,意义在于:单片机就可以接受路由发送的串行数据进行各种控制。
下面简略的讲解如何在openwrt下进行软件包ser2net.ipk的安装
有两种方法:
方法一是在路由已经联结上互联网的情况下,可以由网络进行安装。非常的方便,但我并未采用。
方法二是利用winscp连接上路由,上传ser2net.ipk,然后运行putty,登陆路由执行
opkg updateopkg 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的串口连接部分设置完毕。
添加自启动项的目的是为了在SHY启动的时候能够自动启动更多的服务,配合UCI命令。
在/etc/init.d里添加需要启动的shell脚本,假设名字为my-plugin。接下来模仿该目录下其他启动脚本的格式,添加你的代码。
[cpp] view plaincopyprint?1. #!/bin/sh /etc/rc.common2. # /init.d/my-plugin3. START=50 #启动顺序4.5. start() {6. #启动项执行的代码7. }8.9. stop() {10. killall my-plugin11. }之后还需要在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
我们选用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
在这里,我们需要用到:
P1.7 作为串口的TX(transmit) 传送 接口RST保持两个机器周期以上的高电平时自动复位
至此,STC11F02E最小系统完成。
接收串口数据的目的是为了与openwrt路由完成通讯,STC11F02E要准确无误的辨识出openwrt路由发过来的指令,编制测试程序如下:
#include #include #define uchar unsigned char#define uint unsigned intunsigned char Receive(void){unsigned char dat;while(RI==0); //只要接收中断标志位RI没有被置“1” 当接收完毕时,中断标志RI被置1 //等待,直至接收完毕(RI=1)RI=0; //为了接收下一帧数据,需将RI清0dat=SBUF; //将接收缓冲器中的数据存于datreturn dat;}void main (void){SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2TMOD|= 0x20; //定时器1工作方式2TH1 = 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 intvoid 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、ET2SHY的中断方式接收串口数据部分完毕。
正规的解释如下:
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。
以上参考地址:http://baike.baidu.com/view/168039.htm
可以看到,以上的解释非常抽象。
在我的单片机开发板中,有PWM的示例程序,但不是以函数的形式,改写为函数的形式如下:
unsigned int CYCLE=600,PWM_LOW=0;//PWM-定义周期并赋值void PWM_LED (void) { LED0=1; Delay(60000); //特意加延时,可以看到熄灭的过程 for(PWM_LOW=1WM_LOW0WM_LOW--){ //与逐渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}}图片来源:《LY-51S开发板说明书v1.1.pdf》
烧制入单片机后演示
此刻,在官方的解释中“是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术”此句,是否以不再抽象?
基本上来说,在这个LED应用中,是采用时分法,用时差来进行电压连续变化量的模拟。因为在单片机中,管脚的输出不是1就是0
如何输出一定电压范围的模拟量,PWM就是解决这个问题的一种方式。
此刻,相信我们已经可以猜测到了,Shy呼吸灯的变幻方式。
L298N芯片是常用于驱动直流电机和步进电机的一种芯片,我们用于驱动Shy的两个直流减速电机,在单片机的控制下完成前进,转向,后退的操作。
但是这张图是有光耦的线路连接图,对于Shy目前来说并不需要用光耦进行电气上的隔离,我们需要的是一个简单,高效的L298N电路连接。
图中分析L298N可以看到,其实L298的电路非常简单,只需要两个滤波电路进行电源滤波和八个IN4007防止电源回流,因此我们这里选择自己绘制电路图
参照有光耦的L298N电路图或者L298N的DATASHEET进行线路连接,如图,虽然线路比较简单,但是尽量也不要出错
连接完毕后参照此SCHDOC在元件箱中找出对应的元件,这里我们用小面包板代替PCB板,一是小面包板比较容易连接,二是这种类型的小面包板可以几个一起组合,在以后添加模块的时候比较方便,不过面包板的缺点是可能连线不牢固,在这里我用了许多IN4007剪下的管脚进行了连接
连接好了如图所示,连接的时候先进行电源的连接,再进行管脚的连接,总之分成几部分进行连接,这样若发生错误的时候能够很快排错
经过测试,此L298N能够正常工作。
以下内容是关于部分电子元件说明,均来自互联网
文中用到的 程序打包下载
百闻不如一见,接下来的功能演示就上图来解决吧,还附带精美视频哦~
编辑提醒:请勿用于偷窥,法律责任自负!
欢迎光临 智能家居 (https://bbs.mywll.com/) | Powered by Discuz! X3.4 |