Proyek Robot Dikontrol Gerakan: Bangun Robot Sensor Gerakan Sendiri
Komponen dan Perlengkapan
Arduino UNO
1
Arduino Nano R3
1
Penerima Penerima RF-433
1
Pengode dan Dekoder HT12
1
Adafruit Akselerometer Analog: ADXL335
1
Motor Shield untuk Uno
1
Motor DC (umum)
1
Alat dan Mesin yang Diperlukan
Pengkol (soldering iron umum)
Tentang Proyek Ini
Robot kontrol gerakan adalah salah satu jenis proyek yang paling umum dibuat oleh hobiis dan mahasiswa untuk memahami dan menerapkan pengetahuan mikrokontroler dalam proyek fisik dan praktis. Konsep di baliknya sederhana: orientasi telapak tangan mengontrol gerakan mobil robot. Bagaimana caranya, Anda tanya? Mari kita uraikan.
Untuk pemahaman yang baik, kita akan bergerak dengan memahami peran dan fungsi setiap komponen lalu menggabungkannya untuk mencapai kinerja yang diinginkan.
1. ADXL335 (Akselerometer)
Fungsi akselerometer sederhana: untuk merasakan orientasi pergelangan tangan. Akselerometer mengukur percepatan termasuk percepatan akibat gravitasi 'g' juga. Jadi kita dapat menggunakan akselerometer untuk merasakan orientasi pergelangan tangan dengan mengukur komponen 'g' pada sumbu tertentu ADXL335 seperti yang ditunjukkan pada gambar di bawah:
Karena kemiringan tangan, sudut sumbu X dan/atau Y terhadap vertikal berubah dan sehingga komponen percepatan 'g' juga bekerja padanya yang dapat diukur dan menunjukkan orientasi tangan.
ADXL335 dapat mengukur hingga 3g percepatan dan dihubungkan dengan Arduino dengan menghubungkan pin sumbunya ke pin Analog Arduino. Akselerometer mengeluarkan nilai tegangan proporsional terhadap percepatan.
Dalam proyek ini, Akselerometer terhubung dengan Arduino Nano dan dipasang di telapak tangan. ADXL335 mengeluarkan tegangan dalam rentang 0 hingga Vcc (tegangan yang diterapkan biasanya 3.3V) dan dibaca oleh pin Analog Arduino. Jadi untuk pengguna, kita mendapatkan nilai dalam rentang 0 hingga 1024 (ADC 10-bit). Orientasi yang berbeda menghasilkan nilai analog yang berbeda untuk setiap sumbu yang kemudian dipetakan ke gerakan robot yang berbeda.
Diagram rangkaian untuk Akselerometer adalah:
Kode uji untuk memahami cara kerja ADXL335 adalah sebagai berikut:
void setup() {
pinMode(A0, INPUT); // sumbu x terhubung ke pin A0
pinMode(A1, INPUT); // sumbu y terhubung ke pin A1
pinMode(A2, INPUT); // sumbu z terhubung ke pin A2
Serial.begin(9600); // untuk mencetak data ke Serial Monitor
}
void loop() {
Serial.print(" X= ");
Serial.println(analogRead(A0));
Serial.print(" Y= ");
Serial.println(analogRead(A1));
Serial.print(" Z= ");
Serial.println(analogRead(A2));
delay(1000);
}
Anda dapat menjalankan program ini untuk melihat nilai apa yang Anda dapatkan untuk kemiringan telapak tangan dan pergelangan tangan ke depan, belakang, kiri dan kanan yang akan digunakan akhirnya untuk mengontrol robot.
2. Penerima Penerima RF-433
Fungsi modul RF sederhana: untuk mentransmisikan data perintah dari Arduino Nano di pergelangan tangan ke Arduino Uno yang mengontrol motor. Modul RF menggunakan gelombang radio pada frekuensi 433hz dan demikian nama RF-433. Mereka menggunakan Modulasi Amplitudo untuk mengirim data, tetapi tanpa masuk ke banyak teknikalitas dan menjaga hal-hal sederhana, mereka akan digunakan untuk mentransmisikan perintah ke robot, yaitu: bergerak ke depan, belakang, kanan atau kiri. Dan dalam kasus tidak ada data, diam saja. Mereka bekerja baik hingga jarak 10 meter.
Sekarang untuk memahami cara mengimplementasikan modul RF dalam proyek kita, mari kita bekerja pada rangkaian pemirim dan penerima secara berurutan.
Rangkaian Pemirim
Rangkaian pemirim terdiri dari dua bagian: Pemirim RF dan Pengode HT12E. Pemirim terdiri dari satu pin data, satu antena, satu ground dan daya. Tugas pengode HT12E adalah untuk menyediakan data ke pemirim. Pengode terdiri dari 4 pin data yang datanya dapat dikirim. Kami akan menggunakan 4 pin data ini untuk mewakili empat gerakan, HIGH pada pin ini secara individu akan mewakili salah satu dari empat gerakan dan LOW pada semua mewakili diam.
Diagram rangkaian adalah seperti ditunjukkan:
Pin kiri (A0-A7) adalah pin alamat dan menentukan pasangan yang akan bertukar data (Pemirim dan Penerima yang memiliki alamat sama hanya akan berbagi data). Kami akan mengatur A0-A7 sebagai LOW (Grounded).
Pin Data In terhubung ke pin digital Arduino (dalam proyek ini 6 hingga 9) dan mereka akan mengeluarkan data perintah sebagai berikut:
Pin Digital Perintah (Saat HIGH)
9 Maju
10 Mundur
11 Kiri
12 Kanan
Kami akan digitalWrite pin digital sebagai HIGH berdasarkan input dari ADXL335 untuk melakukan gerakan yang diperlukan.
Rangkaian Penerima
Rangkaian penerima sepenuhnya mirip dengan rangkaian pemirim seperti ditunjukkan, tetapi alih-alih pin data menjadi output dari Arduino, dalam hal ini mereka akan dibaca sebagai input untuk menerima perintah untuk Arduino Uno dan menjalankan motor sesuai kebutuhan:
Untuk menyederhanakan, Anda dapat menghubungkan LED secara seri di pin 17 dengan resistor 1K alih-alih rangkaian kompleks seperti yang ditunjukkan untuk menunjukkan koneksi yang benar dengan pemirim.
3. MOTOR SHIELD
Motor shield adalah bagian termudah untuk ditangani karena ketersediaan library AFMotor dari Adafruit, link: https://github.com/adafruit/Adafruit-Motor-Shield-library
Unduh dan salin library ke folder library Arduino agar dapat menyertakannya dalam sketsa program.
Contoh library AFMotor adalah sebagai berikut:
#include <AFMotor.h>
AF_DCMotor motor(4); // Sambungkan kabel motor ke titik Motor 4 pada shield
void setup() {
Serial.begin(9600); // atur library Serial pada 9600 bps
Serial.println("Motor test!"); // nyalakan motor
motor.setSpeed(200);
motor.run(RELEASE);
}
void loop() {
uint8_t i;
Serial.print("tick");
motor.run(FORWARD);
for (i = 0; i < 255; i++) {
motor.setSpeed(i);
delay(10);
}
for (i = 255; i != 0; i--) {
motor.setSpeed(i);
delay(10);
}
Serial.print("tock");
motor.run(BACKWARD);
for (i = 0; i < 255; i++) {
motor.setSpeed(i);
delay(10);
}
for (i = 255; i != 0; i--) {
motor.setSpeed(i);
delay(10);
}
Serial.print("tech");
motor.run(RELEASE);
delay(1000);
}
4. Menggabungkan Semua
Bagian terakhir dan akhir mencakup menggabungkan semua bagian di atas untuk membentuk robot lengkap yang mengikuti perintah tangan!
Karena motor shield menggunakan hampir semua pin digital, kita akan menggunakan pin analog Arduino Uno untuk membaca Data Penerima. Diagram Rangkaian Akhir adalah sebagai berikut:
Motor shield menangani koneksi ke motor. Hubungkan baterai 9V ke input daya shield.
CATATAN: Saya pribadi lebih suka menghubungkan 2 atau bahkan 3 baterai 9V secara paralel ke input daya shield untuk memberikan cukup daya untuk menjalankan keempat motor. Saya telah menghubungkan keempat motor dalam kelompok 2 (motor dengan sisi yang sama terhubung secara paralel bersama-sama dan demikian hanya memerlukan titik motor 3 dan 4 untuk berjalan).
Kode Akhir
Untuk Arduino Nano:
int x_axis = 0;
int y_axis = 0;
int forward = 9;
int backward = 10;
int right = 11;
int left = 12;
void setup() {
pinMode(A0, INPUT); // Sumbu X
pinMode(A3, OUTPUT); // Sumbu Y
pinMode(forward, OUTPUT); // HIGH untuk Bergerak Maju
pinMode(backward, OUTPUT); // HIGH untuk Bergerak Mundur
pinMode(right, OUTPUT); // HIGH untuk Bergerak Kanan
pinMode(left, OUTPUT); // HIGH untuk Bergerak Kiri
Serial.begin(9600);
}
void loop() {
x_axis = analogRead(A0);
y_axis = analogRead(A3);
Serial.print(" X = ");
Serial.println(x_axis);
Serial.print(" Y = ");
Serial.println(y_axis);
if (y_axis >= 390) {
Serial.println("Maju");
digitalWrite(forward, HIGH);
} else {
if (y_axis <= 310) {
Serial.println("MUNDUR");
digitalWrite(backward, HIGH);
} else {
if (x_axis >= 380) {
Serial.println("KANAN");
digitalWrite(right, HIGH);
} else {
if (x_axis <= 320) {
Serial.println("KIRI");
digitalWrite(left, HIGH);
}
Serial.println(" ");
}
}
}
delay(200);
if (x_axis > 320 && x_axis < 380 && y_axis > 310 && y_axis < 390) {
digitalWrite(forward, LOW);
digitalWrite(backward, LOW);
digitalWrite(right, LOW);
digitalWrite(left, LOW);
}
}
Untuk Arduino Uno:
#include<AFMotor.h>
AF_DCMotor motor_right(3);
AF_DCMotor motor_left(4);
int forward = 0;
int backward = 0;
int right = 0;
int left = 0;
void setup() {
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
Serial.begin(9600);
motor_right.setSpeed(255);
motor_left.setSpeed(255);
motor_right.run(RELEASE);
motor_left.run(RELEASE);
}
void loop() {
forward = digitalRead(A0);
backward = digitalRead(A1);
right = digitalRead(A2);
left = digitalRead(A3);
if (forward == HIGH) {
motor_right.run(FORWARD);
motor_left.run(FORWARD);
Serial.println("Maju");
}
if (backward == HIGH) {
motor_right.run(BACKWARD);
motor_left.run(BACKWARD);
Serial.println("Mundur");
}
if (right == HIGH) {
motor_right.run(FORWARD);
motor_left.run(RELEASE);
Serial.println("KANAN");
}
if (left == HIGH) {
motor_right.run(RELEASE);
motor_left.run(FORWARD);
Serial.println("KIRI");
}
if (left == LOW && right == LOW && forward == LOW && backward == LOW) {
motor_right.run(RELEASE);
motor_left.run(RELEASE);
}
delay(100);
}