Assalamu'alaikum Wr. Wb. Di postingan kali ini saya akan memberikan tutorial membuat rangkaian simulasi sensor kecepatan menggunakan dua buah sensor ultrasonik dengan kontroler ATmega 16. Pada simulasi ini sensor ultrasonik pertama (sensor jarak 1) digunakan untuk mendeteksi objek/benda yang melewatinya. Sedangkan sensor ultrasonik kedua (sensor jarak 2) yang diletakan sejauh 1 m dengan sensor jarak 1 dari arah datangnya objek yang melewati sensor jarak 1 menuju sensor jarak 2 dengan arah yang sejajar secara horizontal terhadap kedua sensor tersebut. Sehingga jika sensor jarak 2 sudah mendeteksi adanya objek setelah melewati sensor jarak 1, maka dapat diketahui nilai kecepatannya berdasarkan rumus v = s/t (kecepatan (v), jarak (s), waktu (t)).
Untuk jarak antara kedua sensornya sebenarnya dapat diatur sesuai kebutuhan namun pada tutorial ini jaraknya sebesar 1 m. Semakin dekat jarak antar kedua sensornya maka kecepatan yang dideteksi semakin cepat, namun untuk kecepatan rata-rata jarak antara kedua sensornya semakin jauh semakin akurat hasilnya.
Pada simulasi sensor kecepatan ini juga dapat diatur jarak pendeteksian objeknya. Hal tersebut untuk mencegah terdeteksinya suatu objek yang lebih jauh dari jarak objek yang ingin dihitung kecepatannya saat melewati kedua sensor jarak tersebut.
Dalam tutorial Simulasi Sensor Kecepatan menggunakan Dua Buah Sensor Ultrasonik dengan Tampilan LCD Karakter 16x2 ini menggunakan CV AVR untuk membuat programnya dalam bahasa C dan menggunakan ISIS Proteus untuk perancangan desain rangkaian dan simulasinya. Berikut langkah-langkah pembuatannya.
- Buka software CV AVR-nya kemudian klik New file → Project maka akan muncul tampilan pop up window CodeWizard AVR. Atur jenis mikrokontroler dan clock speed-nya di tab "Chip".
- Klik tab "Timers" kemudian atur pada Timer0 seperti pada gambar di bawah.
- Klik tab menu "Alphanumeric LCD" dan konfigurasikan seperti pada tampilan ini.
- Buka tab menu "ADC" untuk mengaktifkan ADC. pengaktifan ADC ini hanya digunakan untuk mengatur jarak maksimal antar sensor jarak 1 dan sensor jarak 2 dengan objek yang di deteksi dan simulasi pendeteksian jarak pada masing-masing kedua sensor jarak tersebut.
- Setelah itu klik menu File → Generate Save and Exit, kemudian simpan nama ketiga filenya (disarankan sama semua agar tidak bingung), maka akan tampil seperti ini.
- Selanjutnya lengkapi sourcecode programnya seperti berikut.
- /*****************************************************
- This program was produced by the
- CodeWizardAVR V2.05.3 Standard
- Automatic Program Generator
- © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
- http://www.hpinfotech.com
- Project : Sensor Kecepatan Berbasis Ultrasonik
- Version : 1.3
- Date : 19/12/2018
- Author : Vidi Fitriansyah Hidarlan
- Company : Personal
- Comments:
- Chip type : ATmega16
- Program type : Application
- AVR Core Clock frequency: 8,000000 MHz
- Memory model : Small
- External RAM size : 0
- Data Stack size : 256
- *****************************************************/
- #include <mega16.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <delay.h>
- // Alphanumeric LCD functions
- #include <alcd.h>
- long timer,count,hitung,detik,menit,indeks,waktu,objek_maks,baca_adc,sensor1,sensor2;
- float jarak,kecepatan_mps,kecepatan_kph;
- char data1[16];
- char data2[16];
- char data3[16];
- char data4[16];
- char data5[16];
- char data6[16];
- char data7[16];
- // Timer 0 overflow interrupt service routine
- interrupt [TIM0_OVF] void timer0_ovf_isr(void)
- {
- // Reinitialize Timer 0 value
- TCNT0=0xB2;
- // Place your code here
- timer++;
- }
- #define ADC_VREF_TYPE 0x00
- // Read the AD conversion result
- unsigned int read_adc(unsigned char adc_input)
- {
- ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
- // Delay needed for the stabilization of the ADC input voltage
- delay_us(10);
- // Start the AD conversion
- ADCSRA|=0x40;
- // Wait for the AD conversion to complete
- while ((ADCSRA & 0x10)==0);
- ADCSRA|=0x10;
- return ADCW;
- }
- // Declare your global variables here
- void hitung_waktu()
- {
- if (timer>99)
- {
- lcd_clear();
- detik++;
- timer=0;
- }
- else if (detik>59)
- {
- menit++;
- detik=0;
- }
- }
- void deteksi_sensor()
- {
- if ((PINC.6==0)&&(PINC.7==1)&&(indeks==0))
- {
- TIMSK=0x00;
- indeks=3;
- lcd_clear();
- }
- else if ((PINC.7==0)&&(indeks==3))
- {
- indeks=0;
- TIMSK=0x00;
- timer=0;
- detik=0;
- menit=0;
- baca_adc=read_adc(7);
- objek_maks=baca_adc*3/10;
- }
- else if (PINC.5==0 && indeks==2)//reset timer
- {
- indeks=0;//semua data direset
- timer=0;
- detik=0;
- menit=0;
- lcd_clear();
- }
- else if ((sensor1>objek_maks)&& (sensor2>objek_maks)&&(indeks==0))
- {
- TIMSK=0x00;
- timer=0;
- detik=0;
- menit=0;
- baca_adc=read_adc(7);
- objek_maks=baca_adc*3/10;
- }
- else if ((sensor1<2)&& (sensor2<2)&&(indeks==0))
- {
- TIMSK=0x00;
- timer=0;
- detik=0;
- menit=0;
- baca_adc=read_adc(7);
- objek_maks=baca_adc*3/10;
- }
- else if (sensor1>=2&&sensor1<=objek_maks&&(indeks==0 || indeks==2))
- {
- indeks=1;
- TIMSK=0x01;//memulai timer
- lcd_clear();
- }
- else if (sensor2>=2&&sensor2<=objek_maks && indeks==1)
- {
- indeks=2;
- TIMSK=0x00;//menstop timer
- lcd_clear();
- }
- else
- {
- PINC.2=PINC.1=PINC.4=1;
- }
- }
- void ultrasonik1()
- {
- hitung = 0;
- PORTC.0 = 1;
- delay_us(10);
- PORTC.0 = 0;
- delay_us(1);
- while (PINC.1 == 0)
- {}
- while (PINC.1 == 1)
- {
- hitung++;
- }
- sensor1 = hitung*0.0825/2;
- }
- void ultrasonik2()
- {
- hitung = 0;
- PORTC.2 = 1;
- delay_us(10);
- PORTC.2 = 0;
- delay_us(1);
- while (PINC.3 == 0)
- {}
- while (PINC.3 == 1)
- {
- hitung++;
- }
- sensor2 = hitung*0.0825/2;
- }
- void kecepatan()
- {
- if (TIMSK==0x00)
- {
- jarak=1;
- count=menit*6000+detik*100+timer;
- waktu=count*10;
- kecepatan_mps=jarak*1000/waktu;
- kecepatan_kph=kecepatan_mps*3.6;
- }
- }
- void indikator()
- {
- if (TIMSK==0x01)
- {
- PORTC.4=1;
- PORTD.7=1;
- }
- else
- {
- PORTC.4=0;
- PORTD.7=0;
- }
- }
- void tampil_lcd()
- {
- if (indeks==0)
- {
- lcd_clear();
- lcd_gotoxy(0,0);
- lcd_putsf("Sensor Kecepatan");//tampilkan waktu di LCD baris pertama
- lcd_gotoxy(0,1);
- lcd_putsf("Objek Maks: cm");
- ftoa(objek_maks,0,data5);
- lcd_gotoxy(11,1);
- lcd_puts(data5);
- delay_ms(10);
- }
- else if (indeks==1)
- {
- lcd_gotoxy(0,0);
- sprintf(data1,"Waktu: %d:%d:%d",menit,detik,timer);
- lcd_puts(data1);//tampilkan waktu di LCD baris pertama
- lcd_gotoxy(0,1); //meletakkan kursor pada x=0 dan y=1
- lcd_putsf("Menghitung...");
- }
- else if (indeks==2)
- {
- lcd_gotoxy(0,0);
- lcd_putsf("Waktu: ms");
- ftoa(waktu,0,data4);
- lcd_gotoxy(8,0);
- lcd_puts(data4);
- lcd_gotoxy(0,1);
- lcd_putsf("Kec: m = k");
- ftoa(kecepatan_mps,2,data2);//float to array, mengubah tipedata float k tipe data array yg kan ditampilkan di LCD
- lcd_gotoxy(4,1);
- lcd_puts(data2);
- ftoa(kecepatan_kph,1,data3);//float to array, mengubah tipedata float k tipe data array yg kan ditampilkan di LCD
- lcd_gotoxy(11,1);
- lcd_puts(data3);
- }
- else if (indeks==3)
- {
- lcd_gotoxy(0,0);
- lcd_putsf("Sensor1: cm");
- ftoa(sensor1,0,data6);
- lcd_gotoxy(9,0);
- lcd_puts(data6);
- lcd_gotoxy(0,1);
- lcd_putsf("Sensor2: cm");
- ftoa(sensor2,0,data7);
- lcd_gotoxy(9,1);
- lcd_puts(data7);
- delay_ms(10);
- }
- }
- 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=Out Func3=In Func2=Out Func1=In Func0=Out
- // State7=P State6=P State5=P State4=0 State3=P State2=0 State1=P State0=0
- PORTC=0xEA;
- DDRC=0x15;
- // Port D initialization
- // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
- PORTD=0x00;
- DDRD=0x80;
- // Timer/Counter 0 initialization
- // Clock source: System Clock
- // Clock value: 7,813 kHz
- // Mode: Normal top=0xFF
- // OC0 output: Disconnected
- TCCR0=0x05;
- TCNT0=0xB2;
- OCR0=0x00;
- // Timer/Counter 1 initialization
- // Clock source: System Clock
- // Clock value: Timer1 Stopped
- // Mode: Normal top=0xFFFF
- // OC1A output: Discon.
- // OC1B output: Discon.
- // Noise Canceler: Off
- // Input Capture on Falling Edge
- // Timer1 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: Timer2 Stopped
- // Mode: Normal top=0xFF
- // 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=0x01;
- // USART initialization
- // USART disabled
- UCSRB=0x00;
- // Analog Comparator initialization
- // Analog Comparator: Off
- // Analog Comparator Input Capture by Timer/Counter 1: Off
- ACSR=0x80;
- SFIOR=0x00;
- // ADC initialization
- // ADC Clock frequency: 1000,000 kHz
- // ADC Voltage Reference: AREF pin
- // ADC Auto Trigger Source: ADC Stopped
- ADMUX=ADC_VREF_TYPE & 0xff;
- ADCSRA=0x83;
- // SPI initialization
- // SPI disabled
- SPCR=0x00;
- // TWI initialization
- // TWI disabled
- TWCR=0x00;
- // Alphanumeric LCD initialization
- // Connections are 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 3
- // D5 - PORTD Bit 4
- // D6 - PORTD Bit 5
- // D7 - PORTD Bit 6
- // Characters/line: 16
- lcd_init(16);
- // Global enable interrupts
- #asm("sei")
- while (1)
- {
- // Place your code here
- ultrasonik1();
- ultrasonik2();
- deteksi_sensor();
- hitung_waktu();
- kecepatan();
- indikator();
- tampil_lcd();
- }
- }
- Untuk rumus timer-nya dapat dihitung dengan menggunakan cara di bawah ini. Pada program ini timer0 diatur counter-nya tiap 0,01 detik atau 100 milidetik, sehingga untuk menghasilkan waktu 1 detik timer diulang-ulang selama 100 kali. Selain itu juga Bit maksimal yang digunakan pada timer0 sebesar 256.
- Selanjutnya buat desain rangkaiannya pada Proteus, jika Anda belum memasang atau belum ada library dari sensor ultrasoniknya, maka ikuti langkah 9 sampai dengan 11. Jika Anda sudah pernah atau sudah ada library sensor ultrasoniknya maka lewati saja langkah 9-11.
- Unduh terlebih dahulu file library sensor ultrasoniknya di sini kemudian ekstak file-nya.
- Buka folder hasil ekstraknya, salin kedua file yang berformat *.IDX dan *.C.
- Kemudian tempelkan di direktori berkas default "C:\Program Files (x86)\Labcenter Electronics\Proteus 7 Professional\LIBRARY" jika Windows Anda 64 bit atau "C:\Program Files\Labcenter Electronics\Proteus 7 Professional\LIBRARY" jika Windows Anda 32 bit.
- Sesudah itu buka ISIS Proteus-nya kemudian klik "Pick from Libraries".
- Pada jendela pop up "Pick Devices" ketik "ultrasonic" pada pencarian kata kunci, jika sudah ditemukan Device "ULTRASONIC SENSOR" maka sudah berhasil terpasang library-nya.
- Buat desain rangkaiannya seperti gambar berikut.
- Berikut penjelasan fungsi dari masing-masing potensio dan tombol yang digunakan.
- Untuk simulasi pendeteksian objek/benda cukup mengatur potensionya sesuai dengan jarak maksimum yang diatur dan dideteksi oleh kedua sensor ultrasonik tersebut.
- Untuk memasuki objek yang melewati sensor jarak 2, maka ikuti langkah pada gambar ini.
- Untuk menghitung kecepatan objek selanjutnya tekan tombol reset dan kembalikan potensionya kembali pada nilai di atas deteksi sensor jarak yang ditentukan.
- Selanjutnya klik ganda pada komponen ATmega16 kemudian atur seperti berikut.
- Selain itu juga masukan program "UltrasonicTEP.hex"-nya dari yang satu folder hasil ekstrakan yang sudah di-download tadi dengan cara double click pada masing-masing sensor jaraknya.
- Selanjutnya pilih file "UltrasonicTEP.hex"-nya, kemudian klik "Open".
- Selesai dehh !!
Hasil Simulasinya dapat dilihat pada video di bawah ini.
Selamat mencoba, dan semoga bermanfaat.
Kak, aku coba berkali2 kok error terus ya?
BalasHapusError di bagian mananya ya kalo boleh tau?
Hapus