Monday, October 3, 2011

DIY: build your own GPS receiver!

Untuk 1st entry nih aku nak tunjuk sikit ape yg ak dah buat tuk FYP aku so far. Title FYP aku "Effective Automobile Monitoring and Tracking System". untuk jadikan die effektif. komponen yang paling penting bagi aku dah tentunya GPS.

Preparation
Ok, for starters biar aku terang kan bahan² dan ramuan² die dulu. ini barang² yang aku guna:

1. 66 channel Locosys LS20031 GPS 10Hz Receiver.
2. Arduino Board UNO.
3. Jumper wires.
4. Arduino Software.

barang² nih korang leh dapatkan melalui online dari web die Arduino ngan Sparkfun. or beli kat jalan pasar. ade jual kot.
GPS receiver dan kakinya. ada 5.
Arduino UNO.

Pemasangan


Mula² solder kaki GPS tu macam dalam gambar kat sebelah ni.
Untuk dapatkan data dari GPS kite kena sambungkan GPS ni dengan Arduino. dan Arduino ni kena sambungkan dengan komputer.

Quicktest
Untuk quick test, mula² bukak software arduino dan pastikan arduino board bersambung dengan komputer melalui USB port yang telah di'assign'kan untuk arduino.

then, copy code dibawah dekat ruang sketch dalam software Arduino dan upload ke dalam Arduino board korang.

void setup() {
  Serial.begin(57600);  
}

void loop() {
  if (Serial.available()) {
    Serial.print(Serial.read(), BYTE);
  }
}


pastikan masa korang upload tu GPS belum bersambung dengan Arduino. just for safety. lepas tu baru sambungkan GPS dengan Arduino mengikut PIN configuration seperti di bawah.


  • GPS Pin 5 : (paling kiri bila dilihat dari atas) : tiada connection (or ground)
  • GPS Pin 4 : ke Arduino ground (GND) pin
  • GPS Pin 3 : ke Arduino pin 0
  • GPS Pin 2 : No connection
  • GPS Pin 1 : (paling kanan) : ke Arduino pin 3.3V

GPS PIN configuration
Setelah dicompile  dan jika dilihat pada serial monitor anda akan dapat output begini:

$GPGGA,105317.709,8960.0000,N,00000.0000,E,0,0,,137.0,M,13.0,M,,*4C
$GPGLL,8960.0000,N,00000.0000,E,105317.709,V,N*49
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,105317.709,V,8960.0000,N,00000.0000,E,0.00,0.00,010610,,,N*78
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32

output ini adalah NMEA Sentences yang digunakan GPS module untuk mengira kedudukan.
tapi untuk kita paham sentences ni memang payah. Tapi tak perlu la susah payah nak interpret bahasa asing ni sebab dah ada library yang boleh digunakan untuk tafsir maklumat ni.
Untuk gunakan library tu bolehla download library TinyGPS dekat web ni, arduiniana.

Menggunakan TinyGPS

Setelah korang download library ni dan save dalam folder  hardware>library korang leh la open example code die dari software Arduino tu.

Tapi sebelum korang upload dan guna code tu kite kena wat sedikit ubah suai sebab pada cubaan sebelum ini, cubaan menggunakan code asal adalah menghampakan. Maklumat yang anda dapat hanyalah latitude dan  longitude tanpa maklumat lain seperti tarikh, masa, dan halaju. malah untuk setiap update GPS tu akan ambil masa sehingga 4 minute!

Ini disebabkan code asal menggunakan lagi satu library "NewSoftSerial" dan default buffer untuk library tu adalah terlampau perlahan untuk GPS module yang digunakan. (GPS update at 10hz = 0.1 saat per update)

solusi nye ialah. kita ubah code tu untuk menggukan default serial library.
dalam code test_with_gps_device tukarkan line2 berikut.


TinyGPS gps;
NewSoftSerial nss(2, 3);

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

void setup()
{
  Serial.begin(115200);
  nss.begin(4800);

kepada

TinyGPS gps;
//NewSoftSerial nss(0, 1);

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

void setup()
{
  Serial.begin(57600);
  //nss.begin(57600);

dan cari (ctrl+f) semua line yang mengandungi 'nss' lalu replace kan dengan 'Serial'
Contoh : nss.available()--> Serial.available()

Setelah selesai diedit code itu bolehla anda save dan upload ke Arduino board anda. kemudian sambungkan GPS, compile dan tengok serial monitor.

Sekiranya berjaya, anda sepatutnya akan mendapat output seperti berikut:

data akan diupdate setiap 5 saat. Anda boleh tukar update rate GPS  dalam coding tadi pada line 
while (millis() - start < 5000) untuk jadikan 10 saat tukar nilai menjadi 10000 dan seterusnya.

data yang telah anda dapat ini kemudiannya boleh digunakan dalam tracking software seperti OpenGTS atau software mapping yang lain (Google Map, phone software etc.). Aku pun akan buat satu software untuk tracking ni nanti. Tapi buat sementara ini setakat ni je dulu. Selamat Mencuba!! ;)

p/s: jika ada apa² pertanyaan atau cadangan sila lontarkan dalam ruangan komen. tq. ;) all info are taken from sparkfun and Arduino website.