极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26202|回复: 6

有人用arduino 摇杆控制 小车边运动边转向吗?

[复制链接]
发表于 2013-2-19 16:59:01 | 显示全部楼层 |阅读模式
本帖最后由 Iardly 于 2013-2-19 17:02 编辑

如题。

在论坛里待了一个多月了,实在是安奈不住了,迫不及待的想自己弄个小车玩玩。

关于小车的控制想了很多,也查了很多。初步的方案是:  4WD  +  摇杆。

参考了很多论坛关于摇杆的控制,有弘毅改造ps2的帖子,还有宜城老张的 “三轮慧鱼车”。

发现一个问题:大家在用摇杆进行控制的时候,方向和动力是分别控制的。即:要么前进,要么后退,要么左转,要么右转。

前、后、左、右  几个动作是   时分  的。

所以,我就想可不可以  :  把摇杆推向  左前,或者是右后、左后、右前

                                     从而通过一次控制实现 小车 向  斜45°方向运行。



预想的实现:
      
      定义:  正右为X轴正方向,正前为Y轴正方向。
      要求:  摇杆推向左前,小车自动左转45度,而后直线前进
      
      伪代码:

                 if(X<0 并且 Y>0 )
                 {
                       右侧两部电机  以电压 A  驱动;
                       左侧两粗电机  以电压 B  驱动;        //     A  >  B   
                       delay(500);                                   //     保证小车在前进的过程中,左转45°。
                       左右两侧四部电机  以 相同 电压驱动;  //  保证小车向前直行。
                  }

       当然具体的  电压  A 和 B  以及  delay的时间需要反复调整才能完成配合。

不知道摇杆究竟能否完成这个功能?  请高人作答。  谢谢先。

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-2-19 20:06:59 | 显示全部楼层
最近我也在做小车玩,我是这样实现的,ARDUINO接收电机的方向和速度,由控制端发送需要的参数,这样你想同时进行都可以。并不需要定死方向函数,我个人更喜欢把参数给ARDUINO 他只要去执行就OK.
回复 支持 反对

使用道具 举报

发表于 2013-2-19 20:09:46 | 显示全部楼层
你可以观察下4WD 的行走方式,原地转  左轮和右轮方向相反  行走转  方向相同一快一慢就行 我个人琢磨的,你可以自己观察下
回复 支持 反对

使用道具 举报

发表于 2013-2-19 21:13:30 | 显示全部楼层
本帖最后由 wsy0315 于 2013-2-19 21:18 编辑

我给你个我编写的例子,你看看

我是利用调速实现的,
直接上代码吧:
  1. int val1;
  2. int val2;
  3. int val11;
  4. int val22;
  5. int EN1 = 6;
  6. int EN2 = 9;

  7. void motor(char IN1, char IN2, char EN, char state, int val)
  8. {
  9.     pinMode(IN1, OUTPUT);
  10.     pinMode(IN2, OUTPUT);
  11.     pinMode(EN, OUTPUT);

  12.     if(state == 1)
  13.     {
  14.         analogWrite(EN, val);
  15.         digitalWrite(IN1, 0);
  16.         digitalWrite(IN2, 1);
  17.     }
  18.     else if(state == 2)
  19.     {
  20.         analogWrite(EN, val);
  21.         digitalWrite(IN1, 1);
  22.         digitalWrite(IN2, 0);
  23.     }
  24.     else if(state == 0)
  25.     {
  26.         analogWrite(EN, 0);
  27.         digitalWrite(IN1, 0);
  28.         digitalWrite(IN2, 0);
  29.     }
  30. }

  31. void setup()
  32. {
  33.     Serial.begin(9600);
  34. }

  35. void loop()
  36. {
  37.     int val11 = analogRead(A1);
  38.     val11 = map(val11, 0, 1023, -254, 256);  //适配Y轴,应该是255
  39.     int val22 = analogRead(A2);
  40.     val22 = map(val22, 0, 1023, -249, 261);  //适配x轴
  41.     val1 = abs(val11) + val22;
  42.     val1 = constrain(val1, 0, 255);
  43.     val2 = abs(val11) - val22;
  44.     val2 = constrain(val2, 0, 255);
  45.     if (val1 > 4)  //车轮方向转换
  46.     {
  47.         motor(4, 5, 6, 1, val1);  //左轮电机
  48.         motor(7, 8, 9, 1, val2);  //右轮电机
  49.     }
  50.     else if (val1 < 4)
  51.     {
  52.         motor(4, 5, 6, 2, val1);
  53.         motor(7, 8, 9, 2, val2);
  54.     }
  55.     else
  56.     {
  57.         motor(4, 5, 6, 0, val1);  //左轮电机12,13,6
  58.         motor(7, 8, 9, 0, val2);  //右轮电机7,8,5
  59.     }
  60.     analogWrite(EN1, val1);  //车轮PWM
  61.     analogWrite(EN2, val2);
  62. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-2-20 08:34:11 | 显示全部楼层
其实就是差速运动,可以参考下BOXZ的代码。其中255为全速,数越小速度越慢直至停止
http://www.geek-workshop.com/forum-73-1.html
回复 支持 反对

使用道具 举报

发表于 2014-4-14 10:56:22 | 显示全部楼层
如果你的小车轮不是通过转向轴控制(本身不能做角度变化),那么一直维持两侧差速转向,其轨迹就是一个圆弧。所以不可能一直沿着45度行进,只能是你把小车转向到大约45度后,仍然用直行的方式控制。

回复 支持 反对

使用道具 举报

发表于 2014-9-2 09:50:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 02:11 , Processed in 0.039578 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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