arduino uno 麦克纳姆小车编程

一。制作一个麦克纳姆小车用到的硬件如下:

1.一个小车底盘

2.四颗麦克纳姆车轮,左旋轮和右旋轮各两个

4.四个TT马达

一般有卖组合的底盘加马达加轮子,省的自己组装。(如果你需要使用遥控器手柄,可以2.4G或者蓝牙的遥控器,并购买配套的接收芯片,接收连接方式和蓝牙一样使用串口,替换掉串口的蓝牙就可以了)

5.一块arduino uno芯片

6.一块L293D的马达控制板

7.一个蓝牙HC-08

8.一组18650电池。

二。我使用的是带遥控器的麦克纳姆小车,但该小车没有扩展性,不能编程控制和二次开发,我希望能够使用手机控制,实现寻迹,避障,雷达,追踪,蓝牙控制等,所以我对其进行改装,加入了另一路arduino uno控制,arduino uno通过蓝牙接收手机的信号控制小车做各种动作。

如下图,我把四个马达的控制线引出来接上sm头,后面接到L293D扩展板上,你可以不这样,使用4P的2mm端子就可以直接使用他原来的接线,我是买错了,懒得再去买,就使用了sm接头。这样可以不破坏原本的控制电路,这样我的小车既可以使用原始的遥控器控制,也可以实用自己搞的手机控制。原始的板子使用2.4G通信,我没有破解。

三。麦克纳姆有四个轮子,仔细分辨,你会发现四个轮子长的不一样。四个轮子分两组,左前和右后下使用相对纹理的轮子,右前和左后使用相对纹理的轮子,一般称为A轮和B轮。麦克纳姆的独特技能全靠A,B轮来实现,所以动手能力强的,或者有小车底盘加TT马达的,买四个麦克纳姆轮子就可以了。一般人侍买个底板,四个轮子(A轮两个,B轮两个),四个TT马达就可以了。

如下四个轮子,左上和右下是一组A轮,右上和左下是一组,B轮,轮子上的纹路方向不一样,转动时摩擦力角度不同:

四。一般的小车可以完成前进,后退,左转,右转,停止等动作,麦克纳姆由于轮子的特殊,可以向任意角度漂移,前进,后退,左移,右移,左上角移,右上角移,左下角移,右下角移,左转圈,右转圈。所以在控制上,麦克纳姆四轮小车也和一般的四轮小车不同,一般的四轮小车轮子分左右两组,可以使用两路马达控制板如l298N,l293Dmini等,而麦克纳姆小车需要四路马达控制板或者两个两路马达控制板。

L293D控制板网上有两种,一种是四路的,一种是两路的,有些商家把两路的叫mini L293D,四路的L293D,有些商家不区分叫,都叫L293D,由于两者价格差了一倍,所以购买一定要分辨。麦克纳姆四个轮子因为需要分别控制,所以需要四路的。四路的L293D扩展板,和arduino uno是恰好适配的,可以直接插在arduino上面使用,不需要额外接线。

如下:2路MINI l293D扩展板,他只有一个L293d的芯片,所以只能控制两路,不可以买错,这种可以做普通的四轮小车,因为普通的四轮小车同一侧的两个车轮方向与速度是一样的。

4路L293D扩展板,我给他接上了sm端子,防止小车移动时断开,他的下面带引针,可以插在arduino uno上面直接使用,并给arduino供电,我们供电通过这个扩展板给整个系统供电,左边的两根红黑色线是供电线。他的上下四根线接四个马达,一个马达两根线。

五。控制方法,这是每个轮子转动的方向,也是马达的方向,根据可以,可以把代码移植到需要的平台:

六,工控制代码:

// 需要安装的库: AFMotor
#include<AFMotor.h>
//motor1 motor3->左轮
//motor2 motor4->右轮
AF_DCMotor Motor1(1, MOTOR12_1KHZ);
AF_DCMotor Motor2(2, MOTOR12_1KHZ);
AF_DCMotor Motor3(3, MOTOR34_1KHZ);
AF_DCMotor Motor4(4, MOTOR34_1KHZ);

void forward(int speed)
{
  Motor1.setSpeed(speed);
  Motor1.run(FORWARD);
  Motor2.setSpeed(speed);
  Motor2.run(FORWARD);
  Motor3.setSpeed(speed);
  Motor3.run(FORWARD);
  Motor4.setSpeed(speed);
  Motor4.run(FORWARD);
}

void backward(int speed)
{
  Motor1.setSpeed(speed);
  Motor1.run(BACKWARD);
  Motor2.setSpeed(speed);
  Motor2.run(BACKWARD);
  Motor3.setSpeed(speed);
  Motor3.run(BACKWARD);
  Motor4.setSpeed(speed);
  Motor4.run(BACKWARD);
}

void left(int SPEED)
{
  Motor1.setSpeed(SPEED);
  Motor1.run(BACKWARD);
  Motor4.setSpeed(SPEED);
  Motor4.run(BACKWARD);
  Motor2.setSpeed(SPEED);
  Motor2.run(FORWARD);
  Motor3.setSpeed(SPEED);
  Motor3.run(FORWARD);
}

void right(int SPEED)
{
  Motor1.setSpeed(SPEED);
  Motor1.run(FORWARD);
  Motor4.setSpeed(SPEED);
  Motor4.run(FORWARD);
  Motor2.setSpeed(SPEED);
  Motor2.run(BACKWARD);
  Motor3.setSpeed(SPEED);
  Motor3.run(BACKWARD);
}

void stop()
{
  Motor1.setSpeed(0);
  Motor1.run(RELEASE);
  Motor2.setSpeed(0);
  Motor2.run(RELEASE);
  Motor3.setSpeed(0);
  Motor3.run(RELEASE);
  Motor4.setSpeed(0);
  Motor4.run(RELEASE);
}

void turn_right(int SPEED)
{
  Motor1.setSpeed(SPEED);
  Motor1.run(FORWARD);
  Motor3.setSpeed(SPEED);
  Motor3.run(FORWARD);
  Motor2.setSpeed(SPEED);
  Motor2.run(BACKWARD);
  Motor4.setSpeed(SPEED);
  Motor4.run(BACKWARD);
}

void turn_left(int SPEED)
{
  Motor1.setSpeed(SPEED);
  Motor1.run(BACKWARD);
  Motor3.setSpeed(SPEED);
  Motor3.run(BACKWARD);
  Motor2.setSpeed(SPEED);
  Motor2.run(FORWARD);
  Motor4.setSpeed(SPEED);
  Motor4.run(FORWARD);
}

void right_forward(int SPEED)
{
  Motor1.setSpeed(SPEED);
  Motor1.run(FORWARD);
  Motor4.setSpeed(SPEED);
  Motor4.run(FORWARD);
  Motor2.setSpeed(0);
  Motor2.run(RELEASE);
  Motor3.setSpeed(0);
  Motor3.run(RELEASE);
}

void left_backward(int SPEED)
{
  Motor1.setSpeed(SPEED);
  Motor1.run(BACKWARD);
  Motor4.setSpeed(SPEED);
  Motor4.run(BACKWARD);
  Motor2.setSpeed(0);
  Motor2.run(RELEASE);
  Motor3.setSpeed(0);
  Motor3.run(RELEASE);
}

void left_forward(int SPEED)
{
  Motor2.setSpeed(SPEED);
  Motor2.run(FORWARD);
  Motor3.setSpeed(SPEED);
  Motor3.run(FORWARD);
  Motor1.setSpeed(0);
  Motor1.run(RELEASE);
  Motor4.setSpeed(0);
  Motor4.run(RELEASE);
}

void right_backward(int SPEED)
{
  Motor2.setSpeed(SPEED);
  Motor2.run(BACKWARD);
  Motor3.setSpeed(SPEED);
  Motor3.run(BACKWARD);
  Motor1.setSpeed(0);
  Motor1.run(RELEASE);
  Motor4.setSpeed(0);
  Motor4.run(RELEASE);
}

七。演示视频:

arduino uno和L293d有一些坑,

1.供电,需要三到四节18650,统一供电依然会影响arduino uno的稳定性,不知道是电池原因还是板子原因

2为了稳定,依然需要分开供电,取下跳线帽,l293D使用三节18650,arduino使用5V供电,不要超过5V,超过了好像会主动给L293D供电,还是会不稳定。

3.可能使用N20电机会更好一些

视频:

【开源的arduino麦克纳姆小车-哔哩哔哩】 https://b23.tv/BG6PXKw

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值