基于EVK1105开发平台设计的交互式机器人小车

发布者:AngelicGrace最新更新时间:2015-01-21 来源: eefocus关键字:交互式机器人小车  WiFi  数据采集  视频监控  HTML语言 手机看文章 扫描二维码
随时随地手机看文章

一. 正文

(1)、项目摘要

交互式机器人小车是可以通过wifi实现数据的采集,视频监控等功能的智能控制平台。它集娱乐、现场勘测等于一体,采用了具有超强的音频解码和流媒体处理能力的AT32UC3A0512作为核心,在EVK1105开发平台上成功嵌入网页。并且实现无需插件或asp、php等语言,仅依靠html语言的交互式控制。交互式机器人小车还可以完成视频的动态监控,无需任何插件即可在网页查看相关媒体。小车的控制也是直接在网页上完成,无需任何软件。如手机上有wifi,经测试也可直接登录控制。而且在小车上增加相关传感器模块,还可直接把数据发到网页上,再结合浏览器插件便可将数据直接导入相关数据库或上传到internet。

 

(2)、硬件原理

2.1 系统结构图

 

 

2.2、小车驱动模块

为了加强小车的野外数据采集能力,我们将小车设计为四驱结构并且全部采用360度舵机控制。这样虽然会降低小车的运行速度,但却让小车获得较大力矩和载重能力,使其在崎岖不平的草地上一样可以行动自如。在整个交互式机器人小车结构设计上我们一共采用了6个舵机:DS04-NFC 和 FUTABA3010。

 

DS04-NFC是360°舵机,主要用来驱动小车前进。它的控制信号是50HZ方波信号,一个高电平脉冲持续的时间对应一个速度。高电平为1毫秒~1.5毫秒时,舵机正转(1毫秒时正转速度最快,越接近1.5毫秒越慢,1.5毫秒时舵机停转),高电平为1.5毫秒~2毫秒时舵机反转(1.5毫秒时舵机停转,越接近2毫秒反转的速度越快,2毫秒时以最快的速度反转),转弯用差速控制。FUTABA3010则拥有摄像头云台,是180°舵机,根据所给PWM占空比不同可控制摄像头的左右转和上下转。

 

2.3 、Arduino控制板

在本次设计中我们采用了arduino328驱动电机,它主要是以Atmel的Atmega328作为核心,将MCU内部所有资源都编为开源的函数,可直接调用、查看、修改。具体原理图如下:

 

 

2.4、 DC-DC升压模块

这一模块主要是用于为无线路由器提供电源,具体电路如下:

 

                    

图(4):DC—DC升压电路

 

 

(3)、软件架构

软件部分我们主要分为三块:无线路由加motion摄像头监控、EVK1105上的Websever、Arduino上的舵机驱动。

 

3.1 无线路由模块

在无线路由上我们嵌入了openwrt操作系统用于管理网络连接、自动拨号、wifi控制等。UVC摄像头我们也是挂在路由器上的,采用了motion做视频管理。具体编辑如下:

root@OpenWrt:~# opkg install motion

Installing motion (3.2.11.1-1) to root...

Downloading http://downloads.x-wrt.org/xwrt/backfire/10.03/brcm63xx/packages/motion_3.2.11.1-1_brcm63xx.ipk.

Installing libjpeg (6b-1) to root...

Downloading http://downloads.x-wrt.org/xwrt/backfire/10.03/brcm63xx/packages/libjpeg_6b-1_brcm63xx.ipk.

Configuring libjpeg.

Configuring motion.

root@OpenWrt:~# vi /overlay/etc/motion.conf

# Rename this distribution example file to motion.conf

#

# This config file was generated by motion "3.2.11.1"

 

############################################################

# Daemon

############################################################

 

# Start in daemon (background) mode and release terminal (default: off)

daemon off (on->off)

 

# File to store the process ID, also called pid file. (default: not defined)

process_id_file /var/run/motion/motion.pid

 

############################################################

# Basic Setup Mode

############################################################

 

# Start in Setup-Mode, daemon disabled. (default: off)

setup_mode off

 

###########################################################

# Capture device options

############################################################

 

# Videodevice to be used for capturing (default /dev/video0)

# for FreeBSD default is /dev/bktr0

videodevice /dev/video0

 

# Image width (pixels). Valid range: Camera dependent, default: 352

width 320 (视频宽)

 

# Image height (pixels). Valid range: Camera dependent, default: 288

height 240 (视频高)

 

# Motion Detection Settings:

############################################################

 

# Threshold for number of changed pixels in an image that

# triggers motion detection (default: 1500)

threshold 1500 (灵敏度调节)

# Automatically tune the threshold down if possible (default: off)

threshold_tune off

 

# Noise threshold for the motion detection (default: 32)

noise_level 32

 

# Automatically tune the noise threshold (default: on)

noise_tune on

 

# Live Webcam Server

############################################################

 

# The mini-http server listens to this port for requests (default: 0 = disabled)

webcam_port 8081 #远程端口

# Quality of the jpeg images produced (default: 50)

webcam_quality 50

 

# Output frames at 1 fps when no motion is detected and increase to the

# rate given by webcam_maxrate when motion is detected (default: off)

webcam_motion off

 

# Maximum framerate for webcam streams (default: 1)

webcam_maxrate 1

 

# Restrict webcam connections to localhost only (default: on)

webcam_localhost off

 

# Limits the number of images per connection (default: 0 = unlimited)

# Number can be defined by multiplying actual webcam rate by desired number of seconds

# Actual webcam rate is the smallest of the numbers framerate and webcam_maxrate

webcam_limit 0

 

target_dir /tmp/cam1 保存目录

 

############################################################

# HTTP Based Control

############################################################

 

# TCP/IP port for the http server to listen on (default: 0 = disabled)

control_port 8080

 

# Restrict control connections to localhost only (default: on)

control_localhost on

 

# Output for http server, select off to choose raw text plain (default: on)

control_html_output on

 

# Authentication for the http based control. Syntax username:password

# Default: not defined (Disabled)

; control_authentication username:password

 

##############################################################

# Thread config files - One for each camera.

# Except if only one camera - You only need this config file.

# If you have more than one camera you MUST define one thread

# config file for each camera in addition to this config file.

##############################################################

 

# Remember: If you have more than one camera you must have one

# thread file for each camera. E.g. 2 cameras requires 3 files:

# This motion.conf file AND thread1.conf and thread2.conf.

# Only put the options that are unique to each camera in the

# thread config files.

thread /etc/thread1.conf

thread /etc/thread2.conf

# thread /etc/thread3.conf

# thread /etc/thread4.conf[page]

3.2 EVK1105模块

这一模块中我们主要是基于Lwip在Atmel公司的EVK1105开发平台上构建一个websever,完成人与车间的互动和数据的采集。具体界面如下:

 

 

 

下面是关于web的一段代码:

#if (HTTP_USED == 1)

/* Standard includes. */

#include

#include

 

#include "conf_eth.h"

 

/* Scheduler includes. */

#include "FreeRTOS.h"

#include "task.h"

#include "semphr.h"

#include "partest.h"

#include "serial.h"

 

/* Demo includes. */

/* Demo app includes. */

#include "portmacro.h"

 

/* lwIP includes. */

#include "lwip/api.h"

#include "lwip/tcpip.h"

#include "lwip/memp.h"

#include "lwip/stats.h"

#include "netif/loopif.h"

 

/* ethernet includes */

#include "ethernet.h"

 

#include "gpio.h"

 

#define GPIO_PIN_EXAMPLE_1  0            //传输控制代码

#define GPIO_PIN_EXAMPLE_2  1

#define GPIO_PIN_EXAMPLE_3  29

#define GPIO_PIN_EXAMPLE_4  30

 

//#include "usart.h"

 

/*! The size of the buffer in which the dynamic WEB page is created. */

#define webMAX_PAGE_SIZE    3072

 

/*! Standard GET response. */

#define webHTTP_OK   "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"

 

/*! The port on which we listen. */

#define webHTTP_PORT             ( 80 )

 

/*! Delay on close error. */

#define webSHORT_DELAY        ( 10 )

 

/*! Format of the dynamic page that is returned on each connection. */

/*!网页上按钮是用表单来构建的,不同的按钮发送不同的表单数值 */

#define webHTML_START \

"\

\

\

#39;index.html'",1000)\" bgcolor=\"#FFFFFF\" text=\"#2477E6\">\

\r\n

2011 AVR Campus Design Competition

\

      

Jiangnan University

\

      

Interactive robot control platform car

\

\

\

\

\

\

\

\

 

\

\

 \

 \

\

\

\

\

 

\

  \r\n

\

\r\n\

\r\n\

  \r\n

\

 \r\n

\

\r\n\

\r\n\

  \r\n

\

\

\r\n\

\r\n\

 \r\n

\

 \r\n

\

\r\n\

\r\n\

 \r\n

\

 \r\n

\

\r\n\

\r\n\

 \r\n

\

 \r\n

\

\r\n\

\r\n\

 \r\n

"

#define webHTML_END \

"\r\n\

\r\n\

"

 

portCHAR cDynamicPage[ webMAX_PAGE_SIZE ];

portCHAR cPageHits[ 11 ];

int f;

 

/*! Function to process the current connection */

static void prvweb_ParseHTMLRequest( struct netconn *pxNetCon );

 

/*! \brief WEB server main task

 *         check for incoming connection and process it

 *

 *  \param pvParameters   Input. Not Used.

 *

 */

portTASK_FUNCTION( vBasicWEBServer, pvParameters )

{

struct netconn *pxHTTPListener, *pxNewConnection;

 

       /* Create a new tcp connection handle */

       pxHTTPListener = netconn_new( NETCONN_TCP );

       netconn_bind(pxHTTPListener, NULL, webHTTP_PORT );

       netconn_listen( pxHTTPListener );

 

       /* Loop forever */

       for( ;; )

       {

              /* Wait for a first connection. */

              pxNewConnection = netconn_accept(pxHTTPListener);

              vParTestSetLED(webCONN_LED, pdTRUE);

              if(pxNewConnection != NULL)

              {

                     prvweb_ParseHTMLRequest(pxNewConnection);

              }/* end if new connection */

 

              vParTestSetLED(webCONN_LED, pdFALSE);

 

       } /* end infinite loop */

}

 

 

/*! \brief parse the incoming request

 *         parse the HTML request and send file

 *

 *  \param pxNetCon   Input. The netconn to use to send and receive data.

 *

 */

 

static void prvweb_ParseHTMLRequest( struct netconn *pxNetCon )

{

struct netbuf *pxRxBuffer;

portCHAR *pcRxString;

unsigned portSHORT usLength;

static unsigned portLONG ulPageHits;

 

       /* We expect to immediately get data. */

       pxRxBuffer = netconn_recv( pxNetCon );

 

       if( pxRxBuffer != NULL )

       {

              /* Where is the data? */

              netbuf_data( pxRxBuffer, ( void * ) &pcRxString, &usLength );

 

              /* Is this a GET?  We don't handle anything else. */

              if(( NULL != pcRxString               )

              && ( !strncmp( pcRxString, "GET", 3 ) ))

              {

                     /* Update the hit count. */

                     //ulPageHits++;addr

                     ulPageHits=pxRxBuffer->ptr->len;

 

                            //sendMessage("LwIP: DHCP Started");

                     //inet_ntoa(*(struct in_addr*)&(netif->ip_addr))

                     sprintf( cPageHits, "%d", (int)ulPageHits );

 

                     /* Write out the HTTP OK header. */

                     netconn_write( pxNetCon, webHTTP_OK, (u16_t) strlen( webHTTP_OK ), NETCONN_COPY );

 

                     /* Generate the dynamic page... First the page header. */

                     strcpy( cDynamicPage, webHTML_START );

                     /* ... Then the hit count... */

 

                     strcat( cDynamicPage, cPageHits );

                     //strcat( cDynamicPage, "

Task          State  Priority  Stack       [page]#
************************************************
" );

 

 

                     /* ... Then the list of tasks and their status... */

                     //vTaskList( ( signed portCHAR * ) cDynamicPage + strlen( cDynamicPage ) );

 

                     /* ... Finally the page footer. */

                     switch(ulPageHits)

                     {

                     case 310  :gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                              break;

                     case 311   :gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 312   :gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 313   :gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 314   :gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 315   :gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 316   :gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 317    :gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 318    :gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     case 319    :gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_clr_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_4);

                                                   break;

                     default: gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_1);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_2);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_3);

                     gpio_set_gpio_pin(GPIO_PIN_EXAMPLE_4);

                break;

                     }

                     /*if(ulPageHits<310)

                            usart_putchar(EXAMPLE_USART, 0);

                     else if(ulPageHits<319)

                     {

                            f=ulPageHits-309;

                            usart_putchar(EXAMPLE_USART, f);

                     }

                     else if(ulPageHits==319)

                            usart_putchar(EXAMPLE_USART, 0x0a);

                            */

 

                     /* Write out the dynamically generated page. */

                     netconn_write( pxNetCon, cDynamicPage, (u16_t) strlen( cDynamicPage ), NETCONN_COPY );

              }

              netbuf_delete( pxRxBuffer );

       }

 

       netconn_close( pxNetCon );

       netconn_delete( pxNetCon );

}

 

#endif

(4)、实现功能

1、强大的越野能力,四路360°舵机强力驱动;

 

2、电脑、手机对小车的任意控制,无需任何插件、软件;

 

3、视频的同步监控;

 

4、数据的传输,可用于野外勘测、数据采集等方面;

 

5、可加载各种传感器,车上的控制单元都可在不拆卸的情况下直接下载升级。

关键字:交互式机器人小车  WiFi  数据采集  视频监控  HTML语言 引用地址:基于EVK1105开发平台设计的交互式机器人小车

上一篇:几种AVR下载线
下一篇:基于爱特梅尔AVR的微型节能自动浸焊机的软硬件设计

推荐阅读最新更新时间:2024-03-16 13:51

ARM视频监控平台
  如图1所示是视频监控应用系统的开发平台。ARM的系统扩展槽和设备扩展槽,用于为ARM系统添加如以太网接口、海量数 据存储接口和PCMCIA等接口,或者用于其他功能开发板,为ARM系统扩展了CMOS图像获取功能和VGA显示功能。  图1 ARM视频监控开发平台   其中,VGA接口是通过电阻网络实现4096色彩色显示。与SRAM访问相关的寄存器有:SDRAM控制寄存器、读地址低16位、读地址高16位、读出数据寄存器、写地址低16位、写地址高16位、写入数据寄存器;与CMOS图像采集有关的寄存器有 CMOS采集控制寄存器、CMOS采集状态寄存器;与VGA显示有关的寄存器是VGA显示控制寄存器。
[单片机]
ARM<font color='red'>视频监控</font>平台
MSP430F149定时数据采集程序
#include msp430x14x.h #define RS_H P5OUT |=BIT3 //Data Register is selected #define RS_L P5OUT &=~BIT3 //Instruction Register is selected #define READ P5OUT |= BIT2 //读LCD #define WRITE P5OUT &= ~BIT2 //写LCD #define EN_H P5OUT |= BIT1 //Enable Read/Write Operation #define EN_L P5OUT
[单片机]
基于DSP与CPLD的多通道数据采集系统的设计
用于实时控制系统的嵌入式系统经常需要对模拟量进行测量,通常的方法是以MCU为主产生采集控制时序控制模数转换器,并通过中断或查询的方式读取转换后的结果。由MCU产生采集控制时序将占用较多的系统软硬件资源。而在一般复杂的多路信号测控系统中,MCU需要进行数据存储,通讯,数据处理等多项工作,如果再需要其频繁地产生模数转换控制器的控制时序,将会影响系统的性能,严重时将会成为系统的瓶颈。本文采用CPLD产生A/D转换器的控制时序,使得CPLD主要实现A/D时序控制的功能,DSP主要实现闭环控制算法的功能。 1 系统总体结构 系统以DSP和CPLD为核心,模拟信号从模拟多路开关CD4067接人,利用CPLD进行使能其输入。使
[嵌入式]
基于ARM11的无线视频监控系统
  1 引言   随着无线网络的普及,ARM 处理器运算的能力不断地增强以及计算机处理图像的技术不断地提高,基于ARM 的视频监控正越来越广泛的应用于学校,社区,酒店,网吧,医疗等各种各样地领域。传统的视频监控系统布线复杂,设备庞大,智能化低,以及软硬件资源得不到充分的发挥。而ARM 嵌入式系统的小型化、占用空间小、成本低廉、结构紧凑、支持无线网络等特点,使得利用S3C6410 的ARM11+linux系统构成各种各样的无线网络数字监控系统具有广泛的应用价值。   2 系统整体设计   2.1 硬件总体设计   本系统采用韩国三星公司ARM11 内核的S3C6410 作为微处理器,该款处理器体积小,尺寸仅相当于一个48mm
[单片机]
基于ARM11的无线<font color='red'>视频监控</font>系统
基于CAN总线远程振动监测系统研究
引言     当前,远程振动监测系统在理论研究和应用系统开发等方面已取得了一定进展,但在系统可靠性、网络安全、远程数据实时采集和传输、信息共享等方面还存在着许多不足。特别是处于恶劣和复杂环境下的大型设备,一方面分布地域广,监测点多;另一方面空间位置有限,常常存在严重的电磁干扰。因此,采用既实时、灵活和高效,又安全可靠的现场总线数据通讯方式作为设备状态监测系统的数据采集和传输方式十分必要。     CAN现场总线是一种有效支持分布式控制和实时控制的串行通信网络总线,最初由德国Bosch公司为汽车监测和控制而设计,后被用于其他工业部门的控制,应用范围遍及整个控制领域。CAN总线数据通信具有安全、可靠、实时和灵活等特点,国际标准
[嵌入式]
高精度单片数据采集系统MAX1400的原理及应用
    摘要: MAX1400是美国MAXIM公司推出的一种基于∑-△A/D转换技术的高精度单征数据采集系统芯片。文中介绍了它的工作原理、内部结构及编程要点,并给出了MAX1400应用在压力变送器中的一种典型应用电路。     关键词: 数据采集系统  A/D转换  ∑-△A/DC  MAX1400 传统的数据采集系统大多采用Nyquist率ADC(积分型、逐次比较型、闪烁型等),当需要较高分辨率时(16bit以上),这些传统的A/D转换技术将面监很多困难,因为它们需要复杂的高阶模拟抗混迭滤波器、定时以及幅度误差都极小的采样-保持电路等,因而实现起来困难较大,成本很高。新型的∑-△A/D转换技术能够比较低的成本获
[应用]
实时频谱分析仪的数据采集(捕获)方式有哪几种?有什么区别
ThinkRF R55x0/R57x0实时数据采集可通过三种方式完成: a)块捕获,需要用户发出请求,且每次只能捕获一个数据块,需指定SPP与PPB b)流捕获,捕获全自动但是受限于内存,指定SPP,不用指定PPB c)扫描捕获,需设置触发器,会在触发条件后开始数据捕获。
[测试测量]
基于C8051F060单片机和K9F2808UOC存储器实现数据采集系统的设计
从上个世纪九十年代起,电子技术在钻井井下得到应用。但井下钻具的振动会给很多传感器带来不利影响。 特别是对测量井下钻头姿态的惯性导航传感器影响巨大,在随钻振动环境中,如果对信号不作处理,根本就不能测量出正确的井斜角和方位角,也就无法实现井眼轨迹随钻控制的要求。本文介绍应用SoC芯片中的DMA技术对振动的高速采集和存储功能的实现方法,并给出了钻井环境中测试的结果。 1 方法的提出 传统的数据采集方法采用CPU直接控制的方式进行数据采集,数据传送需要经过CPU的中转才能存入存储器,传送速度慢且采集速率受到CPU的限制,极大影响了系统的采样频率,不能满足对振动信号高速采集的要求。而在DMA传送方式下,数据传送不经过CPU,由DMA
[单片机]
基于C8051F060单片机和K9F2808UOC存储器实现<font color='red'>数据采集</font>系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved