Sensor jarak ultrasonik Ping))) dengan AVR ATMega16

Posted: June 14, 2009 in AVR Project

Ultrasonik sangat bermanfaat jika digunakan sebagai metode untuk mengukur jarak. Saat ini modul sensor ultrasonik yang banyak dijual dipasaran adalah Ping))) produksi parallax. sensor ini cukup handal dan akurat dalam mengukur jarak. Jangkauan sensor ini menurut datasheet dari 3 cm sampai maksimal 3 meter. interface dari sensor ini juga lumayan gampang dibanding sensor2 ultrasonik sejenisnya karena hanya memiliki 3 pin yaitu Vcc,Ground dan sinyal output. Cara pembacaan data dari sensor ini yaitu dengan menghitung waktu tempuh ketika pulsa ultrasonik 40KHz ditransmisikan sampai pulsa tersebut diterima lagi. dari waktu tempuh tersebut bisa diketahui jarak yang ditempuh dengan persamaan :

s=vt dimana:

s=jarak, v=kec.suara diudara, t=waktu tempuh(dlm hal ini dibagi 2)

kecepatan suara diudara menggunakan rumus ini:

v=331,5 + (0,6xT) , dimana:

T adalah suhu lingkungan

331,5 adalah v pada saat suhu 0 C

saya menggunakan suhu 30 C untuk perhitungan v nya.

modul sensor PING)))

Data output dari sensor ini masuk pada PORTB.0 dan akan di proses oleh uC ATMega16 dan ditampilakan pada LCD 16×2. dibawah ini adalah sourcecode yang ditulis dalam bahasa C dengan kompiler CodeVisionAVR:

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 3/25/2009
Author  : GreenBlack
Company : WEIP
Comments:

Chip type           : ATmega16
Program type        : Application
Clock frequency     : 11.059200 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#define pulsa PORTB.0
#define deteksi PINB.0
#define ARAH DDRB.0
#define OUT 1
#define INP 0

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// Declare your global variables here
unsigned int count;
unsigned long jarak,waktu;
unsigned char baris1[16];
unsigned char baris2[16];

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf(" Pengukur Jarak");
lcd_gotoxy(0,1);
lcd_putsf("   Ultrasonik");
delay_ms(3000);
lcd_clear();

while (1)
      {
      // Place your code here

count=0;
ARAH=OUT;
pulsa=1;
delay_us(5);
pulsa=0;
// port as input
ARAH=INP;
// with pull-up
pulsa=1;
while (deteksi==0) {};
while (deteksi==1)
{
count++;
}
waktu=(count*0.090422453703703703703703703703704);   /*waktu 1 kali eksekusi perintah count++ = 0.090422453703703703703703703703704 mikro second atau (1/frekuensi kristal)*/
jarak=((waktu*0.3495)/2);

sprintf(baris1,"Waktu=%5d uS ",waktu);
sprintf(baris2,"Jarak=%3d cm ",jarak);
lcd_gotoxy(0,0);
lcd_puts(baris1);
lcd_gotoxy(0,1);
lcd_puts(baris2);
delay_ms(200);
lcd_clear();

      };
}

Link untuk download Full Sourcecode :

Comments
  1. prita says:

    mas,klo pngukuran d lakukan d outdoor yg suhu na >30C apakah sensor msh bs d gunakan n akurat??
    range suhu nya dr brp smpe brp?
    gmn kalibrasi nya terhadap variasi suhu nya???
    klo d gunakan realtime kn suhu pst brubah2,apkh ad settingan lain dr alat agar dpt menghitung jarak bila suhu nya brubah2……?
    maklum…saya kurang ilmu tp saya brminat dlm pengembangan Ultrasound ini.

    • ADIHOLIX says:

      tetep akurat…asal dirubah aja kecepatan suaranya melaui persamaan diatas…

    • ADIHOLIX says:

      bisa juga digabungkan dengan sensor suhu mas prita,,maksudnya variabel suhunya tidak ditetapkan,tapi variabel suhu dalam perhitungan nanti diambil dari nilai suhu pada sensor suhu..saya rasa itu solusi jika suhu berubah2 secara ekstrem sehingga hasil dari perhitungan tetep akurat..mungkin seperti itu menurut saya..

  2. kazama says:

    mas,kalo pake avr AT90S2321 dan sensornya pake usirr sama gak?tolong ni..lagi bingung buat skripsi…

  3. ADIHOLIX says:

    yang sama apanya? klo programnya jelas gak sama…rangkaiannya juga gak sama…

  4. zrachmat says:

    Hi, saya newbie pake AVR,
    kebetulan saya baru beli kit robot edukasi dari nextsys, pake atmega8353.
    Boleh dong step by step utk baca input sensor di port A dgn hyper terminal.
    tks

  5. Muhammad says:

    hi dear friend,
    i could not find the sensor which is used in this project. i just found a sensor SRF05 which has a separate Trigger and Output lines (there is a shared line in Prallox Madule) and it’s output is a 5v TTL.
    as i am a newbie to AVR programming, how could i modify the code to replace my sensor with Parallox?

    Thanks in advance

  6. Muhammad says:

    hi
    could any one let me know where the LCD is connected?

    Thanks

  7. reza says:

    mas kalo ultrasonik srf 08 kasih tau dong
    caranya dan program atmega 16.
    itu kan pake i2c.
    jadi bngung banget
    tolong ya

  8. Hendra says:

    ntuk menghitung frekuensi yang diterima receiver ultrasonicnya gmn ms y??soalx sy lg bkin project doppler ultrasonic jd btuh data pergeseran frekuensi yang dibangkitkan dan diterima ultrasonicnya

  9. bagus says:

    mas kalor 2 atau lebih dari 3 ussir program avr 12c gabungannya gmn ya???

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s