小R科技-WIFI机器人网·机器人创意工作室

标题: 发个基于arduino和WR703N的wifi小车的下位机程序(两块L298N芯片,4组电机) [打印本页]

作者: 潇洒哥    时间: 2013-10-3 23:01
标题: 发个基于arduino和WR703N的wifi小车的下位机程序(两块L298N芯片,4组电机)
本帖最后由 潇洒哥 于 2013-10-3 23:25 编辑

    我的基于arduino和wr703n的wifi监控小车终于搞定了最后一步的串口通讯!由于国庆放假在家,小车放在学校实验室里!没能带回来。所以测试只能用8个LED灯泡代替两块L298N驱动板了!

    首先说一下wr703n路由器,我用了论坛大神的固件,地址http://www.wifi-robots.com/thread-1037-1-1.html,固件支持web中文,默认开机启动ser2net和wificar(包括mjpg-streamer)
mjpg-streamer默认是UVC摄像头,跟我的奥尼D811HD720P很相配,视频效果很好,就是fps不是很高,一般在8-10fps左右!
    然后就是下位机程序,之前用过论坛管理员的和大神的下位机,感觉有点小BUG,索性参照论坛的下位机自己写了个下位机!原来的BUG也解决了!
以下为我的下位机代码(我用的是两块L298N驱动板,每块电机驱动板上接了两个电机,一共4个电机,4驱动!)
  1. #include <Servo.h>
  2. Servo servo1;//定义舵机1
  3. Servo servo2;//定义舵机2

  4. //L298N_A
  5. int M1_1 = 2;
  6. int M1_2 = 3;
  7. int M2_1 = 4;
  8. int M2_2 = 5;
  9. //L298N_B
  10. int M3_1 = 8;
  11. int M3_2 = 9;
  12. int M4_1 = 10;
  13. int M4_2 = 11;

  14. int buffer[3];
  15. int Serial_flag;
  16. int temp_char;
  17. int date_index=0;
  18. void setup()
  19. {
  20.   pinMode(2,OUTPUT);
  21.   pinMode(3,OUTPUT);
  22.   pinMode(4,OUTPUT);
  23.   pinMode(5,OUTPUT);
  24.   pinMode(8,OUTPUT);
  25.   pinMode(9,OUTPUT);
  26.   pinMode(10,OUTPUT);
  27.   pinMode(11,OUTPUT);
  28.   servo1.attach(6);//定义舵机1控制接口为数字6
  29.   servo2.attach(7);//定义舵机2控制接口为数字7
  30.   Serial.begin(9600);
  31. }
  32. void Stop(void)        //四轮停止
  33. {
  34.   digitalWrite(2,LOW);           
  35.   digitalWrite(3,LOW);
  36.   digitalWrite(4,LOW);
  37.   digitalWrite(5,LOW);
  38.   digitalWrite(8,LOW);
  39.   digitalWrite(9,LOW);
  40.   digitalWrite(10,LOW);
  41.   digitalWrite(11,LOW);
  42. }
  43. void advance(int x)        //向前直行
  44. {
  45.   digitalWrite(2,LOW);
  46.   digitalWrite(3,HIGH);
  47.   digitalWrite(4,LOW);
  48.   digitalWrite(5,HIGH);
  49.   digitalWrite(8,LOW);
  50.   digitalWrite(9,HIGH);
  51.   digitalWrite(10,LOW);
  52.   digitalWrite(11,HIGH);
  53. }
  54. void back(int x)             //向后直行
  55. {
  56.   digitalWrite(2,HIGH);
  57.   digitalWrite(3,LOW);
  58.   digitalWrite(4,HIGH);
  59.   digitalWrite(5,LOW);
  60.   digitalWrite(8,HIGH);
  61.   digitalWrite(9,LOW);
  62.   digitalWrite(10,HIGH);
  63.   digitalWrite(11,LOW);
  64. }
  65. void left(int x)                //左转
  66. {
  67.   digitalWrite(2,LOW);
  68.   digitalWrite(3,HIGH);
  69.   digitalWrite(4,LOW);
  70.   digitalWrite(5,HIGH);
  71.   digitalWrite(8,HIGH);
  72.   digitalWrite(9,LOW);
  73.   digitalWrite(10,HIGH);
  74.   digitalWrite(11,LOW);
  75. }
  76. void right(int x)                    //右转
  77. {
  78.   digitalWrite(2,HIGH);
  79.   digitalWrite(3,LOW);
  80.   digitalWrite(4,HIGH);
  81.   digitalWrite(5,LOW);
  82.   digitalWrite(8,LOW);
  83.   digitalWrite(9,HIGH);
  84.   digitalWrite(10,LOW);
  85.   digitalWrite(11,HIGH);
  86. }
  87. void Communication_Decode()
  88. {
  89.   if(buffer[0]==0x00)
  90.   {
  91.     switch(buffer[1])
  92.     {
  93.       case 0x01:advance(150);return;
  94.       case 0x02:back(150);return;
  95.       case 0x03:right(150);return;
  96.       case 0x04:left(150);return;
  97.       case 0x00:Stop(); return;
  98.     }
  99.   }
  100.   else if(buffer[0]==0x01)
  101.   {
  102.     if(buffer[2]>180)return;
  103.     switch(buffer[1])
  104.     {
  105.       case 0x01:servo1.write(buffer[2]);return;
  106.       case 0x02:servo2.write(buffer[2]);return;
  107.       default:return;
  108.     }
  109.   }
  110. }
  111. void loop()
  112. {
  113. if(Serial.available() > 0)  
  114.   {
  115.     temp_char = Serial.read();
  116.     if(temp_char!=-1)
  117.     {
  118.       if(Serial_flag==0)
  119.       {
  120.         if(temp_char==0xff)
  121.         {
  122.           Serial_flag = 1;
  123.         }
  124.       }
  125.       else
  126.       {
  127.         if(temp_char==0xff)
  128.         {
  129.           Serial_flag = 0;
  130.           if(date_index==3)
  131.           {
  132.             Communication_Decode();
  133.           }
  134.           date_index = 0;
  135.         }
  136.         else
  137.         {
  138.           buffer[date_index]=temp_char;
  139.           date_index++;
  140.         }
  141.       }
  142.     }
  143.   }
  144. }
复制代码


作者: 路易斯小胖    时间: 2013-10-4 11:10
嗯嗯,自制驱动板用得着
作者: 二极管    时间: 2013-10-5 11:06
程序风格不错,学习了{:soso_e100:}
作者: 41257203    时间: 2013-10-5 20:27
感谢分享,楼主人很不错!
作者: 潇洒哥    时间: 2013-10-5 20:36
还是开源的好!
作者: 41257203    时间: 2013-10-6 13:21
潇洒哥 发表于 2013-10-5 20:36
还是开源的好!

上次请教过您,这次还想麻烦您一下能否也写一个L293D扩展板的下位机程序,就是在这个基础上修改下就可以了,无赖看了半天也没搞懂L293D扩展板的电路图。
作者: apple3145    时间: 2013-11-20 01:12
arduino程序不错,通俗易懂{:soso_e113:}
作者: 沧海笑    时间: 2013-12-9 18:36
请问提到的Bug是哪里呢?对比一下就是在void loop()中,有两个变量声明的位置不同,另外是:while(1)这个控制,您改为一个判断语句
  1. if (serial.available()>0)
复制代码
另外就是电机控制,您向各个动作函数传递了速度参数x,实际在相关函数中并未使用。

我目前也是用论坛的蓝牙v1.01版控制端(安卓平台),加arduino下位机,使用论坛开源下位机(arduino三字节十六进制串口协议),只能控制一组电机,另外一组不响应,可是改成单字符方式控制,两组电机工作正常。


作者: 潇洒哥    时间: 2013-12-9 19:35
对,楼上说的没错!我没用pwm控制调速,因为我的小车上用不着的,电机的转速本来就不高,用最大速度也不是很快,所以调速没意义!
作者: HZ_Viki    时间: 2013-12-25 22:24
楼主,奥尼D811HD720P这款摄像头现在已经买不到了,请问有没有类似的摄像头推荐一下啊??
作者: 潇洒哥    时间: 2013-12-26 12:28
楼主,奥尼D811HD720P这款摄像头现在已经买不到了,请问有没有类似的摄像头推荐一下啊??

论坛里不是有天敏的S605系列的吗?
我曾经发过一个帖子,就是关于openwrt的支持摄像头的列表,那里边有很多,你可看看
地址http://www.wifi-robots.com/thread-6364-1-1.html
我的新车用的是一个20元包邮从淘宝上淘到的摄像头,外形酷似小钢炮,实际效果跟小钢炮差不多的!!
作者: HZ_Viki    时间: 2013-12-30 16:42
潇洒哥 发表于 2013-12-26 12:28
论坛里不是有天敏的S605系列的吗?
我曾经发过一个帖子,就是关于openwrt的支持摄像头的列表,那里边有很 ...

多谢 我最后在淘宝上买了二手中星微的摄像头~
作者: HZ_Viki    时间: 2013-12-30 16:45
请问在Arduino串口调试的窗口中,send 类似FF000000FF的命令就行了吗??为什么我的Serial.print()没有反馈呢??
作者: 看星星的豆豆    时间: 2013-12-30 17:58
L298N  造价太高了吧,而且太容易坏了,还没弄成功就被我烧坏了,
果断换继电器,   我感觉改用四路的继电器用的比较好,
作者: 潇洒哥    时间: 2013-12-30 20:24
FF000000FF

这个是16进制数据,要想识别16进制或者8进制数据,必须定义相应的进制类型
作者: 潇洒哥    时间: 2013-12-30 20:27
L298N  造价太高了吧,而且太容易坏了,还没弄成功就被我烧坏了,
果断换继电器,   我感觉改用四路的继电器用的比较好,

L298N不怎么贵啊!??我买的11块钱一片啊!上面那个是我的第一台车,我的第二台车也是用的这个L298n驱动板!
从来没烧毁过!这个驱动板的输出电流大,驱动减速电机无压力,
作者: 潇洒哥    时间: 2013-12-30 20:29
多谢 我最后在淘宝上买了二手中星微的摄像头~

中星微的摄像头,有闪的问题,是通病,不及UVC的好!而且UVC的摄像头很多!电脑城里买的很多都是UVC的,只是图像质量差一点
作者: Let_itGo    时间: 2014-5-4 16:19
本帖最后由 Let_itGo 于 2014-5-4 21:14 编辑

楼主。你这个摄像头捕捉到的画面在哪里看?网页链接是多少啊?  你刷了那个固件后 路由器设置有没有改动的地方嗯?还是 按照刷完的路由器直接用了??
作者: 潇洒哥    时间: 2014-5-5 08:20
楼主。你这个摄像头捕捉到的画面在哪里看?网页链接是多少啊?  你刷了那个固件后 路由器设置有没有改动的地方嗯?还是 按照刷完的路由器直接用了??

摄像头获取视频在上位机上看到,论坛里有,手机,电脑都行,路由器设置肯定要改啊!至少你得打开双向通信,在这里:
http://www.wifi-robots.com/thread-1037-1-1.html
作者: Let_itGo    时间: 2014-5-5 20:22
潇洒哥 发表于 2014-5-5 08:20
摄像头获取视频在上位机上看到,论坛里有,手机,电脑都行,路由器设置肯定要改啊!至少你得打开双向通信 ...

楼主。你用的是什么软件控制的小车、是论坛里的控制平台么?还有 楼主给的源代码 可以直接用?
作者: 潇洒哥    时间: 2014-5-5 20:29
楼主。你用的是什么软件控制的小车、是论坛里的控制平台么?还有 楼主给的源代码 可以直接用?

呵呵,你这个问题问的有点问题,首先我不知道你的小车的架构什什么样的,电机驱动板是不是跟我的一样,我用的是两个L298N驱动板,控制4路电机,软件是论坛的上位机,
作者: 潇洒哥    时间: 2014-5-5 20:30
你要能读懂arduino程序,学习一下吧!
作者: Let_itGo    时间: 2014-5-5 20:42
潇洒哥 发表于 2014-5-5 20:29
呵呵,你这个问题问的有点问题,首先我不知道你的小车的架构什什么样的,电机驱动板是不是跟我的一样,我 ...

我现在暂时还没有弄小车 只是将程序稍微修改 然后先通过路由器控制小灯亮灭。http://www.wifi-robots.com/thread-781-1-1.html楼主你用的也是这个么?
作者: 潇洒哥    时间: 2014-5-6 22:13
我的程序作了一些精简,不用的都精简掉了
作者: 说难也不难    时间: 2014-8-4 11:40
潇洒哥 发表于 2013-10-5 20:36
还是开源的好!


给力:):):)给力
作者: yunhan    时间: 2015-2-4 20:24
你调试成功吗?
作者: 潇洒哥    时间: 2015-2-7 21:51
你调试成功吗?

肯定成功了
作者: dxw1984    时间: 2015-4-27 22:20
支持开源,谢谢分享!努力学习中
作者: 夕阳下的吉他    时间: 2017-9-14 12:17
我现在也在搞一个双L298n的小车底盘,四马达四驱,ARDUINO,老大能分享几张接线的照片吗,学习一下。先谢谢了




欢迎光临 小R科技-WIFI机器人网·机器人创意工作室 (http://www.wifi-robots.com/) Powered by Discuz! X3.4