Senin, 26 Desember 2011

Akusisi Data Percepatan Menggunakan 3 Axis Accelerometer H48C

Oleh : Dwi Kurniawan
Dalam percobaan ini, modul acelerometer yang digunakan adalah buatan Parallax.Inc dimana dalam modul ini sensor yang digunakan adalah H48C dan telah terintegrasi dengan 4 chanel 12-bit A/D converter with serial interface MCP3204.
Gambar 1. Blok diagram H48C
Blok diagram dari H48C ditunjukan oleh gambar 1. Dengan AOX sebagai analog output sumbu x, AOY sebagai analog output sumbu y, AOZ sebagai analog output sumbu y, dan Vref sebagai tegangan referensi. Maka, untuk mengetahui besarnya percepatan yang dinyatakan dalam level tegangan analog untuk tiap sumbu adalah sebagai berikut.
gX = AOX - Vref (mV) ..................................................(4.1)
gY = AOY - Vref (mV) .................................................(4.2)
gZ = AOZ - Vref (mV) ..................................................(4.3)
Pada modul 3 axis accelerometer buatan Parallax.Inc output tegengan analog tiap sumbu dan output Vref dihubungkan dengan MCP3204 untuk mengkonversi data analog menjadi digital dan mengirimkanya ke kontroler secara serial.

Gambar 2. Diagram Blok MCP3204
Diagram blok MCP3204 ditunjukan oleh gambar 2. Pada modul accelerometer, pin AOX pada H48C dihubungkan ke CH0 dari MCP3204, AOY pada H48C terhubung dengan CH1 dari MCP3204, AOZ pada H48C terhubung dengan CH2 dari MCP3204 dan Vref pada H48C terhubung dengan CH3 dari MCP3204.
1. Skema Rangkaian Percobaan
Rangkaian pengujian menggunakan modul 3 axis accelerometer H48C dan kontrolernya menggunaka Arduino board tipe Deumilanove. Skematik rangkaian pengujian ditunjukan oleh gambar 3.
Gambar 3. Skematik rangkaian pengujian modul accelerometer
Dari modul accelerometer hanya dibutuhkan 3 pin untuk melakukan pembacaan, yakni :
1. Pin DIO sebagai jalur digital input / output, terhubung dengan pin 4 Arduino board.
2. Pin CLK untuk pemberian clock triger sensor dan terhubung dengan Pin 5 Arduino board.
3. Pin CS (Chip Select) untuk aktifasi modul, terhubung dengan Pin 6 Arduino board.
2. Algoritma Pembacaan Percepatan Tiap Sumbu
Pembuatan algoritma pembacaan tiap sumbu didasarkan pada timing diagram dari MCP3204 (gambar 4). Dalam modul accelerometer yang digunakan, jalur DIN dan DOUT digabungkan menjadi 1 dan disebut pin DIO.
Gambar 4. Timing Diagram MCP3204
Karena pin DIN dan DOUT digabungkan menjadi 1 pin, maka untuk memungkinkan pembacaan data sensor diperlukan kontroler untuk mengatur kondisi pin DIO sebagai output pada saat pengiriman control bit dan sebagai input pada saat pembacaan data hasil konversi MCP3204.
Konfigurasi kontrol bit untuk pembacaan tiap chanel sesuai dengan tabel 1.
Tabel 4.1. Konfigurasi Bit Kontrol MCP3204

Mengingat bahwa CH0 = AOX, CH1 = AOY, CH2 = AOZ, CH3 = Vref maka alternatif konfigurasi input yang paling mudah adalah dengan input single – ended yakni dengan men-set bit Single/Diff bernilai 1.
Listing program procedure gatH48C(D1,D0) pada arduino IDE adalah sebagai berikut.
int getH48C(int D1,int D0){
digitalWrite(Cs, LOW);
pinMode(Dio, OUTPUT);
//***1
digitalWrite(Clk, LOW);
digitalWrite(Dio, HIGH);// start bit
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***2
digitalWrite(Clk, LOW);
digitalWrite(Dio, LOW);
digitalWrite(Dio, HIGH);//singgle Dio = 1
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***3
digitalWrite(Clk, LOW);
digitalWrite(Dio, LOW);// D2 = 0
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***4
digitalWrite(Clk, LOW);
if (D1==0){ digitalWrite(Dio, LOW);}
else{ digitalWrite(Dio, HIGH);}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***5
digitalWrite(Clk, LOW);
if (D0==0){ digitalWrite(Dio, LOW);}
else{ digitalWrite(Dio, HIGH);}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***6
digitalWrite(Clk, LOW);
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***7
pinMode(Dio, INPUT);
digitalWrite(Clk, LOW);
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***8
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[11]= 1 ;}
else {
dValue[11]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***9
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[10]= 1 ;}
else {
dValue[10]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***10
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[9]= 1 ;}
else {
dValue[9]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***11
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[8]= 1 ;}
else {
dValue[8]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***12
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[7]= 1 ;}
else {
dValue[7]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***13
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[6]= 1 ;}
else {
dValue[6]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***14
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[5]= 1 ;}
else {
dValue[5]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***15
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[4]= 1 ;}
else {
dValue[4]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***16
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[3]= 1 ;}
else {
dValue[3]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***17
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[2]= 1 ;}
else {
dValue[2]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***18
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[1]= 1 ;}
else {
dValue[1]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
//***19
digitalWrite(Clk, LOW);
if (digitalRead(Dio)==HIGH){
dValue[0]= 1 ;}
else {
dValue[0]= 0 ;}
delayMicroseconds(10);
digitalWrite(Clk, HIGH);
delayMicroseconds(10);
data=(dValue[11]*2048)+(dValue[10]*1024)+(dValue[9]*512)+(dValue[8]*256)+(dValue[7]*128)+(dValue[6]*64)+(dValue[5]*32)+(dValue[4]*16)+(dValue[3]*8)+(dValue[2]*4)+(dValue[1]*2)+(dValue[0]*1);
digitalWrite(Cs,HIGH);
return data;
}
Untuk pembacaan nilai tegangan dilakukan dengan memanggil prosedur getH48C(D1,D0) dengan D1 = 1 dan D0 = 0 untuk membaca Vref, D1 = 0, D0 = 0 untuk membaca nilai sumbu X, D1 = 0, D0 = 1 untuk membaca nilai sumbu Y, dan D1 = 1 dan D0 = 0 untuk membaca nilai pada sumbu Z. Contoh pemanggilan prosedur untuk pembacaan nilai Vref, sumbu X, sumbu Y, dan sumbu Z adalah sebagai berikut.
int dX, dY, dZ = 0;
ref = getH48C(1,1);
dX = getH48C(0,0);
dY = getH48C(0,1);
dZ = getH48C(1,0);
Sesuai dengan persamaan 4.1, 4.2, dan 4.3 maka level tegangan untuk tiap sumbu dinyatakan dengan mengeksekusi perintah berikut.
float gX, gY, gZ = 0.00;
gX = (((float)dX) - ((float)ref));
gY = (((float)dY) - ((float)ref));
gZ = (((float)dZ) - ((float)ref));

Nilai gX, gY, dan gZ masih dalam level tegangan yang dinyatakan dengan nilai ADC 12 bit (0 hingga 4095). Untuk menyatakan kedalam nilai g sesuai dengan jangkauan pembacaan sensor (-3 g hingga +3g) maka digunakan persamaan berikut.


g = ((data Axis – Vref)/4095) x (3.3/0.3663)......(4.4)

Berdasarkan persamaan 4.4, nilai 4095 adalah nilai maksimum ADC 12 bit, 3.3 adalah tegangan suplai H48C dan 0.3663 adalah nilai tegangan keluaran 1g. Untuk memudahkan penulisan program, persamaan diatas disederhanakan menjadi persamaan 4.5 berikut.


g = (data Axis – Vref) x 0.0022 ..........................(4.5)


Sehingga, source code untuk pembacaan nilai g untuk tiap sumbu adalah sebagai berikut.

float gX, gY, gZ = 0.00;
gX = (((float)dX) - ((float)ref)) *0.0022;
gY = (((float)dY) - ((float)ref)) *0.0022;
gZ = (((float)dZ) - ((float)ref)) *0.0022;
Hasil pengujian program untuk pembacaan nilai g menggunakan source code diatas dilihat menggunakan serial monitor dengan baud rate 9600 bps sesuai dengan gambar 5.
Gambar 5. Hasil pembacaan modul accelerometer

Lihat video tutorial disini

1 komentar:

  1. Favourites To Learn The Baccarat Strategy - FBCasino
    There are several ways of choosing the best 온카지노 and 인카지노 most febcasino rewarding betting strategy. This is because they can give you the best odds on your

    BalasHapus