![](/media/cache/profiles/0c9aecd2692cfe28067bb0eba9ae409a.jpg.50x50_q85.jpg)
gmat juara
Dependencies: BufferSerial mbed BMP085_lib
main.cpp
- Committer:
- ivanff15
- Date:
- 2014-03-12
- Revision:
- 0:5af6fad57e1a
- Child:
- 1:ea4efc600a1e
File content as of revision 0:5af6fad57e1a:
#include "mbed.h" #include <stdio.h> #include "BufferSerial.h" Serial pc(USBTX,USBRX); I2C i2c(p28,p27); BufferSerial kirim(USBTX,USBRX,1); #define ACCEL 0xA6 #define MAGNET 0x3C #define ID_GATHOTKACA 106 //initialize accel #define ADXL345_AXIS_X_SCALE 4 #define adxl345_address (0xA6>>1) #define adxl345_reg_data_format (0x31) #define adxl345_reg_pwr_ctl (0x2D) #define adxl345_reg_xlsb (0x32) //initialize gyro #define ITG3200_R 0x69 #define ITG3200_W 0x68 #define WHO 0x00 #define SMPL 0x15 #define INT_C 0x17 #define TMP_H 0x1B #define GX_H 0x1D #define GY_H 0x1F #define GZ_H 0x21 #define PWR_M 0x3E #define DLPF 0x16 #define INT_S 0x1A #define TMP_L 0x1C #define GX_L 0x1E #define GY_L 0x20 #define GZ_L 0x22 #define itg3200_address (0xD0) #define itg3200_reg_xmsb (0x1D) #define itg3200_reg_who_am_I (0x00) #define itg3200_reg_smplrt_div (0x15) #define itg3200_reg_dlpf_fs (0x16) #define DLPF_CFG_0 (1<<0) #define DLPF_CFG_1 (1<<1) #define DLPF_CFG_2 (1<<2) #define DLPF_FS_SEL_0 (1<<3) #define DLPF_FS_SEL_1 (1<<4) //initialize magneto #define HMC5843_W 0x3C #define HMC5843_R 0x3D #define PI 3.14159265 #define GRAVITY 256.0f // "1G reference" used for DCM filter and accelerometer calibration #define MAGN_X_MAX 465 #define MAGN_Y_MAX 475 #define MAGN_Z_MAX 600 #define MAGN_X_MIN -561 #define MAGN_Y_MIN -547 #define MAGN_Z_MIN -379 #define MAGN_X_OFFSET ((MAGN_X_MIN + MAGN_X_MAX) / 2.0f) #define MAGN_Y_OFFSET ((MAGN_Y_MIN + MAGN_Y_MAX) / 2.0f) #define MAGN_Z_OFFSET ((MAGN_Z_MIN + MAGN_Z_MAX) / 2.0f) #define MAGN_X_SCALE (100.0f / (MAGN_X_MAX - MAGN_X_OFFSET)) #define MAGN_Y_SCALE (100.0f / (MAGN_Y_MAX - MAGN_Y_OFFSET)) #define MAGN_Z_SCALE (100.0f / (MAGN_Z_MAX - MAGN_Z_OFFSET)) short rawAccX, rawAccY, rawAccZ, rawGyroX, rawGyroY, rawGyroZ, rawMagX, rawMagY, rawMagZ; unsigned short sendAccX, sendAccY, sendAccZ, sendGyroX, sendGyroY, sendGyroZ, sendMagX, sendMagY, sendMagZ; char baca; void bin_dec_conv(unsigned short data) { unsigned short hasil; // unsigned char kirim[16]; hasil = data%100; pc.printf("%d%d%d",(data/100),(hasil/10),(hasil%10)); } void tulis_i2c(unsigned char devadd, unsigned char regadd, unsigned char data) { i2c.start(); i2c.write(devadd); i2c.write(regadd); i2c.write(data); i2c.stop(); } unsigned char baca_i2c(unsigned char devadd, unsigned char regadd) { unsigned char data; i2c.start(); i2c.write(devadd); i2c.write(regadd); i2c.start(); i2c.write(devadd|1); data=i2c.read(0); i2c.stop(); return data; } int baca_adxl() { unsigned char acc_x_msb, acc_x_lsb; unsigned char acc_y_msb, acc_y_lsb; unsigned char acc_z_msb, acc_z_lsb; tulis_i2c(ACCEL, adxl345_reg_pwr_ctl, 0); tulis_i2c(ACCEL, adxl345_reg_pwr_ctl, 16); tulis_i2c(ACCEL, adxl345_reg_pwr_ctl, 8); tulis_i2c(ACCEL, adxl345_reg_data_format, 0x03); acc_x_lsb = baca_i2c(ACCEL,0x32); acc_x_msb = baca_i2c(ACCEL,0x33); acc_y_lsb = baca_i2c(ACCEL,0x34); acc_y_msb = baca_i2c(ACCEL,0x35); acc_z_lsb = baca_i2c(ACCEL,0x36); acc_z_msb = baca_i2c(ACCEL,0x37); float acc_x = (signed short)((signed short)(acc_x_msb<<8) | acc_x_lsb);//*ADXL345_AXIS_X_SCALE/1000.0f; float acc_y = 1*(signed short)((signed short)(acc_y_msb<<8) | acc_y_lsb);//*ADXL345_AXIS_X_SCALE/1000.0f; float acc_z = (signed short)((signed short)(acc_z_msb<<8) | acc_z_lsb);//*ADXL345_AXIS_X_SCALE/1000.0f rawAccX=-1*acc_y; rawAccY=acc_x; rawAccZ=acc_z; } void baca_itg() { tulis_i2c(itg3200_address, itg3200_reg_dlpf_fs, (DLPF_FS_SEL_0|DLPF_FS_SEL_1|DLPF_CFG_0)); tulis_i2c(itg3200_address, itg3200_reg_smplrt_div, 9); char xh,xl,yh,yl,zh,zl; short x,y,z; xl = baca_i2c(itg3200_address,0x1E); xh = baca_i2c(itg3200_address,0x1D); yh = baca_i2c(itg3200_address,0x1F); yl = baca_i2c(itg3200_address,0x20); zh = baca_i2c(itg3200_address,0x21); zl = baca_i2c(itg3200_address,0x22); x=1*(signed short)((signed short)(xl | (xh<<8)));//*0.0695652174; y=1*(signed short)((signed short)(yl | (yh<<8)));//*0.0695652174; z=1*(signed short)((signed short)(zl | (zh<<8))); rawGyroX=-1*y; rawGyroY=x; rawGyroZ=z; } void i2c_tulis_hmc(unsigned char address, unsigned char data) { i2c.start(); i2c.write(HMC5843_W); // write 0x i2c.write(address); // write register address i2c.write(data); // write register address i2c.stop(); //__delay_ms(10); } unsigned char i2c_baca_hmc(unsigned char address) { unsigned char data; i2c.start(); i2c.write(HMC5843_W); // write 0x i2c.write(address); // write register address i2c.start(); i2c.write(HMC5843_R); // write 0x data = i2c.read(0); // Get MSB result i2c.stop(); //__delay_ms(10); return data; } int baca_hmc() // baca_itg(raw) untuk ambil data raw : baca_itg(scaled) untuk ambil data terskala { // char xh, xl, yh, yl, zh, zl; // short x, y, z; int xh, xl, yh, yl, zh, zl; float x, y, z; i2c_tulis_hmc(0x02,0x01); xh=i2c_baca_hmc(0x03); xl=i2c_baca_hmc(0x04); zh=i2c_baca_hmc(0x05); zl=i2c_baca_hmc(0x06); yh=i2c_baca_hmc(0x07); yl=i2c_baca_hmc(0x08); x=(signed short)((signed short)(xl | (xh<<8))); y=(signed short)((signed short)(yl | (yh<<8))); z=(signed short)((signed short)(zl | (zh<<8))); // rawMagX=-1*y; // rawMagY=-1*x; // rawMagZ=-1*z; rawMagX=x; rawMagY=y; rawMagZ=z; } void raw_to_send() { sendAccX = (unsigned short) (rawAccX + 512);//if(sendAccX>999) sendAccX=999; sendAccY = (unsigned short) (rawAccY + 512);//if(sendAccY>999) sendAccY=999; sendAccZ = (unsigned short) (rawAccZ + 512);//if(sendAccZ>999) sendAccZ=999; sendGyroX = (unsigned short)((rawGyroX*0.06956+2400)*0.2083);//if(sendGyroX>999) sendGyroX=999; sendGyroY = (unsigned short)((rawGyroY*0.06956+2400)*0.2083);//if(sendGyroY>999) sendGyroY=999; sendGyroZ = (unsigned short)((rawGyroZ*0.06956+2400)*0.2083);//if(sendGyroZ>999) sendGyroZ=999; sendMagX = (unsigned short)((rawMagX+2048)*0.25);//if(sendMagX>999) sendMagX=999; sendMagY = (unsigned short)((rawMagY+2048)*0.25);//if(sendMagY>999) sendMagY=999; sendMagZ = (unsigned short)((rawMagZ+2048)*0.25);//if(sendMagZ>999) sendMagZ=999; } int main() { pc.baud(57600); while(1) { if(kirim.readable()) { baca=kirim.getc(); if(baca=='s') baca='0'; while(1) { //pc.printf("ivan\n"); baca_adxl(); baca_itg(); baca_hmc(); raw_to_send(); pc.putc(0x0D); bin_dec_conv(ID_GATHOTKACA); pc.putc(0x20); bin_dec_conv(sendAccX); pc.putc(0x20); bin_dec_conv(sendAccY); pc.putc(0x20); bin_dec_conv(sendAccZ); pc.putc(0x20); bin_dec_conv(sendGyroX); pc.putc(0x20); bin_dec_conv(sendGyroY); pc.putc(0x20); bin_dec_conv(sendGyroZ); pc.putc(0x20); bin_dec_conv(sendMagX); pc.putc(0x20); bin_dec_conv(sendMagY); pc.putc(0x20); bin_dec_conv(sendMagZ); wait_ms(75); baca=kirim.getc(); if(baca=='x') { baca='0'; break; } } } } }