Mengenai Saya

Foto saya
semua hanya karena hobby,.. hhehe

Fungsi Trigonometri Di CodeVision AVR


fungsi-fungsi matematika sangat dibutuhkan dalam programming uC, misalnya saja untuk project yang memakai metode khusus, seperti fuzzy, JST, dll.
dan sekali lagi user codevisionAVR terbantu oleh libary MATH.H bawaan codevisionAVR, sehingga kita sebagai user dapat langsung memanggil fungsi-fungsi tersebut.
sebelum menggunakan fungsi-fungsi yang terdapat pada library (math.h) pada codevisionAVR maka harus di deklarasikan terlebih dahulu dalam preprocessor. yaitu dengan sintaks seperti ini
#include

 acos
Deklarasi
double acos(double x);
Menghasilkan nilai arcus cosinus  x dalam radian.
Rentang
Nilai x mestilah ada dalam rentang -1 ke +1 (inklusif). Nilai hasil berada dalam rentang 0 hingga pi (inklusif)

asin
Deklarasi :
double asin(doublex);
Memberikan nilai arcus sinus x dalam radian.
Rentang :
Nilai dari x mesti berada dalam rentang  -1 to +1 (inklusif). Nilai hasil berada dalam rentang -p/2 hingga +p/2 (inklusif).

atan
Deklarasi
double atan(double x);
Menghasilkan nilai arcus tangen  x dalam radian.
Rentang
Nilai dari x tidak memiliki rentang. Nilai hasil berada dalam rentang -p/2 to +p/2 (inklusif).

atan2
Deklarasi
double atan2(doubly y, double x);
Menghasilkan nilai arcus tangen dalam radian y/x didasarkan pada tanda masing-masing nilai untuk menentukan kuadran yang tepat.
Rentang
Baik y dan x tidak boleh bernilai nol. Hasil berada dalam rentang -p/2 hingga +p/2 (inklusif).

cos
Deklarasi
double cos(double x);
Menghasilkan nilai cosinus dari sudut radian x.
Rentang
Nilai x tidak memiliki rentang. Nilai hasil berada dalam rentang -1 hingga +1 (inklusif).

cosh
Deklarasi
double cosh(double x);
Menghasilkan nilai hiperbolic cosinus dari x.
Rentang
Tidak ada rentang limit baik untuk argumen maupun nilai yang dihasilkan.

sin
Deklarasi
double sin(double x);
Menghasilkan nilai sinus dari sudut radian x.
Rentang
Nilai  x tidak memiliki rentang. Nilai yang dihasilkan berada dalam rentang -1 ke +1 (inklusif).

sinh
Deklarasi
double sinh(double x);
Menghasilkan nilai hiperbolik sinus x.
Rentang
Tidak ada rentang limit baik untuk argumen maupun nilai yang dihasilkan.

tan
Deklarasi
double tan(double x);
Menghailkan nilai tangen dari sudut radian x.
Rentang
Tidak ada rentang limit baik untuk argumen maupun nilai yang dihasilkan.

tanh
Deklarasi
double tanh(double x);
Memberikan nilai hiperbolik tangen x.
Rentang
Nilai x tidak memiliki rentang. Nilai hasil memiliki rentang antara -1 hingga +1 (inklusif)

 masih banyak fungsi-fungsi yang terdapat dalam library tersebut, selanjutnya untuk lebih memahami fungsi-fungsi tersebut dapat dibaca di  help codevisionAVR (shortcut F1), kemudian lihat pada sub library fuction reference

untuk mengingatkan kalau fungsi-fungsi diatas adalah dalam bentuk Radians, maka dari itu jika dibutuhkan untuk mengkonversikannya  ke dalam bentuk degree, disini saya akan coba share tentang konfersi tersebut melaluui potongan-potongan program berikut:

float deg2rad(float deg){     //konversi dari degree ke radians
float rad;
rad=deg/57.325;
return rad;         
}

float rad2deg(float rad){    
//konversi dari radians ke degree
float deg;
deg=rad*57.325;
return deg;        
}

 *57.325 didapat dari 180 / 3.14

hal penting yang juga perlu diperhatikan jika menggunakan LCD sebagai penampil data hasil yakni pada setting feature sprintf . yaitu dalam bentuk Float, Width, Precesion. dengan cara seperti berikut
configure--->c compiler--->sprint feature

sekian dulu mengenai fungsi matematik pada codevisionAVR, mohon dibantu jika terdapat kesalahan. hhehehe

Kompas Elektronika


CMPS03
Modul Magnetic Compass

 Modul kompas ini didesain khusus untuk bidang robotik untuk tujuan navigasi robot. Kompas ini menggunakan dua sensor medan magnet KMZ51 buatan Philips yang cukup peka untuk mendeteksi medan magnet bumi. Dua sensor ini dipasang saling bersilangan. Pada modul kompas telah dipasang rangkaian pengkondisi sinyal dan mikrokontroler. Sehingga kita dapat mengakses berapa derajat posisi kompas sekarang secara langsung.

Modul kompas membutuhkan suplai tegangan sebesar 5VDC dengan konsumsi arus sekitar 15mA. Ada dua cara untuk membaca posisi magnet. Yaitu melalui sinyal PWM pada pin nomor 4 atau menggunakan protokol I2C pada pin nomor 2 dan 3.
  
Sinyal PWM yang dihasilkan oleh kompas merupakan sinyal yang lebar pulsanya dapat berubah-ubah. Pulsa berlogika 1 menyatakan derajat. Lebar pulsa berlogika 1 bervariasi antara 1mili-detik (untuk 0º) sampai 36,99mili-detik (untuk 359,9º). Dengan kata lain kompas memiliki resolusi 100μ-detik/º dengan offset sebesar +1mili-detik. Sinyal kemudian akan berlogika 0 selama 65mili-detik. Jadi periode sinyal PWM sebesar 65mili-detik ditambah dengan waktu sinyal yang berlogika 1, atau 66mili-detik sampai 102mili-detik. Sinyal PWM tersebut dihasilkan oleh timer 16-bit dari prosesor pada modul kompas yang menghasilkan resolusi sebesar 1μ-detik. Sehingga disarankan oleh pembuatnya untuk mendeteksi sinyal PWM dengan timer yang resolusinya lebih rendah dari yang dihasilkan oleh kompas. Yakinkan bahwa pin untuk I2C, SDA dan SCL, dihubungkan ke suplai 5VDC melalui resistor pull-up, karena pin SDA dan pin SCL tidak mempunyai pull-up.

Pin 2 dan 3 digunakan untuk berkomunikasi dengan protokol (bahasa) I2C untuk mengambil nilai posisi kompas.
Komunikasi dengan protokol I2C pada modul kompas mempunyai cara yang sama seperti mengakses eeprom serial tipe 24C04 misalnya. Pertama kirim start-bit, alamat kompas (0xC0) dengan bit R/W low, kemudian nomor register yang ingin diakses. Selanjutnya diulang dengan mengirimkan start-bit, alamat kompas dengan bit R/W high (0xC1). Kemudian isi register dibaca.

Pin I2C tidak mempunyai resistor pull-up pada board sehingga harus ditambahkan pada jalur komunikasi yang digunakan. Pembuat modul kompas menyarankan untuk memasang resistor 1k8 jika diinginkan bekerja pada kecepatan 400kHz dan 1k2 atau bahkan 1k bila ingin bekerja pada kecepatan 1MHz. Modul kompas didesain untuk bekerja pada frekuensi standar (SCL) sebesar 100kHz, walaupun kecepatan sinyal clock bisa ditingkatkan sampai 1Mhz dengan beberapa tindakan yang harus diperhatikan. Pada kecepatan diatas sekitar 160kHz, CPU tidak dapat merespon dengan cepat untuk membaca data I2C. oleh karena itu delay sesaat sebesar 50μ-detik harus ditambahkan diantara pengiriman alamat register.

Pin 7 adalah pin input untuk memilih operasi kerja 50Hz atau 60Hz. Pin ini ditambahkan setelah terlihat adanya jitter sekitar 1,5º pada output. Penyebabnya adalah sumber listrik 50Hz pada lingkungan kerja. Dengan melakukan sinkronisasi dengan frekuensi sumber listrik dapat dikurangi sampai 0,2º. Konversi internal selesai setiap 40mili-detik (50Hz) atau setiap 33,3mili-detik (60Hz). Pin 7 mempunyai resistor pull-up pada board sehingga dapat dibiarkan tidak terhubung untuk operasi kerja 60Hz. Antara output PWM atau I2C dan proses konversi tidak ada sinkronisasi. Output PWM dan I2C mengambil pembacaan internal yang terbaru, yang dikonversi secara kontinu, apakah dipakai atau tidak.

Pin 6 digunakan untuk mengkalibrasi kompas. Pin ini memiliki resistor pull-up pada board sehingga dapat dibiarkan tak terhubung setelah melakukan kalibrasi.

Pin 5 dan pin 8 tidak dihubungkan. Sebenarnya pin 8 merupakan jalur reset dan memiliki resistor pull-up pada board. Disiapkan untuk memprogram mikrokontroler yang terpasang pada board.

Timer Overflow Interrupt untuk meggerakkan servo



Pada kesempatan kali ini saya akan sedikit sharing ilmu mengenai Perhitungan Overflow Interrupt yang akan kita gunakan untuk pengaturan putaran servo, sehingga menghasilkan putaran yang kita inginkan.
// Timer 0 overflow interrupt service routine
Perhitungan Timer overflow di tentukan berdasarkan XTAL yang kita gunakan,
Sebagai contoh kita menggunakan XTAL 4 MHz,
=>>    f=4 MHz
=>>    T=1/4 MHz
T=0,25 x 10^-6 s
Jika Timer yang kita gunakan adalah 8 bit maka akan menghasilkan 256 X,
Maka overflow penuhnya adalah 256 X 0,25 x 10^-6 = 64 x 10^-6 s.

Seperti yang telah kita ketahui, servo motor memiliki lebar pulse sebesar 20 ms,untuk menggerakkan servo ke kiri kita harus memberikan Pulse masukan sebesar 1 ms, dan pulse 2 ms untuk menggerakkan servo ke kanan. Sedangkan untuk Posisi netral di tengah kita harus memberikan pulse masukan sebesar 1,5 ms.
Kembali ke perhitungan kita tadi,
=>> kita telah memiliki overflow penuh sebesar 64 x 10^-6 s.
karena servo membutuhkan pulse sebesar 20 ms, maka perhitungannya adalah sebagai berikut;
=>> 20 ms => (20 x 10^-3)/(64 x 10^-6) = 0,3125 x 10^3 =312,5 (dibulatkan menjadi 313)
Untuk pergerakan servo ke kiri membutuhkan pulse sebesar  1 ms, maka perhitungannya adalah sebagai berikut;
=>> 1 ms => (1 x 10^-3)/(64 x 10^-6) = 15,6 (dibulatkan menjadi 16)
Untuk pergerakan servo ke kanan membutuhkan pulse sebesar  2 ms, maka perhitungannya adalah sebagai berikut;
=>> 2 ms => (2 x 10^-3)/(64 x 10^-6) = 31,25 (dibulatkan menjadi 31)
Untuk pergerakan servo ke tengah/posisi netral membutuhkan pulse sebesar  1,5 ms, maka perhitungannya adalah sebagai berikut;
=>> 1,5 ms => (1,5 x 10^-3)/(64 x 10^-6) = 23,4 (dibulatkan menjadi 23)
Perhitungan telah kita lakukan, sehingga kita mendapatkan hasil angka yang akan kita gunakan untuk menggerakkan servo ke kiri, ke kanan, dan ke tengah….

untuk informasi lebih lanjut, coba lihat pembahasan tentang motor servo disini..