Persiapan sebelum memulai project :
Bahan-bahan yang dibutuhkan :
- Minimum System / ATmega 8535/ ATmega 16
- Display LCD 16 x 2
- Potensiometer linear (nickel) 10K ohm(2 buah)
- Resistor 1K (2 buah)
Project ini adalah request dari anak SMA yang mendapatkan tugas matematika dimana gurunya cukup "Gila" untuk menantang anak didiknya membuat alat clinometer atau pengukur ketinggian. Sang murid mencari di google dan didapatkan rangkaian yg menggunakan acelerometer tapi kendalanya harga yang mahal dan dia pun kesulitan mengerjakannya. Solusi saya cukup sederhana dengan memanfaatkan putaran sudut yg dikonversikan ke putaran potensiometer (variable resistor) yang kemudian dirubah ke dalam level tegangan dan dibaca ADC.
Gambar diatas merupakan ilustrasi trigonometri dari sebuah clinometer dengan mencoba memanfaatkan rumus trigonometri. Keuntungan rumus diatas adalah tidak perlu menentukan jarak pengamat ke benda yang diukur,akan tetapi karena mengandalkan rumus tangen maka dari grafik tangen berikut terjadi sedikit anomali pengukuran jika sudut mendekati kelipatan 90 derajat, dimana tangent 90 adalah tak berhingga !.
grafik tangen yang tidak linear sedikit mempengaruhi keakuratan
Pemilihan potensiometer yang akan digunakan sebagai penerjemah dari sudut ke tegangan (menggunakan prinsip pembagian tegangan) juga perlu diperhatikan karena pada umumnya potentiometer yg dijual dipasaran adalah potentiometer audio yg bersifat logaritmik. Jadi potentiometer yang dipilih adalah berjenis "wire wound" atau yang umum di pasaran bernama "potensiometer nikel".
Output dari project kali ini menggunakan lcd 16x2 yang akan menampilkan nilai sudut alpha, beta dan nilai hasil pengukuran ketinggian.
Perputaran sudut pengukuran vs tegangan yg dihasilkan dapat menggunakan rumus pembagian 10 bit adc (0 - 1023) sehingga didapat sudut yang mewakili per bit. Tentunya potensiometer tidaklah terlalu linear karena banyak faktor dan untungnya kita hanya menggunakan sudut 0-90 derajat saja untuk alpha maupun beta. Saya mendapatkan untuk sudut 0-90 dapat menggunakan pembagian nilai bulat per bit ADC yaitu "pembacaan adc / 3". Jadi sesuaikan dulu dengan respon nilai potensiometer yang kamu punya dengan sudut yang dihasilkan.
Untuk pengukuran tangen pada WinAvr akan digunakan library "math.h" dimana pengukuran sudut akan dirubah menjadi satuan radian. Rumus yang digunakan tentunya akan sangat memakan memory akibat nilai "float" yang digunakan. Hal ini kita akali saja dengan menggunakan unsigned integer 32 bit dengan pendekatan seperti berikut :
- tana = tan((M_PI*adcalpha)/180)*1000;
- tanb = tan((M_PI*adcbeta)/180)*1000;
- tinggi= (tanb/tana) + 1 ;
Kita ingat juga konversi dari derajat ke radian digunakan rumus :
- RADIAN = (PI * sudut ) /180
Pengali 1000 pada rumus diatas digunakan untuk mendapatkan nilai float (pecahan / koma) menjadi ratusan sehingga pembagian menjadi agak bulat.
Skematiknya adalah sebagai berikut ini :
klik untuk memperjelas
Script selengkapnya seperti dibawah ini, diasumsikan bahwa tinggi pengamat 1 meter :
#define F_CPU 4000000UL#include <string.h>#include <avr/io.h>#include <util/delay.h>#include <avr/eeprom.h>#include <math.h>#include "lcd.h"char derajat = 0xDF; // karakter derajatvoid reverse(char s[]) //rutin untuk merubah angka ke ascii{int c, i, j;for (i = 0, j = strlen(s)-1; i < j; i++, j--){c = s[i];s[i] = s[j];s[j] = c;}}void itoa(uint16_t n, char s[])//rutin untuk merubah angka ke ascii
{uint16_t i;i = 0;do { // generate digits in reverse orders[i++] = n % 10 + '0'; // get next digit} while ((n /= 10) > 0); // delete its[i] = '\0'; // add null terminator for stringreverse(s);}void initADC() //inisialisasi ADC{ADMUX=(1<<REFS0);// Aref=AVcc;ADCSRA=(1<<ADEN)|(7<<ADPS0);}uint16_t ReadADC(uint8_t ch) //pembacaan ADC{//Select ADC Channel ch must be 0-7ch=ch&0b00000111;ADMUX|=ch;//Start Single conversionADCSRA|=(1<<ADSC);//Wait for conversion to completewhile(!(ADCSRA & (1<<ADIF)));//Clear ADIF by writing one to itADCSRA|=(1<<ADIF);return(ADC);}int main(void){uint16_t baca1,baca2,tana,tanb,tinggi;char dum;lcd_init(LCD_DISP_ON);//inisialisasi LCDlcd_clrscr(); //bersihkan LCDwhile(1){initADC();baca1=ReadADC(6) / 3; //baca alphaif(baca1 <90){ //jika hasil tidak lewat 90 derajatlcd_gotoxy(0,0);lcd_putc(224); //ascii alphalcd_puts(" =");itoa(baca1,&dum);lcd_puts(&dum);lcd_putc(derajat);lcd_putc(' ');}else{ //jika lebih 90 di warninglcd_gotoxy(0,0);lcd_putc(224);lcd_puts(" =max");}_delay_ms(100);initADC();baca2= ReadADC(5) / 3; //baca beta
if(baca2 <90){ // jika perhitungan < 90 derajatlcd_gotoxy(8,0);lcd_putc(226);lcd_puts(" =");itoa(baca2,&dum);lcd_puts(&dum);lcd_putc(derajat);lcd_putc(' ');}else{ //jika lebih 90 di warninglcd_gotoxy(8,0);lcd_putc(226);lcd_puts(" =max");}_delay_ms(100);lcd_gotoxy(0,1);if(baca1 <90 && baca2 <90){//PERHITUNGAN TINGGItana = tan((M_PI*baca1)/180)*1000;tanb = tan((M_PI*baca2)/180)*1000;tinggi= (tanb/tana) + 1 ;lcd_puts(" TINGGI:");itoa(tinggi,&dum);lcd_puts(&dum);lcd_puts(" m");lcd_puts(" ");}else{lcd_gotoxy(0,1);lcd_puts(" TINGGI: Error !");}}return 0;}
SELAMAT MENCOBA
wah menarik juga mas, jadi mengukur 2 sudut dulu untuk dapetin ketinggian y? sudut yang diukur sudut mana aja mas?
BalasHapusterima kasih gan atas info infonya, semoga tuhan membalas kebaikannya di tunggu artikelnya
BalasHapusbang boleh nda saya minta spesifik.a tuk pembuatan clinometer ini karena saya rencana mau buat alat tuk tugas akhir
BalasHapusseblum.a terima kasih
arielmunandar@ymail.com