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

在本教程中,我将向您展示我如何使我的Mecanum车轮机器人平台从我以前的视频,一起工作和自动操作与我的3D打印机械臂,也Arduino项目从我以前的视频之一。

受到推崇的 2019年针对初学者的8个最佳Arduino入门工具包
概述

我们可以用自定义构建的Android应用程序控制Mecanum车轮机器人就像之前视频中解释的那样。除此之外,现在这个应用程序还有控制机器人手臂的按钮。

Arduino Mecanum车轮机器人和机械臂自动操作

原本的机械臂的控制应用程序实际上有滑块来控制机器人的关节,但这造成了手臂稳定性的一些问题。这样一来手臂的工作就更好了,所以我也会把这个更新版本的机器人手臂控制应用和Arduino代码提供给原来的机器人手臂项目。

然而,这款机器人最酷的功能是能够存储动作,然后自动重复它们。

Arduino机器人自动操作

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

构建Arduino机器人

好的,所以在这里我有Mecanum轮子平台已经组装了,您可以在以前的视频中找到有关它的所有详细信息。

机械臂3D打印零件

此外,这里我有3D打印的部分的机器人手臂和伺服电机,现在我将告诉你如何组装他们。这是这个项目的3D模型。

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

步文件:

3D打印STL文件:

机器人手臂的第一个伺服器将直接安装在mecanum车轮平台的顶盖上。

我标记了位置,并使用10毫米钻,我制作了几个孔。

在顶盖上开孔

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

将伺服装置固定在顶板上

然后在这个伺服的输出轴上,使用作为伺服附件的圆角,我们需要连接下一个部分或机器人手臂的腰部。然而,我们可以注意到,以这种方式,部分保持在约8mm以上的板。所以我贴了两块8mm的MDF板,这样腰部可以在上面滑动,这样接头会更稳定。

顶板增加8mm的MDF板

圆角是固定到腰部部分使用自攻螺钉来作为附件与伺服,然后圆角是固定到伺服轴使用适当的螺栓,也随伺服。

将圆角固定在伺服器上

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

固定Arduino机器人的肩部伺服

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

组装Arduino机器人

我们应该注意,在固定部件之前,我们需要确保部件有完整的运动范围。这里我还在肩关节上加了一个橡皮筋这样它对伺服器有一点帮助,因为这个伺服器承担了手臂的其他部分的重量以及有效载荷。

帮助伺服电机的橡皮筋

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

Arduino机器人 - 安装腕带伺服电机

接下来,我们需要装配到抓手装置上。该抓手是控制与SG90伺服电机,在其上,首先我们附加一个定制设计的齿轮连杆。我们将这个连接与另一边的另一个齿轮连接,这是用M4螺栓和螺母固定。实际上,所有其他链接都是用M4螺栓和螺母连接的。

机器人手臂夹持器机构装配

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

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

机器人臂成功

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

Arduino机器人布线管理

我用拉链把所有的线固定在一起,现在剩下的就是把它们连接到Arduino板上。

Arduino机器人电路图

这是这个项目的电路图,以及所有需要连接的东西。

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

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

必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。

以前的教程我解释了如何Mecanum车轮机器人部分工作,也向你展示了我如何做一个定制PCB

定制电路板设计Arduino机器人- Arduino Mega Shield

我在这个PCB上包括了一个5V电压调节器,这样我们就可以做这个项目,或者连接伺服电机,因为他们工作在5V。电压调节器是LM350,可以处理3安培的电流。机器人手臂的所有6个伺服系统都能产生大约2到3安培的电流,这意味着它可以控制它们,但这将导致调节器变得非常热。

12V直流风扇和散热片,用于冷却LM350稳压器

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

我将伺服信号线连接到Arduino数字引脚从5号到10号,为电源我使用了PCB上的5V引脚头。最后,我把所有的电线都推到平台里面,用两个螺母把顶板固定在上面。

Arduino机械臂和Mecanum车轮平台电子必威lol

就是这样,现在这个项目结束了。

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应用程序是使用麻省理工学院App Inventor在线应用程序。它由简单的按钮组成,有适当的图像作为背景。

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

如果我们看一下应用的块,我们可以看到它所做的只是在按钮被点击时发送一个字节的数字。

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

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

if (dataIn == 2) {m = 2;} //如果(m == 2) {moveForward();}

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

void moveForward() {LeftFrontWheel.setSpeed(wheelSpeed);LeftBackWheel.setSpeed (wheelSpeed);RightFrontWheel.setSpeed (wheelSpeed);RightBackWheel.setSpeed (wheelSpeed);}

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

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

机器人手臂控制App

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

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

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

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

//正向移动伺服1 while (m == 16) {if (Bluetooth.available() > 0) {m = Bluetooth.read();} servo01.write (servo1PPos);servo1PPos + +;延迟(speedDelay);} //移动伺服1负向while (m == 17) {if (Bluetooth.available() > 0) {m = Bluetooth.read();} servo01.write (servo1PPos);servo1PPos——;延迟(speedDelay);}

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

//如果手臂速度滑块改变如果(dataIn > 101 & dataIn < 250) {speedDelay = dataIn / 10;//改变伺服速度(延时时间)}

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

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

//如果按钮“SAVE”被按下,如果(m == 12){//如果它是初始保存,设置步进器位置为0如果(index == 0) {LeftBackWheel.setCurrentPosition(0);LeftFrontWheel.setCurrentPosition (0);RightBackWheel.setCurrentPosition (0);RightFrontWheel.setCurrentPosition (0);} lbw[index] = LeftBackWheel.currentPosition();//保存位置到数组lfw[index] = LeftFrontWheel.currentPosition();rbw(指数)= RightBackWheel.currentPosition ();rfw(指数)= RightFrontWheel.currentPosition ();servo01SP(指数)= 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()自定义函数。这个自定义函数使用一些for和while循环运行所有存储的步骤。

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.mfxpo.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); } } } } }

所以这对本教程来说几乎是一切。该项目运作良好,但请注意,它远非完美。由于杀手轮的滑动以及伺服电机的性能差,自动运动可能不是精确的。这些便宜的伺服电机也可以摇晃或抖动即使在不移动时也可以摇晃或抖动,因为没有足够的力量来保持3D印刷部件的重量。

我希望你喜欢这个教程,并学到一些新的东西。欢迎在评论区提出任何问题,并查看我的Arduino项bet188me目集合

27岁的反应

      • 阿米尔


        特别感谢你们的伟大项目bet188me
        请上传手臂+mecanum车轮机器人应用程序文件
        当我试图下载文件,我看到这个文本(请激活zlab在您的服务器),我认为有问题与您的主机配置!

  1. Dom

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

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

    回复
  2. 胜过

    嗨,非常有趣
    我要设计一个挖掘机玩具。
    是一个类似的功能,以步进电机手臂,但我将使用一个液压系统来移动的部分。
    我将使用您的代码和技巧来成功的项目

    回复
  3. 贾斯汀穆

    有可能增大手臂的尺寸吗?伺服系统能处理吗?事实上,现在整个手臂有多长?

    回复
  4. amal sam.

    你好,德扬,

    非常感谢你精彩的项目。不包括稳压器可以吗?它还能工作吗?我想在学校的机器人创作展上做这个项目。

    回复
    • 德国

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

      回复
      • amal sam.

        谢谢你的回复。如果我们要使用一个独立的5v电源,我们会把线路板上的电线连接到哪里?
        非常感谢,
        amal.

  5. Dom

    所以我能够修复上面的问题,但现在我得到了这个错误消息…

    未在此作用域中声明“runSteps”

    我该怎么补救呢?

    回复
  6. 摩尔德

    谢谢你真棒的工作

    我刚建好。当我打开电源时,所有的步进器都启动了,我可以通过应用连接到蓝牙hc05,但没有一个按钮是正常的。
    然后我把速度调整到9600,手臂工作了,但是马达仍然在工作。
    知道我哪里做错了吗?这是我第一次做可以通过蓝牙控制的东西,所以我有点迷糊了。

    谢谢!

    回复
    • 贾斯汀穆

      这也发生在我身上。是因为电池很快就没电了吗?戴文,打电话告诉我你的机器人在电池充满的情况下能坚持多久?

      非常感谢,
      贾斯汀

      回复
      • 贾斯汀穆

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

      • 鲍勃

        我知道我真的迟到了,但是如果将来有人想知道,如果你和他用的是同一块电池的话,我的手机在充满电的情况下能坚持20分钟左右。此外,我没有做这个,但我运行一些简单的计算,以计算出所有伺服和步进电机的总绘图。显然,如果你更多地使用手臂或步进电机,这可能会有所不同,这意味着从电池中吸取更多的电流,并更快地耗尽它。

  7. 阿兰狼

    你好,德扬,

    我的儿子和我真的很喜欢这个项目,我们在一起工作,在我们之间创造出一个很好的债券。
    我非常感谢你们分享这样的项目。bet188me

    但我们的问题是

    如果我们想打印大一点的手臂,伺服电机可以换成nemo17步进电机吗?
    如果是,这些是如何连接的或哪些额外的零件必须购买?

    提前谢谢。
    阿兰来自比利时

    回复
    • 德国

      嘿,很高兴你听到了!
      更换伺服电机的机械臂的NEMA 17步进电机将需要大量的修改设计(主要适合汽车和大小,当然)和完全不同的编码控制步进是一个更为复杂,控制伺服电机。所以我想说,以目前的结构是不可能做到这一点的。我可能会在未来的项目/视频中制作一个带有步进电机的机器人手臂。事实上,我最近做了一个,但类型有点不同,SCARA机器人,你可以去看看。
      干杯!

      回复
  8. 萨尔曼·阿里

    嘿,我需要Arduino机械臂和Mecanum车轮3D模型- SOLIDWORKS文件包括所有零件和装配的机械臂和Mecanum车轮。我尝试下载Arduino机械臂和Mecanum车轮平台的3D模型步骤文件,但这不是有效的,也没有压缩文件。

    回复
  9. Damy明智

    亲爱的呵呵,

    我为我的最终高中项目做了这个,被选为前10名。
    我真的很感谢你的教程,视频和文章都很容易理解。
    好吧,我想说,但我不能真正地用言语言语,因为我不是母语的扬声器。感谢您的YouTube视频和本网站!

    明智的

    回复

留下一个回复

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

受到推崇的

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

最适合初学者和爱好者的示波器

受到推崇的

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

8个最好的arduino初学者工具包

受到推崇的

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

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