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

Kontrol Nirkabel Mobil Robot Arduino menggunakan Modul Transceiver HC-05 Bluetooth, NRF24L01 dan HC-12

Pada tutorial kali ini kita akan belajar cara mengontrol mobil robot Arduino secara wireless yang telah kita buat pada video sebelumnya. Saya akan menunjukkan kepada Anda tiga metode kontrol nirkabel yang berbeda, menggunakan modul Bluetooth HC-05, modul transceiver NRF24L01 dan modul nirkabel jarak jauh HC-12, serta menggunakan Smartphone dan aplikasi Android yang dibuat khusus. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini untuk lebih jelasnya.

Saya sudah memiliki tutorial tentang cara menghubungkan dan menggunakan masing-masing modul ini dengan papan Arduino, jadi jika Anda membutuhkan lebih banyak detail, Anda selalu dapat memeriksanya. Tautan ke masing-masing dari mereka dapat ditemukan di bawah dalam artikel.

Kontrol Mobil Robot Arduino Menggunakan Modul Bluetooth HC-05

Kita akan mulai dengan komunikasi Bluetooth, dan untuk itu kita memerlukan dua modul Bluetooth HC-05 yang perlu dikonfigurasi sebagai perangkat master dan slave.

Kita dapat dengan mudah melakukannya dengan menggunakan perintah AT, dan saya mengatur joystick menjadi master dan mobil robot Arduino menjadi slave. Berikut skema rangkaian lengkap untuk contoh ini:

Anda bisa mendapatkan komponen yang diperlukan untuk contoh ini dari tautan di bawah:

  • Modul Bluetooth HC-05 ………….…
  • Modul Joystick ………………………….
  • Baterai 18650 …………………………..
  • Pengisi Daya Baterai 18650………………
  • Sopir L298N ……………………………..
  • Motor DC Torsi Tinggi 12V …………
  • Dewan Arduino ……………………………

Kode Sumber

Kami akan menggunakan kode yang sama dari tutorial sebelumnya, di mana kami mengontrol mobil robot Arduino secara langsung menggunakan joystick, dan kami akan melakukan beberapa modifikasi.

Kode induk HC-05:

/*
   Arduino Robot Car Wireless Control using the HC-05 Bluetooth
   
                == MASTER DEVICE - Joystick ==
                   
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

int xAxis, yAxis;

void setup() {
  Serial.begin(38400); // Default communication rate of the Bluetooth module
}

void loop() {
  xAxis = analogRead(A0); // Read Joysticks X-axis
  yAxis = analogRead(A1); // Read Joysticks Y-axis
  
  // Send the values via the serial port to the slave HC-05 Bluetooth device
  Serial.write(xAxis/4); // Dividing by 4 for converting from 0 - 1023 to 0 - 256, (1 byte) range
  Serial.write(yAxis/4);
  delay(20);
}Code language: Arduino (arduino)

Kode di perangkat master, atau joystick cukup sederhana. Kita hanya perlu membaca nilai X dan Y dari joystick, yang sebenarnya mengatur kecepatan motor, dan mengirimkannya melalui port serial ke perangkat Bluetooth slave HC-05. Kita dapat mencatat di sini bahwa nilai analog joystick dari 0 hingga 1023 diubah menjadi nilai dari 0 hingga 255 dengan memasukkannya sebesar 4.

Kami melakukan ini karena rentang itu, dari 0 hingga 255, dapat dikirim, melalui perangkat Bluetooth, sebagai 1 byte yang lebih mudah diterima di sisi lain, atau di mobil robot Arduino.

Jadi di sini, jika serial telah menerima 2 byte, nilai X dan Y, menggunakan fungsi Serial.read() kita akan membaca keduanya.

// Code from the Arduino Robot Car

// Read the incoming data from the Joystick, or the master Bluetooth device
  while (Serial.available() >= 2) {
    x = Serial.read();
    delay(10);
    y = Serial.read();
  }Code language: Arduino (arduino)

Sekarang tinggal kita ubah nilainya kembali ke range 0 sampai 1023, cocok untuk kode kontrol motor di bawah ini, yang sudah kami jelaskan cara kerjanya di video sebelumnya.

// Code from the Arduino Robot Car

// Convert back the 0 - 255 range to 0 - 1023, suitable for motor control code below
xAxis = x*4;
yAxis = y*4;Code language: Arduino (arduino)

Catatan singkat bahwa saat mengunggah kode, kita perlu melepaskan pin RX dan TX dari papan Arduino.

Kode Budak HC-05 Lengkap:

/*
   Arduino Robot Car Wireless Control using the HC-05 Bluetooth

             == SLAVE DEVICE - Arduino robot car ==

   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 4
#define in2 5
#define enB 10
#define in3 6
#define in4 7

int xAxis, yAxis;
unsigned int  x = 0;
unsigned int  y = 0;

int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  Serial.begin(38400); // Default communication rate of the Bluetooth module
}

void loop() {
  // Default value - no movement when the Joystick stays in the center
  x = 510 / 4;
  y = 510 / 4;

  // Read the incoming data from the Joystick, or the master Bluetooth device
  while (Serial.available() >= 2) {
    x = Serial.read();
    delay(10);
    y = Serial.read();
  }
  delay(10);
  // Convert back the 0 - 255 range to 0 - 1023, suitable for motor control code below
  xAxis = x*4;
  yAxis = y*4;

  // Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }

  // X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  if (xAxis > 550) {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}Code language: Arduino (arduino)

Kontrol Mobil Robot Arduino Menggunakan Smartphone dan Aplikasi Android Custom-build

Selanjutnya, mari kita lihat bagaimana kita dapat mengontrol mobil robot Arduino kita menggunakan aplikasi Android custom-build. Skema rangkaian mobil robot sama persis dengan contoh sebelumnya, dengan mode Bluetooth HC-05 yang disetel sebagai perangkat pendukung.

Di sisi lain, dengan menggunakan aplikasi online MIT App Inventor, kami akan membuat aplikasi Android kami sendiri, dan inilah tampilannya.

Jadi pada dasarnya aplikasi ini mensimulasikan joystick, yang tampilannya terbuat dari dua gambar, atau sprite gambar.

Jika kita melihat blok aplikasi ini, kita dapat melihat bahwa ketika sprite joystick diseret, gambar bola joystick dipindahkan ke lokasi jari kita saat ini, dan pada saat yang sama kita mengirim X dan Y nilai melalui Bluetooth ke mobil Arduino.

Nilai-nilai ini diterima oleh Arduino dengan cara yang sama seperti pada contoh sebelumnya, menggunakan fungsi Serial.read.

// Read the incoming data from the Smartphone Android App
  while (Serial.available() >= 2) {
    x = Serial.read();
    delay(10);
    y = Serial.read();
  }Code language: Arduino (arduino)

Apa yang perlu kita lakukan tambahan di sini adalah untuk mengubah nilai X dan Y yang diterima dari smartphone ke kisaran 0 hingga 1023, cocok untuk kode kontrol motor di bawah ini. Nilai ini bergantung pada ukuran kanvas, dan nilai X dan Y yang saya dapatkan dari aplikasi saya adalah dari 60 hingga 220, yang menggunakan fungsi map() saya dengan mudah mengonversinya.

// Makes sure we receive corrent values
  if (x > 60 & x < 220) {
    xAxis = map(x, 220, 60, 1023, 0); // Convert the smartphone X and Y values to 0 - 1023 range, suitable motor for the motor control code below
  }
  if (y > 60 & y < 220) {
    yAxis = map(y, 220, 60, 0, 1023);
  }Code language: Arduino (arduino)

Pada blok aplikasi, kita juga dapat melihat bahwa ketika sprite gambar disentuh, bola joystick bergerak kembali ke tengah kanvas dan nilai yang sesuai dikirim ke mobil agar berhenti bergerak. Anda dapat menemukan dan mengunduh aplikasi ini di artikel situs web, serta, dua gambar joystick sehingga Anda dapat membuat sendiri atau memodifikasi aplikasi ini.

Anda dapat mengunduh Aplikasi Android di bawah ini, serta dua gambar untuk joystick:

Arduino_Robot_Car_Joystick_App.apk

1 file 1.62 MB Unduh

Arduino_Robot_Car_Joystick_App_aia_file

1 file 171.20 KB Unduh

Gambar Aplikasi Joystick

1 file 44.36 KB Unduh

Kode Arduino lengkap:

/*
   Arduino Robot Car Wireless Control using the HC-05 Bluetooth and custom-build Android app

             == SLAVE DEVICE - Arduino robot car ==

   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 4
#define in2 5
#define enB 10
#define in3 6
#define in4 7

int xAxis, yAxis;
int  x = 0;
int  y = 0;

int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  Serial.begin(38400); // Default communication rate of the Bluetooth module
}

void loop() {
  // Default value - no movement when the Joystick stays in the center
  xAxis = 510;
  yAxis = 510;

  // Read the incoming data from the Smartphone Android App
  while (Serial.available() >= 2) {
    x = Serial.read();
    delay(10);
    y = Serial.read();
  }
  delay(10);
  
  // Makes sure we receive corrent values
  if (x > 60 & x < 220) {
    xAxis = map(x, 220, 60, 1023, 0); // Convert the smartphone X and Y values to 0 - 1023 range, suitable motor for the motor control code below
  }
  if (y > 60 & y < 220) {
    yAxis = map(y, 220, 60, 0, 1023);
  }

  // Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }

  // X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  if (xAxis > 550) {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}Code language: Arduino (arduino)

Kontrol Nirkabel Mobil Robot Arduino Menggunakan Modul Transceiver NRF24L01

Sekarang kita dapat beralih ke metode berikutnya, kontrol nirkabel mobil robot Arduino menggunakan modul transceiver NRF24L01.

Berikut skema rangkaiannya. Kita dapat mencatat bahwa modul ini menggunakan komunikasi SPI, jadi dibandingkan dengan contoh sebelumnya, saya telah memindahkan pin Enable A dan Enable B dari driver L298N ke pin nomor 2 dan 3 dari papan Arduino. Anda bisa mendapatkan NRF24L01 modul di tautan Amazon berikut.

Kode Sumber

Untuk contoh ini kita perlu menginstal perpustakaan RF24. Dengan cara yang mirip dengan contoh sebelumnya, setelah menentukan beberapa pin dan menyiapkan modul sebagai pemancar, kami membaca nilai X dan Y dari joystick dan mengirimkannya ke modul NRF24L01 lainnya di mobil robot Arduino.

Pertama kita dapat mencatat bahwa pembacaan analog adalah String, yang menggunakan fungsi string.toCharArray() dimasukkan ke dalam array karakter. Kemudian menggunakan fungsi radio.write() kami mengirim data array karakter tersebut ke modul lain.

Kode pemancar:

/*
   Arduino Robot Car Wireless Control using the NRF24L01 Transceiver module

             == Transmitter - Joystick ==

   by Dejan Nedelkovski, www.HowToMechatronics.com

   Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

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

RF24 radio(8, 9); // CE, CSN
const byte address[6] = "00001";

char xyData[32] = "";
String xAxis, yAxis;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  
  xAxis = analogRead(A0); // Read Joysticks X-axis
  yAxis = analogRead(A1); // Read Joysticks Y-axis
  // X value
  xAxis.toCharArray(xyData, 5); // Put the String (X Value) into a character array
  radio.write(&xyData, sizeof(xyData)); // Send the array data (X value) to the other NRF24L01 modile
  // Y value
  yAxis.toCharArray(xyData, 5);
  radio.write(&xyData, sizeof(xyData));
  delay(20);
}Code language: Arduino (arduino)

Di sisi lain. di mobil robot Arduino, setelah mendefinisikan modul sebagai penerima, kami menerima data menggunakan fungsi radio.read(). Kemudian menggunakan fungsi atoi() kita mengubah data yang diterima, atau nilai X dan Y dari joystick, menjadi nilai integer, yang sesuai untuk kode kontrol motor di bawah ini.

// Code from the Arduino Robot Car - NRF24L01 example

if (radio.available()) {   // If the NRF240L01 module received data
    radio.read(&receivedData, sizeof(receivedData)); // Read the data and put it into character array
    xAxis = atoi(&receivedData[0]); // Convert the data from the character array (received X value) into integer
    delay(10);
    radio.read(&receivedData, sizeof(receivedData));
    yAxis = atoi(&receivedData[0]);
    delay(10);
  }Code language: Arduino (arduino)

Sesederhana itu, tetapi tentu saja seperti yang sudah saya katakan, jika Anda memerlukan detail lebih lanjut tentang cara menghubungkan dan menyiapkan modul, Anda selalu dapat memeriksa tutorial khusus saya untuk itu.

Kode penerima:

/*
   Arduino Robot Car Wireless Control using the NRF24L01 Transceiver module

             == Receiver - Arduino robot car ==

   by Dejan Nedelkovski, www.HowToMechatronics.com

   Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define enA 2   // Note: Pin 9 in previous video ( pin 10 is used for the SPI communication of the NRF24L01)
#define in1 4
#define in2 5
#define enB 3   // Note:  Pin 10 in previous video
#define in3 6
#define in4 7

RF24 radio(8, 9); // CE, CSN
const byte address[6] = "00001";

char receivedData[32] = "";
int  xAxis, yAxis;

int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {

  if (radio.available()) {   // If the NRF240L01 module received data
    radio.read(&receivedData, sizeof(receivedData)); // Read the data and put it into character array
    xAxis = atoi(&receivedData[0]); // Convert the data from the character array (received X value) into integer
    delay(10);
    radio.read(&receivedData, sizeof(receivedData));
    yAxis = atoi(&receivedData[0]);
    delay(10);
  }
  
  // Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }

  // X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  if (xAxis > 550) {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}Code language: Arduino (arduino)

Kontrol Nirkabel Mobil Robot Arduino Menggunakan HC-12 Transceiver Jarak Jauh

Untuk metode terakhir kontrol nirkabel mobil robot Arduino, kami akan menggunakan modul transceiver jarak jauh HC-12. Modul-modul ini dapat berkomunikasi satu sama lain dengan jarak hingga 1,8 km.

Skema rangkaian untuk contoh ini hampir sama dengan skema untuk modul Bluetooth HC-05, karena menggunakan metode yang sama untuk komunikasi dengan Arduino, melalui port serial.

Anda bisa mendapatkan modul Transceiver HC-12 di tautan Amazon berikut.

Kode Sumber

Kode Joystick sama persis dengan kode untuk komunikasi Bluetooth. Kami hanya membaca nilai analog joystick dan mengirimkannya ke modul lain menggunakan fungsi Serial.write().

Kode pemancar:

/*
   Arduino Robot Car Wireless Control using the HC-12 long range wireless module
   
                == Transmitter - Joystick ==
                   
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

int xAxis, yAxis;

void setup() {
  Serial.begin(9600); // Default communication rate of the Bluetooth module
}

void loop() {
  xAxis = analogRead(A0); // Read Joysticks X-axis
  yAxis = analogRead(A1); // Read Joysticks Y-axis
  
  // Send the values via the serial port to the slave HC-05 Bluetooth device
  Serial.write(xAxis/4); // Dividing by 4 for converting from 0 - 1023 to 0 - 256, (1 byte) range
  Serial.write(yAxis/4);
  delay(20);
}Code language: Arduino (arduino)

Di sisi lain, dengan loop while() kita menunggu sampai data tiba, kemudian membacanya menggunakan fungsi Serial.read() dan mengubahnya kembali menjadi rentang 0 hingga 1023, cocok untuk kode kontrol motor di bawah ini.

Kode penerima:

/*
   Arduino Robot Car Wireless Control using the HC-12 long range wireless module

             == Receiver - Arduino robot car ==

   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#define enA 9
#define in1 4
#define in2 5
#define enB 10
#define in3 6
#define in4 7

int xAxis, yAxis;
int  x = 0;
int  y = 0;

int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  Serial.begin(9600); // Default communication rate of the Bluetooth module
}

void loop() {
  // Default value - no movement when the Joystick stays in the center
  xAxis = 510;
  yAxis = 510;

  // Read the incoming data from the 
  while (Serial.available() == 0) {}
  x = Serial.read();
  delay(10);
  y = Serial.read();
  delay(10);

  // Convert back the 0 - 255 range to 0 - 1023, suitable for motor control code below
  xAxis = x * 4;
  yAxis = y * 4;

  // Y-axis used for forward and backward control
  if (yAxis < 470) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }

  // X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  if (xAxis > 550) {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}Code language: Arduino (arduino)

Jadi itu cukup banyak untuk tutorial ini. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah.


Proses manufaktur

  1. Robot Raspberry Pi dikendalikan melalui Bluetooth
  2. Kontrol Jarak Jauh Universal menggunakan Arduino, 1Sheeld, dan Android
  3. Voltmeter DIY Menggunakan Arduino dan Smartphone
  4. Arduino dengan Bluetooth untuk Mengontrol LED!
  5. Kontrol Arduino Rover menggunakan Firmata dan Pengontrol Xbox One
  6. Penghitung Mobil menggunakan Arduino + Pemrosesan + PHP
  7. Kontrol Penuh TV Anda Menggunakan Alexa dan Arduino IoT Cloud
  8. Radio FM Menggunakan Arduino dan RDA8057M
  9. BLUE_P:Perisai Pemrograman Arduino Nirkabel
  10. Kontrol Mobil dengan Arduino Uno dan Bluetooth