极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12185|回复: 6

VBLEARN 项目2: 遥控小车制作, 开发记录中

[复制链接]
发表于 2015-2-21 08:40:35 | 显示全部楼层 |阅读模式
本帖最后由 vblearn 于 2015-2-21 09:08 编辑

2015-02-21 08:30
准备做一个遥控小车, 目的吗, 给孩子做玩具用. {:soso_e100:}
一边学一边做. 记录下来.

>>需求:
通过无线控制小车, 可以控制前进,后退,(可以调节速度),左右转弯.
可以闪灯。

>>技术分析
>无线传输
现在可用的方式包括,模电遥控器, 红外,蓝牙,无线串口和无线网络
1模电 2262/2272四路无线遥控套件M4非锁
2 红外,有51剩下的红外接收管,但考虑接收有方向性,暂不用
3 蓝牙有电路,可用(串口透传),价格较高。
4 无线串口暂无电路,朋友推荐CC1101
5 无线网络WIFI(ESP8266)有电路,试验过, 但总感觉有点复杂,而且不很可靠。

>控制命令
使用简单的串口传递命令,

>电机控制
    计划使用L298N. 由于是三轮车,使用差速控制,还需要对两个速度进行微调,以走直线。
>小车,
   购于某宝, http://detail.tmall.com/item.htm?id=43280413496&spm=a1z09.2.9.762.bIvwI4&_u=l1i64r1l1035&mt= 质量很一般.
>发送端
   还需要另一块ARDUINO来处理发送的功能. 要不就得使用计算机遥控了.

>>开发步骤
1 试验L298N, 通过UNO 对两个电机控制
2 试验串口命令 (使用计算机发送)
3 试验有线的控制
4 调节算法, 使用差速进行控制.
5 试验计算机无线的控制.
6 ARDUINO TO ARDUINO的控制

>>计划时间, 2-3天完成.


回复

使用道具 举报

发表于 2015-2-21 13:53:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-21 14:49:05 | 显示全部楼层
本帖最后由 vblearn 于 2015-2-21 14:52 编辑

OK.谢谢楼上, 但已写出来了.
先接了L298N,开始用USB供电,根本带不动两个电机. 现在用12V电源(10A的). 驱动OK了.
还是考虑使用串口进行控制
现在定义了两个命令,一个是前后的速度,一个是左右的转向速度. 这两个数的范围是0到510,以255为中心.
经过计算后,变成左右电机的速度SPEED1,SPEED2,范围为0-255.
但PWM低值时无法驱动电机,高时又太快. 所以SPEED到PWM进行了一个简单的线性变换. 即定义了PWM的最小和最大值, 将SPEED的0-255映射到PWM的MIN到MAX.
由于两个电机速度不完全一致,还保留了两个变量对SPEED进行微调.

串口的处理代码可以参照上一贴项目1-万年历

下面是速度处理的代码.
  1. //control value
  2. int m_ValueCenter=255;// for Forward and Turn
  3. int m_Forward,m_Turn; //Current control -255 to 255
  4. int m_Speed1=0,m_Speed2=0; //-255 to 255
  5. int m_Speed1Adjust=0,m_Speed2Adjust=0;//adjust the motor speed

  6. #define C_PWM1MIN 60
  7. #define C_PWM1MAX 130

  8. #define C_PWM2MIN 60
  9. #define C_PWM2MAX 130

  10. int m_PWM1,m_PWM2; //PWM control;
复制代码

一个是从控制量到两电机速度的函数
  1. void S_CalculateControl()
  2. {
  3.   //  from m_Forward,m_Turn(-255 to 255); to  m_Speed1,m_Speed2; (-255 to 255 )
  4.   m_Speed1=m_Forward;
  5.   m_Speed2=m_Forward;
  6.   if (m_Forward>0)
  7.   {
  8.     if (m_Turn<0)  //turn left
  9.     {
  10.       m_Speed1+=m_Turn; //chang speed
  11.       if (m_Speed1<0) {         
  12.         m_Speed1=0;        
  13.       }
  14.     }
  15.     if (m_Turn>0) //turn right
  16.     {
  17.       m_Speed2-=m_Turn;
  18.       if (m_Speed2<0) {         
  19.         m_Speed2=0;        
  20.       }
  21.     }
  22.   }
  23.   if (m_Forward==0)
  24.   {
  25.     if (m_Turn!=0)  
  26.     {
  27.       m_Speed1=-m_Turn; //chang speed
  28.       m_Speed2=m_Turn;
  29.     }
  30.   }
  31.   if (m_Forward<0)
  32.   {
  33.     //Treat turn
  34.     if (m_Turn<0)  //turn left
  35.     {
  36.       m_Speed1-=m_Turn; //chang speed
  37.       if (m_Speed1>0) {
  38.         m_Speed1=0;
  39.       }
  40.     }
  41.     if (m_Turn>0)
  42.     {
  43.       m_Speed2+=m_Turn;
  44.       if (m_Speed2>0) {
  45.         m_Speed2=0;
  46.       }
  47.     }
  48.   }
  49. }
复制代码

一个是实际控制电机的函数
  1. void S_Control()
  2. {
  3.   int i;
  4.   byte PWM1,PWM2;
  5.   //last adjust
  6.   m_Speed1+=m_Speed1Adjust;
  7.   m_Speed2+=m_Speed2Adjust;
  8.   if (m_Speed1>255)
  9.   {
  10.     m_Speed1=255;
  11.   }
  12.   if (m_Speed1<-255)
  13.   {
  14.     m_Speed1=-255;
  15.   }
  16.   if (m_Speed2>255)
  17.   {
  18.     m_Speed2=255;
  19.   }
  20.   if (m_Speed2<-255)
  21.   {
  22.     m_Speed2=-255;
  23.   }
  24.   if (m_Speed1>0)
  25.   {
  26.     digitalWrite(P_IN1,LOW);
  27.     digitalWrite(P_IN2,HIGH);
  28.     PWM1=m_Speed1*(C_PWM1MAX-C_PWM1MIN)/255+C_PWM1MIN;
  29.     analogWrite(P_ENA,PWM1);
  30.   }
  31.   if (m_Speed1==0)
  32.   {
  33.     analogWrite(P_ENA,0); //
  34.     digitalWrite(P_IN1,LOW);
  35.     digitalWrite(P_IN2,LOW);
  36.   }  
  37.   if (m_Speed1<0)
  38.   {
  39.     digitalWrite(P_IN1,HIGH);
  40.     digitalWrite(P_IN2,LOW);
  41.     PWM1=-m_Speed1*(C_PWM1MAX-C_PWM1MIN)/255+C_PWM1MIN;
  42.     analogWrite(P_ENA,PWM1);
  43.   }
  44.   //Speed2
  45.   if (m_Speed2>0)
  46.   {
  47.     digitalWrite(P_IN3,LOW);
  48.     digitalWrite(P_IN4,HIGH);
  49.     // analogWrite(P_ENB,m_Speed2);
  50.     PWM2=m_Speed2*(C_PWM2MAX-C_PWM2MIN)/255+C_PWM2MIN;

  51. //    Serial.print ("Run2 ");
  52. //   Serial.println (PWM2);
  53.     analogWrite(P_ENB,PWM2);
  54.   }
  55.   if (m_Speed2==0)
  56.   {
  57.     digitalWrite(P_IN3,LOW); //STOP
  58.     digitalWrite(P_IN4,LOW);
  59.     analogWrite(P_ENB,0);
  60.   }  
  61.   if (m_Speed2<0)
  62.   {
  63.     digitalWrite(P_IN3,HIGH);
  64.     digitalWrite(P_IN4,LOW);
  65.     PWM2=-m_Speed2*(C_PWM2MAX-C_PWM2MIN)/255+C_PWM2MIN;
  66.     analogWrite(P_ENB,PWM2);
  67.   }
  68. }
复制代码


下一步,计划先拖根线传递12V和串口.试试后,再处理 移动电源和无线部分的问题.
回复 支持 反对

使用道具 举报

发表于 2015-2-21 19:22:35 | 显示全部楼层
什么时候放图或者视频呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-21 22:10:00 | 显示全部楼层
本帖最后由 vblearn 于 2015-2-21 22:16 编辑

刚增加了蓝牙串口的无线功能。 使用的**莱的一对蓝牙模块。( HC-05 串口蓝牙)
上次调试对了,这次用错了电压,本来应该是5V的,用的3。3V,半天才发现错误。
而且蓝牙用的串口与下载的冲突,下载程序时还需要拔掉0,1口的线。

无线串口工作正常。下一步就是移动电源了。试了一下9V电池算可用吧,先按这个弄,之后再考虑12V的。
太晚了,先上个半成品的图。
电源部分明天再试。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-22 23:10:37 | 显示全部楼层
20150222 22:56进展报告
使用了9V的电池,能够独立运行了。使用计算机发串口命令,可以控制小车了。为此还写了个VB。NET的程序。可以使用键盘进行控制。

但还是存在了严重的问题,就是两个电机的不一致。我本来保留了两个变量对左右电机进行微调。但发现前进和后退时,情况还不同。
看来小车不象想象的简单。 只好准备上闭环控制了。 上次买了两个测速模块。但小车的测速盘太紧,安装时损坏了一个,还没有想到替代的方法。

先把半成品的图片,程序上传,以后有设备再进行闭环的控制。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-3-1 02:00:26 | 显示全部楼层
支持。加油。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 14:52 , Processed in 0.037643 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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