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

 找回密码
 立即注册
查看: 17946|回复: 28

发个基于arduino和WR703N的wifi小车的下位机程序(两块L298N芯片,4组电机)

[复制链接]
发表于 2013-10-3 23:01:29 | 显示全部楼层 |阅读模式
本帖最后由 潇洒哥 于 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:47 | 显示全部楼层
嗯嗯,自制驱动板用得着
回复 支持 反对

使用道具 举报

发表于 2013-10-5 11:06:44 | 显示全部楼层
程序风格不错,学习了{:soso_e100:}
回复 支持 反对

使用道具 举报

发表于 2013-10-5 20:27:55 | 显示全部楼层
感谢分享,楼主人很不错!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-5 20:36:51 | 显示全部楼层
还是开源的好!
回复 支持 反对

使用道具 举报

发表于 2013-10-6 13:21:55 | 显示全部楼层
潇洒哥 发表于 2013-10-5 20:36
还是开源的好!

上次请教过您,这次还想麻烦您一下能否也写一个L293D扩展板的下位机程序,就是在这个基础上修改下就可以了,无赖看了半天也没搞懂L293D扩展板的电路图。
回复 支持 反对

使用道具 举报

发表于 2013-11-20 01:12:08 | 显示全部楼层
arduino程序不错,通俗易懂{:soso_e113:}
回复 支持 反对

使用道具 举报

发表于 2013-12-9 18:36:27 | 显示全部楼层
请问提到的Bug是哪里呢?对比一下就是在void loop()中,有两个变量声明的位置不同,另外是:while(1)这个控制,您改为一个判断语句
  1. if (serial.available()>0)
复制代码
另外就是电机控制,您向各个动作函数传递了速度参数x,实际在相关函数中并未使用。

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

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-9 19:35:22 | 显示全部楼层
对,楼上说的没错!我没用pwm控制调速,因为我的小车上用不着的,电机的转速本来就不高,用最大速度也不是很快,所以调速没意义!
回复 支持 反对

使用道具 举报

发表于 2013-12-25 22:24:13 | 显示全部楼层
楼主,奥尼D811HD720P这款摄像头现在已经买不到了,请问有没有类似的摄像头推荐一下啊??
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-4-25 09:07 , Processed in 1.099860 second(s), 19 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表