Rabu, 29 Juni 2011

MENGAKSES MODUL SENSOR GYROSCOPE LISY300 TERKALIBRASI MENGGUNAKAN CODEVISION AVR

[OVERVIEW]
Sensor gyroscope yang saya gunakan ini adalah sebuah modul yang terdiri dari sensor Gyroscope LISY300AL dan ADC serial ADC101S021 yang dikeluarkan oleh PARALLAX Inc. Pada modul ini pun telah dilengkapi dengan regulator tegangan 3.3 V sebagai supply nya. Modul Sensor Gyroscope LISY300AL dapat mendeteksi kecepatan sudut (angular rate) satu axis, yaitu sumbu Z (yaw). Dan mampu membaca sampai ± 300°/s full scale.  


[PROTOKOL KOMUNIKASI]
Pada dasarnya output dari sensor Gyroscope LISY300AL adalah berupa tegangan analog, tetapi oleh PARALLAX Inc, output dari sensor Gyroscope tersebut dibaca menggunakan ADC serial. Sehingga untuk mengakses modul ini kita harus menggunakan protokol kumunikasi SPI (Serial Peripheral Interface). Berikut adalah timing diagram cara mengakses Modul Sensor Gyroscope LISY300AL (ADC serial ADC101S021).


Pada dasarnya untuk dapat mengakses Modul Sensor Gyroscope LISY300AL ini, sebenarnya kita hanya harus tau cara mengakses ADC serial ADC101S021, dikarenakan Sensor Gyroscope itu sendiri dibaca oleh ADC serial ADC101S021. Dari gambar diatas terlihat bahwa terdapat 3 jalur untuk mengakses ADC serial ADC101S021 yaitu CS, SCLK dan SDATA.

CS digunakan untuk meng-enable ADC serial ADC101S021 agar dapat diakses, harus beri logika LOW.

SCLK digunakan sebagai serial clock, dimana semua aplikasi yang berkomunikasi secara serial membutuhkan clock untuk mengaksesnya, maksimal kecepatan clock untuk mengakses ADC serial ADC101S021 adalah 4MHz.

Sedangkan SDATA adalah jalur data serial yang berasal dari ADC serial ADC101S021. Data yang berasal dari ADC serial ADC101S021 mempunyai 15 bit data. Yaitu 3 bit 0 (LOW) awal, 10 bit data ADC dan 2 bit 0 (LOW) akhir. Dimana 10 bit data ADC dimulai dari MSB dan diakhiri oleh LSB.

[SENSITIVITAS]
Dan sensor Gyroscope LISY300AL, mempunyai sensitivitas 3.3 mV/°/s. Dimana ADC serial ADC101S021 mempunyai pembacaan data 10 bit (0-1023 atau sebanyak 1024 step) dengan perkiraan 3.22 mV/step. Sehingga setiap perubahan setiap step adalah perubahan 1 derajat.

[ZERO RATE LEVEL]
Sebenarnya sensor Gyroscope LISY300AL sudah terkalibrasi dari pabriknya. Yaitu dengan supply tegangan 3.3 V akan menghasilkan zero rate level 1.65 V (tegangan offset atau Voffset). Nilai zero rate level ini terjadi ketika Gyroscope tidak melakukan kecepatan sudut (angular rate), atau sensor Gyroscope dalam keadaan diam. Atau dengan kata lain jika dibaca menggunakan ADC 10 bit, dengan range input ADC 0-3.3 V, maka didapat nilai ADC sebesar 512 untuk zero rate level (tidak terjadi percepatan sudut atau dalam keadaan diam). Jika sumbu Z bergerak searah jarum jam, maka nilai ADC akan berkurang (dibawah nilai zero rate levelnya), Jika bergerak berlawanan arah jarum jam maka nilai ADC akan bertambah (diatas zero rate levelnya).

Tetapi menurut datasheet Gyroscope LISY300AL:
“Zero-rate level describes the actual output signal if there is no angular rate present. For a 3.3 V powered sensor the absolute zero-rate output is ideally 1.65 V. Zero-rate level of precise MEMS sensors is, to some extent, a result of stress to the sensor and therefore zero-rate level can slightly change after mounting the sensor onto a printed circuit board or after exposing it to extensive mechanical stress. This value changes very little over temperature and also very little over time.”

[KALIBRASI]
Karena alasan diatas, maka terjadi penyimpangan untuk nilai zero rate levelnya, yaitu maksimal sekitar 512±24. Oleh karena itu harus dilakukan cara untuk dapat menentukan nilai zero rate level melalui kalibrasi.

Pada dasarnya nilai zero rate level sudah bisa kita tentukan sendiri, yaitu saat tidak terjadi kecepatan sudut (angular rate) atau gyroscope dalam keadaan diam. Sebagai contoh ketika saya baca keluaran Modul Sensor Gyroscope LISY300AL muncul nilai 511, 509, 504, 513 (berubah-ubah). Dari data tersebut bisa saja saya mengambil kesimpulan jika nilai zero rate levelnya adalah 507 (nilai tengahnya).

Pertanyaannya, mengapa nilainya tidak diam/statis? Jawabannya adalah sensor gyroscope bersifar dinamis, dimana sensor gyroscope mempunyai nilai saat terjadi  kecepatan sudut (angular rate). Sedangkan saat diam (tidak terjadi angular rate) maka nilainya adalah sama dengan zero rate level. Lalu nilainya yang berubah-ubah dikarenakan gyroscope mempunyai efek drift saat kondisi diam (nilainya tidak cenderung kembali ke nilai zero rate level). Hal ini adalah kebalikan dari sensor accelerometer, dimana sensor accelerometer bersifat statis. Oleh karena itu mengapa pada banyak aplikasi selalu menggabungkan dua buah sensor tersebut (gyroscope dan accelerometer).

Baiklah, berikut adalah cara melakukan kalibrasinya. Cara ini saya dapat dari program demo yang diberikan oleh PARALLAX Inc.

center (saya gunakan untuk mengganti istilah zero rate level)
data_gyro (hasil pembacaan ADC dari gyroscope melalui komunikasi SPI)

center(n)=(center(n-1)+data_gyro(n))/ banyaknya n

Dimana:
n = sampling
center(n-1) = 0 (bernilai nol pada awalnya)
Semakin banyak n (sampling) maka semakin baik untuk mendapatkan nilai zero rate levelnya. Kalibrasi ini dilakukan hanya 1 kali pada awal program saja.

[MENGAKSES ADC SERIAL ADC101S021 ATAU SPI]
Untuk mengakses ADC serial ini menggunakan protokol komunikasi SPI dan saya menggunakan bahasa C dengan compiler CodeVision AVR untuk memprogramnya. Pada dasarnya compiler CodeVision AVR telah mempunyai library bawaan untuk mengakses SPI, tapi sayangnya library tersebut hanya untuk mengakses 8 bit data saja (aplikasi ini datanya 15 bit). Oleh karena itu saya membuat sebuah fungsi sendiri untuk mengaksesnya.

Untuk listing program lengkap dan schematic rangkaiannya dapat dilihat dibawah ini. 


#include <mega16.h>
#include <delay.h>
#include <stdlib.h>

char j=1, i=1, k=1, data[16], temp[16];
unsigned int data_gyro;
float center=0, sudut;

#asm
   .equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>

void baca_gyro()
{
    data_gyro=0;
    if (i==16){i=1;}
    if (j==16){j=1;}
    PORTB.4=1;//cs high
    delay_us(100);
    PORTB.4=0;//cs low, enable serial transfer —\___

    for(i=1;i<16;i++)
    {
    PORTB.7=1;//sclk high   
    delay_us(1);               
    PORTB.7=0;//sclk low —\___
    delay_us(1);
    if (PINB.6==1){data[j]=1;}//mengambil data per bit dari MISO  
    else data[j]=0;
    j++;
    }
    //perhitungan data ADC 10 bit, 3 bit zero leading dan 2 bit zero trailer tidak dihitung
    //data[1] sampai data[3] adalah bit leading dan data[14] sampai data[15] adalah bit trailer
    data_gyro=((data[4]*512)+(data[5]*256)+(data[6]*128)+(data[7]*64)+(data[8]*32)+(data[9]*16)+(data[10]*8)+(data[11]*4)+(data[12]*2)+(data[13]*1));               
}

void kalibrasi_gyro()
{
    for (k=1;k<10;k++)
    {
    baca_gyro();
    center=center+data_gyro;
    lcd_gotoxy(0,0);
    lcd_putsf(“CALIBRATING…”);
    lcd_gotoxy(0,1);
    ftoa(center,1,temp);
    lcd_puts(temp);
    delay_ms(200);
    }
    center=center/10;   
}

void sudut_gyro()
{
    sudut=data_gyro-center;
    sudut=sudut*-1;
}

void tampil_LCD()
{
    lcd_clear();
    itoa(data_gyro,temp);
    lcd_puts(temp);   
    lcd_gotoxy(0,1);
    ftoa(center,1,temp);
    lcd_puts(temp);   
    lcd_gotoxy(8,1);
    ftoa(sudut,1,temp);
    lcd_puts(temp);
}

void main(void)
{
PORTB=0xff;
DDRB=0×90;//pb7 dan pb4 output, sisanya input

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// LCD module initialization
lcd_init(16);

kalibrasi_gyro();

while (1)
      {
      baca_gyro();
      sudut_gyro();
      tampil_LCD();  
      delay_ms(100);     
      };
}

Untuk mendapatkan program file dalam bentuk CodeVision AVR silakan download link dibawah ini.


Dibawah ini adalah beberapa panduan wajib jika ingin dapat mengakses Modul Gyroscope LISY300:

Datasheet LISY300AL (keluaran pabrikan)
Datasheet Modul Gyroscope LISY300 (keluaran PARALLAX)
Schematic Modul Gyroscope LISY300 (keluaran PARALLAX)
Datasheet serial ADC101S021

Semoga bermanfaat…

6 komentar:

  1. mas saya mau nanya nih.
    pada postingan di atas anda menjelaskan "gyroscope mempunyai efek drift saat kondisi diam (nilainya tidak cenderung kembali ke nilai zero rate level)"
    pertanyaannya: klo memang ada buku atau jurnal penelitian yang menjelaskan seperti itu, saya boleh minta referensinya mas? soalnya skripsi saya membahas gyroscope juga.. mohon bantuannya... trima kasih... ^^

    BalasHapus
  2. assalamu'alaykum...

    mas nanya, apakah gyro ini cocok untuk digunakan ntuk mgngukur ketinggian gelombang laut?

    mksh

    BalasHapus
  3. askum, mas minta link download libary proteus buat modul gyro dan acceleronya, biar saya bisa coba mensimulasikannya,thanks

    BalasHapus
  4. untuk library gyro dan accelero saya tidak punya... grafik diatas saya ambil langsung menggunakan sensornya.

    BalasHapus
  5. Nice Sharing....Sangat membantu...buat admin..ditunggu sharing ilmu yang lainnya...terima kasih...

    BalasHapus
  6. nice sharing...
    wat admin..terima kasih,,ditunggu posting sharing ilmu yang lainnya...

    BalasHapus