工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoロボットアームとメカナムホイールプラットフォームの自動操作

このチュートリアルでは、以前のビデオからMecanum Wheels Robot Platformを作成し、3Dプリントされたロボットアーム(以前のビデオの1つからのArduinoプロジェクト)と連携して自動的に動作する方法を紹介します。

次のビデオを見るか、以下のチュートリアルを読むことができます。

概要

したがって、前のビデオで説明したのと同じ方法で、カスタムビルドのAndroidアプリケーションを使用してMecanumホイールロボットを制御できます。それに加えて、アプリにはロボットアームを制御するためのボタンもあります。

オリジナルのロボットアーム制御アプリには、実際にはロボットの関節を制御するためのスライダーがありましたが、それがアームの安定性にいくつかの問題を引き起こしていました。このように腕ははるかにうまく機能するので、この更新されたバージョンのロボットアーム制御アプリとArduinoコードを元のロボットアームプロジェクトにも提供します。

それでも、このロボットの最も優れた機能は、動きを保存して自動的に繰り返す機能です。

[保存]ボタンを使用すると、各ステップのモーターの位置を簡単に保存できます。次に、[実行]ボタンをクリックするだけで、ロボットは保存された動きを自動的に繰り返します。

Arduinoロボットの構築

さて、ここでMecanumホイールプラットフォームがすでに組み立てられています。これに関するすべての詳細は、前のビデオで確認できます。

また、ここではロボットアームとサーボモーターの3Dプリント部品を持っているので、それらを組み立てる方法を紹介します。これがこのプロジェクトの3Dモデルです。

この3Dモデルを見つけてダウンロードしたり、Thangsのブラウザで調べたりすることができます。

Thangsで3Dモデルをダウンロードします。

3D印刷用のSTLファイル:

ロボットアームの最初のサーボは、メカナムホイールプラットフォームのトップカバーに直接取り付けられます。

場所をマークし、10mmのドリルを使用していくつかの穴を開けました。

次に、ラスプを使用して穴を切り、サーボの開口部を微調整しました。 4本のM3ボルトとナットを使用してサーボをトッププレートに固定しました。

次に、このサーボのこの出力シャフトに、サーボに付属している丸いホーンを使用して、ロボットアームの次の部品またはウエストを取り付ける必要があります。ただし、このようにして、パーツがプレートから約8mm上に留まっていることがわかります。そこで、8mmのMDF板を2枚取り付けて、腰の部分がスライドできるようにして、関節がより安定するようにしました。

丸ホーンはサーボ付属のセルフタッピンネジでウエスト部分に固定し、丸ホーンはサーボ付属のボルトでサーボシャフトに固定します。

次に、ショルダーサーボがあります。所定の位置に置き、セルフタッピングネジを使用して3Dプリント部品に固定するだけです。

丸いホーンが次の部分に進み、サーボの出力シャフトのボルトを使用して2つの部分を互いに固定します。

パーツを固定する前に、パーツが全可動域にあることを確認する必要があることに注意してください。ここでは、肩関節に輪ゴムを追加して、サーボに少し役立つようにしました。このサーボは、残りの腕の重量とペイロードを運ぶためです。

同様の方法で、残りのロボットアームを組み立てました。

次に、グリッパー機構に組み立てる必要があります。グリッパーはSG90サーボモーターで制御され、最初にカスタム設計のギアリンクを取り付けます。このリンクを、M4ボルトとナットを使用して固定されている反対側の別のギア付きリンクとペアにします。実際、他のすべてのリンクはM4ボルトとナットを使用して接続されています。

グリッパーの3Dモデルには元々3mmの穴がありましたが、M3ボルトが足りなかったため、4mmドリルを使用して穴を拡張し、代わりにM4ボルトを使用しました。

グリッパー機構を組み立てたら、最後のサーボに固定してロボットアームが完成しました。

次に、ケーブル管理を行いました。ロボットアームの特別に設計された穴にサーボワイヤーを通しました。 10mmのドリルを使用して、ワイヤーが通過できるように天板に穴を開けました。

結束バンドを使用してすべてのワイヤーを固定しました。あとは、それらをArduinoボードに接続するだけです。

Arduinoロボットの回路図

このプロジェクトの回路図と、すべてを接続する必要がある方法は次のとおりです。

このプロジェクトに必要なコンポーネントは、以下のリンクから入手できます。

  • ステッピングモーター–NEMA17…………..…
  • DRV8825ステッピングドライバー………。……。…
  • MG996Rサーボモーター…………………。…。
  • SG90マイクロサーボモーター……………。…。
  • HC-05Bluetoothモジュール……………。…
  • Li-Poバッテリー……………………………。……
  • Arduinoメガボード…………。………。…

前のチュートリアルでは、メカナムホイールロボットパーツがどのように機能するかを説明し、そのためのカスタムPCBを作成する方法も示しました。

このプロジェクトを作成できるように、このPCBに5V電圧レギュレーターを含めました。または、5Vで動作するため、サーボモーターを接続します。電圧レギュレータはLM350で、最大3アンペアの電流を処理できます。ロボットアームの6つのサーボはすべて、約2アンペアから3アンペアの電流を引き出すことができます。つまり、それらを処理できますが、レギュレーターが非常に高温になります。

そのため、ヒートシンク自体がレギュレーターを冷却するのに十分ではなかったため、ヒートシンクと、空気を吹き込むための小さな12VDCファンを取り付けました。

サーボ信号線を5番から10番までのArduinoデジタルピンに接続し、電力供給にはPCBの5Vピンヘッダーを使用しました。最後に、すべてのワイヤーをプラットフォーム内に押し込み、2つのナットを使用してトッププレートをプラットフォームに固定しました。

これで、このプロジェクトは完了です。

Arduinoコード

残っているのは、ArduinoコードとAndroidアプリケーションがどのように機能するかを確認することです。コードが少し長いので、理解を深めるために、プログラムのソースコードを各セクションの説明とともにセクションに投稿します。そして、この記事の最後に、完全なソースコードを投稿します。

したがって、最初に、6つのサーボ、4つのステッピングモーター、およびBluetooth通信を定義する必要があります。また、以下のプログラムに必要ないくつかの変数を定義する必要があります。セットアップセクションでは、ステッパーの最高速度を設定し、サーボを接続するピンを定義し、Bluetooth通信を開始して、ロボットアームを初期位置に設定します。

#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 dataCode language: Arduino (arduino)

このデータはスマートフォンまたはAndroidアプリからのものなので、実際に送信されているデータの種類を見てみましょう。 Androidアプリは、MITAppInventorオンラインアプリケーションを使用して作成されています。背景として適切な画像を持つシンプルなボタンで構成されています。

アプリのブロックを見ると、ボタンがクリックされたときに1バイトの数字を送信するだけであることがわかります。

したがって、クリックされたボタンに応じて、Arduinoに何をすべきかを指示します。たとえば、番号「2」を受け取った場合、mecanumホイールプラットフォームはmoveForwardカスタム関数を使用して前方に移動します。

if (dataIn == 2) {
      m = 2;
    }
//
if (m == 2) {
      moveForward();
    }Code language: Arduino (arduino)

このカスタム機能は、4つのステッピングモーターすべてを前方に回転するように設定します。

void moveForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}Code language: Arduino (arduino)

他の方向に移動するには、ホイールを適切な方向に回転させるだけです。

ロボットアームの制御も同様です。繰り返しになりますが、アプリにはボタンがあり、ボタンを押したままにすると、ロボットアームの関節が特定の方向に移動します。

先に述べたように、元のロボットアーム制御アプリでは、サーボの位置を制御するためにスライダーを使用していましたが、その方法では1バイトの数字ではなくテキストをArduinoに送信する必要があったため、問題が発生していました。問題は、Arduinoがアプリからのテキストを見逃してエラーが発生したり、ロボットアームが揺れて異常な動作をしたりすることがあることです。

このようにして、特定のボタンが押されたときに1バイトの数字を1つ送信するだけです。

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までの値が得られます。これは、サーボを駆動するためのwhileループのマイクロ秒単位の遅延として使用されます。

ロボットの動きを保存するために、[保存]ボタンをクリックするたびに、サーボとステッパーの現在の位置を配列に保存するだけです。

// 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 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プロジェクトコレクションを確認してください。


製造プロセス

  1. ArduinoとRaspberryPiを使用してインターネット制御のビデオストリーミングロボットを構築する
  2. シンプルなパイロボット
  3. サーボモーター付きロボット回避障害物
  4. ArduinoとAndroidデバイスでルンバロボットを制御する
  5. ArduinoとMPU6050によるサーボモーターの制御
  6. Arduinoを使用したシンプルでスマートなロボットアーム
  7. Littlearm 2C:3DプリントされたArduinoロボットアームを構築する
  8. DIY Arduinoロボットアーム–ハンドジェスチャで制御
  9. ローカルおよびリモートのプログラム可能なロボットアーム
  10. AndroidアプリでArduinoロボットアームを制御する
  11. ロボットは協働ロボットアームとモバイルプラットフォームを組み合わせた