【Arduino机器人手臂和麦克纳姆轮平台自动操作】

本教程介绍如何将Arduino机器人手臂与麦克纳姆轮平台结合,实现自动操作。通过定制的Android应用控制,不仅可以操作麦克纳姆轮小车,还能控制3D打印的机械臂。教程详述了构建过程、电路设计和Arduino代码,包括存储和重复动作的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Arduino机器人手臂和麦克纳姆轮平台自动操作】

在本教程中,我将向您展示我如何从我以前的视频中制作我的 Mecanum Wheels 机器人平台,以便与我的 3D
打印机械臂协同工作并自动操作,这也是我之前视频之一中的 Arduino 项目。
在这里插入图片描述

您可以观看以下视频或阅读下面的书面教程。

1. 概述

因此,我们可以使用定制的Android应用程序控制Mecanum轮子机器人,方法与上一个视频中所述相同。除此之外,现在该应用程序还具有用于控制机器人手臂的按钮。

Arduino Mecanum 轮子机器人和机械臂自动运行

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

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

Arduino机器人自动操作

使用“保存”按钮,我们可以简单地存储每个步骤的电机位置。然后我们只需要单击“运行”按钮,机器人就会一遍又一遍地自动重复存储的动作。

2. 构建 Arduino 机器人

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

机械臂3D打印零件

另外,这里有机器人手臂和伺服电机的3D打印部件,现在我将向您展示如何组装它们。这是这个项目的3D模型。

在这里插入图片描述

您可以找到并下载此3D模型,也可以在Thangs的浏览器中进行探索。

在这里插入图片描述

在唐斯下载3D模型

用于 3D 打印的 STL 文件:
Arduino机械臂和麦克纳姆轮平台来自STL文件

机械臂的第一台舵机将直接安装在麦克纳姆轮平台的顶盖上。

我标记了位置,并使用10毫米的钻头打了几个孔。

在顶盖上开口

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

将舵机固定到顶板上

然后在这个伺服的输出轴上,使用作为舵机附件的圆喇叭,我们需要连接机器人手臂的下一个部分或腰部。但是,我们可以注意到,通过这种方式,零件保持在板上方约8mm。因此,我连接了两块8mm的MDF板,这样腰部就可以在上面滑动,所以关节会更稳定。

在顶板上添加 8mm MDF 板

使用作为伺服附件的自攻螺钉将圆喇叭固定在腰部,然后使用舵机随附的适当螺栓将圆喇叭固定到伺服轴上。

将圆喇叭固定到伺服器

接下来是肩部伺服。我们只需将其放置到位,并使用自攻螺钉将其固定在3D打印部件上。

固定Arduino机器人的肩部伺服器

圆喇叭在下一部分,然后使用伺服输出轴上的螺栓将两个部件相互固定。

组装Arduino机器人

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

帮助伺服电机的橡皮筋

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

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

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

机械臂抓手机构总成

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

在这里插入图片描述

3 200 400 500 岁以下最佳 2020D 打印机 另
请参阅适合初学者和业余爱好者的最佳实惠的3D打印机

组装好夹持器机构后,我将其固定在最后一个伺服器上,因此机器人手臂就完成了。

机器人手臂完成组装

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

Arduino机器人布线管理

我用扎带将所有电线固定在一起,现在剩下的就是将它们连接到Arduino板上。

3. Arduino机器人电路图

这是该项目的电路图以及所有东西都需要如何连接。

在这里插入图片描述

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

步进电机 – NEMA 17
DRV8825 步进驱动器
MG996R伺服电机
SG90微型伺服电机
HC-05 蓝牙模块
锂聚合物电池
Arduino Mega Board

前面的教程中,我解释了 Mecanum 轮子机器人零件的工作原理,并向您展示了我如何为其制作定制 PCB.

Arduino机器人的定制PCB设计 - Arduino Mega Shield

我在这个PCB上包括了一个5V稳压器,以便我们可以制作这个项目,或者连接伺服电机,因为它们在5V下工作。稳压器是 LM350,可处理高达 3 安培的电流。机器人手臂的所有六个伺服器都可以消耗大约 2 安培到 3 安培的电流,这意味着它可以处理它们,但这会导致调节器变得非常热。

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

因此,我在上面安装了一个散热器,以及一个小型 12V DC 风扇来吹一些空气,因为散热器本身不足以冷却调节器。

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

Arduino机械臂和麦克纳姆轮平台电子

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

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

4. Arduino Code

剩下的就是看看Arduino代码和Android应用程序是如何工作的。由于代码有点长,为了更好地理解,我将在各个部分发布程序的源代码,并为每个部分提供描述。在本文的最后,我将发布完整的源代码。

所以首先我们需要定义 6 伺服、4 步进电机和蓝牙通信,以及定义下面程序所需的一些变量。在设置部分,我们设置步进器的最大速度,定义伺服系统的销,开始蓝牙通信并将机器人手臂设置为初始位置。

#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;

SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(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);
}

Code language: Arduino (arduino)
然后在循环部分,我们首先检查是否有任何传入数据。

// Check for incoming data
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.read();  // Read the data

Code language: Arduino (arduino)
这些数据来自智能手机或Android应用程序,所以让我们来看看它实际发送的是什么样的数据。Android应用程序是使用MIT App Inventor在线应用程序制作的。它由简单的按钮组成,这些按钮具有适当的图像作为背景。

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

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

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

因此,根据单击的按钮,我们告诉Arduino该怎么做。例如,如果我们收到数字“2”,麦克纳姆轮平台将使用 moveForward 自定义功能向前移动。

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

Code language: Arduino (arduino)

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

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

Code language: Arduino (arduino)
对于向任何其他方向移动,我们只需要在适当的方向上旋转轮子。

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

机械臂控制应用

正如我之前提到的,在最初的机器人手臂控制应用程序中,我们使用滑块来控制伺服系统的位置,但这导致了一些问题,因为这样我们必须将文本发送到 Arduino,而不是 1 字节数字。问题是Arduino有时会错过来自应用程序的文本并出错,或者机器人手臂摇晃并表现异常。

通过这种方式,我们只需在触摸特定按钮时发送一个 1 字节的数字。

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

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

// 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);
    }

Code language: Arduino (arduino)
因此,根据触摸的按钮,伺服器沿正向或负方向移动。同样的工作原理适用于所有伺服电机。为了改变移动速度,我们使用来自滑块的值,范围从 100 到 250。

// If arm speed slider is changed
    if (dataIn > 101 & dataIn < 250) {
      speedDelay = dataIn / 10; // Change servo speed (delay time)
    }

Code language: Arduino (arduino)
通过将它们除以 10,我们得到从 10 到 25 的值,这些值用作驱动伺服系统的 whiles 循环中的微秒延迟。

为了存储机器人运动,我们只需在每次单击“保存”按钮时将伺服系统和步进器的当前位置保存到数组中。

// 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;
    }

Code language: Arduino (arduino)
然后,当我们按下“运行”按钮时,我们调用 runSteps() 自定义函数。此自定义函数使用一些 for 和 while 循环运行所有存储的步骤。

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
      }
    }

Code language: Arduino (arduino)
我们应该注意到,它从第一个位置开始,到最后一个位置,并一遍又一遍地重复。因此,在保存步骤时,我们实际上需要以第一步与最后一步具有相同位置的方式定位机器人。在运行这些步骤时,我们还可以更改平台和机器人手臂的速度,以及暂停和重置所有步骤。

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

图标
Arduino机器人手臂和麦克纳姆轮机器人应用程序文件

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

/*
       Arduino Robot Arm and Mecanum Wheels Robot
          Smartphone Control via Bluetooth
       by Dejan, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;

SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(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);
        }
      }
    }
  }
}

Code language: Arduino (arduino)
因此,这几乎是本教程的所有内容。该项目运行良好,但请注意,它远非完美。由于麦克纳姆轮的打滑以及伺服电机的性能不佳,自动运动可能不是那么精确。这些廉价的伺服电机即使在不移动时也会摇晃或抖动,因为没有足够的力量来承受3D打印部件的重量。

我希望您喜欢本教程并学到了一些新东西。请随时在下面的评论部分提出任何问题,并查看我的Arduino项目集合

翻译地址:https://howtomechatronics.com/projects/arduino-robot-arm-and-mecanum-wheels-platform-automatic-operation/
视频地址:https://youtu.be/LBNRGBY5zN8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2345VOR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值