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

Penerima RC Arduino DIY untuk Model RC dan Proyek Arduino

Dalam tutorial ini kita akan belajar cara membuat receiver RC berbasis Arduino. Sejak saya membuat transmitter Arduino RC DIY di salah satu video saya sebelumnya, saya mendapat banyak permintaan dari kalian, untuk membuat receiver khusus untuk itu, jadi ini dia.

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

Sekarang kedua perangkat ini dapat dengan mudah berkomunikasi dan kita dapat menggunakannya untuk mengontrol banyak hal secara nirkabel. Saya akan menjelaskan bagaimana semuanya bekerja melalui beberapa contoh. Pada contoh pertama kita akan menggunakan receiver Arduino RC ini untuk mengendalikan sebuah mobil sederhana yang terdiri dari dua buah motor DC. Dalam contoh kedua saya akan menunjukkan kepada Anda bagaimana mengontrol motor dan servo tanpa sikat, yang merupakan komponen umum yang ditemukan di banyak pesawat RC komersial, kapal, mobil, dan sebagainya. Jika kita tahu cara mengontrolnya, kita dapat dengan mudah memodifikasi dan mengontrol banyak model RC dengan pemancar Arduino yang kita buat sendiri.

Sebagai contoh ketiga saya akan menunjukkan kepada Anda bagaimana saya memodifikasi dan menggunakan sistem RC berbasis Arduino ini untuk mengendalikan mobil RC komersial.

Diagram Sirkuit Penerima RC Arduino

Untuk memulainya, mari kita lihat diagram rangkaian sistem ini. Komunikasi radio didasarkan pada modul transceiver NRF24L01.

Pemancar terus-menerus mengirimkan data dari pengontrolnya, joystick, tombol, potensiometer, dan sakelar sakelar, dan kami menerima data ini dengan penerima. Untuk detail lebih lanjut bagaimana pemancar Arduino ini bekerja, Anda dapat memeriksa tutorial terperinci saya yang lain untuk itu.

Kami juga dapat mencatat di sini bahwa penerima RC ini tidak harus bekerja hanya dengan Pemancar khusus yang saya buat ini. Ini dapat bekerja dengan pengaturan serupa lainnya yang terdiri dari papan Arduino dan modul NRF24L01.

Namun demikian, otak dari penerima RC ini adalah papan Arduino Pro Mini. Untuk memberi daya, kita dapat menggunakan pin VCC yang dapat kita sambungkan 5V, atau pin RAW yang dapat kita sambungkan dari 6 hingga 12V. Perhatikan bahwa ada dua versi Arduino Pro Mini, seperti yang saya gunakan di sini yang beroperasi pada 5V dan yang lainnya beroperasi pada 3.3V. Di sisi lain, modul NRF24L01 beroperasi pada tegangan 3.3V, oleh karena itu diperlukan pengatur tegangan. Kali ini saya menggunakan regulator tegangan AMS1117, yang menghasilkan 3.3V dari input yang dapat berkisar dari 5V hingga 12V.

Anda bisa mendapatkan komponen yang dibutuhkan untuk Arduino RC Receiver ini dari link di bawah ini:

  • Modul Pemancar NRF24L01…….………
  • NRF24L01 + PA + LNA …………………..…….
  • AMS1117 3.3V Voltage regulator ………..
  • Pin Header Pria + Wanita ……………….. Amazon / Banggood / AliExpress
  • Arduino Pro Mini………………..……..………..
  • Arduino Pro Mini seperti yang saya gunakan……

Untuk komunikasi dengan Arduino, modul NRF24L01 menggunakan protokol SPI, ditambah dua pin digital tambahan. Artinya, tersisa 9 pin digital yang dapat digunakan sebagai saluran output, dua di antaranya adalah pin RX dan TX. Perlu dicatat, bahwa pin ini harus diputuskan dari apa pun saat kami mengunggah sketsa ke papan Arduino, jadi oleh karena itu saya memungkinkan untuk dihubungkan atau diputuskan melalui header pin yang terpisah. Sebenarnya kita juga bisa menggunakan input analog sebagai output digital, jadi meskipun board Arduino ini cukup kecil, kita punya banyak output atau channel yang tersedia.

Desain PCB

Namun demikian, untuk menjaga agar sirkuit ini tetap kompak, saya membuat PCB khusus menggunakan perangkat lunak desain sirkuit online gratis EasyEDA. Di sini, saya mengatur 8 saluran tepat di sebelah 5V dan rel Ground, sehingga kami dapat langsung menghubungkan servo dan ECS ke sana. Nomor saluran 9 terletak di posisi terpisah, di dekat pin VCC Arduino, jadi kita dapat menggunakan misalnya, ESC untuk memberi daya pada Arduino dengan fitur Sirkuit Penghapus Baterai yang menyediakan 5V. Tentu saja, kita dapat menggunakan saluran lain untuk tujuan itu, karena pin VCC juga terhubung ke rel 5V tersebut.

Sedangkan untuk channel nomor 7 dan 8, kita bisa lihat disini bagaimana ada interupsi dengan pin header tersebut. Jika kita ingin menggunakannya, kita hanya perlu menghubungkan kedua pin secara bersamaan. Header pemrograman terletak di sudut kanan atas dan kapasitor 100uF berfungsi untuk pengatur tegangan dan modul NRF24L01. Di sudut kiri bawah PCB, saya menempatkan pin analog.

Di sini kita dapat mencatat satu hal lagi, dan bahwa beberapa papan Arduino Pro Mini mungkin memiliki pengaturan pin yang berbeda, oleh karena itu saya menyertakan satu versi lagi dari PCB sehingga Anda dapat memilih yang cocok dengan papan Arduino Pro Mini Anda.

Berikut tautan ke file proyek 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. 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 5 PCB hanya dengan $2.

Perakitan PCB

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

Sekarang kita bisa melanjutkan dan merakit PCB. Pertama, kita perlu menyolder pin header papan Arduino. Cara mudah untuk melakukannya adalah dengan menggunakan papan tempat memotong roti untuk menempelkan pin header di dalamnya sehingga papan akan tetap kokoh di tempatnya saat menyolder. Seperti yang saya katakan sebelumnya, tergantung pada papan Anda, pin mungkin sedikit berbeda, jadi ingatlah itu saat menyoldernya.

Juga, ada beberapa pin Ground yang harus kita biarkan bebas karena ada beberapa jejak yang berjalan di PCB di bawahnya. Setelah saya menyolder papan Arduino, saya memotong kelebihan panjang pin.

Selanjutnya, saya menempatkan semua pin header lainnya di tempatnya. Kami membutuhkan header pin pria dan wanita, atau terserah Anda memilih pin header yang akan digunakan. Namun, sebaiknya gunakan pin header male untuk saluran digital karena motor servo dan sambungan ESC adalah female, sehingga kita dapat menghubungkannya dengan mudah.

Regulator tegangan adalah komponen pemasangan permukaan jadi saya menggunakan perekat Blue-Tack untuk menahannya saat menyolder. Terakhir, setelah kita menyolder kedua kapasitor di tempatnya, kita dapat memasang modul NRF24L01 ke pin header yang sesuai.

Tergantung pada aplikasi, atau jangkauan yang kita butuhkan, kita dapat menggunakan modul normal dengan antena on-board, atau modul yang dapat kita pasang antena yang lebih besar dan dapat mencapai komunikasi nirkabel hingga 700 meter di ruang terbuka . Jadi, Penerima RC Arduino kami sekarang sudah siap dan kami dapat menggunakannya untuk apa pun yang kami inginkan.

Untuk memprogram receiver, atau menghubungkan Arduino Pro Mini ke komputer, kita dapat menggunakan antarmuka UART USB to serial yang dapat dihubungkan ke header program.

Di menu alat Arduino IDE kita perlu memilih papan Arduino Pro atau Pro Mini, pilih versi prosesor yang tepat, pilih port dan pilih metode pemrograman ke “USBasp”.

Jadi sekarang kami dapat mengunggah kode ke Arduino.

Contoh 1 – Mobil Arduino RC

Oke, sekarang kita bisa melanjutkan dan melihat contoh pertama.

Ini adalah mobil sederhana yang terdiri dari dua motor DC 12V dan di beberapa video saya sebelumnya, saya telah menunjukkan cara kerjanya dan cara membuatnya.

Lihat juga:Pengemudi Motor L298N – Antarmuka Arduino, Cara Kerja, Kode, Skema

Kali ini kita akan menggunakan receiver Arduino RC baru untuk mengontrolnya. Untuk menggerakkan motor DC, kami menggunakan driver motor L298N dan untuk menyalakan, kami menggunakan 3 baterai Li-ion yang menyediakan sekitar 12V.

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

  • Sopir L298N ……………………………….. 
  • Motor DC Torsi Tinggi 12V ………….. 
  • Motor DC dengan Roda Ban Plastik …….
  • Breadboard dan Kabel Lompat ………… 

Jadi, koneksinya sangat sederhana, 12V yang berasal dari baterai masuk ke pin 12V di receiver kami, dan enam pin kontrol driver masuk ke 6 saluran. Perlu kita perhatikan di sini bahwa untuk dapat mengontrol kecepatan motor kita perlu memberikan sinyal PWM ke pin Enable A dan Enable B dari driver. Di receiver kami saluran nomor 2, 3, 6 dan 9 dapat mengeluarkan sinyal PWM, jadi di sana saya menghubungkan pin Aktifkan driver ke saluran nomor 2 dan 6 dalam kasus ini.

Mari kita lihat kode Arduino sekarang.

/*
   Arduino RC Receiver - Car Example 
   by Dejan, www.HowToMechatronics.com
   Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define enA 9  // Arduino pin D9 - CH6 on PCB board - PWM output
#define in1 8  // D8 - CH5 
#define in2 7  // D7 - CH4
#define in3 6  // D6 - CH3 
#define in4 4  // D4 - CH1 
#define enB 5  // D5 - CH2 - PWM output

RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

// Max size of this struct is 32 bytes
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

int  steering, throttle;
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.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); //  Set the module as receiver
  resetData();
}
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
  }
  
  // Parse the data from the Joystic 1 to the throttle and steering variables
  throttle = data.j1PotY;
  steering = data.j1PotX;  
  
  // Throttle used for forward and backward control
  // Joystick values: 0 to 255; down = 0; middle = 127; up = 255
  if (throttle < 110) {
    // Set Motor A backward
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // Set Motor B backward
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(throttle, 110, 0, 0, 255);
    motorSpeedB = map(throttle, 110, 0, 0, 255);
  }
  else if (throttle > 140) {
    // Set Motor A forward
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(throttle, 140, 255, 0, 255);
    motorSpeedB = map(throttle, 140, 255, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }
  // Steering used for left and right control
  if (steering < 110) {
    // Convert the declining steering readings from 140 to 255 into increasing 0 to 255 value
    int xMapped = map(steering, 110, 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 (steering > 140) {
    // Convert the increasing steering readings from 110 to 0 into 0 to 255 value
    int xMapped = map(steering, 140, 255, 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
}
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 pertama-tama kita perlu memasukkan SPI dan perpustakaan RF24, menentukan beberapa pin, objek radio, dan struktur data tempat kita akan menyimpan data yang masuk dari pemancar. Di bagian setup kita perlu menentukan output pin dan memulai komunikasi radio. Untuk detail lebih lanjut bagaimana ini bekerja dan apa yang dilakukan setiap baris ini, Anda dapat memeriksa tutorial NRF24L01 saya yang terperinci.

Di bagian loop, kami terus-menerus memeriksa apakah kami menerima data dan jika kami melakukannya, kami membaca data yang masuk. Jika kita melihat sekilas pada kode pemancar, kita dapat melihat jenis data yang dikirimkan ke penerima. Ia membaca data dari semua pengontrolnya, joystick, potensiometer, dan tombol, dan mengirimkan data itu sebagai satu paket ke penerima.

Jadi, begitu kita membaca data itu, kita bisa melakukan apapun yang kita inginkan dengannya. Dalam hal ini, kita akan menggunakan nilai sumbu Y Joystick 1 untuk mengontrol throttle dan nilai sumbu X untuk mengontrol kemudi. Saya memasukkan data ini ke dalam variabel throttle dan kemudi yang terpisah. Nilai yang kita peroleh dari joystick adalah dari 0 hingga 255. Jadi, jika kita menggerakkan joystick ke bawah, kita akan mengatur pin kontrol pengemudi dengan tepat sehingga mobil bergerak mundur, dan menggunakan nilai throttle untuk mengontrol kecepatan gerakan. Prinsip yang sama berlaku untuk mengemudi ke depan, kiri dan kanan. Sekali lagi, saya sudah memiliki tutorial terperinci tentang cara kerja mobil ini sehingga Anda dapat memeriksanya untuk pemahaman yang lebih baik. Di bagian bawah kode, kita dapat mencatat fungsi kustom resetData(), yang menyetel ulang semua nilai ke nilai default awal sehingga jika komunikasi radio terputus, mobil akan langsung bergerak.

Contoh 2 – Servo Penerima RC Arduino dan Kontrol Motor Brushless

Baiklah, sekarang kita dapat melanjutkan dengan contoh kedua, mengontrol servos dan motor brushless menggunakan receiver Arduino RC ini.

Untuk mengendalikan motor brushless, kita membutuhkan ESC, atau Electronic Speed ​​Controller. Arduino berkomunikasi dengan ESC hanya dengan satu pin. Untuk mengontrol ESC, Arduino mengirimkan sinyal PWM tertentu ke ESC dan dengan itu ESC mengontrol kecepatan motor. ESC dengan koneksi yang sama menyediakan 5V melalui fitur Battery Eliminator Circuit, sehingga kami juga dapat memberi daya pada receiver kami.

Lihat juga: Tutorial Kontrol Motor Tanpa Kuas Arduino | ESC | BLDC

Sedangkan untuk motor servo, mereka memiliki jenis koneksi yang sama dengan ESC dan kami dapat memasangkannya ke salah satu saluran yang tersedia.

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

  • Motor Tanpa Kuas ………………………..
  • ESC 30A ………………………………………
  • Baterai Li-Po ……………………..……
  • Motor Servo MG996R ………………

Sinyal input untuk mengendalikan motor servo dan motor brushless menggunakan ESC hampir sama. Mereka menggunakan sinyal PWM 50Hz tertentu yang dapat dengan mudah dihasilkan menggunakan perpustakaan Arduino Servo.

Catatan:  Saat menggunakan servos MG996R dengan pengaturan ini, mereka dapat menyebabkan masalah di sirkuit dan membakar Arduino Pro Mini. Mungkin menarik arus yang lebih tinggi dan yang dapat menyebabkan lonjakan tegangan pada rel 5V. Arduino Pro Mini harus menangani hingga 5,5v pada pin 5V, tetapi ketika lonjakan itu terjadi, itu dapat membakar Arduino. Saya mengalami masalah ini saat menguji sirkuit, dan seseorang di bagian komentar juga melaporkan hal yang sama. Solusi untuk ini mungkin menempatkan kapasitor decoupling yang lebih besar di servos tetapi saya tidak yakin dan saya belum mengujinya. Jadi harap waspadai masalah ini.

Di sisi lain, dalam contoh saya menggunakan dua servos MG996R lain yang tidak membakar Arduino, saya kira karena mereka tidak menyebabkan lonjakan yang begitu tinggi. Saya juga menggunakan contoh ini dengan 4 servo S90 yang lebih kecil dan tidak ada masalah.

Lihat juga: Cara Kerja Motor Servo & Cara Mengontrol Servo menggunakan Arduino

/*
  DIY RC Receiver - Servos and Brushless motors control
  by Dejan, www.HowToMechatronics.com
  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;
Servo esc;  // create servo object to control the ESC
Servo servo1;
Servo servo2;
int escValue, servo1Value, servo2Value;
// 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() {
  Serial.begin(9600);
  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
  resetData();
  esc.attach(10);   // Arduino digital pin D10 - CH9 on PCB board
  servo1.attach(4); // D4 - CH1
  servo2.attach(5); // D5 - CH2
}
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
  }

  // Controlling servos
  servo1Value = map(data.j2PotX, 0, 255, 0, 180); // Map the receiving value form 0 to 255 to 0 to 180(degrees), values used for controlling servos
  servo2Value = map(data.j2PotY, 0, 255, 0, 180);
  servo1.write(servo1Value);
  servo2.write(servo2Value);

  // Controlling brushless motor with ESC
  escValue = map(data.j1PotY, 127, 255, 1000, 2000); // Map the receiving value form 127 to 255 to  1000 to 2000, values used for controlling ESCs
  esc.writeMicroseconds(escValue); // Send the PWM control singal to the ESC
  
}
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)

Jadi, setelah menerima data dari pemancar, kami mengubah nilai dari 0 hingga 255 menjadi nilai dari 0 hingga 180 untuk mengontrol servo menggunakan fungsi write(). Dengan cara yang sama, kami mengubah data untuk mengontrol ESC ke nilai dari 1000 hingga 2000. Dalam contoh ini kami mengontrol ESC ini dari titik tengah Joystick nomor 1, ke posisi atas, jadi oleh karena itu kami mengubah nilai dari tengah , 127 hingga 255 menjadi nilai dari 1000 hingga 2000. Menggunakan fungsi Servo Library writeMicroseconds() kami mengirim sinyal PWM ke ESC sehingga kami dapat mengontrol kecepatan motor brushless dari minimum hingga maksimum.

Lihat juga: Pesawat RC Arduino | 100% buatan sendiri

Jadi, beginilah cara kita mengontrol pesawat RC, mobil, kapal, dan sebagainya, karena mereka biasanya menggunakan motor jenis ini, servo, dan motor brushless.

Contoh 3 – Kontrol Model Mobil RC

Mobil RC hadir dengan pengontrolnya sendiri yang dapat mengontrol roda depan untuk bergerak ke kiri dan ke kanan, serta menggerakkan mobil ke depan dan ke belakang.

Namun, karena ini adalah mobil RC yang murah, kontrolnya digital, atau hidup atau mati, ke posisi maksimum kiri dan kanan dan kecepatan maksimum. Terlepas dari itu, saya membongkar mobil untuk melihat apa yang ada di dalamnya dan bagaimana saya bisa mengimplementasikan receiver Arduino RC untuk mengendalikannya.

Setelah saya menemukan komponen elektroniknya, saya perhatikan bahwa kedua motor tersebut sebenarnya adalah motor DC sederhana yang beroperasi pada 5V. Bahkan motor depan yang mengontrol gerakan terbatas untuk kemudi adalah motor DC rotasi kontinu sederhana.

Jadi, ternyata kita sudah tahu cara mengontrol motor DC, jadi mengganti papan sirkuit ini dengan receiver Arduino DIY kita akan cukup mudah. Selain receiver kami, kami hanya membutuhkan driver motor yang mampu menggerakkan dua motor secara bersamaan. Ada banyak opsi untuk tujuan itu, bahkan yang kami gunakan pada contoh pertama, driver L298N.

Namun, yang itu terlalu besar untuk aplikasi ini, jadi saya memilih driver motor MX1508. Ini adalah driver motor DC ganda sederhana yang memiliki fitur H-bridge dan kontrol PWM. Ini memiliki 4 pin input kontrol, 4 pin untuk motor, dan 2 pin untuk memberi daya.

Saya melepas sambungan motor dari papan sirkuit mobil RC dan menyoldernya ke pengemudi. Di sisi belakang saya menyolder pin daya dan yang tersisa sekarang adalah menghubungkan driver ini dengan penerima. Tenaga untuk mobil RC ini berasal dari baterai Ni-Cd 4.8V yang terletak di bagian bawah mobil.

Jadi, menggunakan kabel lompat saya menghubungkan pin ini ke pin VCC Arduino, dan juga menghubungkan 4 pin input kontrol driver ke 4 saluran digital. Seperti yang saya katakan, driver ini mendukung kontrol PWM, jadi untuk motor B, atau motor belakang, saya menggunakan saluran PWM nomor 2 dan 3.

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

  • Mobil RC MGRC …………………………………
  • Driver Motor DC MX1508 ………………
  • Breadboard dan Kabel Lompat ………… 

Kode untuk mobil RC ini sangat mirip dengan contoh pertama.

/*
   Arduino RC Receiver - RC Model control
   by Dejan , www.HowToMechatronics.com
   Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define in3 5  // D5 - CH2 - PWM output
#define in4 6  // D6 - CH3 - PWM output
#define in1 7  // D7 - CH4
#define in2 8  // D8 - CH5


RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

// Max size of this struct is 32 bytes
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

int  steering, throttle;
int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  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
  resetData();
}
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
  }
  // Parse the data from the Joystic 1 to the steering and throttle variables
  steering = data.j2PotX;
  throttle = data.j1PotY;


// Throttle used for forward and backward control
  if (throttle < 110) {
    // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedB = map(throttle, 110, 0, 0, 255);
    // Set Motor B backward
    analogWrite(in3, motorSpeedB);
    digitalWrite(in4, LOW);
  }
  else if (throttle > 140) {
    // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedB = map(throttle, 140, 255, 0, 255);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    analogWrite(in4, motorSpeedB);
  }
  // If joystick stays in middle the motors are not moving
  else {
    digitalWrite(in3, HIGH);
    digitalWrite(in4, HIGH);
  }
  
// steering used for left and right control
  if (steering < 110) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
  }
  if (steering > 140) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
  }
  // If joystick stays in middle the motors are not moving
  else {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, HIGH);
  }
}
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)

Kami menggunakan data yang berasal dari joystick untuk mengontrol throttle dan kemudi mobil RC. Untuk bergerak mundur kita menggunakan fungsi analogWrite() untuk mengirimkan sinyal PWM ke driver pada pin Input3, sedangkan pin input4 kita tahan LOW. Untuk bergerak maju, kami melakukannya dengan cara sebaliknya. Jika joystick tetap di tengah, kami memberi perintah kepada pengemudi untuk mengerem atau menghentikan motor. Prinsip yang sama digunakan untuk motor kemudi, meskipun di sini kita tidak perlu menggunakan fungsi analogWrite() karena kita tidak perlu mengontrol kecepatan motor ini.

Setelah mengunggah sketsa ini ke Arduino, saya harus memasang kembali mobil RC. Saya menempatkan driver kecil di rumah bagian dalam dan mengamankan sisa bagian dengan sekrup. Saya menghubungkan kembali receiver dengan pengemudi, dan meletakkannya di bawah rumah luar mobil yang memiliki cukup tempat untuk muat di receiver.

Jadi, tidak hanya kami memodifikasi mobil RC ini untuk dikendalikan dengan pemancar RC DIY kami, tetapi juga meningkatkannya dengan menambahkan kontrol PWM sehingga sekarang kami juga dapat mengontrol kecepatan mobil. Jika model RC yang ingin Anda modifikasi memiliki servos dan motor brushless, bukan motor DC, Anda dapat mengikuti metode yang dijelaskan pada contoh kedua.

Saya harap Anda menikmati tutorial ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah dan jangan lupa untuk memeriksa koleksi Proyek Arduino saya.


Proses manufaktur

  1. DIY:Pemantauan dan Pengaturan Suhu untuk HomeBrew
  2. Pengukuran Suhu untuk Proyek Lab dan Sains
  3. Memilih Antara Router CNC Dan Pemotong Laser CNC Untuk Proyek Kerajinan DIY Anda.
  4. Animasi dan Permainan LCD
  5. Voltmeter DIY Menggunakan Arduino dan Smartphone
  6. Voltmeter DIY dengan Arduino dan Tampilan Nokia 5110
  7. Python3 dan Komunikasi Arduino
  8. Pentingnya Model CAD untuk Proyek Fabrikasi Logam
  9. Bubut yang Disempurnakan Untuk Poles Dan Deburring
  10. Mkr1000 Pinout:Pilihan Pilihan untuk Proyek IoT