Arduino机器人手臂和Mecanum车轮平台自动操作

在本教程中,我将向您展示我以前的视频中的Mecanum Wheels机器人平台,一起使用我的3D印刷机器人手臂自动运行,也是我之前的一个视频的Arduino项目。

概述

因此,我们可以使用自定义构建Android应用程序来控制Mecanum Wheels机器人,同样如上所述的视频中解释。除此之外,现在该应用程序还有用于控制机器人臂的按钮。

Arduino Mecanum轮子机器人和机器人手臂自动操作

原本的机器人手臂控制应用程序实际上具有用于控制机器人关节的滑块,但这导致了手臂稳定性的一些问题。通过这种方式,ARM工作更好,因此我也将提供这个更新版本的机器人ARM控制应用程序和Arduino代码到原始机器人ARM项目。

尽管如此,该机器人的最酷功能是存储运动的能力,然后自动重复它们。

Arduino机器人自动操作

使用Save按钮,我们可以简单地为每一步存储电机的位置。然后我们只需要点击Run按钮,机器人就会自动一次又一次地重复存储的动作。

建造Arduino机器人

好的,所以在这里我有Mecanum Wheels平台已经组装好了,你们可以在我之前的视频中找到所有的细节。

机器人臂3D印刷零件

此外,这里我有机器人手臂的3D印刷部分和伺服电机,现在我会向您展示如何装配它们。这是这个项目的3D模型。

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

步骤文件:

3D打印STL文件:

机器人臂的第一伺服将直接安装在Mecanum轮子平台的顶盖上。

我标记了位置,并使用一个10mm钻我做了几个洞。

在顶盖上开孔

然后使用锉刀,我切开孔,然后微调伺服的开口。我使用四个M3螺栓和螺母将伺服固定到顶板上。

将伺服固定到顶板上

然后在此伺服的该输出轴上,使用与伺服一起配件的圆角,我们需要连接机器人臂的下一个部分或腰部。但是,我们可以注意到,以这种方式,部分在板上左右8毫米。因此,我附上了两块8mm MDF板,所以腰部可以滑动它们,因此接头将更稳定。

将8mm MDF板添加到顶板上

圆角用与伺服配件一起使用的自攻螺钉固定到腰部,然后使用伺服的适当螺栓固定到伺服轴上。

将圆角固定到伺服上

接下来我们有肩膀伺服。我们简单地将其安装到位并使用自攻螺钉将其固定到3D印刷部件。

确保Arduino机器人的肩部伺服

圆角继续下一个部分,然后这两个部分被固定到对方使用伺服输出轴上的螺栓。

组装Arduino机器人

我们应该注意到,在确保部件之前,我们需要确保该部件具有全方位的运动。这里我还向肩关节添加了橡胶带,使其给伺服带来有点帮助,因为这种伺服带有臂的其余部分的重量以及有效载荷。

用于帮助伺服电机的橡皮筋

以类似的方式,我组装了机器人臂的其余部分。

Arduino机器人-安装腕部关节伺服电机

接下来,我们需要组装到夹具机制。夹具用SG90伺服电机控制,首先,我们附加定制设计的齿轮连接。我们将此链接与另一侧的另一个齿轮连杆配对,使用M4螺栓和螺母固定。实际上,所有其他链接都是使用M4螺栓和螺母连接的。

机器人手臂夹具机构组件

夹具的3D模型最初有3mm孔,但我没有足够的M3螺栓,因此我使用4mm钻头扩展了孔并使用M4螺栓。

一旦我组装了夹具机制,我将它固定到最后一个伺服器,因此机器人臂完成了。

机器人臂成功

接下来我做了一些有线电视管理。我将伺服导线穿过专门设计的机器人手臂孔。用一个10mm的钻头,我在顶板上做了一个孔,以便电线可以通过。

Arduino机器人布线管理

使用拉链绑架我将所有电线固定在一起,现在剩下的是将它们连接到Arduino板。

Arduino机器人电路图

这是该项目的电路图以及一切都需要连接。

Arduino机器人手臂和Mecanum车轮机器人电路图

您可以从下面的链接获取此项目所需的组件:

yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

在里面以前的教程我解释了Mecanum Wheels机器人部件的作用,也向您展示了我的方式自定义PCB for it

定制PCB设计Arduino Robot  -  Arduino Mega Shield

我在该PCB上包括5V电压稳压器,以便我们可以制作该项目,或连接伺服电机,因为它们在5V时工作。电压调节器是LM350,可处理最多3个电流的AMP。机器人臂的所有六个伺服臂可以从大约2安培绘制到3安培的电流,这意味着它可以处理它们,但这会导致调节器变得非常热。

12V DC风扇和用于冷却LM350电压调节器的散热器

因此,我将散热器附加到它,以及一个小的12V直流风扇吹一些空气,因为散热器本身不够冷却调节器。

我将伺服信号线连接到来自数字5到10的Arduino数字引脚,并且为了供电,我在PCB上使用5V引脚头。最后,我推动了平台内的所有电线,并使用两个坚果将顶板固定到它。

Arduino机械臂和Mecanum Wheels平台电子产品yabo7. com

就是这样,现在我们完成了这个项目。

Arduino Mecanum轮子机器人和机器人手臂

Arduino Code.

接下来看看Arduino代码和Android应用程序是如何工作的。由于代码有点长,为了更好地理解,我将把程序的源代码分成几个部分,并对每个部分进行描述。在本文的最后,我将发布完整的源代码。

因此,首先,我们需要定义6伺服电机,4个步进电机和蓝牙通信,以及定义下面的程序的某些变量。在设置部分中,我们设置脚步的最大速度,定义伺服连接的引脚,开始蓝牙通信并将机器人手臂设置为初始位置。

#include  #include  #include  servo servo01;伺服伺服02;伺服伺服03;伺服伺服04;伺服伺服05;伺服伺服06;软件系列蓝牙(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); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 #define led 14 int wheelSpeed = 1500; int lbw[50], lfw[50], rbw[50], rfw[50]; // arrays for storing positions/steps int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; int dataIn; int m = 0; void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); pinMode(led, OUTPUT); servo01.attach(5); servo02.attach(6); servo03.attach(7); servo04.attach(8); servo05.attach(9); servo06.attach(10); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(5); delay(20); Serial.begin(38400); // Move robot arm to initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 100; servo02.write(servo2PPos); servo3PPos = 120; servo03.write(servo3PPos); servo4PPos = 95; servo04.write(servo4PPos); servo5PPos = 60; servo05.write(servo5PPos); servo6PPos = 110; servo06.write(servo6PPos); }

然后在循环部分中,我们首先检查是否有任何传入数据。

//检查输入数据是否(bluetooth.available()> 0){datain = bluetooth.read();//阅读数据

这些数据来自智能手机或Android应用程序,所以让我们看看它实际发送的是什么类型的数据。Android应用程序是使用MIT App Inventor Online应用。它由简单的按钮组成,这些按钮具有适当的图像作为背景。

Arduino机器人自定义为智能手机控制构建Android应用程序

如果我们看一下应用程序的块,我们可以看到它所做的一切都是它在单击按钮时发送一个字节的数字。

机器人控制应用程序块-代码

根据点击按钮,我们告诉Arduino做什么。例如,如果我们收到数字“2”,mecanum轮子平台将向前移动,使用moveForward自定义功能。

if(Datain == 2){m = 2;} // if(m == 2){modeforward();}

此自定义功能设置了所有四个步进电机以向前旋转。

void mopeforward(){左边花.setspeed(wheelspeed);leftbackwheel.setspeed(wheelspeed);RightFrontWheel.setspeed(wheelspeed);RightBackWheel.setspeed(wheelspeed);}

对于任何其他方向的移动,我们只需要在适当的方向旋转轮子。

用于控制机器人臂,我们使用相同的方法。同样,我们在应用程序中有按钮,并且当按住按钮时,机器人臂关节在特定方向上移动。

机器人ARM控制应用程序

正如我之前提到的,在最初的机器人手臂控制应用中我们使用滑块来控制伺服的位置但这造成了一些问题因为这样我们必须发送文本到Arduino,而不是1字节的数字。问题是Arduino有时会错过来自App的Text,出现错误或机器人手臂抖动,行为异常。

通过这种方式,当一个特定的按钮被触摸时,我们简单地发送一个1字节的数字。

Android应用程序块,用于伺服控制Arduino机器人手臂

Arduino代码进入该号码的循环,并留在那里,直到我们触摸按钮,因为在那一刻我们发送数字0,这意味着机器人应该什么都不做。

//以正方向移动伺服1(m == 16){if(bluetooth.available()> 0){m = bluetooth.read();} servo01.write(servo1ppos);servo1ppos ++;延迟(SpeedDelay);} //以负方向移动伺服1(m == 17){if(bluetooth.available()> 0){m = bluetooth.read();} servo01.write(servo1ppos);servo1ppos--;延迟(SpeedDelay);}

因此,根据触摸的按钮,伺服以正面或负方向移动。所有伺服电机都适用相同的工作原理。为了改变移动速度,我们使用来自滑块的值范围为100到250。

//如果(数据> 101和数据<250)改变了ARM速度滑块{SpeedDelay = Datain / 10;//更改伺服速度(延迟时间)}

通过将它们划分10,我们将值从10到25划分为25,这些值用作诸如武器循环中微秒的延迟,以驱动伺服电池。

为了存储机器人移动,我们只需单击保存按钮,我们只需将伺服和脚步程序的当前位置保存到数组中。

//如果(m == 12){//如果是初始保存,则按下按钮“保存”,如果(index == 0){leftbackwheel.setCurrentPosition(0)设置脚步程序位置到0;左边弗伦特韦·塞育仓(0);lightbackwheel.setCurrentPosition(0);RightFrontWheel.SetCurrentPosition(0);lbw [index] = refackwheel.CurrentPosition();//将位置保存到数组LFW [index] = reftfrontWheel.CurrentPosition();RBW [index] = lightbackwheel.currentPosition();RFW [index] = rightFrontWheel.CurrentPosition();servo01sp [index] = servo1ppos;//将位置保存到数组servo02sp [index] = servo2ppos中; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index m = 0; }

然后,当我们按RUN按钮时,我们调用runsteps()自定义函数。此自定义函数运行通过所有存储的步骤使用一些窗口循环。

if (m == 14) {runSteps();//如果按钮“RESET”被按下,如果(dataIn != 14) {stopMoving();memset(激光焊,0,sizeof(激光焊));memset(lfw, 0, sizeof(lfw));memset (rbw 0 sizeof (rbw));memset (rfw 0 sizeof (rfw));memset (servo01SP 0 sizeof (servo01SP));memset(servo02SP, 0, sizeof(servo02SP));memset (servo03SP 0 sizeof (servo03SP));memset (servo04SP 0 sizeof (servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 } }

我们应该注意到它从第一个位置开始到最后一个位置,并不断重复这个过程。因此,在保存步骤时,我们实际上需要以一种方式对机器人进行定位,即第一步与最后一步具有相同的位置。在执行这些步骤时,我们还可以改变平台和机器人手臂的速度,以及暂停和重置所有步骤。

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

这里是这个Arduino机器人项目的完整Arduino代码:

/ * Arduino机器人手臂和Mecanum轮子机器人智能手机通过蓝牙通过Dejan,www.www.kuaixg.com * / #include  #include  #include  servo servo01;伺服伺服02;伺服伺服03;伺服伺服04;伺服伺服05;伺服伺服06;软件系列蓝牙(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); // Stepper3 AccelStepper RightFrontWheel(1, 46, 47); // Stepper4 #define led 14 int wheelSpeed = 1500; int lbw[50], lfw[50], rbw[50], rfw[50]; // arrays for storing positions/steps int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; int dataIn; int m = 0; void setup() { // Set initial seed values for the steppers LeftFrontWheel.setMaxSpeed(3000); LeftBackWheel.setMaxSpeed(3000); RightFrontWheel.setMaxSpeed(3000); RightBackWheel.setMaxSpeed(3000); pinMode(led, OUTPUT); servo01.attach(5); servo02.attach(6); servo03.attach(7); servo04.attach(8); servo05.attach(9); servo06.attach(10); Bluetooth.begin(38400); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(5); delay(20); Serial.begin(38400); // Move robot arm to initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 100; servo02.write(servo2PPos); servo3PPos = 120; servo03.write(servo3PPos); servo4PPos = 95; servo04.write(servo4PPos); servo5PPos = 60; servo05.write(servo5PPos); servo6PPos = 110; servo06.write(servo6PPos); } 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; } if (dataIn == 16) { m = 16; } if (dataIn == 17) { m = 17; } if (dataIn == 18) { m = 18; } if (dataIn == 19) { m = 19; } if (dataIn == 20) { m = 20; } if (dataIn == 21) { m = 21; } if (dataIn == 22) { m = 22; } if (dataIn == 23) { m = 23; } if (dataIn == 24) { m = 24; } if (dataIn == 25) { m = 25; } if (dataIn == 26) { m = 26; } if (dataIn == 27) { m = 27; } // Move the Mecanum wheels platform 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(); } // Mecanum wheels speed if (dataIn > 30 & dataIn < 100) { wheelSpeed = dataIn * 20; } // Move robot arm // Move servo 1 in positive direction while (m == 16) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo01.write(servo1PPos); servo1PPos++; delay(speedDelay); } // Move servo 1 in negative direction while (m == 17) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo01.write(servo1PPos); servo1PPos--; delay(speedDelay); } // Move servo 2 while (m == 19) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo02.write(servo2PPos); servo2PPos++; delay(speedDelay); } while (m == 18) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo02.write(servo2PPos); servo2PPos--; delay(speedDelay); } // Move servo 3 while (m == 20) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo03.write(servo3PPos); servo3PPos++; delay(speedDelay); } while (m == 21) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo03.write(servo3PPos); servo3PPos--; delay(speedDelay); } // Move servo 4 while (m == 23) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo04.write(servo4PPos); servo4PPos++; delay(speedDelay); } while (m == 22) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo04.write(servo4PPos); servo4PPos--; delay(speedDelay); } // Move servo 5 while (m == 25) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo05.write(servo5PPos); servo5PPos++; delay(speedDelay); } while (m == 24) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo05.write(servo5PPos); servo5PPos--; delay(speedDelay); } // Move servo 6 while (m == 26) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo06.write(servo6PPos); servo6PPos++; delay(speedDelay); } while (m == 27) { if (Bluetooth.available() > 0) { m = Bluetooth.read(); } servo06.write(servo6PPos); servo6PPos--; delay(speedDelay); } // If arm speed slider is changed if (dataIn > 101 & dataIn < 250) { speedDelay = dataIn / 10; // Change servo speed (delay time) } // If button "SAVE" is pressed if (m == 12) { //if it's initial save, set the steppers position to 0 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(); servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index m = 0; } // If button "RUN" is pressed if (m == 14) { runSteps(); // If button "RESET" is pressed 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)); memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); 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 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); } // Automatic mode custom function - run the saved steps void runSteps() { while (dataIn != 13) { // Run the steps over and over again until "RESET" button is pressed for (int i = 0; i <= index - 2; i++) { // Run through all steps(index) 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) { break; } } } } // If speed slider is changed if (dataIn > 100 & dataIn < 150) { speedDelay = dataIn / 10; // Change servo speed (delay time) } // Mecanum wheels speed if (dataIn > 30 & dataIn < 100) { wheelSpeed = dataIn * 10; dataIn = 14; } } 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(); } // Servo 1 if (servo01SP[i] == servo01SP[i + 1]) { } if (servo01SP[i] > servo01SP[i + 1]) { for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { servo01.write(j); delay(speedDelay); } } if (servo01SP[i] < servo01SP[i + 1]) { for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { servo01.write(j); delay(speedDelay); } } // Servo 2 if (servo02SP[i] == servo02SP[i + 1]) { } if (servo02SP[i] > servo02SP[i + 1]) { for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) { servo02.write(j); delay(speedDelay); } } if (servo02SP[i] < servo02SP[i + 1]) { for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) { servo02.write(j); delay(speedDelay); } } // Servo 3 if (servo03SP[i] == servo03SP[i + 1]) { } if (servo03SP[i] > servo03SP[i + 1]) { for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) { servo03.write(j); delay(speedDelay); } } if (servo03SP[i] < servo03SP[i + 1]) { for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) { servo03.write(j); delay(speedDelay); } } // Servo 4 if (servo04SP[i] == servo04SP[i + 1]) { } if (servo04SP[i] > servo04SP[i + 1]) { for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) { servo04.write(j); delay(speedDelay); } } if (servo04SP[i] < servo04SP[i + 1]) { for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) { servo04.write(j); delay(speedDelay); } } // Servo 5 if (servo05SP[i] == servo05SP[i + 1]) { } if (servo05SP[i] > servo05SP[i + 1]) { for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) { servo05.write(j); delay(speedDelay); } } if (servo05SP[i] < servo05SP[i + 1]) { for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) { servo05.write(j); delay(speedDelay); } } // Servo 6 if (servo06SP[i] == servo06SP[i + 1]) { } if (servo06SP[i] > servo06SP[i + 1]) { for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) { servo06.write(j); delay(speedDelay); } } if (servo06SP[i] < servo06SP[i + 1]) { for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) { servo06.write(j); delay(speedDelay); } } } } }

这就是本教程的全部内容。这个项目运转得很好,但请注意它远非完美。自动运动可能不是那么精确,因为滑动的mecanum车轮以及伺服电机的性能差。这些廉价的伺服电机也可以震动或抖动,即使不移动,只是因为没有足够的力量来承受3D打印部件的重量。

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

25回应

      • 阿米尔

        你好
        特别感谢您的伟大项目足彩网女欧洲杯
        请上传ARM + MECANUM WHEELS ROBOT APP文件
        当我尝试下载该文件时,我看到此文本(请在您的服务器中有效zlab)我认为主机配置有问题!

  1. dom

    我可以使用新的应用程序从原始机器人臂项目使用相同的arduino代码吗?或者编码不同。

    我想用新的应用程序只需只有机器人手臂而不是车辆。

    回复
  2. 威廉

    嗨,非常有趣
    我将投影挖掘机玩具。
    是与步进电机到臂的类似功能,但我将使用液压系统移动部件。
    我将使用您的代码和技巧来成功的项目

    回复
  3. 贾斯汀何塞

    是否有可能增加手臂的大小?伺服能够处理吗?实际上,整个手臂现在有多长?

    回复
  4. amal sam.

    你好德州,

    非常感谢您的惊人项目。如果我们没有包括电压调节器,是否可以?它仍然有效吗?我想在学校为机器人创造博览会做这个项目。

    回复
    • 德国

      嘿,谢谢!电压调节器用于为机械臂伺服电机提供电源。在我的情况下,我的主要动力是12V电池,这是适用于步进电机,但伺服电机你需要5V。因此,您可以排除电压调整器,以防您使用单独的5V电源为伺服电机。

      回复
      • amal sam.

        感谢您的回复。如果我们要使用一个单独的5V电源,我们将在哪里连接PCB上的电线?
        非常感谢,
        阿玛尔

  5. dom

    所以我能够解决上面的问题,但现在我收到了这个错误消息......

    'runsteps'未在此范围内宣布

    我如何解决它?

    回复
  6. 摩尔德

    谢谢你真棒的工作

    我刚刚建造它。当我打开电源时,所有的脚步者都可以使用应用程序连接到蓝牙HC05,但没有任何按钮都在工作。
    然后我把速度改为9600,手臂工作,但电机仍然订婚。
    知道我哪里做错了吗?这是我第一次做可以通过蓝牙控制的东西,所以我有点迷糊了。

    谢谢!

    回复
    • 贾斯汀何塞

      这也是在我身上的。是因为电池耗尽真正快速吗?德文,打电话给你告诉我你的机器人持续多长时间的电池在开始时充满电?

      非常感谢,
      贾斯汀

      回复
      • 贾斯汀何塞

        *对不起,我的意思是德国而不是德文。真对不起

      • 鲍勃

        我知道我真的很晚了,但是,对于未来的任何人来说,想知道它将在一个完整的电池上持续到20分钟,假设你正在使用他是相同的电池。此外,我还没有做到这一点,但我跑了一些简单的计算来弄清楚所有伺服和步进电机的总吸引。显然,如果您使用的臂更多或步进电机更有意味着这意味着从电池中抽出更多电流并更快地耗尽它,这可能会有所不同。

  7. m

    嗨,我的夹子机制真的很快。任何提示吗?你还有更多的图片吗?

    回复
  8. 阿兰狼

    你好德州,

    我的儿子和我真的很喜欢这个项目,我们在一起工作,在我们之间创造出一个很好的债券。
    我希望非常感谢您分享此类项目。足彩网女欧洲杯

    但我们的问题是:

    如果我们想打印手臂有点更大,是否可以用Nemo17步进电机更换伺服电机?
    如果是这样,这些连接或必须购买哪些额外的零件?

    提前致谢。
    来自比利时的土地

    回复
    • 德国

      嘿,很高兴你听到了!
      更好地更换机器人手臂的伺服电机与NEMA 17步进电机将需要对设计进行大量修改(主要是为了适合电动机,当然,当然)和完全不同的编码,因为控制台的控制器有点复杂一些控制那些伺服电机。所以我会说,使用此目前的配置无法执行此操作。在未来的项目/视频中,我可能会制作一个有步进电机的机器人手臂。实际上,我最近制作了一个,但它有点不同的类型,Scara机器人,你可以看看。
      干杯!

      回复
  9. Salman Ali.

    嘿,我需要Arduino机器人手臂和Mecanum Wheels 3D模型 - SolidWorks文件包括机器人手臂和Mecanum轮子的所有零件和组装。我尝试下载Arduino机械臂和Mecanum Wheels Platfrom 3D模型步骤文件,但这无效地和Zipped文件。

    回复

留下一个回复

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

受到推崇的

2019年初学者和爱好者的最佳进入级示波器

为初学者和爱好者最好的示波器

受到推崇的

2019年针对初学者的8个最佳Arduino入门工具包

初学者的8个最佳Arduino Starter Kits

受到推崇的

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

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