Pin TRIG pada sensor dihubungkan pada pin PORTC.4 pada mikrokontroler,
sedangkan pin OUT dihubungkan pada pin PORTC.5 pada mikrokontroler. Pin TRIG
digunakan untuk memberikan sinyal trigger agar gelombang ultrasonik dapat
dipancarkan, sedangkan pin ECHO merupakan pin keluaran yang akan mengeluarkan
pulsa yang mempresentasikan jarak sensor dengan benda. LCD digunakan untuk
menampilkan besaran pulsa dan jarak yang terukur oleh sensor tersebut.
Untuk memulai membuat program, seperti biasa buat project baru dengan
bantuan code wizard. Kali ini kita membutuhkan sebuah timer untuk menghitung
lebarnya pulsa yang keluar dari pin ECHO. Oleh karena itu kita setting dahulu
pengaturan timer. Kali ini yang akan kita gunakan adalah Timer 1 dengan mode
sebagai timer biasa. Kali ini besarnya nilai clock untuk timer yang digunakan
adalah 2MHz. Selain itu kita juga harus mengaktifkan mode overflow interrupt
pada timer. Untuk lebih jelasnya pengaturan dari Timer1 dapat
Setelah mengkonfigurasi Timer1, selanjutnya kita konfigurasi
pin untuk interface ke LCD dan sensor. Kali ini kita gunakan PORTD untuk jalur
data ke LCD, sedangkan sensor nantinya terhubung pada PORTC.4 dan PORTC.5.
Pengaturan lebih jelasnya dapat dilihat pada gambar di bawah ini.
Algoritma untuk pembacaan sensor ultrasonik dapat dijelaskan seperti berukut ini.
1. Keluarkan pulsa 10us pada pin PORTC.4 (TRIG sensor)
2. Hitung lebar pulsa high pada pin PORT.5 (ECHO)
3. Konversi lebar pulsa ke satuan jarak(cm)
4. Tampilkan ke LCD
Untuk lebih jelasnya dapat dilihat pada source code di bawah ini.
#include (mega8.h)
#include (delay.h)
#include (stdio.h)
// Alphanumeric LCD Module functions
#include
#define TRIGGER PORTC.4
#define ECHO PINC.5
unsigned char baris_1[16], baris_2[16];
long timer = 0, xTimer = 0;
float pulsa, jarak;
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
xTimer++;
}
void bacaJarak() {
TRIGGER = 1; // Memberikan pulsa high selama 10 microseconds
delay_us(10);
TRIGGER = 0;
while(ECHO == 0); // Tunggu pulsa high dari sensor
TCNT1 = 0; // Nolkan timer
xTimer = 0; // Nolkan variabel xTimer
while(ECHO == 1); // Tunggu pulsa low dari sensor
timer = TCNT1; // Ambil data dari timer
pulsa = (float)xTimer * 65535 * 0.5 + (float)timer * 0.5; // Menghitung pulsa yang masuk dalam satuan microseconds
jarak = pulsa / 29.034 / 2; // Menghitung jarak dalam satuan centimeter
lcd_clear();
sprintf(baris_1, “Pulsa = %5.2f “, pulsa);
sprintf(baris_2, “Jarak = %3.2f “, jarak);
lcd_gotoxy(0, 0);
lcd_puts(baris_1);
lcd_gotoxy(0, 1);
lcd_puts(baris_2);
delay_us(300);
}
// Declare your global variables here
void main(void)
{
// Port C initialization
// Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State6=T State5=P State4=0 State3=T State2=T State1=T State0=T
PORTC=0×20;
DDRC=0×10;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0×00;
TCCR1B=0×02;
TCNT1H=0×00;
TCNT1L=0×00;
ICR1H=0×00;
ICR1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0×04;
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS – PORTD Bit 0
// RD – PORTD Bit 1
// EN – PORTD Bit 2
// D4 – PORTD Bit 4
// D5 – PORTD Bit 5
// D6 – PORTD Bit 6
// D7 – PORTD Bit 7
// Characters/line: 16
lcd_init(16);
lcd_clear();
// Global enable interrupts
#asm(“sei”)
while (1)
{
// Place your code here
bacaJarak();
delay_ms(100);
}
}
Pada program diatas dapat dilihat bahwa pada saat terjadi interrupt timer maka variabel xTimer akan increment. Variabel ini yang nantinya digunakan untuk perhitungan timer bersama dengan isi register TCNT1. Pada fungsi bacaJarak perhitungan lebar pulsa high berada pada baris berikut.
pulsa = (float)xTimer * 65535 * 0.5 + (float)timer * 0.5; // Menghitung pulsa yang masuk dalam satuan microseconds
Karena kita menggunakan frekuensi clock 2MHz untuk clock timernya, maka dapat dihitung setiap 1 pulsa memiliki periode 0.5 microseconds. Sehingga untuk menghitung total pulsa high dapat mengalikan nilai xTimer * 65535 (karena 16 bit) * 0.5 + TCNT1 * 0.5. Setelah besar lebar pulsa kita ketahui kita dapat mengkonversi ke dalam satuan jarak(cm) dengan rumus perhitungan
jarak = pulsa / 29.034 / 2; // Menghitung jarak dalam satuan centimeter
Nilai 29.034 tersebut adalah konstanta untuk kecepatan gelombang ultrasonik. Karena terjadi pemantulan gelombang, maka jarak yg ditempuh oleh gelombang tersebut adalah 2 kali dari jarak sensor ke benda. Oleh karena itu kita harus membagi lagi dengan 2, sehingga besarnya nilai jarak sama dengan jarak sensor dengan benda pemantul. Karena pada program kita nantinya akan menampilkan bilangan berkoma (float) pada lcd, maka kita harus mengatur terlebih dahulu pada bagian compiler. Klik Project => Configure, kemudian pilih pada bagian berikut. Ganti bagian (s)printf Features menjadi float, width, precision.
Sensor ultrasonik dapat di aplikasikan untuk alat pengukur tinggi badan
4 sensor programnya bagaimana eng.
BalasHapus/*****************************************************
HapusPROGRAM 2 SENSOR ULTRASONIK DENGAN TAMPIKAN LCD
Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include
#include
#include
// Alphanumeric LCD functions
#include
#define TRIGGER PORTD.4 //sensor1
#define ECHO PIND.5
#define TRIGGER1 PORTB.4 //sensor2
#define ECHO1 PINB.5
unsigned char baris_1[16], baris_2[16];
long timer = 0, xTimer = 0;
float pulsa, jarak, pulsa1, jarak1;
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
xTimer++;
}
void bacaJarak() {
TRIGGER = 1; // Memberikan pulsa high selama 10 microseconds
delay_us(10);
TRIGGER = 0;
while(ECHO == 0); // Tunggu pulsa high dari sensor
TCNT1 = 0; // Nolkan timer
xTimer = 0; // Nolkan variabel xTimer
while(ECHO == 1); // Tunggu pulsa low dari sensor
timer = TCNT1; // Ambil data dari timer
pulsa = (float)xTimer * 65535 * 0.5 + (float)timer * 0.5; // Menghitung pulsa yang masuk dalam satuan microseconds
jarak = (pulsa / 29.034 / 2)+0.3; // Menghitung jarak dalam satuan centimeter
delay_us(100);
}
void bacaJarak1() {
TRIGGER1 = 1; // Memberikan pulsa high selama 10 microseconds
delay_us(10);
TRIGGER1 = 0;
while(ECHO1 == 0); // Tunggu pulsa high dari sensor
TCNT1 = 0; // Nolkan timer
xTimer = 0; // Nolkan variabel xTimer
while(ECHO1 == 1); // Tunggu pulsa low dari sensor
timer = TCNT1; // Ambil data dari timer
pulsa1 = (float)xTimer * 65535 * 0.5 + (float)timer * 0.5; // Menghitung pulsa yang masuk dalam satuan microseconds
jarak1 = (pulsa1 / 29.034 / 2)+0.3; // Menghitung jarak dalam satuan centimeter
delay_us(100);
}
// Declare your global variables here
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x20;
DDRB=0x10;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x20;
DDRD=0x10;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
lcd_init(16);
lcd_clear();
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
bacaJarak();
bacaJarak1();
if(jarak>1&&jarak<151){PORTC.0=1,PORTC.1=1,PORTC.2=1;} else {PORTC.0=0;}
if(jarak1>1&&jarak1<181&&jarak>150){PORTC.1=1;} else {PORTC.1=0;}
if(jarak1>199&&jarak1<300&&jarak>150){PORTC.2=1;} else {PORTC.2=0;}
lcd_clear();
sprintf(baris_1, "Sensor1=%3.0f ", jarak);
lcd_gotoxy(0,0);
lcd_puts(baris_1);
sprintf(baris_2, "Sensor2=%3.0f ", jarak1);
lcd_gotoxy(0,1);
lcd_puts(baris_2);
delay_ms(1000);
}
}
ini work ?
Hapusmaaf ma tanya program bagian mana yg mengatur jumlah penggunaan ultrasonik
mas it clock nya 16 MHz atau 16000000 MHz ?
Hapusmas minta script n rangkaian untuk ADC 8 bit donk
BalasHapushttp://mikrokontroler32.blogspot.co.id/2015/03/sensor-suhu-lm35-sebagai-pengontrol.html
Hapusgan kalok pake crystal 8Mhz
BalasHapusprogram nya giman?
Mas bisa minta skema pemasangan ultrasonic & lcd ke atmega?
BalasHapus