Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Robot Roda Mecanum Arduino

Dalam tutorial ini kita akan belajar bagaimana membangun Robot Roda Arduino Mecanum yang mampu bergerak ke segala arah. Mobilitas unik robot ini dicapai dengan menggunakan roda jenis khusus, yang disebut Roda Mecanum.

Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Ringkasan

Saya benar-benar mendesain dan mencetak roda ini secara 3D karena harganya bisa sedikit mahal untuk dibeli. Mereka bekerja dengan cukup baik dan saya harus mengatakan bahwa mengendarai platform robot ini sangat menyenangkan. Kami dapat mengontrol robot secara nirkabel menggunakan modul radio transceiver NRF24L01, atau dalam kasus saya, saya menggunakan Pemancar RC DIY yang saya buat di salah satu video saya sebelumnya.

Saya juga memungkinkan untuk dikontrol menggunakan smartphone melalui komunikasi Bluetooth. Saya membuat aplikasi Android khusus di mana kita dapat mengontrol robot roda Mecanum untuk bergerak ke segala arah. Selain itu, dengan menggunakan penggeser di aplikasi, kita dapat mengontrol kecepatan gerakan.

Otak dari platform robot ini adalah papan Arduino Mega yang mengontrol setiap roda secara individual. Setiap roda terpasang pada motor stepper NEMA 17, dan mengetahui fakta bahwa motor stepper dapat dikontrol dengan tepat, saya menambahkan satu lagi fitur keren di aplikasi yang melaluinya kita dapat memprogram robot untuk bergerak secara otomatis. Menggunakan tombol Simpan kita dapat menyimpan setiap posisi atau langkah dan kemudian robot dapat secara otomatis menjalankan dan mengulangi langkah-langkah tersebut. Dengan tombol yang sama, kita dapat menjeda operasi otomatis serta mengatur ulang atau menghapus semua langkah sehingga kita dapat menyimpan yang baru.

Model 3D Robot Roda Mecanum

Pertama-tama, saya merancang robot Roda Mecanum ini menggunakan perangkat lunak pemodelan 3D. Platform dasar robot ini adalah kotak sederhana yang akan saya buat dari papan MDF tick 8mm.

Empat motor stepper terpasang ke platform ini dan roda Mecanum terpasang ke poros motor.

Anda dapat menemukan dan mengunduh model 3D ini, serta menjelajahinya di browser Anda di Thangs.

Unduh model 3D rakitan dari Thangs.

File STL untuk pencetakan 3D:

Cara Kerja Roda Mecanum

Roda Mecanum adalah roda dengan rol yang terpasang pada kelilingnya. Rol ini diposisikan secara diagonal atau pada sudut 45 derajat terhadap sumbu rotasi roda. Ini membuat roda mengerahkan gaya ke arah diagonal saat bergerak maju mundur.

Jadi, dengan memutar roda dalam pola tertentu, kami memanfaatkan gaya diagonal ini sehingga robot dapat bergerak ke segala arah.

Kami juga harus mencatat di sini bahwa kami membutuhkan dua jenis roda Mecanum, sering disebut sebagai, roda Mecanum tangan kiri dan tangan kanan. Perbedaan di antara mereka adalah orientasi rol dan mereka harus dipasang di robot di lokasi tertentu. Sumbu rotasi dari setiap roller atas roda harus mengarah ke bagian tengah robot.

Berikut adalah demonstrasi singkat tentang cara robot bergerak tergantung pada arah putaran roda.

Jika keempat roda bergerak maju maka hasil gerakan robot akan maju, begitu pula sebaliknya jika semua roda bergerak mundur maka robot akan bergerak mundur. Untuk bergerak ke kanan, roda kanan perlu berputar di dalam robot, sedangkan roda kiri perlu berputar di luar robot. Gaya yang dihasilkan akibat posisi roller secara diagonal akan membuat robot bergerak ke kanan. Hal yang sama tetapi sebaliknya terjadi ketika bergerak ke kiri. Dengan roda-roda ini kita juga dapat mencapai gerakan dalam arah diagonal dengan hanya memutar dua roda.

Membuat Robot Roda Mecanum

Namun demikian, sekarang izinkan saya menunjukkan kepada Anda bagaimana saya membangun platform robot ini. Seperti yang saya sebutkan, untuk membuat dasar platform saya menggunakan papan MDF tick 8mm. Menggunakan gergaji meja, pertama-tama saya memotong semua bagian sesuai dengan dimensi model 3D.

Selanjutnya, dengan menggunakan bor 3mm dan mata bor Forstner 25mm saya membuat bukaan pada panel samping untuk memasang motor stepper. Setelah saya mendapatkan potongan-potongannya, saya melanjutkan dengan merakitnya. Saya menggunakan lem kayu dan beberapa sekrup untuk mengencangkannya. Yang paling penting di sini adalah membuat bukaan untuk motor dibuat dengan tepat sehingga semua roda nantinya akan bersentuhan dengan permukaan.

Tentu saja, Anda juga dapat mencetak 3D platform dasar ini, daripada membuatnya dengan MDF, jadi saya akan menyertakan file 3D-nya di artikel situs web. Terakhir, saya semprotkan cat dasar dan tutup dengan warna putih.

Berikutnya adalah roda Mecanum. Seperti yang saya katakan sebelumnya, velg ini bisa sedikit mahal untuk dibeli, jadi itulah mengapa saya memutuskan untuk mendesain dan mencetak 3D milik saya sendiri. Roda terbuat dari dua bagian, sisi luar dan dalam yang diikat bersama dengan beberapa baut dan mur M4. Masing-masing memiliki 10 rol, dan coupler poros yang dirancang khusus agar sesuai dengan motor stepper NEMA 17.

Saya mencetak 3D semua bagian untuk roda Mecanum menggunakan printer 3D Creality CR-10 saya.

Berikut adalah link ke printer 3D ini jika Anda ingin memeriksanya.

Jadi, setelah saya menyiapkan bagian cetakan 3D, saya melanjutkan dengan membuat poros untuk rol. Untuk itu, saya menggunakan kawat baja tick 3 mm. Panjang poros harus sekitar 40mm, jadi menggunakan alat putar saya memotong kawat sepanjang itu.

Saya mulai merakit roda Mecanum dengan mengamankan kedua sisi dan coupler poros menggunakan empat baut dan mur M4. Panjang baut harus 45mm.

Untuk memasang rol, pertama-tama kita perlu memasukkan sedikit poros melalui lubang yang terletak di keliling sisi dalam.

Kemudian kita dapat memasukkan mesin cuci M3 kecil, memasukkan roller dan mendorong poros sepenuhnya ke dalam slot sisi luar roda. Saya menggunakan mesin cuci tunggal karena saya tidak memiliki cukup ruang untuk memasukkan mesin cuci kedua di sisi lain.

Saya mengulangi proses ini untuk semua 10 rol. Sebenarnya mudah dan menyenangkan merakit roda ini. Yang penting di sini adalah roller harus bisa bergerak bebas.

Pada akhirnya saya menggunakan beberapa tetes lem AC di setiap lubang bagian dalam untuk memastikan poros tidak lepas.

Ok jadi setelah roda siap sekarang kita bisa melanjutkan dengan merakit seluruh robot. Pertama, kita perlu memasang motor stepper ke platform dasar. Untuk mengamankannya di tempatnya, saya menggunakan baut M3 dengan panjang 12mm.

Selanjutnya, kita perlu memasang roda ke poros motor. Shaft coupler yang saya buat memiliki slot untuk memasukkan mur M3, yang dapat dilalui oleh baut M3 sehingga kami dapat mengencangkan roda ke poros.

Selanjutnya, untuk mengamankan penutup atas ke alas, saya memasang batang berulir di dua sudut alas. Saya membuat lubang pada posisi yang sama pada penutup sehingga saya dapat dengan mudah memasukkan dan mengencangkan penutup ke alasnya.

Di bagian belakang alas saya membuat lubang 20mm untuk memasang saklar daya nanti, serta lubang 5mm untuk memasang LED.

Diagram Sirkuit

Sekarang kita bisa melanjutkan dengan elektronik. Berikut diagram rangkaian lengkap dari proyek ini.

Jadi keempat motor stepper NEMA 17 akan kita kendalikan menggunakan empat driver stepper DRV8825, atau bisa juga kita menggunakan driver stepper A4988. Untuk menyalakan stepper dan seluruh robot kami akan menggunakan catu daya 12V, dan dalam kasus saya, saya akan menggunakan baterai Li-Po 3S yang menyediakan sekitar 12V. Untuk komunikasi radio kami menggunakan modul NRF24L01, dan untuk komunikasi Bluetooth kami menggunakan modul Bluetooth HC-05. Saya juga menyertakan pembagi tegangan sederhana yang akan digunakan untuk memantau tegangan baterai dan sambungan LED untuk menunjukkan kapan tegangan baterai akan turun di bawah 11V.

Saya juga menyertakan regulator tegangan 5V khusus yang dapat menyediakan sekitar 3A arus. Ini opsional, tetapi saya berencana di video mendatang untuk menggabungkan proyek ini dengan proyek Lengan Robot Arduino saya, dan untuk tujuan itu saya memerlukan 5V untuk menggerakkan motor servonya.

Anda bisa mendapatkan komponen yang dibutuhkan untuk proyek ini dari tautan di bawah ini:

  • Motor Stepper – NEMA 17………………
  • DRV8825 Stepper Driver………………
  • Modul Pemancar NRF24L01…….…
  • Modul Bluetooth HC-05 …………….…
  • Baterai Li-Po …………………………….……
  • Arduino Mega Board ………………….…

Desain PCB

Namun demikian, untuk menjaga komponen elektronik tetap teratur dan menghilangkan kekacauan kabel, saya merancang PCB khusus menggunakan perangkat lunak desain sirkuit online gratis EasyEDA. PCB ini sebenarnya akan bertindak sebagai shield Arduino MEGA karena kita akan bisa langsung menghubungkannya di atas board Arduino Mega. Saya menggunakan lapisan atas dan bawah untuk menjalankan koneksi. Untuk pin Arduno yang tidak saya gunakan, saya menyertakan koneksi pin header sehingga tersedia jika kita ingin menggunakannya untuk sesuatu di masa mendatang. Saya juga menyertakan pin koneksi 12V, 5V, dan GND, serta pin untuk memilih resolusi loncatan driver.

Berikut link ke file proyek desain PCB ini. Jadi, setelah saya menyelesaikan desain, saya membuat file Gerber yang diperlukan untuk membuat PCB.

File Gerber:

Kemudian saya memesan PCB dari JLCPCB yang juga menjadi sponsor video ini.

Di sini kita cukup drag dan drop file Gerber dan setelah diunggah, kita dapat meninjau PCB kita di penampil Gerber. Jika semuanya baik-baik saja maka kita dapat melanjutkan dan memilih properti yang kita inginkan untuk PCB kita. Kali ini saya memilih warna PCB menjadi biru agar sesuai dengan warna papan Arduino. Dan hanya itu, sekarang kami dapat memesan PCB kami dengan harga yang wajar. Perhatikan bahwa jika ini adalah pesanan pertama Anda dari JLCPCB, Anda bisa mendapatkan hingga 10 PCB hanya dengan $2.

Setelah beberapa hari PCB telah tiba. Kualitas PCB sangat bagus dan semuanya sama persis dengan desainnya.

Merakit PCB

Ok sekarang kita bisa melanjutkan dan merakit PCB. Saya mulai dengan menyolder komponen yang lebih kecil terlebih dahulu, resistor dan kapasitor. Kemudian saya memasukkan dan menyolder male pin header ke PCB yang akan digunakan untuk menghubungkannya ke board Arduino.

Selanjutnya, saya menempatkan semua pin header perempuan di tempatnya dan menyoldernya juga. Adapun koneksi dan pin motor stepper untuk memilih resolusi loncatan saya menggunakan header pin male. Dengan cara ini kita dapat langsung menghubungkan motor ke PCB dan menggunakan jumper untuk memilih resolusi loncatan. Kemudian saya menyolder blok terminal, trimmer, dan pengatur tegangan.

Dan itu saja, PCB sekarang sudah siap dan kita dapat melanjutkan dengan memasukkan driver dan menghubungkan motor ke sana. Pertama, saya menempatkan jumper untuk memilih resolusi loncatan. Saya memilih resolusi langkah ke-16 dengan menghubungkan pin MS3 driver ke 5V.

Kemudian di atasnya saya menempatkan driver DRV8825, serta menghubungkan modul NRF24L01 dan modul Bluetooth HC-05. Sekarang kita dapat dengan mudah memasang PCB ke board Arduino.

Selanjutnya, saya menghubungkan baterai ke blok terminal yang sesuai dan menempatkannya ke platform dasar.

Di sini saya memasukkan sakelar daya di tempatnya dan menghubungkannya ke blok terminal lainnya. Tepat di atas sakelar daya, saya juga memasukkan LED indikator baterai.

Yang tersisa sekarang adalah menghubungkan motor ke PCB. Kita harus mencatat di sini bahwa ketika menghubungkan motor yang berlawanan, kita juga harus menghubungkan konektornya yang berlawanan. Ini diperlukan nanti ketika memprogram robot, sehingga, misalnya, perintah maju, akan menggerakkan kedua motor ke arah yang sama, meskipun sebenarnya terbalik dan yang satu akan membuat putaran searah jarum jam dan yang lainnya berlawanan arah jarum jam.

Pada akhirnya saya dapat dengan mudah memasukkan penutup di bagian atas, dan kita selesai dengan proyek robot Roda Mecanum ini.

Kode Arduino Robot Roda Mecanum

Apa yang tersisa untuk video ini adalah melihat kode Arduino. Sebenarnya, ada dua kode Arduino yang terpisah. Yang satu ini untuk mengendalikan robot menggunakan modul NRF24L01 dan yang lainnya untuk mengendalikan robot menggunakan smartphone.

Kode Arduino untuk mengendalikan robot menggunakan modul NRF24L01:

/*
   === 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)

Deskripsi: Jadi, di sini kita menggunakan library RF24 untuk komunikasi radio dan library AccelStepper untuk mengontrol motor stepper. Pertama, kita perlu menentukan pin yang semuanya terhubung, mendefinisikan beberapa variabel yang diperlukan untuk program di bawah ini, dan di bagian penyiapan, atur kecepatan maksimum stepper dan mulai komunikasi radio.

Di bagian loop kita mulai dengan membaca data yang berasal dari pemancar RC. Kode pemancar RC serta detail lebih lanjut bagaimana komunikasi ini bekerja dapat ditemukan di tutorial khusus saya untuk itu.

Jadi tergantung pada data yang diterima, misalnya, jika Joystick kiri dipindahkan ke depan, nilainya akan lebih besar dari 160 dan dalam kasus seperti itu akan memanggil fungsi kustom moveForward(). Jika kita melihat pada fungsi ini, kita dapat melihat bahwa yang dilakukannya hanyalah mengatur kecepatan motor menjadi positif. Untuk bergerak mundur, kecepatan disetel ke negatif. Jadi untuk bergerak ke segala arah lain kita hanya perlu mengatur putaran roda dengan tepat seperti yang dijelaskan di awal.

Untuk menjalankan perintah ini, di bagian loop kita perlu memanggil fungsi runSpeed() untuk semua stepper. Pada bagian loop kita juga membaca input analog dari pembagi tegangan yang berasal dari baterai, dan berdasarkan nilai ini kita dapat mengetahui kapan tegangan baterai akan turun di bawah 11V sehingga kita dapat menyalakan LED penunjuk.

Kode Arduino untuk mengendalikan robot menggunakan smartphone:

/*
   === 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)

Deskripsi: Kode lain untuk mengendalikan robot menggunakan aplikasi Android, sangat mirip dan bekerja dengan cara yang sama. Di sini, alih-alih modul radio, kita perlu mendefinisikan modul Bluetooth dan menginisialisasi komunikasinya di bagian penyiapan. Jadi sekali lagi, pertama-tama kita membaca data yang masuk dari smartphone atau aplikasi Android, dan menurut itu, memberitahu robot ke arah mana harus bergerak.

Jika kita melihat pada aplikasi Android, kita dapat melihat bahwa aplikasi ini hanya mengirimkan angka dari 0 hingga 15 melalui Bluetooth saat tombol ditekan.

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.

Saya harap Anda menikmati tutorial ini dan belajar sesuatu yang baru. Feel free to ask any question in the comments section below and check my Arduino Projects Collection.


Proses manufaktur

  1. Robot Raspberry Pi dikendalikan melalui Bluetooth
  2. Hambatan Menghindari Robot Dengan Motor Servo
  3. Robot Pengikut Baris
  4. Robot yang Dikendalikan Bicara
  5. Robot Piano Terkendali Arduino:PiBot
  6. Littlearm 2C:Membangun Lengan Robot Arduino Cetak 3D
  7. Robot Asisten Rumah Otonom
  8. Kontrol Lengan Robot Arduino dengan Aplikasi Android
  9. Robot untuk navigasi dalam ruangan yang sangat keren
  10. WiDC:Robot FPV Terkendali Wi-Fi