• Tidak ada hasil yang ditemukan

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

LAMPIRAN 4

POSISI SARUNG TANGAN DAN MODEL PESAWAT

LAMPIRAN 5

POSISI SENSOR FLEX DAN PUTARAN BALING-BALING

Dokumen terkait