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).
'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
Update Contact :
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email : Fajarudinsidik@gmail.com
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email: Fajarudinsidik@gmail.com
atau Kirimkan Private messanger melalui email dengan klik tombol order dibawah ini :

