BAB V KESIMPULAN DAN SARAN
5.2. Saran
Saran yang diajukan untuk memperbaiki sistem ini adalah sebagai berikut: 1. Pendesaianan dan peletakan alat dapat didesain dengan lebih baik. 2. Desain letak nRF24L01 agar tidak diletakkan di dalam ruangan tertutup.
3. Pemanfaatan alat ini agar bisa dikembangkan menjadi sarung tangan yang dapat mengontrol pesawat terbang mainan atau mobil mainan atau kapal mainan.
68
DAFTAR PUSTAKA
[1] Putra, Y.A.W., 2015, Kontroler Lengan Robot Berbasis Smartphone Android, Tugas Akhir, Jurusan Teknik Elektro, FST, Universitas Sanata Dharma, Yogyakarta. [2] Gani, Ruslan., Wahyudi, Iwan, S., 2011, Perancangan Sensor Gyroscope dan
Accelerometer Untuk Menentukan Sudut dan Jarak, Makalah, Dalam: Seminar
Tugas Akhir, Universitas Diponegoro, 08 Februari, http://eprints.undip.ac.id/26217/
, diakses 15 Oktober 2018
[3] _____, 2015, Aircraft Rotations, https://www.grc.nasa.gov/WWW/K-12/airplane/rotations.html, diakses 06 Desember 2018
[4] Senduk, S.K., 2018, Perancangan Artifical Finger Untuk Game Piano Tiles 2TM, Tugas Akhir, Jurusan Teknik Elektro, FST, Universitas Sanata Dharma, Yogyakarta. [5] Handoko, A.P.T., 2017, Pengering Pakaian Otomatis Berbasis Arduino Uno, Tugas
Akhir, Jurusan Teknik Elektro, FST, Universitas Sanata Dharma, Yogyakarta. [6] Muslimin, S., & Wijarnarko, Y., 2014, Penerapan Flex-Sensor Pada Lengan
Robot Berjari Pengikut Gerak Lengan Manusia Berbasis Mikrokontroler,
https://technologic.polman.astra.ac.id/index.php/firstjournal/article/view/39, diakses 25 Oktober 2018
[7] Nirwani, A.T., 2018, Simulator Kursi Roda Otomatis Dengan Sensor Flex Berbasis
Mikrokontroler,https://eprints.uny.ac.id/60223/1/Laporan_Affin_15507134002.pdf,
diakses 16 Desember 2018.
[8] Shobrina, dkk, 2018, Analisis Kinerja Pengiriman Dta Modul Transceiver
NRF24l01, Xbee Dan Wifi ESP8266 Pada Wireless Sensor Network,
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=10&ved=2 ahUKEwjAzNqC1ovfAhVbXSsKHQI_Ao8QFjAJegQIBRAC&url=http%3A%2F
%2Fj-ptiik.ub.ac.id%2Findex.php%2Fj-ptiik%2Farticle%2Fdownload%2F1241%2F451%2F&usg=AOvVaw2YWMtcZ1D Zk2Vlkm1nxraZ, diakses 25 November 2018
[9] Iriyanto, P., 2018, Rancang Bangun Sistem Alarm Infus Otomatis Terpusat, Tugas Akhir, Jurusan Teknik Elektro, FST, Universitas Lampung, Lampung.
[10] Saputra, Wirahadi, 2018, Prototipe Sistem Keamanan Pabrik Dari Kbeakaran
Dengan Penampil HMI Berbasis PLC OMRON CPM2A, Tugas Akhir, Jurusan
Teknik Elektro, FST, Universitas Sanata Dharma, Yogyakarta.
[11] Firman, B., 2016, Implementasi Sensor IMU MPU6050 Berbasis Serial I2C Pada
Self-Balancing Robot, Yogyakarta.
[12] _____,Agustus 19, 2013, MPU-6000 and MPU-6050 Register Map and Revision
4.2, InvenSense Inc.
[13] _____,Agustus 19, 2013, MPU-6000 and MPU-6050 Product Specification
Revision 3.4, InvenSense Inc.
[14] Lutfimahfuzh, Mikroprosesor, http://kl301.ilearning.me/2015/05/19/pelajari- tentang-pwm-dan-bagaimana-implementasi-dan-pemrogramannya-pada-atmega-8535/, diakses 25 April 2019.
[15] Samuel, Aldinova, 2011, Aplikasi Sensor Thermal Array TPA81 Pada Robot
Pemadam Api, Tugas Akhir, Jurusan Teknik Elektro, FST, Universitas Sanata
Dharma, Yogyakarta.
[16] Dirga, 2016, Lemari Penyimpanan Berbicara Berbasis Mikrokontroller, Tugas Akhir, Jurusan Teknik Elektro, FST, Universitas Sanata Dharma, Yogyakarta
[17] Fahmi, H.Z., Maulana, R., Kurniawan, W., 2017, Implementasi Complementary
Filter Menggunakan Sensor Accelerometer dan Gyroscope Pada Keseimbangan Gerak Robot Humanoid,
LAMPIRAN 1
LISTING PROGRAM BAGIAN PENGIRIM
#include <Wire.h> //Library untuk komunikasi I2C #include <SPI.h> //Library untuk komunikasi SPI
#include <nRF24L01.h> //Library untuk modul transceiver nRF24L01 #include <RF24.h>
//Menginisialisasi data-data dalam satu paket
struct datakirim{ //Membuat data paket bernama datakirim int srv1; //Menginisialisai variable data servo 1 dalam paket int srv2; //Menginisialisai variable data servo 2 dalam paket int srv3; //Menginisialisai variable data servo 3 dalam paket int flex; //Menginisialisai variable data sensor flex dalam paket }
se; //Paket yang akan dikirim
RF24 radio(7, 8); //Inisialisasi pin untuk CE dan CS
const byte node1[1] = {'W'}; //Karakter 'W' untuk alamat nRF24L01 node 1 const byte node2[1] = {'S'}; //Karakter 'S' untuk alamat nRF24L01 node 2
//Inisialisasi MPU6050
const int MPU = 0x68; //Alamat I2C MPU6050 float AccX, AccY, AccZ;
float GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw;
float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime;
int c = 0; void setup() {
radio.begin();
radio.setPALevel(RF24_PA_MIN);
radio.openReadingPipe(1, node2); //Membaca jalur pipe antara node 1 dan node 2 radio.startListening(); //nRF24L01 mulai bekerja
radio.setChannel(76); //Mengatur nRF24L01 untuk bekerja dalam channel 76 Wire.begin(); //Inisialisasi komunikasi
Wire.beginTransmission(MPU); //Mulai komunikasi dengan MPU6050 Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission(true); //Komunikasi selesai //Memanggil fungsi untuk mengetahui nilai error MPU6050 error(); delay(20); } void loop() { radio.openWritingPipe(node1); radio.stopListening();
// === Membaca data acceleromter === // Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true);
//Berdasarkan datasheet, untuk range +-2g, kita harus membagi data accelerometer dengan 16384
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value //Menghitung nilai Roll dan Pitch dari nilai accelerometer
accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) + AccErrorX; //Hasil nilai accAngleX di jumlahkan dengan nilai AccErrorX untuk mengurangi nilai error
accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + AccErrorY; //Hasil nilai accAngleY di jumlahkan dengan nilai AccErrorY untuk mengurangi nilai error
//Membaca data gyroscope
previousTime = currentTime; //Waktu sebelumnya disimpan sebelum waktu sesungguhnya dibaca
currentTime = millis(); //Membaca waktu
elapsedTime = (currentTime - previousTime) / 1000; //Dibagi dengan 1000 agar mendapatkan detik
Wire.beginTransmission(MPU); Wire.write(0x43);
Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true);
GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; //Berdasarkan datasheet, untuk range 250deg/s, kita harus membagi data gyro dengan 131.0
GyroY = (Wire.read() << 8 | Wire.read()) / 131.0; GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
//Memperbaiki nilai keluaran gyro dengan menguranginya dengan nilai error gyro GyroX = GyroX - GyroErrorX;
GyroY = GyroY - GyroErrorY; GyroZ = GyroZ - GyroErrorZ;
//Nilai masih dalam derajat/s, jadi perlu dikalikan dengan //seconds (s) untuk mendapatkan sudut dalam derajat
gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime;
yaw = yaw + GyroZ * elapsedTime;
//Perhitungan complementary filter untuk mengurangi //drift data pada MPU6050
roll = 0.96 * gyroAngleX + 0.04 * accAngleX; pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;
//Mengkonversikan nilai sudut MPU6050 menjadi sudut servo int servorollValue = map(roll, -90, 90, 60, 120);
int servopitchValue = map(pitch, -90, 90, 60, 120); int servoyawValue = map(yaw, -90, 90, 0, 180); //Memasukan nilai konversi ke dalam paket data se.srv1=servorollValue;
se.srv2=servopitchValue; se.srv3=servoyawValue;
//Membaca nilai keluaran sensor flex int nilaiflex = analogRead(A0);
//Mengkonversi nilai keluaran sensor flex menjadi kecepatan motor dc int kcpt = map(nilaiflex, 640, 800, 0, 255);
//Memasukan nilai konversi ke dalam paket data se.flex=kcpt;
//Memberi batas pada keluaran servo dan motor dc if(se.srv1<=60){ se.srv1=60; } else if(se.srv1>=120){ se.srv1=120; } else { se.srv1=se.srv1; } if(se.srv2<=60){ se.srv2=60; } else if(se.srv2>=120){ se.srv2=120; } else { se.srv2=se.srv2; }
if(se.srv3<=0){ se.srv3=0; } else if(se.srv3>=180){ se.srv3=180; } else { se.srv3=se.srv3; } if(se.flex<=0){ se.flex=0; } else if(se.flex>=255){ se.flex=255; } else { se.flex=se.flex; } //Mengirim data radio.write(&se, sizeof(se));
//Menampilkan data pada serial monitor Serial.print(se.srv1); Serial.print("/"); Serial.print(se.srv2); Serial.print("/"); Serial.println(se.srv3); Serial.print("/"); Serial.println(se.flex); //delay 10ms delay (10);
}
void error() {
//Fungsi untuk menghitung nilai error pada MPU6050 //Membaca data accelerometer sebanyak 200 kali while (c < 200) {
Wire.beginTransmission(MPU); Wire.write(0x3B);
Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true);
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ; AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ; AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ; //Menjumlahkan semua yang telah dibaca
AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
c++; }
//Membagi hasil dengan 200 untuk mendapatkan nilai error AccErrorX = AccErrorX / 200;
AccErrorY = AccErrorY / 200; c = 0;
//Membaca data gyro sebanyak 200 kali while (c < 200) {
Wire.beginTransmission(MPU); Wire.write(0x43);
Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); GyroX = Wire.read() << 8 | Wire.read(); GyroY = Wire.read() << 8 | Wire.read(); GyroZ = Wire.read() << 8 | Wire.read(); //Menjumlahkan semua yang telah dibaca
GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c++;
}
//Membagi hasil dengan 200 untuk mendapatkan nilai error GyroErrorX = GyroErrorX / 200;
GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200;
//Menampilkan data pada serial monitor Serial.print("AccErrorX: "); Serial.println(AccErrorX); Serial.print("AccErrorY: "); Serial.println(AccErrorY); Serial.print("GyroErrorX: "); Serial.println(GyroErrorX); Serial.print("GyroErrorY: "); Serial.println(GyroErrorY); Serial.print("GyroErrorZ: "); Serial.println(GyroErrorZ); }
LAMPIRAN 2
LISTING PROGRAM BAGIAN PENERIMA
#include <SPI.h> //Library untuk komunikasi SPI
#include <nRF24L01.h> //Library untuk modul transceiver nRF24L01 #include <RF24.h>
#include <Servo.h> //Library untuk servo
//Menginisialisasi data-data dalam satu paket
struct datakirim{ //Membuat data paket bernama datakirim int srv1; //Menginisialisai variable data servo 1 dalam paket int srv2; //Menginisialisai variable data servo 2 dalam paket int srv3; //Menginisialisai variable data servo 3 dalam paket int flex; //Menginisialisai variable data sensor flex dalam paket }
se; //Paket yang akan diterima
int r1 = 4; //Inisialisai pin untuk r1 int r2 = 2; //Inisialisai pin untuk r2 int e1 = 6; //Inisialisai pin untuk el
//Inisialisasi variable servo-servo Servo servoroll;
Servo servopitch; Servo servoyaw;
RF24 radio(7, 8); //Inisialisasi pin untuk CE dan CS
const byte node1[1] = {'W'}; //Karakter 'W' untuk alamat nRF24L01 pipe 1 const byte node2[1] = {'S'}; //Karakter 'S' untuk alamat nRF24L01 pipe 2
void setup() {
//Inisialisasi pinout pinMode(r1, OUTPUT); pinMode(r2, OUTPUT); pinMode(e1, OUTPUT);
//Inisialisasi pinout servo-servo servoroll.attach(3); servopitch.attach(5); servoyaw.attach(9); radio.begin(); radio.setPALevel(RF24_PA_MIN); radio.openWritingPipe(node2);
radio.openReadingPipe(1, node1); //Membaca jalur pipe antara node 1 dan node 2 radio.startListening(); //nRF24L01 mulai bekerja
radio.setChannel(76); //Mengatur nRF24L01 untuk bekerja dalam channel 76 } void loop() { if (radio.available()) { //Membaca data radio.read(&se, sizeof(se));
//Menampilkan data pada serial monitor Serial.print(se.srv1); Serial.print("/"); Serial.print(se.srv2); Serial.print("/"); Serial.println(se.srv3); Serial.print("/"); Serial.println(se.flex);
//Mengontrol servo sesuai dengan gerakan MPU6050 servoroll.write(se.srv1);
servopitch.write(se.srv2); servoyaw.write(se.srv3);
//Mengontrol motor dc agar sesuai dengan kelengkungan sensor flex analogWrite(e1, se.flex); digitalWrite(r1, HIGH); digitalWrite(r2, LOW); //delay 10ms delay (10); } }
LAMPIRAN 3
RANGKAIAN PENGIRIM & PENERIMA
Gambar L-1. Rangkaian Pengirim