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

电子制作

259人已加入

描述

  这个创意是个舶来品。记得有个国外作者做了一个基于Arduino和wifi路由器的智能机器人。

  要求有摄像头,能够拍摄小车经过地方的影像。

  要求使用Arduino模块实现控制。

  要求使用PC通过路由器控制小车。

  实现这样的机器人很难吗?能不能做一个简化版的?

  组件列表

  A4WD小车;ROMEO控制板;5节2300MAH电池;12V电池包;充电器;上海贝尔 RG-100A路由器;中星微301摄像头 ;两自由度DF15MG云台。

Arduino开源平台 
 图1 基于Arduino开源平台的WiFi视频监控小车

Arduino开源平台 
 图2 Arduino_romeo主控板

  
图3 小车

Arduino开源平台  
图4 云台和摄像头

Arduino开源平台  
图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 < 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口。其他功能可以在上面增加。此时下载好程序后可以通过 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,让他帮你丢垃圾,这一切都不是问题。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
daifhfh 2015-10-04
0 回复 举报
非常有用,感谢分享! 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分