Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Selasa, 18 Maret 2014

[TUTORIAL] Clinometer (pengukur ketinggian) Sederhana Memanfaatkan ADC




Persiapan sebelum memulai project :

  • Tutorial ADC dapat dibaca disini
  • Dasar menulis ke LCD dapat dilihat disini

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 derajat

void 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 order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 

   s[i] = '\0'; // add null terminator for string 
   reverse(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-7
   ch=ch&0b00000111;
   ADMUX|=ch;

   //Start Single conversion

   ADCSRA|=(1<<ADSC);

   //Wait for conversion to complete
   while(!(ADCSRA & (1<<ADIF)));

   //Clear ADIF by writing one to it
   ADCSRA|=(1<<ADIF);

   return(ADC);
}

int main(void)
{

uint16_t baca1,baca2,tana,tanb,tinggi;
char dum;

lcd_init(LCD_DISP_ON);//inisialisasi LCD
lcd_clrscr(); //bersihkan LCD

   while(1)
   {
      initADC(); 

      baca1=ReadADC(6) / 3; //baca alpha
      if(baca1 <90){ //jika hasil tidak lewat 90 derajat

      lcd_gotoxy(0,0);
      lcd_putc(224); //ascii alpha
      lcd_puts(" =");

          itoa(baca1,&dum);
  lcd_puts(&dum);
 lcd_putc(derajat);
 lcd_putc(' ');
 
 }

 else{ //jika lebih 90 di warning
          lcd_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 derajat
 
 lcd_gotoxy(8,0);
 lcd_putc(226);
          lcd_puts(" =");

          itoa(baca2,&dum);
 lcd_puts(&dum);
 lcd_putc(derajat);
 lcd_putc(' ');
      }

      else{  //jika lebih 90 di warning
          lcd_gotoxy(8,0);
 lcd_putc(226);
 lcd_puts(" =max");
 }

      _delay_ms(100);
 lcd_gotoxy(0,1);
      

      if(baca1 <90 && baca2 <90){
          //PERHITUNGAN TINGGI
          tana = 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  
Share:

3 komentar:

  1. wah menarik juga mas, jadi mengukur 2 sudut dulu untuk dapetin ketinggian y? sudut yang diukur sudut mana aja mas?

    BalasHapus
  2. terima kasih gan atas info infonya, semoga tuhan membalas kebaikannya di tunggu artikelnya

    BalasHapus
  3. bang boleh nda saya minta spesifik.a tuk pembuatan clinometer ini karena saya rencana mau buat alat tuk tugas akhir

    seblum.a terima kasih

    arielmunandar@ymail.com

    BalasHapus

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (11) arduino (27) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (74) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (8) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika