Program - Programkuuuu

Program Parsing Data GPS
Pada sistem dalam proyek akhir ini menggunakan data dengan format data $GPRMC (Recommended minimum specific GNSS data).

 while (1)
      {
    if (getchar()=='$' && getchar()=='G' &&  getchar()=='P' && getchar()=='R' && getchar()=='M' && getchar()=='C'
              {
                for(i=0;i<60;i++)
                 {
                    data[i]=getchar();
                 }
                putchar1('$');
                for(i=0;i<60;i++)
                 {
                  putchar1(data[i]);
                 }
              }
      };

Program di atas digunakan untuk parsing data GPS dengan menggunakan perintah “if”. Pada program tersebut jika pada data yang diterima oleh ATMega 162 terdapat format $GPRMC maka selanjutnya data akan diambil sebanyak 60 karakter setelah format tersebut. Data yang diambil selanjutnya diinisialisasikan dengan format integer i. Fungsi getchar digunakan untuk mengambil data yang berasal dari GPS dan yang melakukan perintah tersebut adalah mikrokontroller.

Sesuai dengan inisialisasi USART yaitu UCSRB adalah Communication Parameters: 8 Data, 1 Stop, No Parity. USART Receiver dan  USART Transmitter dalam keadaan aktif dan USART Baud rate: 9600 sesuai yang diset pada GPS.

UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

Program Pengiriman Data GPS
Setelah data diparsing menggunakan mikrokontroller ATMega 162, maka data harus dikirim ke ATMega 16 untuk diolah kembali. Pengiriman menggunakan XBee PRO yakni secara wireless. Data yang dikirim menggunakan inisialisasi awal $ dan data yang diambil sebanyak 60 data sehingga data tersebut akan diambil oleh ATMega 16. 

  putchar1('$');
  for(i=0;i<60;i++)
      {
         putchar1(data[i]);
      }

Program Pada ATMega 16
Program yang dilakukan pada ATMega 16 ini antara lain program pengambilan data GPS dari ATMega 162, penentuan titik koordinat lintang dan bujur, penentuan data kecepatan, konversi lintang bujur dalam satuan meter, konversi kecepatan dalam satuan km/jam, perhitungan jarak 2 titik dari lintang bujur, program bila tidak terdapat sinyal, serta program utama untuk integrasi dengan hardware.

Program Pengambilan Data GPS
Setelah data dikirim oleh ATMega 162 melalui XBee PRO Transmitter dan diterima XBee PRO Receiver pada ARMega 16. Sebelumnya dilakukan inisialisasi karakter yang akan digunakan untuk pemrograman agar tidak terdapat error seperti pada program di atas. Jumlah karakter atau data yang diambil maksimal sebanyak 43 data dan menggunakan integer ‘i’ untuk fungsi.

       if (getchar()=='$'
              {
                for(i=0;i<43;i++)    
                 {
                    data[i]=getchar();
                    if(i<16)
                    { 
                       lcd_gotoxy(i,0);
                       lcd_putchar(data[i+14]) ;
                    }
                    else
                    {
                      lcd_gotoxy(i-16,1);
                      lcd_putchar(data[i+14]) ;
                    }  
                 }               

Pada pengambilan data ini, data yang diambil hanya sebanyak 43 karakter sesuai dengan panjang format data $GPRMC. Data yang diambil ditampilkan pada layar LCD 16x2. Pada program tersebut jika data yang diinisialisasikan dengan “i” lebih dari 16 karakter maka data selanjutnya akan ditampilkan pada layar LCD baris kedua secara otomatis agar data dapat terbaca sepenuhnya.

Program Penentuan Lintang dan Bujur
Setelah didapatkan format data $PRMC, maka data tersebut diparsing atau dicacah kembali untuk diambil data koordinat lintang dan bujur.

 double numl, numb, nums;             
 unsigned char buff[10];
 PORTA=0x00; DDRA=0x00;
 PORTB=0xFF; DDRB=0x00;
 PORTC=0x80; DDRC=0x7F;
 PORTD=0x00; DDRD=0x00;

Karakter – karakter yang akan digunakan harus diinisialisasikan terlebih dahulu seperti program di bawah ini. Inisialisasi tersebut menggunakan tipe data double karena tipe tersebut bisa beruda desimal dari 24 hingga 53 digit. Sedangkan unsigned char buff digunakan untuk penyimpanan hasil pembacaan data yang didapat dari GPS sebanyak 10 karakter data.

Program di bawah  ini digunakan untuk memroses data lintang yang didapatkan. Sebelumnya lcd dibersihkan dengan program lcd_clear(); sehingga data yang tampil tidak akan terganggu dengan data sebelumnya. Koordinat lintang berada pada karakter ke-14 sehingga inisialisasi awal adalah i=14 sampai 22. Numl digunakan untuk inisialisasi lintang yang awalnya diberikan nilai 0. Numl dibagi dengan 100 untuk memindahkan letak koma yang sesuai dengan format data derajat meridian. Selanjutnya data lintang ditampilkan pada LCD 16x2 baris pertama. Untuk mengetahui arah dari lintang apakah utara atau selatan maka data tersebut diambil dari data GPS pada karakter ke 24.

 lcd_clear();
 numl=0;
 for(i=14;i<=17;i++)
 {
   numl = ((data[i]-0x30)*pow(10,17-   i))+ numl;
 }                   
 for(i=19;i<=22;i++)
 {
   numl = ((data[i]-0x30)*pow(10,18-i))+ numl;
 }

 numl/=100;       
 numl=(float)numl;                          
 sprintf(buff, "Lntg: %4.6f", numl);
 lcd_gotoxy(0,0);
 lcd_puts(buff);
 lcd_gotoxy(15,0);   
 lcd_putchar(data[24]);  

 numb=0;
 for(i=26;i<=30;i++)
 {
  numb = ((data[i]-0x30)*pow(10,30-i))+ numb;
 }
 for(i=32;i<=35;i++)
 {
 numb = ((data[i]-0x30)*pow(10,31-i))+ numb;
 }

 numb/=100;       
 numb=(float)numb;                          
 sprintf(buff, "Bjr:%4.6f", numb);
 lcd_gotoxy(0,1);
 lcd_puts(buff);
 lcd_gotoxy(15,1); 
 lcd_putchar(data[37]);

Seperti halnya lintang, inisialisasi bujur juga sama dengan lintang hanya inisialisasi fungsinya saja yang berbeda yaitu menggunakan numb. Data bujur dimulai pada karakter ke 26 sampai karakter ke 35 dan arah dari bujur barat atau selatan berada pada karakter ke 37. Bujur ditampilkan pada baris kedua pada LCD 16x2.

Program Penentuan Kecepatan GPS
Pada data $GPRMC juga diambil data kecepatan dengan satuan knot. Inisialisasinya adalah nums yang diberikan nilai awal sama seperti lintang dan bujur yaitu nol. Karena hanya menggunakan satu buah LCD maka harus diberikan delay untuk menampilkan data kecepatan yang juga diberikan fungsi untuk membersihkan karakter pada LCD.

 delay_ms(500);
 lcd_clear();     
 nums=0;                      for(i=39;i<=39;i++)
 {
 nums = ((data[i]-0x30)*pow(10,39-i))+ nums;
 }
for(i=41;i<=42;i++)
 {
 nums = ((data[i]-0x30)*pow(10,40-i))+ nums;
 }

 nums=(float)nums;                           
 sprintf(buff, "Speed:%2.3f", nums);
 lcd_gotoxy(0,0);
 lcd_puts(buff); 
 lcd_gotoxy(12,0);    lcd_putsf("knot");
 delay_ms(500);

Inisialisasi nums yang semula double diubah menjadi float karena punya kepresisian hingga 23 digit. Kecepatan juga menggunakan buff untuk menyimpan data yang telah diambil dan ditampilkan dengan format2 angka di depan koma dan 3 angka di belakang koma. Untuk menampilkan karakter “knot” maka menggunakan fungsi lcd_putsf.

Program Konversi Lintang Bujur
Karena data GPS berupa derajat meridian maka lintang dan bujur harus diubah menjadi satuan meter agar bisa ditentukan jarak dua titik pada proses selanjutnya.

 numl=(float)numl*110067;                         
 sprintf(buff, "Lntg:%6.2f", numl);

 numb=(float)numb*110321;                          
 sprintf(buff, "Bjr:%7.2f", numb);

Sesuai dengan rumus konversi titik koordinat dari Robinson Arthur maka data GPS yang bertipe Degrees Minutes harus diubah menjadi satuan meter yaitu dengan rumus:
Lintang = lintang (DM) x 110067
Bujur = bujur (DM) x 110321
Selanjutnya data setelah dikonversi juga ditampilkan di LCD 16x2 dengan letak koma yang berbeda.

Program Konversi Kecepatan
Seperti yang telah dijelaskan di awal, kecepatan yang didapatkan dari data GPS memiliki satuan knot sehingga harus diubah menjadi satuan Km/h. listing programnya adalah seperti di bawah ini.

 kec=nums*1,852;
 kec=(float)kec;                          
 sprintf(buff, "     :%2.3f", kec);
 lcd_gotoxy(0,1);
 lcd_puts(buff); 
 lcd_gotoxy(12,1);
 lcd_putsf("km/h");
 delay_ms(500);

Kecepatan dalam satuan Km/h diinisialisasikan dengan “km”. Sesuai dengan rumus konversi satuan knot diubah menjadi Km/h dengan dikalikan 1,852. Seperti program lainnya, program ini juga menngunakan buff untuk menyimpan data dari GPS dan ditampilkan pada LCD 16x2 pada baris kedua. Pada program ini diberikan delay untuk mengulang tampilan ke tampilan lintang dan bujur.

Program Perhitungan Jarak
Untuk menetukan jarak maka harus diberikan 1 titik koordinat tetap yaitu titik koordinat palang pintu kereta api. Oleh karena itu, pada program ditetapkan titik koordinat palang pintu kereta api sekaligus dikonversi dengan inisialisasi di bawah ini.
 Lintang = 7.165617 * 110067;
 Bujur = 112.476623 * 110321;
Pada inisialisasi tersebut menggunakan tipe data “double”, karena data yang akan ditampilkan berupa desimal dan bisa mencapai 24 samapi 53 digit.

 //lintang
 numl/=100;                        numl=(float)numl*110067;
 JL = pow((abs(lintang - numl)),2);                         
 sprintf(buff, "Lntg:%6.2f", numl);
    
 //bujur
 numb/=100;                        numb=(float)numb*110321;
 JB = pow((abs(bujur - numb)),2);                          
 sprintf(buff, "Bjr:%7.2f", numb);
               
 // jarak 
 jarak = sqrt(JL + JB);
 sprintf(buff, "Jarak:%4.2f", jarak);
 lcd_gotoxy(0,0);
 lcd_puts(buff);                   lcd_gotoxy(15,0);
 lcd_putchar('m');


Pada program di atas dilakukan eksekusi lintang dan bujur terlebih dahulu yaitu: JL = pow((abs(lintang - numl)),2); untuk perhitungan 2 titik lintang yang dipangkatkan, demikian juga untuk 2 titik bujur yaitu: JB = pow((abs(bujur - numb)),2); Selanjutnya adalah perhitungan jarak dengan rumus: jarak = sqrt(JL + JB);    

Dengan program tersebut maka didapatkan nilai yang sama seperti pada rumus yang telah ditentukan.                                            
  
Program GPS Tanpa Sinyal
Ada kalanya GPS tidak mendapatkan sinyal, bisa dikerenakan oleh cuaca yang kurang mendukung atau bisa karena XBee PRO yang tidak bisa mengirimkan data. Pada perancangan dibuat program untuk mendeteksi jika GPS tidak mendapatkan sinyal sebagai berikut.

if(data[14]==','&&data[15]==','&&data[16]==',')
 {
  for(i=0;i<43;i++)
  data[i]='0';                   
 }
 PORTC.3=~PORTC.3;
 PORTC.4=~PORTC.4;

Pada program tersebut, jika data atau karakter ke-14 yang seharusnya merupakan awal ari data lintang berupa tanda koma yang berarti tidak ada sinyal maka data yang diproses adalah nol dan output dari program ini adalah lampu indikator merah dan kuning yang terus menyala berkedip – kedip sampai GPS kembali mendapatkan sinyal.

Program Putar Balik Motor
Program putar balik motor digunakan untuk menutup dan  membuka palang pintu perlintasan kereta api. Untuk menutup motor berarti motor dalam kondisi putar kiri, sedangkan pada saat membuka palang maka motor dalam keadaan putar kanan. Untuk inisialisasi program menggunakan fungsi sendiri yaitu untuk fungsi menutup dan membuka palang pintu seperti di bawah ini.

 void TUTUP(void)
{
 PORTC.5 = 1; PORTC.3 = 1; PORTC.4=  0; PORTC.6 = 0;
 { 
  if(PINB.0!=0)
    PORTC.0=1;
  else
   {
    PORTC.0=0;
    delay_ms(1000);  
   }
 }
}


 void BUKA(void)
{
 PORTC.5 = 0; PORTC.3 = 0; PORTC.4=  0; PORTC.1 = 1;
 {
  if(PINB.1!=0) 
   PORTC.1 = 1;    
  else
  {
   PORTC.1 = 0;
   delay_ms(1000);
  }
 }
}

Pada program tersebut untuk menutup palang menggunakan PORTC pin 0 dan untuk membuka menggunakan pin 1 pada ATMega 16. Pada putar balik motor juga dilengkapi dengan limit switch yang befungsi sebagai input untuk membatasi putaran motor. Pada palang pintu kereta api dipasang 2 buah limit switch yang diletakkan pada PORTB pin 0 dan pin 1. Jika limit switch aktif atau mendapat logika 1 maka motor akan berhenti berputar baik pada saat menutup maupun membuka palang pintu kereta api.

 Program Perancangan Output
Selain untuk putar balik motor, pada ATMega 16 juga terdapat beberapa input yang merupakan aksesoris dari palang pintu perlintasan kereta api yaitu berupa lampu indikator merah dan kuning, buzzer, dan sensor phototransistor.

 PORTC.3 = 1;  // lampu merah
 PORTC.4 = 1;  // lampu kuning
 PORTC.5 = 1;  // buzzer
 PORTC.6 = 1;  // phototransmitter
 PORTC.7 = 1;  // photoreceiver

 Program Integrasi Sistem
Untuk integrasi dengan sistem tujuan utama adalah buka tutup palang pintu perlintasan pada saat kereta api berada jarak tertentu dan kecepatan tertentu pula. Pada sistem ini dibuat 3 macam kasus untuk menutup palang pintu perlintasan yaitu pada saat kereta api dengan kecepatan 20 km/jam dan berada kurang ari sama dengan 20 meter dari palang pintu. Kasus kedua adalah kecepatan kereta api antara 20 sampai 40 km/jam dengan jarak kurang dari sama dengan 40 meter. Kasus ketiga untuk menutup palang yaitu kereta api dengan kecepatan antara 40 samapi 60 km/jam dengan jarak  kurang dari sama dengan 60 meter. Setelah 30 meter kereta api melewati palang pintu perlintasan maka palang pintu perlintasan akan membuka dan semua aksesoris kembali dalam keadaan OFF.

 if (jarak <= 100 && a==0)
 {
  PORTC.4 = 1;
  if (kec <= 20 && jarak <= 20)
    TUTUP();
  else if (20< kec <=40 && jarak <= 40)
    TUTUP(); 
  else if (40< kec <=60 && jarak <= 60)
    TUTUP();
 }
                
  if (jarak <= 10)
    a=1;
  if (jarak >= 30 && a==1)
    BUKA(); 

5 comments:

  1. mbak...bisa minta program lengkapnya nggak,,, udah saya coba contoh program di atas, tapi masih nggak bisa tuh untuk dapetin nilai koordinat latitude dan longitudenya.... lagi ngerjain TA juga nech mbak,,, mohon bantuannya :)

    ReplyDelete
    Replies
    1. Semua file dan buku TA saya ada di sidoarjo, sedangkan saya skrang ada di jakarta. kalo misal posisi kamu dekat dengan kampus PENS bisa pinjem buku saya diperpustakaan, atau bisa minta tolong rekan disana buat download buku saya, krn download cuma bisa diakses dari kampus PENS. :)

      Delete
    2. hmmm...ribet juga y mbak hehe... mbak ndiri nggak nyimpen arsipnya di laptop tw flash? hehe

      Delete
    3. mas/mbak, laptop saya dan semua file2nya ada di sidoarjo, saya di jakarta skrng. maaf ya :)

      Delete
  2. Assalamu alaikum Mbak. Aku Nurul Dari balikpapan.. nanti aku tanya tanyamenegnai tugas mbak ini yah... maaf sebelumnya n salam kenal. bukan g sopan. aku mau sig out dulu

    ReplyDelete

Terima kasih sudah berkunjung, silakan tinggalkan komentar Anda ^.^