`一、源起
据日本《朝日新闻》报道,由日本原子力安全技术中心研发出动救灾的“防灾监测机器人”Monirobo已到达福岛核电站。这种“防灾监测机器人”是设计用于辐射量太高、人员无法操作的状况下运作。
目前已经部署的红色机器人,负责侦测受损反应炉的辐射指数;数天后将部署黄色机器人,采集辐射尘样本和监测易燃气体。
这种机器人高度一点五公尺,可在相隔一公里的距离遥控操作,确保人员安全。它的车轮是如坦克般的履带,机械臂用于移除障碍物和收取样本。配备辐射侦测器、3D相机以及温度与湿度感应器等。法国GIE Intra也送出多台遥控机器人协助救灾,有些机器人如坦克。这些在1986年切尔诺贝利核灾后研制的机器人,可隔着9.65公里距离遥控,开进反应炉铲土和移除墙壁、侦测辐射,甚至可爬墙。
实现这样的机器人很难吗?能不能做一个简化版的?
二、创意方案与栏目互动
这个创意是个舶来品。记得有个国外作者做了一个基于Arduino和wifi路由器的智能机器人。
要求有摄像头,能够拍摄小车经过地方的影像。
要求使用Arduino模块实现控制。
三、组件列表
序号
|
材料名称
|
单价
|
1
|
A4WD小车
|
205
|
2
|
ROMEO控制板
|
300
|
3
|
5节2300MAH电池
|
65
|
4
|
12V电池包
|
130
|
5
|
充电器
|
90
|
6
|
上海贝尔RG-100A路由器
|
55
|
7
|
中星微301摄像头
|
20
|
8
|
两自由度DF15MG云台
|
259
|
|
合计:
|
1124
|
四、文档
整个技术文档我们会在稍后一周公布,欢迎大家持续关注。
五、照片
感谢热心网友“庄子”全程参与了本次方案的开发,并提供了详细的技术支持资料。
基于Arduino开源平台的WiFi视频监控小车
Arduino_romeo主控板
小车
云台+摄像头
摄像头
六、源代码
下面放出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 < dataLenMax)) //接收数据,同时数据不大于最大数据长度
{
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;
else if(RxData [4]<=30) x=30;
else x = RxData[4];
if(RxData[6]>=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口。其他功能可以在上面增加。此时下载好程序后可以通过 Joys
tickInterface 这个软件用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
,让他帮你丢垃圾,这一切都不是问题。
`
16