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

Arduinoメカナムホイールロボット

このチュートリアルでは、任意の方向に移動できるArduino MecanumWheelsRobotを構築する方法を学習します。ロボットのこのユニークな機動性は、メカナムホイールと呼ばれる特殊なタイプのホイールを使用することで実現されます。

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

概要

私は実際にこれらのホイールを設計して3D印刷しました。これは、購入するのに少し費用がかかる可能性があるためです。彼らは非常にうまく機能し、このロボットプラットフォームを運転するのはとても楽しいと言わなければなりません。 NRF24L01無線トランシーバーモジュールを使用してロボットをワイヤレスで制御できます。私の場合は、以前のビデオの1つで作成したDIYRC送信機を使用しています。

また、Bluetooth通信を介してスマートフォンを使用して制御できるようにしました。 Mecanumホイールロボットを制御して任意の方向に移動できるカスタムAndroidアプリケーションを作成しました。また、アプリのスライダーを使用して、移動速度を制御できます。

このロボットプラットフォームの頭脳は、各ホイールを個別に制御するArduinoMegaボードです。各ホイールはNEMA17ステッピングモーターに取り付けられており、ステッピングモーターを正確に制御できることを知って、ロボットが自動的に動くようにプログラムできるもう1つの優れた機能をアプリに追加しました。 [保存]ボタンを使用すると、各位置またはステップを保存でき、ロボットは自動的に実行してこれらのステップを繰り返すことができます。同じボタンを使用して、自動操作を一時停止したり、すべてのステップをリセットまたは削除して、新しいステップを保存したりできます。

Mecanum WheelsRobot3Dモデル

まず、3Dモデリングソフトウェアを使用してこのMecanumWheelsロボットを設計しました。このロボットのベースプラットフォームは、8mmティックのMDFボードで作成するシンプルなボックスです。

このプラットフォームには4つのステッピングモーターが取り付けられており、Mecanumホイールはモーターのシャフトに取り付けられています。

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

Thangsからアセンブリの3Dモデルをダウンロードします。

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

メカナムホイールのしくみ

メカナムホイールは、ローラーが円周に取り付けられたホイールです。これらのローラーは、ホイールの回転軸に対して斜めまたは45度の角度で配置されます。これにより、後方に前進するときにホイールが対角線方向に力を発揮します。

したがって、車輪を特定のパターンで回転させることにより、これらの対角線の力を利用して、ロボットを任意の方向に動かすことができます。

ここで、2種類のMecanumホイールが必要であることに注意する必要があります。これは、左手用と右手用のMecanumホイールと呼ばれることがよくあります。それらの違いはローラーの向きであり、ロボットの特定の場所に取り付ける必要があります。各ホイールのトップローラーの回転軸は、ロボットの中心を指している必要があります。

これは、車輪の回転方向に応じてロボットが動く方法の簡単なデモンストレーションです。

4つの車輪すべてが前方に移動すると、ロボットの動きは前方に移動します。逆に、すべての車輪が後方に移動すると、ロボットは後方に移動します。右に移動するには、右の車輪がロボットの内側で回転し、左の車輪がロボットの外側で回転する必要があります。斜めに配置されたローラーによって生じる力により、ロボットは右に移動します。左に移動すると、同じですが反対のことが起こります。これらのホイールを使用すると、2つのホイールだけを回転させることで対角線方向への移動も実現できます。

MecanumWheelsロボットの作成

それでも、このロボットプラットフォームをどのように構築したかをお見せしましょう。前述したように、プラットフォームのベースを作成するために、8mmティックのMDFボードを使用しています。テーブルソーを使用して、最初に3Dモデルの寸法に従ってすべてのピースをカットしました。

次に、3mmのドリルと25mmのForstnerビットを使用して、ステッピングモーターを取り付けるための開口部をサイドパネルに作成しました。準備ができたら、組み立てを続けました。木工用ボンドとネジを使って固定しました。ここで最も重要なことは、モーターの開口部を正確に作成して、すべての車輪が後で表面に接触するようにすることです。

もちろん、MDFで作成する代わりに、このベースプラットフォームを3D印刷することもできるので、Webサイトの記事にその3Dファイルを含めます。最後に、ベースとカバーを白色でスプレー塗装しました。

次はメカナムホイールです。先に述べたように、これらのホイールは購入するのに少し費用がかかる可能性があるため、自分でホイールをデザインして3Dプリントすることにしました。ホイールは、外側と内側の2つの部品で構成されており、M4ボルトとナットで固定されています。それぞれ10個のローラーと、NEMA17ステッピングモーターに適合するように特別に設計されたシャフトカプラーがあります。

Creality CR-10 3Dプリンターを使用して、Mecanumホイールのすべてのパーツを3Dプリントしました。

チェックアウトしたい場合に備えて、この3Dプリンターへのリンクは次のとおりです。

そこで、3D印刷された部品の準備ができたら、ローラーのシャフトの作成に移りました。そのために、3mmティックの鋼線を使用しました。シャフトの長さは約40mmである必要があるので、回転工具を使用してその長さにワイヤーを切断しました。

4本のM4ボルトとナットを使って両側とシャフトカプラーを固定することでメカナムホイールの組み立てを始めました。ボルトの長さは45mmである必要があります。

ローラーを取り付けるには、まず、内側の円周にある穴にシャフトをわずかに挿入する必要があります。

次に、小さなM3ワッシャーを挿入し、ローラーを挿入して、シャフトをホイールの外側のスロットに完全に押し込みます。反対側に2つ目のワッシャーを挿入するのに十分なスペースがなかったため、1つのワッシャーを使用しました。

10個のローラーすべてに対してこのプロセスを繰り返しました。これらのホイールを組み立てるのは、実際には簡単で楽しいものです。ここで重要なのは、ローラーが自由に動くことができる必要があるということです。

最後に、シャフトが緩まないように、内側の穴のそれぞれにAC接着剤を数滴使用しました。

さて、車輪の準備ができたら、ロボット全体の組み立てに進むことができます。まず、ステッピングモーターをベースプラットフォームに取り付ける必要があります。それらを所定の位置に固定するために、長さ12mmのM3ボルトを使用しました。

次に、ホイールをモーターのシャフトに取り付ける必要があります。私が作ったシャフトカプラーには、M3ナットを挿入するためのスロットがあり、M3ボルトが通過できるため、ホイールをシャフトに固定できます。

次に、トップカバーをベースに固定するために、ベースの2つの角にネジ棒を取り付けました。カバーの同じ位置に穴を開けたので、カバーを簡単に挿入してベースに固定することができました。

ベースの裏側には、後で電源スイッチを取り付けるための20mmの穴と、LEDを取り付けるための5mmの穴を開けました。

回路図

これで、電子機器に進むことができます。これがこのプロジェクトの完全な回路図です。

したがって、4つのDRV8825ステッピングドライバーを使用して4つのNEMA 17ステッピングモーターを制御します。または、A4988ステッピングドライバーを使用することもできます。ステッパーとロボット全体に電力を供給するために、12V電源を使用します。私の場合、約12Vを供給する3SLi-Poバッテリーを使用します。無線通信にはNRF24L01モジュールを使用し、Bluetooth通信にはHC-05Bluetoothモジュールを使用しています。また、バッテリー電圧を監視するために使用される単純な分圧器と、バッテリー電圧が11Vを下回る時期を示すためのLED接続も含まれています。

また、約3Aの電流を供給できる専用の5V電圧レギュレータも含まれています。これはオプションですが、将来のビデオでこのプロジェクトをArduinoロボットアームプロジェクトと組み合わせる予定です。そのためには、サーボモーターを駆動するために5Vが必要になります。

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

  • ステッピングモーター–NEMA17………………
  • DRV8825ステッピングドライバー…………………
  • NRF24L01トランシーバモジュール……。…
  • HC-05Bluetoothモジュール……………。…
  • Li-Poバッテリー……………………………。……
  • Arduinoメガボード…………………。…

PCBデザイン

それでも、電子部品を整理し、配線の混乱を取り除くために、EasyEDAの無料オンライン回路設計ソフトウェアを使用してカスタムPCBを設計しました。このPCBは、Arduino Megaボードの上に直接接続できるため、実際にはArduinoMEGAシールドとして機能します。接続の実行には、最上層と最下層の両方を使用しました。私が使用しなかったArdunoピンには、将来何かに使用したい場合に使用できるように、ピンヘッダー接続を含めました。また、12V、5V、GND接続ピン、およびドライバーのステッピング解像度を選択するためのピンも含まれています。

このPCBデザインのプロジェクトファイルへのリンクは次のとおりです。そのため、設計が完了したら、PCBの製造に必要なガーバーファイルを生成しました。

ガーバーファイル:

次に、このビデオのスポンサーでもあるJLCPCBにPCBを注文しました。

ここでは、ガーバーファイルをドラッグアンドドロップするだけで、アップロードしたら、ガーバービューアでPCBを確認できます。すべて問題がなければ、先に進んでPCBに必要なプロパティを選択できます。今回は、Arduinoボードの色と一致させるためにPCBの色を青に選択しました。これで、PCBをリーズナブルな価格で簡単に注文できるようになりました。 JLCPCBからの最初の注文の場合、わずか2ドルで最大10個のPCBを入手できることに注意してください。

数日後、PCBが到着しました。 PCBの品質は素晴らしく、すべてが設計とまったく同じです。

PCBの組み立て

これで、PCBを組み立てることができます。私は最初に小さなコンポーネント、抵抗器とコンデンサーをはんだ付けすることから始めました。次に、Arduinoボードに接続するために使用されるPCBにオスのピンヘッダーを挿入してはんだ付けしました。

次に、すべてのメスのピンヘッダーを所定の位置に配置し、それらもはんだ付けしました。ステッピングモーターの接続とステッピング分解能を選択するためのピンについては、オスのピンヘッダーを使用しました。このようにして、モーターをPCBに直接接続し、ジャンパーを使用してステッピング分解能を選択できます。次に、端子台、トリマー、電圧レギュレーターをはんだ付けしました。

これでPCBの準備が整い、ドライバーを挿入してモーターを接続することができます。まず、ステッピング解像度を選択するためのジャンパーを配置しました。ドライバのMS3ピンを5Vに接続して、16ステップの解像度を選択しました。

次に、それらの上にDRV8825ドライバーを配置し、NRF24L01モジュールとHC-05Bluetoothモジュールを接続しました。これで、PCBをArdunoボードに簡単に取り付けることができます。

次に、バッテリーを適切な端子台に接続し、ベースプラットフォームに配置しました。

ここでは、電源スイッチを所定の位置に挿入し、もう一方の端子台に接続しました。電源スイッチの真上にもバッテリーインジケーターLEDを挿入しました。

残っているのは、モーターをPCBに接続することです。ここで、反対側のモーターを接続するときは、それらのコネクターも反対側に接続する必要があることに注意してください。これは、後でロボットをプログラミングするときに必要になります。たとえば、forwardコマンドは、両方のモーターを同じ方向に動かしますが、実際には反転し、一方は時計回りに、もう一方は反時計回りに回転します。

最後に、上部にカバーを簡単に挿入できるので、このMecanumWheelsロボットプロジェクトは完了です。

Mecanum WheelsRobotArduinoコード

このビデオに残されているのは、Arduinoコードを確認することです。実際には、2つの別々のArduinoコードがあります。これはNRF24L01モジュールを使用してロボットを制御するためのもので、もう1つはスマートフォンを使用してロボットを制御するためのものです。

NRF24L01モジュールを使用してロボットを制御するためのArduinoコード:

/*
   === Arduino Mecanum Wheels Robot ===
     Radio control with NRF24L01 
  by Dejan, www.HowToMechatronics.com
  Libraries:
  RF24, https://github.com/tmrh20/RF24/
  AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <AccelStepper.h>

RF24 radio(48, 49);   // nRF24L01 (CE, CSN)

const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

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

int wheelSpeed = 1500;

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct 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;
}Code language: Arduino (arduino)

説明: したがって、ここでは、無線通信にRF24ライブラリを使用し、ステッピングモーターを制御するためにAccelStepperライブラリを使用しています。まず、すべてが接続されているピンを定義し、以下のプログラムに必要ないくつかの変数を定義し、セットアップセクションでステッパーの最大速度を設定して無線通信を開始する必要があります。

ループセクションでは、RC送信機からのデータを読み取ることから始めます。 RC送信機のコードと、この通信がどのように機能するかについての詳細は、私の特定のチュートリアルに記載されています。

したがって、受信したデータに応じて、たとえば、左側のジョイスティックを前方に移動すると、その値は160より大きくなり、そのような場合はmoveForward()カスタム関数が呼び出されます。この関数を見てみると、モーターの速度を正に設定するだけであることがわかります。後退する場合、速度は負に設定されます。したがって、他のすべての方向に移動するには、最初に説明したように、ホイールの回転を適切に設定する必要があります。

これらのコマンドを実行するには、ループセクションで、すべてのステッパーに対してrunSpeed()関数を呼び出す必要があります。ループセクションでは、バッテリーからの分圧器からのアナログ入力も読み取ります。この値に従って、バッテリー電圧が11V未満に低下する時期を知ることができるため、表示LEDをオンにすることができます。

スマートフォンを使用してロボットを制御するためのArduinoコード:

/*
   === Arduino Mecanum Wheels Robot ===
     Smartphone control via Bluetooth 
  by Dejan, www.HowToMechatronics.com
  Libraries:
  RF24, https://github.com/tmrh20/RF24/
  AccelStepper by Mike McCauley: http://www.airspayce.com/mikem/arduino/AccelStepper/index.html

*/

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

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 dataIn, m;

int lbw[50], lfw[50], rbw[50], rfw[50]; // for storing positions/steps
int index = 0;

void setup() {
  // Set initial seed values for the steppers
  LeftFrontWheel.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);
}Code language: Arduino (arduino)

Description: The other code for controlling the robot using the Android application, is very similar and works the same way. Here instead of the radio module we need to define the Bluetooth module and initialize its communication in the setup section. So again, first we read the incoming data from the smartphone or the Android app, and according to it, tell the robot in which direction to move.

If we take a look at the Android app we can see that it simply sends numbers from 0 to 15 through the Bluetooth when the buttons are pressed.

The app is made using the MIT App Inventor online application and you can find more details about it in my particular tutorial for it.

Here you can download this app as well as the editable project file:

For programming the automatic robot movement with this app, when we press the “SAVE” button we simply store the current positions of the stepper motors into arrays. Then when we press the “RUN” button, we call the runSteps() custom function which executes or runs through all stored steps using some for and while loops.

I hope you enjoyed this tutorial and learned something new. Feel free to ask any question in the comments section below and check my Arduino Projects Collection.


製造プロセス

  1. Bluetoothで制御されるRaspberryPi Robot
  2. サーボモーター付きロボット回避障害物
  3. ラインフォロワーロボット
  4. 音声制御ロボット
  5. Arduino制御ピアノロボット:PiBot
  6. Littlearm 2C:3DプリントされたArduinoロボットアームを構築する
  7. 自律型ホームアシスタントロボット
  8. AndroidアプリでArduinoロボットアームを制御する
  9. 超クールな屋内ナビゲーション用ロボット
  10. WiDC:Wi-Fi制御のFPVロボット
  11. Arduinoだけでスマートトーキングヒューマノイドロボット!