基于Arduino开源平台的wifi视频监控小车.docx
- 文档编号:23161506
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:12
- 大小:203.95KB
基于Arduino开源平台的wifi视频监控小车.docx
《基于Arduino开源平台的wifi视频监控小车.docx》由会员分享,可在线阅读,更多相关《基于Arduino开源平台的wifi视频监控小车.docx(12页珍藏版)》请在冰豆网上搜索。
基于Arduino开源平台的wifi视频监控小车
基于Arduino开源平台的wifi视频监控小车
这个创意是个舶来品。
记得有个国外作者做了一个基于Arduino和wifi路由器的智能机器人。
要求有摄像头,能够拍摄小车经过地方的影像。
要求使用Arduino模块实现控制。
要求使用PC通过路由器控制小车。
实现这样的机器人很难吗?
能不能做一个简化版的?
组件列表
A4WD小车;ROMEO控制板;5节2300MAH电池;12V电池包;充电器;上海贝尔RG-100A路由器;中星微301摄像头;两自由度DF15MG云台。
图1基于Arduino开源平台的WiFi视频监控小车
图2Arduino_romeo主控板
图3小车
图4云台和摄像头
图5摄像头
源代码 -基于Arduino开源平台的wifi视频监控小车
2012年06月25日12:
04 来源:
互联网 作者:
秩名 我要评论(0)
源代码
下面放出ROMEO板的源程序将这个程序使用Arduino0022下载进去:
#include //舵机控制库
//电机控制端口设置
#defineEN15//控制左侧电机速度
#defineEN26//控制右侧电机速度
#defineIN14//控制左侧电机方向
#defineIN27//控制右侧电机方向
#defineFORW0//前进
#defineBACK1//后退
#definedataLenMax16//设置最大数据帧长度不大于16
ServoservoX;//云台X轴舵机左右
ServoservoY;//云台Y轴舵机上下
//控制电机转动子函数
voidMotor_Control(intM1_DIR,intM1_EN,intM2_DIR,intM2_EN)
{
//////////M1////////////////////////
if(M1_DIR==FORW)//M1电机的方向
digitalWrite(IN1,LOW);//置高,设置方向向前
else
digitalWrite(IN1,HIGH);//置低,设置方向向后
if(M1_EN==0)//M1电机的速度
analogWrite(EN1,LOW);//置低,停止
else
analogWrite(EN1,M1_EN);//否则,就设置相应的数值
///////////M2//////////////////////
if(M2_DIR==FORW)//M2电机的方向
digitalWrite(IN2,LOW);//置高,方向向前
else
digitalWrite(IN2,HIGH);//置低,方向向后
if(M2_EN==0)//M2电机的速度
analogWrite(EN2,LOW);//置低,停止
else
analogWrite(EN2,M2_EN);//否则,就设置相应的数值
}
voidsetup()
{
inti;
for(i=4;i<=7;i++)//设置控制电机的各端口为输出模式
pinMode(i,OUTPUT);
Serial.begin(19200);//设置波特率为19200bps
servoX.attach(10);
servoY.attach(11);
}
///////////////////UART通讯命令字宏定义///////////////////////////////////////////
#defineUART_START00X55//通讯数据帧头
#defineUART_START10XAA//通讯数据帧头
#defineUART_END0X0A//返回数据包结束标志
//////////////////////////命令字定义/////////////////////////////////////////////////////
//波特率57600BPS,无奇偶效验,一位停止位。
文中的数字都是8位的十六进制数/////
///////////////////////////////////2路舵机控制/////////////////////////////////////////////
//本指令可同时控制6路舵机,每路可单独控制位置和速度。
//字头桢长度命令字S1位置S1速度S2位置S2速度校验和
//55aa401
//"S1位置,s2位置"为2个舵机的角度值,范围为0~180,90为中位。
//"S1速度,s2速度"为运动的速度值,spd越高,运动速度越快,范围为0~0xff。
//返回值:
//字头桢长度命令字应答标志校验和
//55aa0101SSUM
//返回操作标志。
设置成功S返回0X01,失败无返回。
//////////////////////////////////////////////////////////////////////////////////////////////
#defineRC_MOTO_SET0X01//2路舵机控制
////////////////////////////////2路电机调速控制////////////////////////////////////////////////
//本指令可同时控制2路直流电机速度。
(机器人头超前方,人面对机器人后方)
//字头桢长度命令字左电机右电机校验和
//55aa202S1S2SUM
//S1,S2分别代表2个电机的PWM输出占空比。
0x80代表电机停止,0x00代表正转最大速度(100%占空比,机器人向前),0xff代表反转最大速度(100%占空比机器人向后)。
//返回值:
//字头桢长度命令字应答标志校验和
//55aa0102SSUM
//返回操作标志。
设置成功S返回0X01,失败无返回。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#defineMOTO_SET0X02//2路电机调速控制
voidloop()
{
//定义变量
intdataLen=0;//数据长度
intstart_flag=0;//数据帧起始标志
intdata_index=0;//数据帧索引
intcom_index=0;//命令索引
inttemp_char1=0;//接收暂存器1
inttemp_char0=0;//接收暂存器1
inti,x,y;//变量
intstate=0;//接收数据帧状态1代表有数据帧,0代表没有接收到数据帧
intSUM;//校验和
intRxData[32];//数据存储寄存器
intSerial_flag;
intMoto1S,Moto2S;//电机1.2速度控制暂存
intMoto1D,Moto2D;//电机1.2方向控制暂存
while
(1)
{
temp_char1=Serial.read();//读取串口数据
if(temp_char1!
=-1)//有数据接收到
{
Serial_flag=1;
if(start_flag==0)//判断是否有0X550XAA数据帧头
{
if(temp_char1==UART_START1)
{
if(temp_char0==UART_START0)
{
start_flag=1;
RxData[0]=UART_START0;
RxData[1]=UART_START1;
data_index=0;
com_index=0;
}
}
elsetemp_char0=temp_char1;
}
elseif(com_index<2)
{
switch(com_index)
{
case0:
RxData[2]=temp_char1;//数据长度
dataLen=temp_char1;
break;
case1:
RxData[3]=temp_char1;//命令字
break;
}
com_index++;
}
elseif((data_index { RxData[data_index+4]=temp_char1; data_index++; } else { RxData[data_index+4]=temp_char1; state=1; start_flag=0; } } if(state==1)//如果有数据帧接收到 { SUM=0; for(i=0;i SUM%=256; if(SUM==RxData[dataLen+4])//如果校验和正确解析命令 { if(RxData[3]==RC_MOTO_SET)//舵机云台控制命令 { if(RxData[4]>=150)x=150; elseif(RxData[4]<=30)x=30; elsex=RxData[4]; if(RxData[6]>=150)y=150; elseif(RxData[6]<=30)y=30; elsey=RxData[6]; servoX.write(x); servoY.write(y); state=0; } elseif(RxData[3]==MOTO_SET)//电机控制命令 { ///////////////////电机1控制量变换///////////////////////////// if(RxData[4]==0X80)Moto1S=0; elseif(RxData[4]<0X80)//小于0X80的控制数据代表正转 { Moto1D=FORW;//正转 Moto1S=0xff-RxData[4]*2;//将0X00最大速度到0X7F最小速度,转换为0最小到255最大速度的值 } else//大于0X80的控制数据代表反转 { Moto1D=BACK;//反转 Moto1S=(RxData[4]-0X80)*2;//将0XFF最大速度到0X81最小速度,转换为0最小到254最大速度的值 } ///////////////////电机2控制量变换///////////////////////////// if(RxData[5]==0X80)Moto2S=0; elseif(RxData[5]<0X80)//小于0X80的控制数据代表正转 { Moto2D=FORW;//正转 Moto2S=0xff-RxData[5]*2;//将0X00最大速度到0X7F最小速度,转换为0最小到255最大速度的值 } else//大于0X80的控制数据代表反转 { Moto2D=BACK;//反转 Moto2S=(RxData[5]-0X80)*2;//将0XFF最大速度到0X81最小速度,转换为0最小到254最大速度的值 } Motor_Control(Moto1D,Moto1S,Moto2D,Moto2S);//电机速度及其方向控制 state=0; } } } } } 程序使用了一种帧结构每个数据命令都是55AA开头,最后一个字节有一个简单的校验和。 这样是为了防止路由器发出错误数据干扰小车。 因为据我观察,路由器在启动的时候会发出一大堆字符。 如果协议太简单小车可能会读取到错误数据乱动作。 程序做了小车速度控制,及其两个云台舵机控制在里面。 云台X轴舵机接数字10口,Y轴舵机接11口。 其他功能可以在上面增加。 此时下载好程序后可以通过JoystickInterface这个软件用USB线连接测试一下小车是否能够可靠运行。 如果USB线能控制,将路由器的串口线接在ROMEO的串口,对应关系为路由器G接ROMEO板GND,T接RX,R接TX。 注意接线最好都断电操作。 修改控制按键键值,下面是一些控制代码,将键抬起设置为停止这样就可以在无按键的时候小车自动停止。 A020******* A020******* 100%速度后退55AA0202FFFF01 100%速度左转55AA0202FF0002 100%速度右转55AA020200FF02 直至Wifi监控小车就算基本功能实现完毕。 后面还有很多功能可以试试,比如通过以太网远程遥控。 加一些传感器,车灯什么的。 可以发挥的空间很大。 相关问题 Q: 什么是WifiRobot无线远程智能遥控小车? A: WifiRobot无线远程智能遥控小车就是利用非常成熟的WIFI无线网络为数据载体,实现控制数据,音视频双向数据交换而达到控制小车和视频监控等等功能。 Q: WifiRobot无线远程智能遥控小车有什么功能? A: WifiRobot无线远程智能遥控小车是集无线通讯、实时四驱、多向机械云台、视频监控、电器红外遥控、环境温度检测、为一体的多功能智能遥控车。 Q: WifiRobot无线远程智能遥控小车用在什么地方? A: WifiRobot无线远程智能遥控小车可以放在公司作为产品演示的高级智能助手,帮你递送文件,帮你拿听百威,帮你拿盒万宝路,又或者向你的客户打声招呼。 WifiRobot无线远程智能遥控小车可以放在家里当做一贴切保姆,你可以在公司用电脑监控家里的的一切动态,可以在车上就设定好家里空调温度,可以定时电视机在什么时候换什么台,这一切你只需要连接到ITELNET。 WifiRobot无线远程智能遥控小车也是广场上的明星,你带着他在城市广场上炫耀,玩耍,让它拿个小礼物送心仪的MM,让他帮你丢垃圾,这一切都不是问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Arduino 平台 wifi 视频 监控 小车