Sunday, March 3, 2013

Salam Otomasi. 


oke.. di sini kita akan membahas soal penggunaan sensor jarak PING dimana untuk perhitungan datanya memanfaatkan fasilitas timer1 yang ada di mikro. Sebenernya pake increment variabel si bisa, cuma kalo sama pabrikan AVR dikasih fasilitas timer, kenapa ga dipake? ^^ ..

Kayak yang udah pernah saya bahas soal timer, selain sebagai PWM, timer mikro juga bisa dipake buat Timer (lah sama aja dong? timer jadi timer). maksudnya, timer ini fungsinya, emm, kayak stop watch.. ketika distart, timer ini akan increment (menghitung naik), nah kecepatan naiknya berapa? Ini si sebenernya pengamatan saya, kalo ada yang salah ya mohon dikoreksi :) Lanjuuut ..

Pada mikro, terdapat clock (detak jantung :D). bisa pake clock internal 1MHz, 4MHz, 8MHz, atau pake clock external 11,0592 MHz, 12 MHz n maksimalnya 16MHz. Apa si artinya? Artinya, ketika memakai clock 1MHz, maka mikrokontroler akan mengerjakan 1.000.000 intruksi selama 1 detik. Jadi, semakin tinggi nilai clock yang dipakai, maka semakin cepat pula sebuah intruksi itu dieksekusi. Apa si intruksi itu? Kalo saya ga salah, ketika belajar bahasa assembly, maka ada intruksi mov, ljmp, sjmp, nop, dsb dimana masing-masing punya rentang byte pada memori, sehingga pemahaman instruksi ini penting agar space memori cukup untuk listing program yang akan kita pakai. Jadi, kalo kita nulis pake bahasa Bascom Home: LCD "tes" sebenernya 1 baris akan = berbaris-baris instruksi in assembly.




Oke, sebelum masuk lebih dalam lagi, mohon di download dulu datasheet sensor ping di sini . Datasheet ini sangat perlu, sebelum kita mengakuisisi data dari sebuah sensor. Seringkali sensor yang kita pake tidak berfungsi seperti yang kita harapkan, ketika tanya di forum, dan mendapat pertanyaan balik, "sudah dipelajari datasheetnya belum?", malah *spechless (alias belum baca/bahkan belum download). Meski coding untuk pemakaian beberapa sensor itu tersedia di internet, tapi tetep pelajari datasheetnya terlebih dahulu. Karena coding yang diupload di internet kadang-kadang sengaja ada yang disalahin oleh pengarangnya, biar sama-sama ngerasain trial and eror. Atau kasih coding lengkap, tapi kalo kita butuh untuk keperluan yang lain, mesti modif dulu (& saya ngikutin aliran yang ini.. hehehehe).


untuk wiring, ga usa dibahas kali ya, tinggal nancepin Vcc, Ground, & untuk input saya pake' portA.0, berikut codingnya:



'deklarasi kVristal
'-------------------------------L6-------------------------------------
$crystal = 16000000

'deklarasi header
'-------------------------------L10------------------------------------
$regfile = "m32def.dat"

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.6 , Db6 = Portb.5 , Db7 = Portb.7 , Rs = Portb.2 , E = Portb.3
Config Lcd = 16 * 2

'----------------------------------------------------------------------
'variabel untuk sensor ultrasonik
Dim Up As Integer
Dim Jarak As Integer
Dim Jarak7 As Single
'Dim Jarake As String * 10

Config Timer1 = Timer , Prescale = 64
'Stop Timer1
'Config Porta.7 = Output
Echo7 Alias Pina.0
Trig7 Alias Porta.0

Const Centi = 58
Const Konst = 0.068965
'On Timer1 Naik
Dim Key As String * 5
Waitms 100

Enable Interrupts
Enable Timer1
Initlcd
Cursor Off

Cls
Home : Lcd "prepare"                                        'menulis di koorinat 1,1: "prepare"                                                     'delay 1 detik
Wait 2

Cls
Do

 Gosub Sens7
 Home : Lcd Timer1 ; ";" ; Jarak ; "; "                     '
 Lowerline : Lcd Jarak7 ; ";"                               '

Loop

'==========================
Sens7:
 Set Ddra.0
 Reset Trig7
 Waitus 5
 Set Trig7
 Waitus 5
 Reset Trig7

 Reset Ddra.0
 Set Trig7
 Bitwait Echo7 , Set

 Timer1 = 0
 Start Timer1

Do
 If Echo7 = 0 Then
  Stop Timer1
  Exit Do
 End If
Loop

Jarak7 = Timer1 * Konst
Jarak = Round(jarak7)

Waitus 200
Return

End


'=================================

Penjelasan:
Seperti coding di atas, saya pake xtal 16MHz, fasilitas Timer saya pake Timer1, biar rentang hitungannya panjang (65535 - 16 bit) dari pada timer0 atau timer2 (255 - 8 bit).

Nah, masuk ke hitungannya. Di coding ada prescale = 64. Apa itu? Prescale itu merupakan sebuah penskalaan, semisal di peta, ada istilah skala 1:1000, artinya 1cm di peta, mewakili 1m jarak asli. Sama seperti halnya di mikro, jika prescale = 64 artinya "1 hitungan naik Timer1 = 64 hitungan clock", atau kalo dibalik "dibutuhkan 64hitungan clock untuk menaikkan nilai timer1 = timer1 + 1". Sedangkan clock itu sendiri = nilai xtal yang digunakan.

Sehingga dari rumus di atas, Fprescale = 16.000.000 / 64 = 250.000Hz, jadi Ttimer1 = 1 / 250000 = 0,000004 secon = 4 uSecon. Artinya untuk kenaikan timer1 +1 membutuhkan waktu 4uSecon (ingat bagian ini baik-baik! ).

Kita akan masuk ke bagian sensor Ping dulu, ini saya copas dari datasheetnya:

• Range – 2 cm to 3 m (0.8 in to 3.3 yrds)
- ini tau kan artinya apa
• Input Trigger – positive TTL pulse, 2 uS min, 5 μs typ
- kita kasih ouput logika High (1) selama 5 uSecon untuk triggernya.
• Echo Pulse – positive TTL pulse, 115 uS to 18.5 ms
- ini panjang pulsa echo
• Echo Hold-off – 750 μs from fall of Trigger pulse
- ketika kita reset pulse buat trigger tadi, maka akan ada 'delay' 750uSecon
• Burst Frequency – 40 kHz for 200 μs
- ini frekuensi dari sinyal ultrasonik yang dikeluarkan
• Delay before next measurement – 200 μs
- ini batas buat delay tiap 'pemanggilan' data

secara gambar akan dijelaskan seperti ini:
Sesuai datasheet, jadi 2cm-300cm akan direpresentasikan dengan pulsa high selebar 115uS - 18500uS .. Eits, bener tuh? :D Oke, kita cek dulu. Berdasarkan fakta, suara ultrasonik ini merambat di udara dengan kecepatan 29,034uS tiap 1cm (bulatkan 29uS aja ya :D.. uS itu mikro secon lho)

Teorinya ini:
=> 1 S (secon) = 10 ^ -3 mS (mili Secon) = 10 ^ -6 uS (mikro Secon), nS = 10 ^ -9 (nano Secon) *ngingetin lagi, sapa tau pas SMA pelajaran Fisika bab ini lagi bobok :p hehehehhe

Jadi, misal ngukur jarak 2cm, maka dibutuhkan waktu 4x29uS = 116 uS, nah, selisih 1uSecon kan berdasarkan data datasheet (Echo Return Pulse Minimum = 115 uS)? Kalo 3meter, maka 600x29uS = 17,4 mS. Lho padahal Echo Return Pulse Maximum nya 18,5 mS. Itu artinya, ketika tidak ada pantulan pulsa yang ditangkap dalam jangka waktu 18,5 mS, maka pulsa echo akan otomatis falling down :) ..

Tapi kenapa dikali 4, bukan 2cm? Ingat, sistem kerja sensor PING ini: gelombang dipancarkan, ketika mengenai suatu benda akan dipantulkan, nah pantulannya ini ditangkap lagi oleh sensor. Jadi, ketika lebar pulsa 400uS, itu adalah waktu bolak-balik, bukan waktu bolak aja, atau balik aja :p .. sehingga didapat rumus, en ing engggg.. :D

jarak = (lebar pulsa / 29uS) / 2 atau dengan kata lain jarak = lebar pulsa / 58 (ini untuk menghitung jarak dalam centi meter. untuk inchi, ya pembagi 58 nya itu aja yg diganti, sesuai kecepatan ultrasonik berapa uS / 1 inch). Lalu hubungannya dengan timer apa? Ya timer dipake untuk menghitung lebar pulsanya. Tadi Ttimer = 4uS kan? Nah, misal nih, saya punya pulsa yg lebarnya 100uS, maka nilai timer1 = 25, ya kan? :D .. Bentar, masih bingung ini? Itu lho, kan timer1 akan increment tiap 4uS, maka dalam 100uS, ada 25x increment, sehingga nilai timer1 = 25. Tapi inget di coding, nilai timer ini harus dikali 4, sehingga akan mempresentasikan lebar pulsa sesungguhnya (25x4uS = 100uS pulsa asli). Setelah ketemu lebar pulsanya, baru deh dimasukin ke rumus jarak ntu.


Jarak7 = Timer1 * Konst
Jarak = Round(jarak7)


wah dicoding saya itu kok langsung dikali variabel Konst (=0.068965)? Aslinya tu runtutannya gini:
1) Pulsa = Timer1 * 4
2) Jarak = Pulsa / 58

Lha kalo disingkat pan jadi Jarak = Timer1 * 4 / 58, 4/58 =0.068965 itu :) Untuk perintah Round, artinya itu pembulatan (dalam variabel integer), biar hasilnya ga koma-koma gitu ^^b.. oiya, ini kan pake Timer1, pake timer0 tu bisa juga. Cuman, karena rentang nilainya 255 (misal pake prescale = 1), itu harus pake interrupts timer0, sehingga ketika ada overflow (hitungan sudah melebihi 255, setelah 255 akan kembali ke 0 lagi), ada variabel yang kita increment, ya bisa dikatakan kayak sistem LSB + MSB gitu dah. bisa digoogle banyak kok ^^ kenapa timer1 tidak perlu pake "On Timer1 xxx" gitu? Coba de diitung, maksimal pulsa 18500uS / 4 = 4625 <> masih jauh dengan nilai 65535. Jadi InsyaAllah amaaaan...

Perhitungan ini punya prosentase eror, tp saya belum mengamati berapa, males. hehehehe. Berikut rumus-rumus inti dari pembahasan di atas, jadi sekarang mu pake xtal berapa, prescaler berapa, tinggal masukin rumus :D .. semoga bermanfaat :) Selamat belajar.. (Next post, tentang setting fuse bit, insyaAllah)
.



hasil belajar di sumber :
http://kautsar-sam.blogspot.com/2012/08/sensor-jarak-ping-include-rumus.html



5 komentar:

  1. Mantaps mas, penjelasannya detik banget, terima kasih banyak mas, ditunggu mas artikel ttg pake timer0 atau timer2, biar bs gunain LSB MSB

    ReplyDelete