INTERFACE SENSOR JARAK HC-SR04 DENGAN MIKROKONTROLER AVR ATMEGA16 (AVR-GCC)


Sensor HC-SR04 adalah sensor jarak yang memanfaatkan sifat suara. Cara kerja sensor adalah dengan memancarkan gelombang suara 40kHz, kemudian gelombang suara dipantulkan oleh benda yang berada didepannya, gelombang yang terpantul tadi diterima kembali oleh sensor tersebut, waktu sejak sensor HC-SR04 memancarkan dan menerima gelombang suara itulah yang digunakan sebagai acuan untuk mengukur jarak dari sensor dengan benda yang berada didepannya. Dengan memasukkan waktu ketika sensor memancarkan gelombang suara sampai dengan menerima kembali pada rumus berikut ini maka akan didapat jarak antara sensor dengan benda.

jarak (meter) = (waktu x kecepatan suara di udara (340m/s)) / 2



Gambar diatas merupakan timing diagram dari sensor HC-SR04. Agar dapat mengukur jarak dengan sensor jarak HC-SR04 pertama-tama dengan memberikan pulsa high pada pin TRIGER dengan durasi 10uS sensor akan memancarkan gelombang suara sebanyak 8 ayunan dengan frekuensi 40kHz. Saat sensor menerima kembali gelombang suara tersebut maka pin ECHO akan menghasilkan pulsa high selama sensor HC-SR04 menerima gelombang pantulan,  pin ECHO yang menghasilkan pulsa high ini akan dihitung waktunya dari saat mulai mengeluarkan pulsa high sampai dengan low kembali. Kemudian hasil pengukuran waktu tadi dimasukkan kedalam rumus, namun hasil pengukuran masih dalam satuan meter, untuk menjadikan centimeter maka harus dikalikan dengan 100, jadi rumus akhir adalah.

jarak (centimeter) = ((waktu selama pin ECHO high x kecepatan suara diudara (340m/s)) / 2) x 100)

Gambar dibawah ini merupakan rangkaian sensor jarak HC-SR04 dengan mikrokontroler juga dilengkapi dengan LCD16x4 untuk menapilkan jarak jarak yang terbaca oleh sensor. Pada rangkaian tersebut pin TRIGER dari sensor terhubung pada PORTC0 mikrokontroler dan pin ECHO sensor terhubung dengan PORTC1 mikrokontroler, sedangkan untuk LCD16x4 terhubung dengan PORTB. Untuk crystal yang digunakan pada mikrokontroler adalah 11,059200MHz.


Pada contoh program dibawah ini PORT mikokontroler yang digunakan sebagai pemberi pulsa pada pin TRIGER sensor adalah PORTC0 sebagai output, untuk penerima pulsa dari pin ECHO sensor adalah PORTC1 sebagai input. sebagai penghitung waktu selama pin ECHO high digunakan timer1 dengan mode normal overflow, precaler menggunakan 64, dan interupt timer1 kondisi tidak aktif.

/*
 * main.c

 *
 *  Created on: May 10, 2017
 *      Author: Hannasy Arif (Hanelka Lab)
 */

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <compat/deprecated.h>
#include "lcd.h"

#define DDRC_TRIG PC0
#define DDRC_ECHO PC1
#define PORTTRIG 0
#define PORTECHO 1

//Bagian LCD
static int lcd_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(lcd_putchar,NULL, _FDEV_SETUP_WRITE);
static int lcd_putchar(char c, FILE *stream)
{
 if(c == '\n') lcd_putchar('\r', stream);
  LCD_send_char(c);
  return (0);
}

//fungsi inisialisasi PORT yang digunakan untuk interface dengan HC-SR04
void portInit()
{
 //set PORTC0 sebagai output untuk memberi pulsa high kepada pin TRIGER
 //set PORTC1 sebagai input untuk menerima pulsa high dari pin ECHO
 DDRC = (1<<DDRC_TRIG) | (0<<DDRC_ECHO);
}

//fungsi untuk menghitung cacahan timer
unsigned int hcsr04GetCount()
{
 unsigned int countTime = 0;
 //set PORTC0 untuk memberi pulsa high pada pin TRIGER
 sbi(PORTC, PORTTRIG);
 //tunggu selama 10uS
 _delay_us(10);
 //clear PORTC0 agar low kembali
 cbi(PORTC, PORTTRIG);

 //tunggu PORTC1 mendapat pulsa high dari dari pin ECHO, looping ditempat
 loop_until_bit_is_set(PINC, PORTECHO);

 //jika sudah mendapatkan pulsa high dari pin ECHO
 //set timer dengan mode normal overflow dan nilai prescaler = 64
 TCCR1A |= (0<<WGM10) | (0<<WGM11);
 TCCR1B |= (0<<WGM12) | (0<<WGM13) | (1<<CS10) | (1<<CS11) | (0<<CS12);
 //menghitung cacahan timer mulai dari TCNT1 = 0x00
 //timer mulai mencacah
 TCNT1 = 0x00;

 //tunggu sampai pulsa dari pin ECHO low kembali, looping ditempat
 loop_until_bit_is_clear(PINC, PORTECHO);

 //jika sudah low masukkan nilai cacahan timer TCNT1 ke variable countTime
 countTime = TCNT1;

 //matikan timer kembali
 TCNT1 = 0x00;
 TCCR1A = 0x00;
 TCCR1B = 0x00;

 _delay_ms(10);

 //hasil perhitungan masih dalam bentuk cacahan timer
 return countTime;
}

int main(void)
{
 unsigned int distance;
 LCD_init();
 stdout = &mystdout;
 LCD_send_command(LCD_CLR);
 LCD_send_command(LCD_Home);
    while (1)
    {
     //karena hasil perhitungan waktu masih dalam cacahan timer maka perlu dikonversi ke waktu
     //nilai pengali 0.09837964 didapat dari
     //pengali = (((prescaler/frekClockMikro) * kecSuaradiUdara)/2)*100
     //dengan begitu hasil pada variable distance berupa centimeter
  distance = (unsigned int)(0.09837964*hcsr04GetCount());
  //tampilkan nilai di LCD
  LCD_line(LCD_Line_1);
  printf("Jarak = %ucm     ", distance);

  _delay_ms(200);
        //__asm__ volatile("nop");  // so the endless loop isn't optimized away
    }

    return (1); // should never happen

}

Program lengkap dari contoh program diatas dapat di Download dibawah ini:

Tidak ada komentar:

Posting Komentar