Kamis, 03 September 2015

ULTRASONIK HC SR04







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



vidionya ada di sini

8 komentar:

  1. 4 sensor programnya bagaimana eng.

    BalasHapus
    Balasan
    1. /*****************************************************
      PROGRAM 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);
      }
      }

      Hapus
    2. ini work ?
      maaf ma tanya program bagian mana yg mengatur jumlah penggunaan ultrasonik

      Hapus
    3. mas it clock nya 16 MHz atau 16000000 MHz ?

      Hapus
  2. mas minta script n rangkaian untuk ADC 8 bit donk

    BalasHapus
    Balasan
    1. http://mikrokontroler32.blogspot.co.id/2015/03/sensor-suhu-lm35-sebagai-pengontrol.html

      Hapus
  3. gan kalok pake crystal 8Mhz
    program nya giman?

    BalasHapus
  4. Mas bisa minta skema pemasangan ultrasonic & lcd ke atmega?

    BalasHapus