10. Dasar Pembelajaran Komponen Penentu Posisi
Bab ini menjelaskan penggunaan Joystick, penentu koordinat tiga dimensi dan GPS. Beberapa contoh aplikasi di ulas; misalnya untuk memperoleh informasi lintang, bujur, dan tinggi di atas permukaan laut serta cara mengukur jarak dua posisi.
10.1 Joystick
Joystick dapat digunakan untuk mengatur posisi dua dimensi (x dan y). Contoh peranti ini diperlihatkan di Gambar 10.1. Kelima pin yang tersedia seperti berikut:
- Gnd : dihubungkan ke ground;
- +5V dihubungkan ke sumber tegangan +5V;
- VRx : Nilai analog 0— 5V yang menyatakan posisi x;
- VRy : Nilai analog 0— 5V yang menyatakan posisi y;
- SW : tombol ditekan atau tidak (1 = ditekan, O = tidak ditekan).
Gambar 10.1 Joystick PS2
Untuk menguji joystick, rangkaian di Gambar 10.2 bisa digunakan. Contoh penyusunan rangkaian diperlihatkan di Gambar 10.3. Selanjutnya, Anda bisa menguji dengan sketch joystick.
Gambar 10.2 Rangkaian yang menghubungkan joystick dan Arduino
// ——————————————–
// Contoh untuk memantau nilai
// yang dihasilkan oleh PS2 Joystick
// ——————————————–
const int PIN_VRX = 0;
const int PIN_VRY =1;
const int PIN_SW = 6;
void setup()
{
pinMode(PIN_SW, INPUT);
Serial.begin(9600);
}
void loop()
{
// Baca data dari tiga pin
int nilaix =analogRead(PIN_VRX);
int nilaiY =analogRead(PIN_VRY);
int nilaisw = digitalRead(PIN_SW);
// Kirim ke port serial
Serial.print(“X: “);
Serial.print(nilaiX);
Serial.print(“,Y: “);
Serial.print(nilaiY);
Serial.print(“, SW:”);
Serial.println(nilaiSW);
delay(100);// Diperlukan untuk menunda pembacaan berikutnya
}
Sketch di depan menggunakan pin analog 1 dan 2 serta pin digital 6 untuk dihubungkan ke joystick. karena itu, pinMode ( ) hanya dikenakan pada pin digital 6. Nilai X dan Y diperoleh dengan menggunakan analogRead ( ) , sedangkan nilai SW dibaca melalui digital Read ( ) .
Berdasarkan sifat-sifat yang diperoleh selama melakukan pengujian dengan menggunakan sketch joystick, kita dapat memanfaatkan joystick untuk keperluan mengatur kecerahan LED. Tentu saja, ide ini dapat juga dimanfaatkan untuk kepentingan pengaturan kecepatan motor berputar.
Perwujudan pengontrolan kecerahan dua LED dapat dilakukan dengan menggunakan sketch joyled. Adapun rangkaian yang diperlukan diperlihatkan di Gambar 10.6.
Gambar 10.6 Rangkaian pengaturan kecerahan dua LED menggunakan joystick
// ——————————————–
// Contoh penggunaan joystick
// untuk mengatur kecerahan dua LED
// ——————————————–
const int PIN_VRX=0;
const int PIN_VRY=1;
const int PIN_LED MERAH=6;
const int PIN_LED HIJAU =5;
void setup()
{
pinMode(PIN_LED MERAH, OUTPUT);
pinMode(PIN_LED_HIJAU, OUTPUT);
// Atur setiap LED dengan kecerahan medium
analogWrite(PIN_LED HIJAU,127);
analogWrite(PIN_LED_MERAH,127);
}
void loop()
{
// Baca data dari tiga pin
int nilaiX=analogRead(PIN_VRX);
int nilaiY =analogRead(PIN_VRY);
// Petakan angka ke jangkauan -127 s/d 128
nilaix=map(nilaix, 0,1023,-127,128);
nilaiY=map(nilaiY, 0,1023,-127,128);
// Atur kecerahan LED
analogWrite(PIN_LED HIJAU, 127 +nilaiX);
analogWrite(PIN_LED MERAH,127+nilaiY);
delay(100);// Diperlukan untuk menunda pembacaan berikutnya
Rangkaian actual pengontrolan dua LED menggunakan joystick dapat dilihat di Gambar 10.7 Adapun Gambar 10.8 menunjukkan contoh ketika LED menyala dengan kecerahan berbeda.
Gambar 10.7 Rangkaian aktual untuk mengatur kecerahan dua LED menggunakan joystick. Pin SW tidak digunakan
Gambar 10.8 Contoh hasil pengaturan pada dua LED menggunakan joystick
10.2 Pemantau Posisi Tiga Dimensi
Modul GY-271 (Gambar 10.9) adalah modul yang menggunakan IDC HMC5883 yang dapat dimanfaatkan sebagai penentu posisi pada ruang tiga dimensi (ada informasi X, Y, dan Z). Supaya dapat berfungsi, sumber tegangan sebesar 3V hinga 5V DC perlu diberikan. Perlu diketahui, di pasaran terdapat berbagai modul yang setara dengan GY-271; misalnya HMC5883L buatan Honeywell.
Gambar 10.9 Modul GY-271
Pin-pin yang tersedia di GY-271 dan hubungannya ke Arduino adalah:
- VCC dihubungkan ke sumber tegangan 5V di Arduino;
- GND dihubungkan ke GND di Arduino;
- SCL dihubungkan ke port analog 5 di Arduino;
- SDA dihubungkan ke port analog 5 di Arduino;
- DRDY tidak dipakai.
Gambar 10.10 menunjukkan hubungan di atas secara visual.
Gambar 10.10 Rangkaian yang menghubungkan GY-271 dan Arduino
sketch berikut digunakan untuk menguji rangkaian di atas:
// ——————————————–
// Contoh untuk menguji GY-271 yang
// menggunakan IC HMC5883
// untuk memperoleh posisi X, Y,z
// ——————————————–
#include <Wire.h>
const int PIN_SDA=4;
const int PIN_SLC=5;
const int ADDR=0x1E; // Alamat untuk HMC5883
void setup()
{
// Inisialisasi port serial
Serial.begin(9600);
// Inisialisasi I2C
Wire.begin();
//Inisialisasi HMC5883
Wire.beginTransmission(ADDR);
Wire.write(0x02); // Mode register
Wire.write(0x00); // Mode pengukuran terus-menerus
Wire.endTransmission();
}
void loop()
{
int x, y, z; // Posisi X, Y,Z
// Pemberitahuan untuk membaca data di HMC5883
Wire.beginTransmission(ADDR);
wire.write(0x03); // Pilih register 3, X MSB register
Wire.endTransmission();
// Baca data per sumbu,2 register per sumbu
Wire.requestFrom(ADDR, 6); // 2 x 3 byte
if (Wire.available() >= 6)
{
x= Wire.read() <<8; // byte tinggi X
x |= Wire.read(); // byte rendah X
z = Wire.read() << 8; // byte tinggi z
z |=Wire.read(); // byte rendah Z
y=Wire.read()<<8; // byte rendah Y
y |= Wire.read(); // byte rendah Y
}
// Kirim informasi ke port serial
Serial.print(“x: “);
Serial.print(x);
Serial.print(” y:”);
Serial print(y);
Serial.print(” z : “);
Serial.println(z);
delay(500);
}
Gambar 10.11 Pengujian dapat dilakukan dengan memutar-mutar posisi GY-271
Gambar 10.12 Contoh hasil pengujian modul GY-271
10.3 GPS Receiver
Global Position System (GPS) adalah sistem navigasi berbasis yang dapat memberikan informasi mengenai posisi suatu alat vang berhubungan dengannya dari satelit. Nah, alat yang berhubungan dengan GPS tersebut dinamakan GPS Receiver. Informasi yang diperoleh antara lain berupa
- posisi lintang (latitude);
- posisi bujur (longitude).
Untuk menjadikan Arduino sebagai GPS receiver, Anda perlu menyiapkan modul GPS. Contoh modul GPS adalah Skylab SKM53 (Gambar 10,13), yang telah dilengkapi dengan antena internal. Peranti ini memerlukan tegangan DC SV. Țersedia enam pin, namun hanya empat pin yang akan digunakan, yaitu:
- VCC (dihubungkan dengan pin 5V di Arduino);
- GND (dihubungkan dengan pin GND di Arduino);
- TXD (dihubungkan dengan salah satu pin digital di Arduino);
- RXD (dihubungkan dengan salah satu pin digital di Arduino).
Gambar IO. 13 Modul GPS Skylab SKM53
Contoh rangkaian yang menghubungkan modul GPS dan Arduino diperlihatkan di Gambar 10.14. Rangkaian inilah Yang akan digunakan untuk menguji beberapa percobaan. Oleh karena itu, Anda bisa memulai penyusunan rangkaian tersebut.
Gambar 10.14 Rangkaian yang menghubungkan Arduino dan modul GPS
Penyiapan Pustaka TinyGPS
Pustaka bernama TinyGPS, buatan Mikal Hart, akan memudahkan dalam mengakses informasi yang dihasilkan oleh modul GPS. Pustaka ini dapat diunduh di situs https://github.com/mikalhart/TinyGPS/releases/tag/v13. Namun, untuk memudahkan Anda, file bernama TinyGPS—13. zip disediakan di CD. File ini perlu didekompresi terlebih dahulu sehingga akan terbentuk folder bernama TinyGPS—13. Setelah itu, sederhanakan nama folder tersebut menjadi TinyGPS (karena Arduino IDE tidak akan mengenali nama folder yang mengandung tanda minus). Selanjutnya, lakukan langkah-langkah seperti berikut.
- Pindahkan subfolder TinyGPS ke C: \ Program Files (x86) \Arduino\1ibraries (dengan asumsi, program Arduino IDE terinstal di C: \ Program Files (x86) \ Arduino).
- Tutuplah Arduino IDE jika dalam keadaan sedang dibuka.
- Panggil kembali Arduino IDE supaya pustaka yang baru saja Anda tambahkan dikenali.
Pengujian untuk Mendapatkan Informasi Posisi Lintang dan Bujur
Setelah pustaka TinyGPS dimasukkan ke folder libraries milik Arduino IDE, pengujian untuk mendapatkan informasi posisi lintang dan bujur dapat segera dilaksanakan. Untuk keperluan ini, Anda bisa menggunakan Skecth Berikut :
// ——————————————–
// Contoh pengujian GPS
// ——————————————–
#include <SoftwareSerial.h>
#include <TinyGPS.h>
SOftwareSerial gpsSerial(2,3);
TinyGPS gps;
void setup()
{
Serial.begin(9600);
gpsSerial.begin (9600);
}
void loop()
if (gpsSerial.available())
{
int kar = gpsSerial.read();
if (gps.encode(kar))
{
float latitude, longitude;
gps.f_get_ position(&latitude, &longitude);
Serial.print(“Latitude (lintang): “);
Serial.println(latitude, 7);
Serial.print(“Longitude (bujur): “);
Serial.println(longitude,7);
}
}
}
Sketch di atas memerlukan pustaka SoftwareSerial dan TinyGPS. Oleh karena itu, sketch diawali dengan:
#include <SoftwareSerial.h>
#include <TinyGPS.h>
Pustaka SoftwareSeriaI digunakan untuk melakukan komunikasi serial dengan modul GPS melalui pin digital, sedangkan pustaka TinyGPS dipakai untuk menangani pembacaan data dari modul GPS.
Sebagaimana terlihat di Gambar 10.14, pin RXD dihubungkan ke Pin 2 dan TXD ke pin 3. Hubungan ini dinyatakan dalam:
SoftwareSeriaI gpsSerial (2, 3) ;
Pernyataan di atas digunakan untuk menciptakan objek bernama gpsSerial yang berkelas
Softwareserial. Jadi, argumen pertama menyatakan pin RXD dan argumen kedua menyatakan TXD. Objek yang digunakan untuk menangani modul GPS diciptakan melalui:
TinyGPS gps;
Dengan demikian, terbentuk objek bernama gps.
Di setup ( ) , dua pernyataan berikut digunakan untuk menginisialisasi objek yang terkait komunikasi serial dengan port serial maupun TinyGps:
Serial. begin (9600) ;
gpsSerial. begin (9600) ;
Angka 9600 menyatakan kecepatan komunikasi.
Sebelum pembacaan data dari satelit dilakukan, pemeriksaan terhadap ketersediaan data dilakukan melalui pemanggilan:
gpsSeria1.available ( )
Jika hasilnya true, berarti data dari satelit tersedia. Selanjutnya, data dibaca melalui:
int kar = gpsSeria1.read() ;
Hasilnya sebuah karakter yang disimpan di kar. Karakter yang diperoleh perlu diproses dengan encode() untuk mendapatkan informasi yang didasarkan karakter tersebut. Fungsi anggota tersebut menghasilkan true sekiranya data yang aslinya dalam format NMEA berhasil dipecah. Setelah itu, posisi dapat diperoleh dengan memanggil fungsi anggota seperti f_get_position() atau get_position ( ) . Dalam hal ini f_get_position() berguna untuk mendapatkan data dalambentuk titik-mengambang, get_position () dipakai untuk mendapatkan data dalam bentukbilangan bulat. Dengan memanggil f get position ( ) , data bujur dan lintang diperoleh.
Gambar 10.15 memperlihatkan contoh aktual penyusunan modul GPS dan Arduino. Contoh hasil pengujian diperlihatkan di Gambar 10.15. Tentu saja, hasil yang dipampangkan tergantung dari lokasi tempatAnda menguji sketch di atas.
Membandingkan Hasil Posisi Lintang dan Bujur
Hasil yang terdapat di Gambar 10.16 dapat Anda bandingkan dengan posisi yang dihasilkan oleh situs tertentu di internet. Pastikan bahwa Anda mempunyai hubungan ke Internet. Kemudian, Anda bisa menguji dengan mengikuti langkah-langkah berikut.
- Melalui browser, masuklah ke situs http://www.mapcoordinates.net/en.
- Ketikkan Monas Jakarta pada kotak di sebelah kanan dan kemudian tekan Enter.
Contoh hasil diperlihatkan di Gambar 10.!7. Pada contoh tersebut. Latitude untuk Monas Jakarta adalah 6175392 dan longitude-nya adalah 106,827156. Adapun tinggi di atas permukaan laut adalah 6 meter.
Memperoleh Informasi Waktu dan Ketinggian
Informasi yang diperoleh dari modul GPS sebenarnya juga mengandung waktu dan ketinggian lokasi di atas permukaan laut. Informasi waktu dapat diperoleh melalui fungsi anggota ohjek berkelas TinyGPS bernama crack datetime ( ) , sedangkan informasi ketinggian posisi (atau altitude) diperoleh melalui f_altitde ( ) .
Sketch timealt menunjukkan contoh untuk mendapatkan informasi waktu dan ketinggian lokasi di atas permukaan laut. Rangkaian yang digunakan untuk menguji sama seperti pada sketch sebelum ini.
// ——————————————–
// Contoh untuk mendapatkan informasi
// tambahan:waktu dan ketinggian
// ——————————————–
#include <SoftwareSerial.h>
#include <TinyGPS.h>
SoftwareSerial gpsSerial(2,3);
TinyGPS gps;
void setup()
{
Serial.begin(9600);
gpsSerial.begin(9600);
}
void loop()
{
if (gpsSerial.available())
int kar=gpsSerial.read();
if (gps.encode(kar))
{
int tahun;
byte bulan, tgl, jam, menit, detik;
gps.crack_datetime(&tahun, &bulan, &tgl, &jam, &menit, &detik);
char teks[22];
sprintf(teks, “%02d/02d/%04d %02d:%02d:응%02d “,
tgl, bulan, tahun, jam, menit, detik);
Serial.println(teks):
float latitude, longitude;
gps.f_get_position(&latitude, &longitude);
Serial.print(“Altitude (lintang): “);
Serial.println(latitude, 7);
Serial.print(“Longitude (bujur):”);
Serial.println(longitude, 7);
float altitude;
altitude = gps.f_altitude();
Serial.print(“Altitude:”);
Serial.println(altitude,7);
Serial.println();
}
}
}
Pada Sketch timealt, pernyataan berikut digunakan untuk mendapatkan data waktu:
gps.crack datetime (&tahun, &bulan, &tgl, & jam, &menit, &detik) ;
dengan cara seperti itu, data tahun, bulan tanggal, jam, menit, dan detik didapatkan. Adapun informasi tinggi Iokasi diperoleh melalui:
altitude = gps.f_altitude ( ) ;
Menghitung Jarak Antara Posisi Sekarang dan Suatu Lokasi
Pustaka TinyG?S menyediakan fungsi anggota bernama distance_between ( ) dengan pemanggilan berbentuk:
TinyGPS: : distance between (latitude 1, longitude 1, latitude 2, longitude 2) ;
Dua argumen pertama menyatakan posisi suatu lokasi dan dua argumen berikutnya menyatakan posisi lokasi kedua.
// ——————————————–
// Contoh untuk memantau jarak posisi
// sekarang terhadap suatu posisi
// ——————————————–
#include <SoftwareSerial.h>
#include <TinyGPS.h>
SoftwareSerial gpsSerial(2,3);
TinyGPS gps;
void setup()
{
Serial.begin(9600);
gpsSerial.begin(9600);
}
void loop() {
if (gpsSerial.available())
{ int kar =gpsSerial.read();
if (gps.encode(kar))
{ float latitude, longitude;
gps.f_get_position(&latitude, &longitude);
float jarak km = TinyGPS::distance between( latitude, longitude,LAT_ACUAN, LON ACUAN) / 1000; Serial.print(“Jarak: “);
Serial.print(jarak km, 7);
Serial.println(” km”);
}
}
}
Gambar 10.19 memeprlihatkan hasil pengujian yang dilakukan di suatu lokasi di Melaka, Malaysia.
Gambar 10.19 Contoh hasil pemonitoran jarak lokasi terhadap Monas Jakarta
Menyajikan Informasi Posisi di LCD
Modul GPS sangat bermanfaat untuk diterapkan pada pengukuran lokasi yang tidak statis. Sebagai contoh pengukuran dilakukan di mobil yang bergerak dari suatu lokasi ke lokasi lain. Pada keadaan seperti ini informasi mengenai posisi tentu saja akan lebih baik kalau ditampilkan pada peranti penampil LCD.
Gambar 10.20 Rangkaian untuk menampilkan informasi posisi LCD
// ——————————————–
// Contoh untuk menyajikan informasi
// lintang dan bujur ke LCD
// ——————————————–
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h>
const int PIN_RS =12;
const int PIN_E =11;
const int PIN_DB 4= 7;
const int PIN_DB 5= 6;
const int PIN_DB 6= 5;
const int PIN_DB_7= 4;
// Buat objek
LiquidCrystal lcd(PIN_RS, PIN_E, PIN_DB 4,
PIN_DB_5,PIN_DB_6,PIN_DB_7);
SoftwareSerial gpsSerial(2,3); TinyGPS gps;
void setup()
{
Serial.begin(9600); gpsSerial.begin(9600);
// Tentukan ukuran LCD
lcd.begin(16, 2);
}
void loop()
if (gpsSerial.available())
{
int kar = gpsSerial.read();
if (gps.encode(kar))
{
float latitude, longitude;
gps.f_get_position(&latitude, &longitude);
lcd.clear();
lcd.print(“Lin.: “);
lcd.print(latitude, 7);
lcd.setCursor (0, 1);
lcd.print(“Buj.: “);
lcd.print(longitude, 7);
delay(1000);
}
}
}
Gambar 10.21 Posisi lintang dan bujur suatu posisi disajikan di LCD