KOMUNITAS
Home / FORUM / All / Hobby / Hobby & Community /
Hobby Elektronika Digital, MicroController & solder Menyolder gabung sini Yuks
KASKUS
51
244
https://www.kaskus.co.id/thread/000000000000000002654259/hobby-elektronika-digital-microcontroller-amp-solder-menyolder-gabung-sini-yuks

Hobby Elektronika Digital, MicroController & solder Menyolder gabung sini Yuks

DIGITAL ELECTRONICS HOBBY FORUM




Spoiler for apa aja sih yang dibahas?:


Spoiler for "Hobby Microcontroller Itu Mahal ? Kreativitasmu Itu yg Mahal Gan !":




UPDATE 8/JUNI/2014

DUKUN FUSEBIT AKAN MENGHIDUPKAN IC MU YANG MATI !



Selengkapnya dibahas di sini gan !!

CLINOMETER SEDERHANA MEMANFAATKAN ADC



Selengkapnya dibahas di post berikut




Spoiler for Buka Jika Mau Paket Belajar:


Proyek2 micro yg sudah jadi
Quote:



I.N.D.E.X F.O.R.U.M

Quote:




Biar ngiler, ane kasih contoh hasil karya TS...






Spoiler for Contact TS lewat dimari yahh:



.
Diubah oleh ahocool
[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 :

Code:


[size="2"]#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;

}


[/size]
SELAMAT MENCOBA
×
© 2022 KASKUS, PT Darta Media Indonesia. All rights reserved
Ikuti KASKUS di