




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于linux的视频监控小车 设计报告 目录摘要 .3一方案规划.4二. 系统硬件部分5三网页部分7四驱动部分.11五Linux文件系统、内核部分 16总结17参考文献17.作品图片18 摘要本文描述了监控小车的设计原理和实现方法。该系统工作在linux上,linux系统运行于s3c2440(ARM9)微处理器。通过B/S结构实现人机交互,控制直流电机实现对小车的控制,控制舵机实现对摄像头方向的控制,通过视频服务器得到监控画面。本作品是在初学linux时所做,最后经过测试和调试,达到最初目标。一.方案规划1.1 目标要求 B/S结构,基于linux,要有视频画面,实现无线传送数据,可移动。1.2 目标实现方式 a) S3C2440(ARM9)可以运行linux系统,手上正好有TQ2440开发板。 b) 视频画面通过USB摄像头获取,网页上的视频画面由视频服务器获取。 c) 通过USB无线网卡连接无线路由器,实现无线传送数据。 d) 把整个系统放在可移动的小车上,实现可移动要求。1.3系统总体设计S3C2440LinuxWEB服务器MJPG-streamer网页小车1.4 总结 用到linux系统,就会涉及到U-boot,文件系统,内核;用USB类型的摄像头和无线网卡就要移植相应的驱动;要实现B/S结构,需要WEB和视频服务器;要实现对直流电机和舵机的控制,需要编写I/O字符驱动;网页部分需要网页编程和javascript。总之,要把该目标实现,需要多方面的知识,虽然每部分用的知识不是很深,但是要把多方面的知识结合起来就有点难度,特别对于linux初学者来说,本着求知的态度,一部分一部分学,一边学一边做。二.系统硬件部分 2.1 小车车体 通过改装电动玩具坦克车,保留坦克车的车底。2.2 小车电源部分 1.功率计算:A开发板 电压:4.8V,电流:0.6 P=2.88W (无线网卡和USB集线器包含在内)B舵机 电压:5V,电流:0.06A P=0.6W(备注:两个辉盛 SG90)C直流电机 电压:5V ,电流:0.2A P=2W(备注:2个直流电机)DL298N 电机驱动模块,L7805电源转换芯片。总功率:P=5.48W电池:1.2V*4(8800ma)给开发板供电;1.2V*8(8000ma)给L298N模块和L7805电源模块供电;舵机的输入电源为经L7805转换后的5V。2.电路原理图 L7805转换电路 L298N 电机驱动模块电路 三. 网页部分1. WEB服务器boa 1. BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。 交互其他应用程序返回响应Web客户机对应资源Web服务器CGI程序发送请求传送请求服务器结果返回服务器 2. boa移植到linux tar xzf boa-0.94.14.tar.gz 解压 cd boa-0.94.14/src,修改Makefile文件,CC = arm-linux-gcc,CPP =arm-linux-gcc E make 编译出可执行文件 修改boa.conf。在/etc目录下建立一个boa目录,复制boa.confg到该目录;在 /var/log/下建立boa目录,该目录下可以查看boa服务器的日志;默认是/var/www下的内容可以访问(DocumentRoot /var/www);默 认cgi :ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/(cgi可执行程序放在/usr/lib/cgi-bin/目录下) 例如49/cgi-bin/cgi-test.cgi2.网页设计及javascript 1. 网页设计 网页分三部分:视频显示区、小车控制按键区、摄像头转动按键区; 2. javascript Javascrpt也分为三部分:视频图片处理脚本、按键处理脚本、AJAX异步通信脚本。 重点脚本说明:/*异步访问提交处理*/ function carstop() xhr = createXHR(); if(xhr) xhr.onreadystatechange=callbackFunction; /调用callbackFunction()返回信息 xhr.open(GET,/cgi-bin/car.cgi?carstop=1&cur_time=+new Date().getTime(); /cgi后面跟个cur_time参数是为了防止Ajax页面缓存 xhr.send(null); else /XMLHttpRequest对象创建失败 alert(浏览器不支持,请更换浏览 器!); 用ajax异步通信可以使页面无刷新的向服务器提交数据和返回数据。这样直流电机和舵机响应的速度就很快,延迟很小。3. CGI程序 本次使用的是cgic库,cgic库的特点: 1分析数据,并自动校正一些有缺陷的浏览器发来的数据; 2透明接收用GET或 POST方法发来的From数据;3能接受上传文件; 4能够设置和接收cookies; 5用一致的方式处理From元素里的回车; 6提供字符串,整数,浮点数,单选或多选功能来接收数据; 7提供数字字段的边界检查; 8能够将CGI环境变量转化成C中的非空字符串; 9提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;1.直流电机的控制程序#include cgic.h#include #include #include #include #include #include #include int fd; /保存打开文件返回值int cgiMain() fd=open(/dev/leds,0); /打开设备文件 if(fd0) / 返回值=-1 perror(open device leds); printf(leds show,please ctrl+c to exit);/*前进:左轮、右轮前进*/ if(cgiFormSubmitClicked(carforward)=cgiFormSuccess) /若carforward按下 ioctl(fd,0,0); / GPB5=0 ioctl(fd,1,1); / GPB6=1 ioctl(fd,0,2); / GPB7=0 ioctl(fd,1,3); / GPB8=1 printf(Content type: text/htmlnn); /ajax返回信息时必须用到,说明返回是个网页 printf(car foward .); /区域输出car foward . /*右转:控制左轮,右轮停止 */ if(cgiFormSubmitClicked(carright)=cgiFormSuccess) ioctl(fd,0,2); / GPB7=0 ioctl(fd,1,3); / GPB8=1 printf(Content type: text/htmlnn); printf(turn right .); /*左转:控制右轮,左轮*/ if(cgiFormSubmitClicked(carleft)=cgiFormSuccess) ioctl(fd,0,0); /GPB5=0 ioctl(fd,1,1); /GPB6=1 printf(Content type: text/htmlnn); printf(turn left .); /*停止:右轮、左轮停止*/ if(cgiFormSubmitClicked(carstop)=cgiFormSuccess) ioctl(fd,0,0); / GPB5=0 ioctl(fd,0,1); / GPB6=0 ioctl(fd,0,2); / GPB7=0 ioctl(fd,0,3); / GPB8=0 printf(Content type: text/htmlnn); printf(car stop .); 2.舵机控制程序舵机程序不列出,大概和直流电机控制程序类似。 cgic库的移植及编译cgic程序过程省略4. 视频服务器 MJPG-steamer移植 1.首先需要移植 jpeg库,版本是:jpeg-6b;和boa 一样,首先使用. /configure -build=i386-linux,-host=arm-linux -prefix=/home/wendi/jpeg-6b/jpeg -enable-shared -enable-static 其中“-prefix=/home/wu/jpeg-6b/jpeg” 指定,make install 时jpeg 库的安装位置,然后make ,make install,拷贝库到文件系统中。2.移植mjpg-streamer第一步 下载源码tar xvf mjpg-streamer-r63.tar.gz第二步 解压第三步 修改源码 cd mjpg-streamer-r63 修改顶层makefile及plugins目录中的各级makefile将所有 CC=gcc 修改为 CC=arm-none-linux-gnueabi-gcc 修改plugins/input_uvc/Makfile 修改 CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC 为 CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I/home/linux/s3c2410-2.6.35/video/jpeg/include 修改 $(CC) $(CFLAGS) -ljpeg -o $ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo 为 $(CC) $(CFLAGS) -ljpeg -L/home/linux/s3c2410-2.6.35/video/jpeg/lib -o $ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo jpeg_utils.c:27: fatal error: jpeglib.h: No such file or directory第四步 make四 驱动部分 1.USB无线网卡驱动移植 无线网卡的型号为TL WN322G+ v3,芯片是RT5370,USB的ID号为0f210 5370,到台湾的Ralik下载linux驱动源码包。 第一步 解压,进入源码包,编辑顶层Makefile,修改平台相关的部分。 ifeq ($(PLATFORM),SMDK)LINUX_SRC = /opt/EmbedSky/linux-CROSS_COMPILE = arm-linux-Endif第二步 修改os/linux/config.mk # Support Wpa_SupplicantHAS_WPA_SUPPLICANT=y# Support Native WpaSupplicant for Network MagangerAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y第三步 修改usb口识别的文件 rtusb_dev_id.c文件,这个文件在源码包的common/rtusb_dev_id.c,#ifdef RT5370USB_DEVICE(0x148F,0x5370), /* Ralink 5370 */USB_DEVICE(0x148F,0x5372), /* Ralink 5370 */USB_DEVICE(0x13D3,0x3365), /* Azurewave */USB_DEVICE(0x13D3,0x3329), /* Azurewave */USB_DEVICE(0x2001,0x3C15), /* Alpha */USB_DEVICE(0x2001,0x3C19), /* Alpha */USB_DEVICE(0x2001,0x3C1C), /* DLink */USB_DEVICE(0x2001,0x3C1D), /* DLink */USB_DEVICE(0x043E,0x7A12), /* Arcadyan */USB_DEVICE(0x043E,0x7A22), /* LG innotek */USB_DEVICE(0xF201,0x5370), /* TP-LINK TL-WN322G+ v3 */#endif / RT5370 /如果没有你的设备的usb id号的话就要在里面添加lsusb命令后得到的id号。第四步 sudo make sudo make install cp RT2870STA.DAT 到/etc/Wireless/RT2870 下 驱动在rt5370sta.ko在os/linux下2.直流电机的I/O字符驱动#define DEVICE_NAME leds /* 加载模式后,执行”cat /proc/devices”命令看到的设备名称 */#define LED_MAJOR 231 /* 主设备号 */* 应用程序执行ioctl(fd, cmd, arg)时的第2个参数 */#define IOCTL_LED_ON 0#define IOCTL_LED_OFF 1/* 用来指定LED所用的GPIO引脚 */static unsigned long led_table = S3C2410_GPB5, S3C2410_GPB6, S3C2410_GPB7, S3C2410_GPB8,;/* 用来指定GPIO引脚的功能:输出 */static unsigned int led_cfg_table = S3C2410_GPB5_OUTP, S3C2410_GPB6_OUTP, S3C2410_GPB7_OUTP, S3C2410_GPB8_OUTP,;/* 应用程序对设备文件/dev/leds执行open(.)时, * 就会调用s3c24xx_leds_open函数 */static int s3c24xx_leds_open(struct inode *inode, struct file *file) int i; for (i = 0; i 4) return -EINVAL; switch(cmd) case IOCTL_LED_ON: / 设置指定引脚的输出电平为0 s3c2410_gpio_setpin(led_tablearg, 0); return 0; case IOCTL_LED_OFF: / 设置指定引脚的输出电平为1 s3c2410_gpio_setpin(led_tablearg, 1); return 0; default: return -EINVAL; /* 这个结构是字符设备驱动程序的核心 * 当应用程序操作设备文件时所调用的open、read、write等函数, * 最终会调用这个结构中指定的对应函数 */static struct file_operations s3c24xx_leds_fops = .owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的_this_module变量 */ .open = s3c24xx_leds_open, .ioctl = s3c24xx_leds_ioctl,;static struct class *led_class;/* 执行“insmod s3c24xx_leds.ko”命令时就会调用这个函数*/static int _init s3c24xx_leds_init(void) int ret; /* 注册字符设备驱动程序 * 参数为主设备号、设备名字、file_operations结构; * 这样,主设备号就和具体的file_operations结构联系起来了, * 操作主设备为LED_MAJOR的设备文件时,就会调用s3c24xx_leds_fops中的相关成员函数 * LED_MAJOR可以设为0,表示由内核自动分配主设备号 */ ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &s3c24xx_leds_fops); if (ret 0) printk(DEVICE_NAME cant register major numbern); return ret; /注册一个类,使mdev可以在/dev/目”录下面建立设备节点 led_class=class_create(THIS_MODULE,DEVICE_NAME); if(IS_ERR(led_class) printk(Err:failed in leds class .n); return -1; /创建一个设备节点,节点名为leds_name device_create(led_class,NULL,MKDEV(LED_MAJOR,0),NULL,DEVICE_NAME); printk(DEVICE_NAME initializedn); return 0;/*执行”rmmod s3c24xx_leds.ko”命令时就会调用这个函数*/static void _exit s3c24xx_leds_exit(void) /* 卸载驱动程序 */ unregister_chrdev(LED_MAJOR, DEVICE_NAME); device_destroy(led_class,MKDEV(LED_MAJOR,0); class_destroy(led_class);/* 这两行指定驱动程序的初始化函数和卸载函数 */module_init(s3c24xx_leds_init);module_exit(s3c24xx_leds_exit);/* 描述驱动程序的一些信息,不是必须的 */MODULE_AUTHOR(wubin); / 驱动程序的作者MODULE_DESCRIPTION(S3C2410/S3C2440 LED Driver); / 一些描述信息MODULE_LICENSE(GPL);编译直流电机驱动: 在linux中1.在/linux/drivers/char/Kconfig中添加 config leds5tristate leds5depends on ARCH_S3C2440default y if ARCH_S3C2440help GPIO control for leds5.2.在/linux/drivers/char/Makefile添加 obj-$(CONFIG_leds5) += leds5.o3.在内核配置文件中配置leds5驱动。4.编译出leds驱动。 make SUBDIR=drivers/char/ modules3. 舵机的I/O字符驱动 1. 程序较多,把关键部分列出gpbcon=_raw_readl(S3C2410_GPBCON);gpbcon&=12;gpbcon|=8; /设置GPB1为TOUT1_raw_writel(gpbcon,S3C2410_GPBCON);tcfg0=_raw_readl(S3C2410_TCFG0);tcfg0&=0xff;tcfg0|=50; /设置定时器1的预分频值为1/50_raw_writel(tcfg0,S3C2410_TCFG0);tcfg1=_raw_readl(S3C2410_TCFG1);tcfg1&=0xf0;tcfg1|=48; /pwm定时器1的分频值1/16_raw_writel(tcfg1,S3C2410_TCFG1);tcntb=1225; /决定pwm的宽度(周期)_raw_writel(tcntb,S3C2410_TCNTB(1);tcmpb=arg; /比较值为_raw_writel(tcmpb,S3C2410_TCMPB(1);tcon=_raw_readl(S3C2410_TCON);tcon&=0xf00; /0000 xxxx xxxx tcon|=0xb00; /0000 xxxx xxxx | 1101 0000 0000 = 1101 xxxx xxxx xxxx定时器1关闭死区、自动重载、关反相器、更新TCNTB0&TCMPB0、启动定时器0 _raw_writel(tcon,S3C2410_TCON); tcon&=0x200; /清除定时器0的手动更新TCNTB0&TCMPB0功能(设置TCON的第1位)_raw_writel(tcon,S3C2410_TCON);2. 舵机相关参数 fclk=405mhz pclk=50.625mhz 分频:1/50 1/16 定时器工作频率:63281hz /一秒钟tcntbb0递减63281次 舵机工作周期:20ms/50hz tcntbo=1225
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省宜昌市长阳县2026届化学九年级第一学期期中统考试题含解析
- 2026届四川省成都市新都区英语九年级第一学期期末调研试题含解析
- 化验员读本培训
- 2026届内蒙古翁牛特旗九年级化学第一学期期末考试试题含解析
- 2026届山东省莱城区刘仲莹中学英语九年级第一学期期末达标测试试题含解析
- 山东省枣庄市第三十二中学2026届九上化学期中监测试题含解析
- 太湖县五校联考2025-2026学年八年级上学期开学道德与法治试题
- 山东省烟台某中学高三上学期调研考试数学-试题
- 黑龙江省大兴安岭松岭区古源中学2026届英语九年级第一学期期末经典试题含解析
- 2025年辅警考试面试题及答案
- 年产62万吨甲醇制烯烃(MTO)项目初步设计说明书
- 联通创新人才认证(解决方案)考试题库(附答案)
- 全成本管理探索与实践
- 电烙铁焊接技术培训
- ICU患者的早期活动
- 出纳课件 转账支票pptx
- TSZUAVIA 009.11-2019 多旋翼无人机系统实验室环境试验方法 第11部分:淋雨试验
- ps6000自动化系统用户操作及问题处理培训
- 商务礼仪情景剧剧本范文(通用5篇)
- 2021年东台市城市建设投资发展集团有限公司校园招聘笔试试题及答案解析
- 某县干部周转宿舍工程可行性研究报告
评论
0/150
提交评论