基于Arduino开源平台的wifi视频监控小车

这个创意是个舶来品。记得有个国外作者做了一个基于arduino和wifi路由器的智能机器人。
要求有摄像头,能够拍摄小车经过地方的影像。
要求使用arduino模块实现控制。
要求使用pc通过路由器控制小车。
实现这样的机器人很难吗?能不能做一个简化版的?
组件列表
a4wd小车;romeo控制板;5节2300mah电池;12v电池包;充电器;上海贝尔 rg-100a路由器;中星微301摄像头 ;两自由度df15mg云台。
图1 基于arduino开源平台的wifi视频监控小车
图2 arduino_romeo主控板
图3 小车
图4 云台和摄像头
图5 摄像头
源代码
下面放出romeo板的源程序将这个程序使用arduino 0022 下载进去:
#include //舵机控制库
//电机控制端口设置
#define en1 5//控制左侧电机速度
#define en2 6//控制右侧电机速度
#define in1 4//控制左侧电机方向
#define in2 7//控制右侧电机方向
#define forw 0//前进
#define back 1//后退
#define datalenmax 16 //设置最大数据帧长度 不大于16
servo servox; //云台x轴舵机 左右
servo servoy; //云台y轴舵机 上下
//控制电机转动子函数
void motor_control(int m1_dir,int m1_en,int m2_dir,int m2_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);//否则,就设置相应的数值
}
void setup()
{
int i;
for(i=4;i<=7;i++)//设置控制电机的各端口为输出模式
pinmode(i, output);
serial.begin(19200);//设置波特率为19200bps
servox.attach(10);
servoy.attach(11);
}
///////////////////uart通讯命令字宏定义///////////////////////////////////////////
#define uart_start0 0x55 //通讯数据帧头
#define uart_start1 0xaa //通讯数据帧头
#define uart_end 0x0a //返回数据包结束标志
////////////////////////// 命令字定义/////////////////////////////////////////////////////
// 波特率 57600bps,无奇偶效验,一位停止位。文中的数字都是8位的十六进制数 /////
///////////////////////////////////2路舵机控制/////////////////////////////////////////////
//本指令可同时控制6路舵机,每路可单独控制位置和速度。
//字头 桢长度 命令字 s1位置 s1速度 s2位置 s2速度 校验和
//55 aa 4 01
//s1位置,s2位置为2个舵机的角度值,范围为0~180,90为中位。
//s1速度,s2速度为运动的速度值,spd越高,运动速度越快,范围为0~0xff。
//返回值:
//字头 桢长度 命令字 应答标志 校验和
//55 aa 01 01 s sum
//返回操作标志。设置成功s返回0x01,失败无返回。
//////////////////////////////////////////////////////////////////////////////////////////////
#define rc_moto_set 0x01 // 2路舵机控制
////////////////////////////////2路电机调速控制////////////////////////////////////////////////
//本指令可同时控制2路直流电机速度。(机器人头超前方,人面对机器人后方)
//字头 桢长度 命令字 左电机 右电机 校验和
//55 aa 2 02 s1 s2 sum
//s1,s2分别代表2个电机的pwm输出占空比。0x80代表电机停止,0x00代表正转最大速度(100%占空比,机器人向前),0xff代表反转最大速度(100%占空比机器人向后)。
//返回值:
//字头 桢长度 命令字 应答标志 校验和
//55 aa 01 02 s sum
//返回操作标志。设置成功s返回0x01,失败无返回。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define moto_set 0x02 //2路电机调速控制
void loop()
{
//定义变量
int datalen = 0; //数据长度
int start_flag = 0; //数据帧起始标志
int data_index = 0; //数据帧索引
int com_index = 0; //命令索引
int temp_char1 = 0; //接收暂存器1
int temp_char0 = 0; //接收暂存器1
int i,x,y; //变量
int state = 0; //接收数据帧状态 1代表有数据帧,0代表没有接收到数据帧
int sum; //校验和
int rxdata[32]; //数据存储寄存器
int serial_flag;
int moto1s,moto2s; //电机1.2 速度控制暂存
int moto1d,moto2d; //电机1.2 方向控制暂存
while(1)
{
temp_char1 = serial.read(); //读取串口数据
if(temp_char1!=-1) //有数据接收到
{
serial_flag=1;
if(start_flag == 0) // 判断 是否有 0x55 0xaa 数据帧头
{
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;
}
}
else temp_char0 = temp_char1;
}
else if( com_index < 2)
{
switch(com_index)
{
case 0 : rxdata[2] = temp_char1; //数据长度
datalen = temp_char1;
break;
case 1 : rxdata[3] = temp_char1; //命令字
break;
}
com_index++;
}
else if((data_index < datalen) && (datalen =150) x=150;
else if(rxdata [4]=150) y=150;
else if(rxdata[6]<=30) y=30;
else y = rxdata[6];
servox.write(x);
servoy.write(y);
state = 0;
}
else if(rxdata[3] == moto_set) //电机控制命令
{
///////////////////电机1控制量变换/////////////////////////////
if(rxdata[4] == 0x80) moto1s = 0;
else if(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;
else if(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;
}
}
}
}
}
程序使用了一种帧结构 每个数据命令都是 55 aa开头,最后一个字节有一个简单的校验和。这样是为了防止路由器发出错误数据干扰小车。因为据我观察,路由器在启动的时候会发出一大堆字符。如果协议太简单小车可能会读取到错误数据乱动作。
程序做了小车速度控制,及其两个云台舵机控制在里面。云台x轴舵机接数字10口,y轴舵机接11口。其他功能可以在上面增加。此时下载好程序后可以通过 joystickinterface 这个软件用usb线连接测试一下小车是否能够可靠运行。
如果usb线能控制,将路由器的串口线接在romeo的串口,对应关系为 路由器g接romeo板gnd,t接rx,r接tx。注意接线最好都断电操作。
修改控制按键键值,下面是一些控制代码,将键抬起设置为停止这样就可以在无按键的时候小车自动停止。
停止 55aa0202808003
100% 速度前进 55aa0202000003
100% 速度后退 55aa0202ffff01
100% 速度左转 55aa0202ff0002
100% 速度右转 55aa020200ff02
直至wifi监控小车就算基本功能实现完毕。后面还有很多功能可以试试,比如通过以太网远程遥控。加一些传感器,车灯什么的。可以发挥的空间很大。
相关问题
q:什么是wifi robot无线远程智能遥控小车?
a:wifi robot无线远程智能遥控小车就是利用非常成熟的wifi无线网络为数据载体,实现控制数据,音视频双向数据交换而达到控制小车和视频监控等等功能。
q:wifi robot无线远程智能遥控小车有什么功能?
a:wifi robot无线远程智能遥控小车是集无线通讯、实时四驱、多向机械云台、视频监控、电器红外遥控、环境温度检测、为一体的多功能智能遥控车。
q:wifi robot无线远程智能遥控小车用在什么地方?
a:wifi robot无线远程智能遥控小车可以放在公司作为产品演示的高级智能助手,帮你递送文件,帮你拿听百威,帮你拿盒万宝路,又或者向你的客户打声招呼。
wifi robot无线远程智能遥控小车可以放在家里当做一贴切保姆,你可以在公司用电脑监控家里的的一切动态,可以在车上就设定好家里空调温度,可以定时电视机在什么时候换什么台,这一切你只需要连接到itelnet。
wifi robot无线远程智能遥控小车也是广场上的明星,你带着他在城市广场上炫耀,玩耍,让它拿个小礼物送心仪的mm,让他帮你丢垃圾,这一切都不是问题。

解析特斯拉如何增加动力电池的电量
PCB设计中的过孔问题讨论
元宵佳节到 故宫安防要重视
苹果13大约什么时候上市 苹果13手机上市时间表及价格
如何进行5G网络的干扰防范
基于Arduino开源平台的wifi视频监控小车
欧姆龙电气将出展“2012慕尼黑上海电子展”
德州仪器面向汽车与通用照明推出大功率LED驱动器
新发现半导体薄膜材料可产生光伏效应
2022年投影仪推荐,看电影、刷剧的神器
原理图和电路图区别
传苹果iPad Pro 2024款“彻底改革”:首配OLED屏,包括13英寸型号
抢先看第三代半导体GaN与SiC技术沙龙
奥迪首款SUV电动车将搭载7吋OLED屏
路由器的原理、结构和特点
小米8曝光:第一款采用3D结构光的安卓手机
液位传感器在农田灌溉水位测量中的技术方案
可搭建私人网盘的在线文件浏览器
无需公网IP,花生壳助力「高速公路雾天行车安全系统」智能化监管!
新能源乘用车申报及电池配套的主要特点