车轮机器人

在本教程中,我们将学习如何构建一个Arduino Mecanum车轮机器人,能够在任何方向移动。机器人的这种独特的机动性是通过使用特殊类型的轮子实现的,称为Mecanum轮子。

概要

实际上,我设计并3D打印了这些轮子,因为它们买起来有点贵。他们工作得很好,我必须说,驾驶这个机器人平台是如此有趣。我们可以无线控制机器人使用NRF24L01无线电收发模块,或者在我的例子中,我使用我的DIY RC发射机,这是我在我之前的视频之一。

DIY Mecanum车轮机器人无线控制与RC发射机

我也可以通过蓝牙通信使用智能手机来控制。我制作了一个自定义的Android应用程序,我们可以通过该应用程序来控制Mecanum轮子机器人以任何方向移动。此外,在应用程序中使用滑块,我们可以控制运动速度。

DIY Arduino所有方向车辆机器人使用Android App.jpg控制

该机器人平台的大脑是一个Arduino Mega板,单独控制每个轮子。每个轮子都连接在NEMA 17步进电机上,并了解这一事实步进电机可以精确控制,我在应用程序中添加了一个更酷的功能,我们可以通过它来编程机器人自动移动。使用“保存”按钮我们可以保存每个位置或步骤,然后机器人可以自动运行并重复这些步骤。使用相同的按钮,我们可以暂停自动操作以及重置或删除所有步骤,以便我们可以存储新的。

Mecanum轮子机器人3D模型

首先,我使用3D建模软件设计了这个Mecanum车轮机器人。这个机器人的基础平台是一个简单的盒子,我将用8毫米的蜱中密度纤维板制作。

三维模型Mecanum车轮机器人车辆

四个步进电机附着在该平台上,并且麦粉轮附着在电机的轴上。

您可以下载3D打印所需的3D模型和STL文件。

步文件:

STL文件3D打印:

麦考欧轮子如何工作

Mecanum车轮是一个带有辊子的轮子。这些辊子对角地或以45度的角度定位到车轮的旋转轴上。当向后移动时,这使得车轮施加在对角线方向上。

Mecanum轮施加对角线力导致特定的移动

因此,通过在某些图案中旋转车轮,我们利用这些对角线力,因此机器人可以在任何方向上移动。

我们还应该注意到,我们需要两种类型的麦考欧轮,通常被称为左手和右手的麦蕉轮。它们之间的差异是滚筒的方向,并且必须在特定位置安装在机器人中。每个车轮顶辊的旋转轴应指向机器人的中心。

左撇子和右手的麦anum轮子

以下是如何根据轮子旋转方向移动的机器人移动的快速展示。

如果所有四个车轮向前移动,那么机器人的结果将是向前的,反之亦然如果所有车轮向后移动机器人将向后移动。为了向右移动,右轮需要在机器人内部旋转,而左车轮需要在机器人外部旋转。由于对角定位辊引起的产生力将使机器人向右移动。移动到左侧时相同但相反。通过这些轮子,我们还可以通过仅旋转两个轮子来实现对角线方向的运动。

制作麦anum轮子机器人

不过,现在让我向你们展示我是如何建造这个机器人平台的。正如我提到的,为了制作平台的基础,我使用了8毫米tick中密度纤维板。首先,我用台式锯根据3D模型的尺寸切割所有的零件。

切割机器人平台的中密度纤维板

接下来,使用3mm钻头和25mm Forstner钻头,我在侧面面板上打开了连接步进电机的开口。一旦我把零件准备好,我就继续组装它们。我用了木胶和一些螺丝把它们固定住。这里最重要的事情是要有精确的发动机开口,以便所有的车轮在以后都能与表面接触。

组装基座平台

当然,你也可以用3D打印这个基础平台,而不是用MDF制作它,所以我将在网站文章中包含它的3D文件。最后,我喷涂了基础和它的覆盖白色。

绘制机器人基础平台

接下来是Mecanum车轮。就像我之前说的,这些轮子可能买起来有点贵,所以我决定设计和3D打印我自己的轮子。车轮由两部分组成,外侧和内侧用一些M4螺栓和螺母固定在一起。他们有10辊每个,和一个轴耦合器专门设计适合NEMA 17步进电机。

Mecanum滚轮3D模型 - 探索视图

我3D打印Mecanum车轮使用我的Creality CR-10 3D打印机的所有部件。3D打印的Mecanum车轮

这是A.链接到此3D打印机如果您想检查出来。

3D印刷的Mecanum轮子零件

所以,一旦我准备好了3D印刷部件,我就会继续制作滚筒的轴。为此目的,我使用了3毫米蜱钢丝。轴的长度需要大约40mm,因此使用旋转工具,我将电线切割成该长度。

用3mm tich钢丝制成羊膜轮滚轮的轴

我开始使用四个M4螺栓和螺母来通过固定双面和轴联接器来组装Mecanum轮。螺栓的长度需要为45mm。

拆卸3D打印Mecanum车轮

为了安装辊子,首先需要稍微将轴稍微插入位于内侧圆周的孔中。

安装Mecanum轮子滚筒

然后我们可以插入一个小型M3垫圈,插入滚轮并将轴一直推入轮子的外侧的槽中。我使用了一个垫圈,因为我没有足够的空间,在另一边插入第二个垫圈。

安装滚筒

我对所有10个滚轮重复了这个过程。组装这些轮子其实很简单也很有趣。这里重要的是滚轮必须能够自由移动。

3D用10个滚筒打印的mecanum轮子

最后,我用几滴AC胶在每个内孔,以确保轴不会松动。

使用AC胶水固定滚筒轴

所以一旦车轮准备就绪,我们就可以随身组装整个机器人。首先,我们需要将步进电机连接到基础平台。将它们固定到位,我使用长度为12mm的M3螺栓。

组装Mecanum Wheels机器人

接下来,我们需要把轮子连接到马达的轴上。我做的轴耦合器有一个插槽用于插入M3螺母,通过其中M3螺栓可以通过,所以我们可以把轮子固定到轴上。

3D打印轴对NEMA 17步进电机

接下来,为了确保顶盖的基础上,我附加了螺纹杆的两个角落的基础。我在盖子的相同位置上钻了洞,这样我就能很容易地插入并把盖子固定到底座上。

机器人平台的顶盖

在基座的后侧,我制作了20mm孔,以稍后将电源开关连接,以及用于连接LED的5mm孔。

电路原理图

现在我们可以继续电子产品了。必威lol这是这个项目的完整电路图。

Arduino Mecanum轮子机器人电路图

因此,我们将控制四个NEMA 17步进电机使用四个DRV8825步进驱动器,或者我们也可以使用A4988步进驱动器。为步进器和整个机器人供电,我们将使用12V电源,在我的情况下,我将使用提供12V左右的3S Li-Po电池。为无线电通讯我们正在使用NRF24L01模块,而且为蓝牙通信我们正在使用HC-05蓝牙模块。我还包括一个简单的分压器,将用于监控电池电压和LED连接,以指示电池电压下降到11V以下。

我还包括一个专用的5V电压稳压器,可以提供约3A电流。这是可选的,但我计划在未来的视频中与我的Arduino机器人手臂项目结合起来,为此目的,我需要5V来驱动其伺服电机。

你可以从下面的链接得到这个项目所需的组件:

必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

PCB设计

尽管如此,为了保持电子组件组织并摆脱布线混乱,我设计了一种使用Easy必威loleda免费在线电路设计软件的自定义PCB。这款PCB实际上将充当Arduino Mega Shield,因为我们将能够直接将其连接在Arduino Mega Board之上。我使用顶层和底层来运行连接。对于我未使用的那些Arduno引脚,我包括PIN标头连接,以便我们将来可以为某些东西使用它们。我还包括12V,5V和GND连接引脚,以及用于选择驱动器的踩踏分辨率的引脚。

用于Mecanum车轮机器人的Arduino Mega Shield PCB板

这是一个链接PCB设计的项目文件。因此,一旦完成设计,我就生成了制造PCB所需的格柏文件。

格柏文件:

然后我从JLCPCB订购PCB他们也是这个视频的赞助商。

在这里,我们可以简单地拖放Gerber文件并一旦上传,我们可以在Gerber Viewer中查看我们的PCB。如果一切都正确,那么我们可以继续选择我们想要的PCB的属性。这次我选择了PCB颜色以蓝色,以便与Arduino板颜色匹配。就是这样,现在我们可以以合理的价格简单地订购我们的PCB。请注意,如果它是jlcpcb的第一个订单,您只需2美元即可获得10台PCB即可。

从JCLPCB订购PCB

几天后,PCB已经到了。PCB的质量很大,一切都与设计完全相同。

Mecanum车轮机器人Arduino Mega Shield -自定义设计PCB从JLCPCB

组装PCB

好的,现在我们可以继续前进并组装PCB。我首先开始焊接较小的部件,电阻器和电容器。然后我将焊接和焊接的阳销标头插入到PCB中,该PCB将用于将其连接到Arduino板。

焊接针头向PCB

接下来,我将所有女性销标头放置在适当位置并焊接它们。至于步进电机连接和引脚,用于选择我使用的踩踏分辨率的踩踏分辨率。这样,我们可以直接将电机连接到PCB并使用跳线来选择踩踏分辨率。然后我焊接接线盒,修剪器和电压调节器。

组装PCB

就这样,PCB已经准备好了,我们可以继续插入驱动器并将电机连接到它。首先,我放置了用于选择步进分辨率的跳线。我通过连接驱动的MS3引脚到5V来选择16步分辨率。

将DRV8825步进驱动器插入PCB Sheild

然后在它们之上,我将DRV8825驱动程序放置,以及连接NRF24L01模块和HC-05蓝牙模块。现在我们可以简单地将PCB安装到Arduno板上。

将PCB屏蔽连接到Arduino Mega Board

接下来,我将电池连接到适当的接线盒并将其放入基础平台。

Li-Po电池为Arduino Mecanum车轮机器人项目供电

这里我将电源开关插入到位并将其连接到另一个接线盒。在电源开关上方,我还插入了电池指示灯LED。

电池电压指示LED

现在留下了什么是将电机连接到PCB。我们应该注意到,在连接对面的电机时,我们应该连接它们的连接器也相反。在编程机器人时稍后需要这一点,因此,例如,前向命令将在相同方向上移动两个电机,尽管它们实际上是翻转,但是一个可以顺时针呈现,另一个逆时针旋转。

将步进电机连接到PCB屏蔽

最后,我可以简单地插入顶部的盖子,所以我们通过这个Mecanum Wheels机器人项目完成。

将顶盖连接到机器人基础平台

Mecanum车轮机器人Arduino代码

这个视频的留下是什么,看看Arduino代码。实际上,有两个单独的Arduino代码。这一个用于使用NRF24L01模块控制机器人,而其他用于使用智能手机控制机器人。

使用NRF24L01模块控制机器人的Arduino代码:

/ * === arduino mecanum轮子robot ===与dejan的nrf24l01用nrf24l01的无线电控制www.howtomechatronbet188官方网站ics.com图书馆:rf24,https://github.com/tmrh20/rf24/ Accelstepper由Mike McCauley:http:// www.airspayce.com / mikem / arduino / accelstepper / index.html * / #include  #include  #include  #include  rf24收音机(48,49);// nrf24l01(ce,csn)const字节地址[6] =“00001”;unsigned long lastreceivetime = 0;unsigned long currentime = 0;//定义步进电机和引脚将使用Accelstepper RefrackWheel(1,42,43);//(类型:驱动程序,步骤,dir) -  Stepper1 Accelstepper LeftfrontWheel(1,40,41);//步进per2 Accelstepper LightBackWheel(1,44,45);//步道3 Accelstepper RightFrontWheel(1,46,47);//步骤per4 int wheelspeed = 1500;//此结构的最大大小为32字节 -  NRF24L01缓冲区限制结构DATA_PACKAGE {BYTE J1POTX; byte j1PotY; byte j1Button; byte j2PotX; byte j2PotY; byte j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver Serial.begin(115200); } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Set speed - left potentiometer wheelSpeed = map(data.pot1, 0, 255, 100, 3000); if (data.j1PotX > 150) { moveSidewaysLeft(); } else if (data.j1PotX < 100) { moveSidewaysRight(); } else if (data.j1PotY > 160) { moveForward(); } else if (data.j1PotY < 100) { moveBackward(); } else if (data.j2PotX < 100 & data.j2PotY > 160) { moveRightForward(); } else if (data.j2PotX > 160 & data.j2PotY > 160) { moveLeftForward(); } else if (data.j2PotX < 100 & data.j2PotY < 100) { moveRightBackward(); } else if (data.j2PotX > 160 & data.j2PotY < 100) { moveLeftBackward(); } else if (data.j2PotX < 100) { rotateRight(); } else if (data.j2PotX > 150) { rotateLeft(); } else { stopMoving(); } // Execute the steps LeftFrontWheel.runSpeed(); LeftBackWheel.runSpeed(); RightFrontWheel.runSpeed(); RightBackWheel.runSpeed(); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveSidewaysRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveSidewaysLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void rotateLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void rotateRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveRightForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(wheelSpeed); } void moveRightBackward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftForward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(-wheelSpeed); } void stopMoving() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(0); } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; }

描述:因此,在这里,我们正在使用RF24库进行无线电通信和用于控制步进电机的AccelStepper库。首先,我们需要定义所有它们所连接的引脚,定义下面的程序所需的一些变量,并且在设置部分中设置了脚步的最大速度并开始无线电通信。

在回路部分,我们开始读取数据从RC发射机。的RC发射器代码关于这种交流方式的更多细节可以在我的教程中找到。

所以根据接收到的数据,例如,如果左操纵杆向前移动,它的值将大于160,在这种情况下将调用moveForward()自定义函数。如果我们看一下这个函数,我们可以看到它所做的就是将马达的速度设置为正。向后移动时,速度设置为负。所以为了向其他方向移动,我们只需要设置轮子的旋转,就像一开始解释的那样。

为了执行这些命令,在循环部分,我们需要为所有步进器调用runSpeed()函数。在回路部分,我们也读取来自电池的分压器的模拟输入,根据这个值,我们可以知道电池电压什么时候会下降到11V以下,所以我们可以打开指示LED。

使用智能手机控制机器人的Arduino代码:

/ * === arduino mecanum轮子robot ===智能手机通过蓝牙通过dejan,www.www.mfxpo.com图书馆:rf24,httbet188官方网站ps://github.com/tmrh20/rf24/ Accelstepper由Mike McCauley:http:// www.airspayce.com / mikem / arduino / accelstepper / index.html * / #include  #include 软件级别蓝牙(A8,38);// Arduino(RX,TX) -  HC-05蓝牙(TX,RX)//定义步进电机和PIN将使用Accelstepper RefrackWheel(1,42,43);//(类型:驱动程序,步骤,dir) -  Stepper1 Accelstepper LeftfrontWheel(1,40,41);//步进per2 Accelstepper LightBackWheel(1,44,45);//步道3 Accelstepper RightFrontWheel(1,46,47);//步道4 #define LED 14 int wheelspeed = 1500;int日期,m;INT LBW [50],LFW [50],RBW [50],RFW [50];//用于存储位置/步骤INT index = 0;void setup(){//设置初始种子值为streffrontwheel.setmaxspeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); Serial.begin(38400); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(1); delay(20); pinMode(led, OUTPUT); } void loop() { // Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); // Read the data if (dataIn == 0) { m = 0; } if (dataIn == 1) { m = 1; } if (dataIn == 2) { m = 2; } if (dataIn == 3) { m = 3; } if (dataIn == 4) { m = 4; } if (dataIn == 5) { m = 5; } if (dataIn == 6) { m = 6; } if (dataIn == 7) { m = 7; } if (dataIn == 8) { m = 8; } if (dataIn == 9) { m = 9; } if (dataIn == 10) { m = 10; } if (dataIn == 11) { m = 11; } if (dataIn == 12) { m = 12; } if (dataIn == 14) { m = 14; } // Set speed if (dataIn >= 16) { wheelSpeed = dataIn * 10; Serial.println(wheelSpeed); } } if (m == 4) { moveSidewaysLeft(); } if (m == 5) { moveSidewaysRight(); } if (m == 2) { moveForward(); } if (m == 7) { moveBackward(); } if (m == 3) { moveRightForward(); } if (m == 1) { moveLeftForward(); } if (m == 8) { moveRightBackward(); } if (m == 6) { moveLeftBackward(); } if (m == 9) { rotateLeft(); } if (m == 10) { rotateRight(); } if (m == 0) { stopMoving(); } //Serial.println(dataIn); // If button "SAVE" is pressed if (m == 12) { if (index == 0) { LeftBackWheel.setCurrentPosition(0); LeftFrontWheel.setCurrentPosition(0); RightBackWheel.setCurrentPosition(0); RightFrontWheel.setCurrentPosition(0); } lbw[index] = LeftBackWheel.currentPosition(); // save position into the array lfw[index] = LeftFrontWheel.currentPosition(); rbw[index] = RightBackWheel.currentPosition(); rfw[index] = RightFrontWheel.currentPosition(); index++; // Increase the array index m = 0; } if (m == 14) { runSteps(); if (dataIn != 14) { stopMoving(); memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0 memset(lfw, 0, sizeof(lfw)); memset(rbw, 0, sizeof(rbw)); memset(rfw, 0, sizeof(rfw)); index = 0; // Index to 0 } } LeftFrontWheel.runSpeed(); LeftBackWheel.runSpeed(); RightFrontWheel.runSpeed(); RightBackWheel.runSpeed(); // Monitor the battery voltage int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i //Serial.println(voltage); // If voltage is below 11V turn on the LED if (voltage < 11) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } void runSteps() { for (int i = index - 1; i >= 0; i--) { // Run through all steps(index) LeftFrontWheel.moveTo(lfw[i]); LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.moveTo(lbw[i]); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.moveTo(rfw[i]); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.moveTo(rbw[i]); RightBackWheel.setSpeed(wheelSpeed); while (LeftBackWheel.currentPosition() != lbw[i] & LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) { LeftFrontWheel.runSpeedToPosition(); LeftBackWheel.runSpeedToPosition(); RightFrontWheel.runSpeedToPosition(); RightBackWheel.runSpeedToPosition(); if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.read(); if ( dataIn == 15) { // If button "PAUSE" is pressed while (dataIn != 14) { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); if ( dataIn == 13) { stopMoving(); break; } } } } if (dataIn >= 16) { wheelSpeed = dataIn * 10; dataIn = 14; } if ( dataIn == 13) { break; } } } } // Go back through steps for (int i = 1; i <= index - 1; i++) { // Run through all steps(index) LeftFrontWheel.moveTo(lfw[i]); LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.moveTo(lbw[i]); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.moveTo(rfw[i]); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.moveTo(rbw[i]); RightBackWheel.setSpeed(wheelSpeed); while (LeftBackWheel.currentPosition() != lbw[i]& LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) { LeftFrontWheel.runSpeedToPosition(); LeftBackWheel.runSpeedToPosition(); RightFrontWheel.runSpeedToPosition(); RightBackWheel.runSpeedToPosition(); //Serial.print(" current: "); //Serial.println(LeftBackWheel.currentPosition()); if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.read(); if ( dataIn == 15) { // If button "PAUSE" is pressed while (dataIn != 14) { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.read(); if ( dataIn == 13) { stopMoving(); break; } } } } if (dataIn >= 16) { wheelSpeed = dataIn * 10; dataIn = 14; } if ( dataIn == 13) { //Serial.println("DEKI"); break; } } } } } void moveForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveSidewaysRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void moveSidewaysLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void rotateLeft() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(wheelSpeed); } void rotateRight() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(-wheelSpeed); } void moveRightForward() { LeftFrontWheel.setSpeed(wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(wheelSpeed); } void moveRightBackward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(-wheelSpeed); RightFrontWheel.setSpeed(-wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftForward() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(wheelSpeed); RightFrontWheel.setSpeed(wheelSpeed); RightBackWheel.setSpeed(0); } void moveLeftBackward() { LeftFrontWheel.setSpeed(-wheelSpeed); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(-wheelSpeed); } void stopMoving() { LeftFrontWheel.setSpeed(0); LeftBackWheel.setSpeed(0); RightFrontWheel.setSpeed(0); RightBackWheel.setSpeed(0); }

描述:使用Android应用程序来控制机器人的其他代码非常相似,同样有效。这里而不是我们需要定义蓝牙模块并在设置部分中初始化其通信的无线电模块。所以,首先,我们从智能手机或Android应用程序中读取了传入的数据,并根据它告诉机器人在哪个移动方向。

如果我们看看Android应用程序,我们可以看到它只需按下按钮即可通过蓝牙发送0到15的数字。

Mecanum Wheels机器人Android应用程序块

该应用程序是使用的麻省理工学院应用程序发明家在线申请,您可以在我的中找到更多关于它的详细信息特定的教程

Arduino Mecanum Wheels机器人控制的Android应用程序

在这里你可以下载这个应用程序以及可编辑的项目文件:

用这个app编程机器人的自动运动,当我们按下“保存”按钮时,我们只是将步进电机的当前位置存储成数组。然后,当我们按下“RUN”按钮时,调用runSteps()自定义函数,它使用for和while循环执行或运行所有存储的步骤。

我希望你喜欢这个教程并学会了新的东西。随意询问以下意见部分中的任何问题,并检查我的Arduino项bet188me目集合

74年响应

  1. 内脑

    卓越的优秀工作!!!!!!,
    我需要更多这样的项目。bet188me它非常乐于助人
    与上一个项目相比,你的Mega盾牌是一种新方法,我真bet188me的很喜欢它。您可以为设计PCB和导出到Gerber文件进行任何视频教程吗?我使用相同的概念进行了一个项目,即保存说明。但我使用的是Repeitouch Pro应用程序来录制按钮触摸。
    步骤录制可以使用MIT应用程序IntvEntor构建。我的意思是在一个Android应用中来控制电机并记录电机打开/关闭时间。

    回复
    • 德国

      谢谢你!是的,我可能应该做一个视频教程,教我如何为我的项目设计pcb。bet188me

      回复
  2. Sławirsuchoń

    嘿,伟大的项目!你能解释为什么你联系的NEMA 17额定值2.8V和原理图,有12V连接到电机驱动器作为电机电源?

    回复
  3. 迈克尔

    您好,它也可以使用Ardunio Uno Board,而不是Ardunio Mega Board?

    回复
    • 德国

      嘿,是的,你可以使用一个Arduno Uno板为这个项目,你只需要连接和定义代码中的步进驱动器的步骤和DIR引脚,这是所有的。

      回复
  4. 弗兰克Helliger

    你好,
    如何关闭步进电机以节省电力。
    由于连续电流,DVR 8824将非常热。
    我有一个对它建立的fotoapperat,现在可以制作很棒的视频。
    看这里 …https://www.youtube.com/watch?v=ta1qR2rsq6A
    谢谢你的伟大项目。LG弗兰克

    文本谷歌转换器

    回复
    • 德国

      嘿,看到有人设法重新创建我所做的项目时,它总是很好。bet188me
      首先,如果驱动程序得到太,你可以使用它的电位器来降低当前的绘图。然而,在不使用的时候,它仍然会产生电流,因为电机保持步进,实际上在这段时间内,电机产生的电流最大。
      为了在不使用时禁用电机,您可以使用驱动程序的启用或睡眠引脚。如果启用引脚很高,它将禁用所有输出,或者如果睡眠引脚较低,则驱动器将进入睡眠模式,因此再次将关闭输出。

      回复
  5. l

    你好,
    不错的工作 !
    我很想自己做,但我想我漏掉了一些东西。
    在哪里可以在哪里找到焊接在PCB中的组件列表?

    谢谢。

    回复
  6. NicolòPovan.

    嗨!快速问题:您用什么材料来打印3D零件?ABS?PLA?
    伟大的工作,我正试图重新创造它。

    orher问题:您是如何连接无线电和蓝牙模块的?他们都需要CE和SCK引脚,不是吗?

    回复
  7. 杰森

    真棒!!!非常感谢!
    我试图编译你的程序,但有一些错误:'a8'在这个范围内没有宣布
    蓝牙(A8,38),是什么意思?

    回复
    • 德国

      蓝牙模块TX引脚连接到Arduino板的A8模拟引脚,RX引脚到Arduino数字引脚38.您应该根据连接设置此引脚。

      回复
  8. Aaron Nance.

    首先,谢谢你对你令人敬畏的工作和分享这一点。

    我刚刚为自己建造了其中一个。当我打开电源时,所有的脚步者都会​​接合,我可以使用应用程序连接到HC05,但没有一个按钮正在运行。

    我把董事会连接到我的计算机和un注释的println,所以我可以看到什么是串行监视器。我得到的值是1200,1280,2480,但不是0-14,当我按下应用程序的控制按钮。

    知道我哪里做错了吗?这是我第一次制作可以通过蓝牙控制的东西,所以我有点困惑。

    谢谢!

    回复
    • 德国

      嘿,谢谢!嗯,我想这是与蓝牙通信相关的东西。您可以尝试更改蓝牙模块的波特率,它可能具有比Arduino代码中定义的38400不同的速率。还尝试一些我的其他教程,在那里我使用蓝牙模块检查连接是否正常工作。

      回复
      • Muzaffar Abdul.

        您好,我已经获得了与上面的人相同的问题。在按下智能手机上的按钮时,我正在获得1200,1280,2480的值。

        当我将波特率更改为9600时,在智能手机上的任何按钮时,串行监视器上的任何内容都没有。

        另外,我在您的教程中查询了蓝牙模块的波特率,值是9600。我已经尝试了led教程,它工作良好的9600波特率,但对mecanum车轮机器人它不工作。

        你可以帮助plz,因为它是一个scholl项目。谢谢。

    • angelo

      大家好,我也有同样的问题。我通过在Arduino代码中将波特从38400到9600更改波特来解决这个问题。更准确地说,我改变了代码的这一部分:

      Serial.Begin(38400);
      bluetooth.begin(38400);//蓝牙模块的默认波特率
      蓝牙。setTimeout (1);

      通过这种方式:
      Serial.Begin(38400);
      bluetooth.begin(9600);//蓝牙模块的默认波特率
      蓝牙。setTimeout (1);

      现在工作的完美!

      感谢Dejan为这个精彩的项目,并与我们所有人分享!我很佩服你的技能!他们令人难以置信!

      回复
  9. Guerrino

    伟大的项目。对其实现的一些观察:驱动器下的100微法拉电解电容很小,我不得不订购至少50个,所以我们改善了经济,但我们制造了投机泡沫。它可能插入暂停在可变时间在一个移动和另一个之间的意愿和保存他们?辊轮更好地打印他们在软材料,否则他们不坚持。我试着在滚轮的中心做一个O形圈的座位。优秀的PCB服务,从中国到意大利的四天时间,完美的PCB。谢谢你发表你的项目,我也会尝试你的其他项目。bet188meGuerrino

    回复
    • 德国

      嘿,谢谢你的输入!用柔软的材料印刷滚轮,听起来像一个非常好的主意。至于在步骤之间插入暂停,我猜这是可能的,通过编程,一切都是可能的。

      回复
  10. 瑞秋

    嘿,我对这个超级新,我不觉得超级有信心做我自己的pcb,我想知道是否有一个推荐的屏蔽,我可以用在这个项目?

    回复
    • 德国

      嘿,你可以从jlcpcb订购相同的pcb,你可以找到它的链接。这是一种自定义PCB,因此您无法找到100%与此项目匹配的商业屏蔽。

      回复
  11. Rohith.

    嗨非常感谢你,我几乎已经完成了这个项目,除了我下载并打开应用程序时,它会说错误无法写入损坏的管道桩,也不会在串行窗口中给出任何输入。如何解决此问题

    回复
    • 德国

      嘿,这个错误表明你的蓝牙通讯有问题。请确保您的手机能正确连接HC-05蓝牙模块。您可以尝试我的Arduino蓝牙教程中一个更简单的代码,看看是否能让它工作。确保你有正确定义的引脚,在草图中定义的波特率也应该与你的HC-05波特率马赫,它可能是不同的。

      回复
      • Rohith.

        我们在板子的连接连续性中遇到了一定的干扰,我们可以手动短5v吗?

      • Rohith.

        我们还可以使用直流电机而不是步进电机吗?

  12. 马塞洛

    谢谢你制作这个项目。这很棒!我受到启发,以制作我自己的一个。我收到了PCB盾牌并兴奋到焊接。但我似乎可以找到组装它所需的电阻器和电容器的列表。

    回复
  13. 嘿,首先我要感谢你提供的这个教程和你在这里免费提供的那种学习材料,你提供的绝对是惊人的,所以再次感谢你,为此。
    我已经使用几乎相同的设备重建了项目,遥控器和汽车(都使用NRF),但有一个小的修改,其中我使用两个操纵杆模块。
    我面临着一个奇怪的问题,我的脚步者电路都是好的原因,我已经测试过他们和它的所有工作。
    但是,在尝试控制器时,我从发射机接收数据,我可以从接收器读取数据,但步进器根本不动。
    我无法检测到问题的源头,在哪里进一步挖出错误,如果您通过故障排除问题,请通过我面临的问题来引导我会很棒。
    谢谢。

    回复
    • 德国

      嘿,我很高兴听到你发现我的项目有用。bet188me
      当你试图移动它们时,步进器会改变声音吗?检查是否在按命令输入正确的自定义功能时,通过在该自定义功能中打印串行监视器上的某些内容。
      也试着删除(注释)所有Serial.print(),因为它们是非常慢的函数,可能会阻碍电机的运动(我个人经历过这个问题)。同时尝试改变步进器的最大速度和当前速度。

      回复
      • 德扬先生,你说的真的起作用了,我删除了所有的评论,它就起作用了。
        这在提交中显示了一些真正的深度和经验。
        非常感谢。
        我想在不同的事情上接受你的建议,这是伺服,你会推荐什么样的伺服(品牌)在那里提供非常稳定,精确和高效的伺服伺服?
        再次感谢你。

  14. 巴菲

    嗨,我坐这个项目,但是当我唯一的时候,我得到的是尖叫声和加热电机驱动程序
    我在面包板上安装了同样的结果,得到了同样的结果我做错了什么我在所有这些时间内都有新的
    谢谢

    回复
    • 德国

      嘿,听起来你没有正确连接电机和驱动程序,或者您尚未正确地在代码中定义它们。尝试使用简单的步进电机程序,以确保它们正常工作。

      回复
  15. 克里斯

    很棒的教程。我指导一个9岁的团队在Arduino上这是我们的第一个机器人项目。我对电子学也不熟悉——我必威lol在学习和教学。

    我们正在一步一步地完成这个项目——打印轮子并组装它们。能否提供一份电阻电容等元器件的清单?我还不知道如何读取PCB。

    回复
    • 德国

      嘿,谢谢,我很高兴听到这个消息!
      嗯,组件值已经在电路图中说明。LED的电阻可以是220或330欧姆。驱动器上的电容器应大约为100uf,36V或更高。另外两个电容器应为16V或更高。我希望这有助于一点点。

      回复
      • 克里斯

        谢谢Dejan。这有助于。一些后续问题:

        a)我可以使用LM317电压调节器而不是LM350吗?
        b)我找不到亚马逊或Bangwood上的修剪器。对我可以买到它们的任何建议吗?

  16. 可以Aksaya

    嗨,
    首先感谢您的项目和提供给我们的信息,就像培训师一样:o)bet188me
    我和我的儿子也想制作这样的项目。但我们有一个Arduino CNC盾牌,如果有可能我们想为这个项目使用它。我们可以找到X,Y和Z电机驱动器的步骤驱动器通信引脚(步骤和DIR)。但是,我们找不到一步司机的步骤和Dir引脚。你有关于这个的信息吗?或者我们必须与您使用相同的专用董事会吗?
    感谢您现在的支持。

    回复
    • 德国

      嘿,我很高兴你发现这个项目有趣。
      是的,您可能会使用Arduino CNC Shield来重新创建此项目,您只需正确连接并定义所有引脚。你是什​​么意思,你找不到阶梯驱动程序的步骤和Dir引脚?盾牌完全有一个驾驶员吗?

      回复
      • 可以Aksaya

        你好,我们又见面了,
        数控屏蔽有X、Y、Z和驱动电路。如果我可以使用Arduino Mega这个屏蔽,我可以找到X, Y, Z驱动的Step和DIR引脚,但我不能找到一个驱动的Step和DIR引脚。
        例如;
        使用这款CNC屏蔽用于左前电机,我将使用CNC Shiled的Z驱动器和Arduino引脚4(步骤40)和引脚7(用于DIR)(您的销41)

        对于右前电机,我将使用CNC Shiled的X驱动器和Arduino引脚2(步骤46)和引脚5(用于谜语)(您的销47)

        对于左后电机,我将使用数控shiled 's驱动器和Arduino销?(STEP)(你的别针42)和别针?(for DIR)(Your 's pin 43)

        对于右背部电机,我将使用CNC shiled的Y驱动器和Arduino引脚3(步骤)(您的引脚44)和引脚6 (DIR)(您的引脚45)

        从您的Arduinomega代码中,我用PIN号更改了PIN号码。但它不起作用。你有什么想法Tosolve我的问题吗?
        感谢您的支持。

      • 德国

        嘿,我明白了。您应该尝试使用更简单的代码,驾驶仅是一个步进,以弄清楚它是如何工作的。betway至于查找步骤和DIR引脚,您可以尝试使用万用表的连续性功能,将一个探头放入驱动器DIR引脚,然后通过进入Arduino的引脚进行搜索。所以当你能听到哔哔声时,你有PIN号码。我猜这个理论应该有效,虽然我没有尝试过。

  17. 贾斯汀何塞

    您好,当您开始将电阻器和电容器抵挡到PCB时,您已经附加到PCB的红色?你能告诉我那是什么

    回复
  18. 克里斯

    你好德州,

    快速问题 - 具有50V电容器的100UF的尺寸大于围绕它的驱动器导线,因此电机驱动器无法正确拟合。

    任何建议都会真的很有帮助。

    回复
  19. 克里斯

    我终于设法克服了所有的技术问题,并获得了机器人连接和运行 - 电子部件 - 不是Chasis。必威lol

    我所拥有的一个问题是,经过大约30秒的跑步后,司机运行很热,电机似乎跳过革命......

    对此有什么想法或想法吗?

    回复
    • SzabolicsTamás.

      我刚完成我的,我有类似的问题,只有一个马达。看来应该是司机和一定是一些过热的问题,因为我设置了一个通风器来冷却司机这个问题似乎解决了。

      回复
  20. TamásSzabolics.

    亲爱的呵呵,

    我试图将项目与您(我没有电压复合器和无线电模块)构建近似相同。电路板建于,arduino代码上传,电机连接。我可以使用您发布的应用程序使用我的手机连接到蓝牙调制,但不幸的是电机不会移动。我检查了电压,它们应该在电机上和蓝牙调制上。你有什么想法是什么?也许波特率错了?提前谢谢了!

    回复
    • 德国

      嘿,您应该使用串行监视器启动故障排除。首先,检查您从手机中获取的数据是什么样的数据,只需在串行监视器上打印变量的数据,并查看这是正确的。此外,您也可以尝试将自定义变量或值添加到电机,以使它们移动,或检查它们是否有效。您还可以使用更简单的代码并单独检查每个电机,或者模块是否正常工作,即使在相同的设置和板上也是如此。
      我的意思是,要诚实,它总是复杂,事情第一次不起作用。在尝试制作工作时,我也会遇到很多错误。给您和特定的答案真的很难解决问题的问题,但我认为最合适的方法是通过简单的代码检查每个组件,您可以在我的其他详细教程中找到针对特定组件的其他教程的代码。

      回复
      • TamásSzabolics.

        感谢您的回复。我设法调试蓝牙连接,问题是波特率,我将它更改为9600,它立即运行。我已经在一起建造了零件,所以我的机器人也有效。我打算用前面的超声波传感器扩展它,我也想制作机器人臂扩展,所以我想问一下你在PCB上用过什么类型的修剪器?非常感谢

  21. 穆罕默德

    你好
    我想感谢你为这个项目所做的努力。
    我买了所有的碎片,并打印了PCB板
    但我无法确定电容器的电压。
    我即将把我的项目移交给大学。
    请尽可能尽快回复
    并谢谢。

    回复
    • 德国

      嘿,对于电机驱动器的电容器,您可以使用35V至63V的电压,以及您可以使用大约16V大约16V的电压的电压。

      回复
  22. 吉米

    你好德州,

    我非常感谢你对这个项目的努力工作。我做了你让我做的一切,但当我打开串口,按下应用程序上的按钮,所有它说的是反问号。你能告诉我有什么问题吗?我需要赶快给我的老师。
    提前致谢

    回复
    • 德国

      问题可能是蓝牙的波特率。尝试更改代码中的蓝牙波特率以与蓝牙模块波特率匹配,请尝试9600而不是38400。

      回复
  23. 哈扎·汗

    嗨,老兄
    我正在建造这个项目。它几乎完整地根据您的指示,但电机似乎没有显示出任何运动[测试单独电动机正常工作],当电机单独测试时,DRV8825的故障引脚没有任何电压。在您的项目中,所有故障引脚都是从Arduino获得5V的。你能介绍这样做的原因,以及对我的项目没有工作的原因。我应该如何解决我的项目排除问题

    回复
    • 德国

      嘿,即使在Arduino给出5V时,故障引脚也很好。它的原因是这样的,因为该地方的A4988驱动器具有VCC引脚,因此您可以使用A4988或DRV8825驱动程序。尝试使用更简单的示例/代码来移动电机。您可能已连接错误或在程序中定义脚步和其引脚可能是错误的。

      回复
  24. Malluri Siva Balachandar.

    我确切地完成了这个项目,但我使用了CNC盾牌而不是定制板来推动驱动器。此外,我还增加了超声波声学传感器和磁仪,用于避免避免和运动程度。我正在使用这个项目进行学位最终的主要项目。对于面向申请的,我正在使用传感器集线器(在停车场中检查免费插槽),在Arduino&Bluetooth在停车场的帮助下,向机器人提供指示挑选汽车。
    非常感谢你做这个项目。我很喜欢。
    现在我喜欢制作一些模式(如圆圈,形状或与蜡笔的简单图纸)。是否有可能这样做,至少圈子(如Dji Robomaster S1机器人呢)?是否有任何软件可以向机器人提供指示进行模式或图纸?
    你能帮我做我喜欢做的事情吗?
    再次感谢您的精彩指示,可以让此机器人成为可能。

    回复
    • 德国

      嘿,很高兴听到这个消息!好吧,我想你应该制作制作这种模式的程序。先试着画一些简单的形状,比如画一个矩形,然后画一个六边形,然后画圆:)。

      回复
  25. Muzaffar Abdul.

    你好...我现在正在建立这个项目..我知道修剪器在电路中的重要性吗?谢谢

    回复
    • 德国

      修剪器用于将12V从电池中获取到5V输出,以防需要驱动需要5V的东西。在这种情况下,对于麦肯欧轮毂机器人,我们真的不需要它,所以你可以忽略它。我在PCB中添加了该项目的特征,用于此项目的更新版本,其中我从我以前的Projets附加了机器人臂,它使用5V伺服电机。bet188me

      回复
  26. Serdardönmez.

    你好。
    我一直在学习你的项目,我迫不及待地想这样做。
    我读了所有的评论,并决定做它与cnc盾牌在我的手。
    我有一个问题,如果我使用A4988而不是drv8825,代码是否合适?谢谢。

    回复
  27. 奥达

    您好,我爱你的项目真的很棒,信息丰富!bet188me从各方面看到电子产品真的很棒,如何成为一个伟大的项必威lol目。
    我是一个电子爱必威lol好者(乞丐),有一个小问题试图建立这个项目为自己。所以我使用drv8825,一切工作正常,除了当步进器得到停止信号(m=0),它在全速移动,而不是不移动。我检查了蓝牙,它工作得很好(收到所有正确的信号),我可以看到它工作,因为一切都很好。步进器在必要时以给定的速度朝给定的方向移动,但当它们不需要移动时,它们以全速旋转。也许你知道这是怎么回事?(我使用教程中的所有东西,除了我没有连接RF模块,因为我丢失了:D)。

    回复
    • 德国

      嘿,谢谢!那有点奇怪。如果“m = 0”我们调用STOPMOVING()定制功能,请将电机速度设置为0并停止电机移动。我可以认为这个问题可能是你没有收到从控制应用程序停止的正确数据。确保从“Datain”变量接收“0”,“M”变量获取值0。

      回复
  28. Salman Ali.

    嘿,我想第一次感谢您的教程和您在这里提供的学习资料,以便“免费”。我需要下载mecanum轮子机器人3d模型步骤文件,但下载限制超出!

    回复
      • Pawel.

        嗨,我有相同的问题,我尝试在手机上,在difffrent浏览器,仍然不能下载。

      • 德国

        嘿,我现在修好了。这真的是一个下载限制的问题,这个文件被下载了5000次,这是文件的默认下载限制。我增加了它,这样你就可以下载了。我很抱歉。

      • Salman Ali.

        嘿,我需要Mecanum轮子机器人3D模型- SOLIDWORKS文件包含Mecanum轮子机器人的所有零件和装配。我试图下载Mecanum车轮机器人3D模型步骤文件,但这是无效的,也没有压缩文件。

留下一个回复

您的电子邮件地址将不会被公布。

推荐的

2019年初学者的8个最佳Arduino Starter Kits

8个最佳ARDUINO初学者工具包

推荐的

用于初学者和爱好者的最佳3D打印机 -  3D打印

初学者和爱好者的最佳3D打印机