これは MMA7361 3軸アナログ加速度センサ の Nucleo F401RE 用のライブラリです。詳しい説明はLibrary中のReadMe.hに記載しています。文字化けや開けない場合はダウンロードしてみてください。Google Chrome では見れるはずです。

Dependents:   Nucleo_L3GD20_MMA7361_Kalman

Revision:
0:ad6f3a862ed5
Child:
3:0359af763b6c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mma7361.cpp	Sun Feb 01 03:56:22 2015 +0000
@@ -0,0 +1,279 @@
+#include "mbed.h"
+#include "mma7361.h"
+
+/*---------------------------------description-----------------------------------------*/
+
+//    range=0 : range is 1.5G
+//    range=1 : range is 6.0G
+
+/*-------------------------------about mat[3][3]---------------------------------------*/
+
+/*
+      | mat[0][0] mat[0][1] mat[0][2] |   | A00 A10 A20 |   : middle bits (=0G) of each axes when range is 1.5G
+      | mat[1][0] mat[1][1] mat[1][2] | = | A01 A11 A21 |   : middle bits (=0G) of each axes when range is 6.0G
+      | mat[2][0] mat[2][1] mat[2][2] |   | G00 G10 G20 |   : bits/G of each axes when range is 1.5G
+      | mat[3][0] mat[3][1] mat[3][2] |   | G01 G11 G21 |   : bits/G of each axes when range is 6.0G
+      
+      You mast change this value in "mma7361.h". You can see this value with function : calibration() & show_mat()
+*/
+
+/*---------------------------------description-----------------------------------------*/
+/*---------------------------------constracta------------------------------------------*/
+
+mma7361::mma7361(): dx(PA_0),dy(PA_1),dz(PA_4),ST(PH_0),GS(PH_1),pcdev(USBTX,USBRX)
+{
+    mma7361::ST=0;
+    mma7361::GS=0;
+    mma7361::range=0;
+    mma7361::clear_mat();
+}
+
+mma7361::mma7361(PinName accelx,PinName accely,PinName accelz): dx(accelx),dy(accely),dz(accelz),ST(PH_0),GS(PH_1),pcdev(USBTX,USBRX)
+{
+    mma7361::ST=0;
+    mma7361::GS=0;
+    mma7361::range=0;
+    mma7361::clear_mat();
+}
+
+mma7361::mma7361(PinName accelx,PinName accely,PinName accelz,PinName set): dx(accelx),dy(accely),dz(accelz),ST(set),GS(PH_1),pcdev(USBTX,USBRX)
+{
+    mma7361::ST=0;
+    mma7361::GS=0;
+    mma7361::range=0;
+    mma7361::clear_mat();
+}
+
+mma7361::mma7361(PinName accelx,PinName accely,PinName accelz,PinName set,PinName set_range): dx(accelx),dy(accely),dz(accelz),ST(set),GS(set_range),pcdev(USBTX,USBRX)
+{
+    mma7361::ST=0;
+    mma7361::GS=0;
+    mma7361::range=0;
+    mma7361::clear_mat();
+}
+
+/*---------------------------------constracta------------------------------------------*/
+/*-----------------------------------member--------------------------------------------*/
+
+void mma7361::calibration(){
+    mma7361::GS=0;
+    mma7361::range=0;
+    mma7361::ST=1;
+    wait_ms(250);
+    mma7361::ST=0;
+    
+    mma7361::pcdev.printf("Prease set devise with z-axis is going up\n\r");
+    mma7361::pcdev.printf("Press Enter key\n\r");
+    while(getchar()==-35);
+    int ax_0_0 = mma7361::read_bit(x_axis);
+    int ay_0_0 = mma7361::read_bit(y_axis);
+    int gz_0_0 = mma7361::read_bit(z_axis);
+    for(int j=0; j<100; j++){
+        mma7361::low_pass_filter(&ax_0_0,x_axis);
+        mma7361::low_pass_filter(&ay_0_0,y_axis);
+        mma7361::low_pass_filter(&gz_0_0,z_axis);
+    }
+    mma7361::GS=1;
+    wait_ms(250);
+    int ax_1_0 = mma7361::read_bit(x_axis);
+    int ay_1_0 = mma7361::read_bit(y_axis);
+    int gz_1_0 = mma7361::read_bit(z_axis);
+    for(int j=0; j<100; j++){
+        mma7361::low_pass_filter(&ax_1_0,x_axis);
+        mma7361::low_pass_filter(&ay_1_0,y_axis);
+        mma7361::low_pass_filter(&gz_1_0,z_axis);
+    }
+    mma7361::GS=0;
+    wait_ms(250);
+    
+    mma7361::pcdev.printf("Prease set devise with x-axis is going up\n\r");
+    mma7361::pcdev.printf("Press Enter key\n\r");
+    while(getchar()==-35);
+    int ay_0_1 = mma7361::read_bit(y_axis);
+    int az_0_0 = mma7361::read_bit(z_axis);
+    int gx_0_0 = mma7361::read_bit(x_axis);
+    for(int j=0; j<100; j++){
+        mma7361::low_pass_filter(&ay_0_1,y_axis);
+        mma7361::low_pass_filter(&az_0_0,z_axis);
+        mma7361::low_pass_filter(&gx_0_0,x_axis);
+    }
+    mma7361::GS=1;
+    wait_ms(250);
+    int ay_1_1 = mma7361::read_bit(y_axis);
+    int az_1_0 = mma7361::read_bit(z_axis);
+    int gx_1_0 = mma7361::read_bit(x_axis);
+    for(int j=0; j<100; j++){
+        mma7361::low_pass_filter(&ay_1_1,y_axis);
+        mma7361::low_pass_filter(&az_1_0,z_axis);
+        mma7361::low_pass_filter(&gx_1_0,x_axis);
+    }
+    mma7361::GS=0;
+    wait_ms(250);
+    
+    mma7361::pcdev.printf("Prease set devise with y-axis is going up\n\r");
+    mma7361::pcdev.printf("Press Enter key\n\r");
+    while(getchar()==-35);
+    int ax_0_1 = mma7361::read_bit(x_axis);
+    int az_0_1 = mma7361::read_bit(z_axis);
+    int gy_0_0 = mma7361::read_bit(y_axis);
+    for(int j=0; j<100; j++){
+        mma7361::low_pass_filter(&ax_0_1,x_axis);
+        mma7361::low_pass_filter(&az_0_1,z_axis);
+        mma7361::low_pass_filter(&gy_0_0,y_axis);
+    }
+    mma7361::GS=1;
+    wait_ms(250);
+    int ax_1_1 = mma7361::read_bit(x_axis);
+    int az_1_1 = mma7361::read_bit(z_axis);
+    int gy_1_0 = mma7361::read_bit(y_axis);
+    for(int j=0; j<100; j++){
+        mma7361::low_pass_filter(&ax_1_1,x_axis);
+        mma7361::low_pass_filter(&az_1_1,z_axis);
+        mma7361::low_pass_filter(&gy_1_0,y_axis);
+    }
+    mma7361::GS=0;
+    wait_ms(250);
+    
+    ax_0_0=(ax_0_0+ax_0_1)/2;
+    ay_0_0=(ay_0_0+ay_0_1)/2;
+    az_0_0=(az_0_0+az_0_1)/2;
+    ax_1_0=(ax_1_0+ax_1_1)/2;
+    ay_1_0=(ay_1_0+ay_1_1)/2;
+    az_1_0=(az_1_0+az_1_1)/2;
+    gx_0_0-=ax_0_0;
+    gy_0_0-=ay_0_0;
+    gz_0_0-=az_0_0;
+    gx_1_0-=ax_0_1;
+    gy_1_0-=ay_0_1;
+    gz_1_0-=az_0_1;
+    
+    mma7361::set_each_num(ax_0_0,ay_0_0,az_0_0,ax_1_0,ay_1_0,az_1_0,gx_0_0,gy_0_0,gz_0_0,gx_1_0,gy_1_0,gz_1_0,0);
+    wait_ms(100);
+}
+
+void mma7361::set_each_num(int ax_0_0,int ay_0_0,int az_0_0,int ax_1_0,int ay_1_0,int az_1_0,int gx_0_0,int gy_0_0,int gz_0_0,int gx_1_0,int gy_1_0,int gz_1_0,int new_range){
+    //def or -1 -> don' change value
+    mma7361::GS=new_range;
+    mma7361::range=new_range;
+    int temp[12];
+    temp[0]=ax_0_0;
+    temp[1]=ay_0_0;
+    temp[2]=az_0_0;
+    temp[3]=ax_1_0;
+    temp[4]=ay_1_0;
+    temp[5]=az_1_0;
+    temp[6]=gx_0_0;
+    temp[7]=gy_0_0;
+    temp[8]=gz_0_0;
+    temp[9]=gx_1_0;
+    temp[10]=gy_1_0;
+    temp[11]=gz_1_0;
+    for(int i=0; i<4; i++){
+        for(int j=0; j<3; j++){
+            if(temp[i*3+j]!=def){
+                mma7361::mat[i][j]=temp[i*3+j];
+            }
+        }
+    }
+}
+
+void mma7361::set_num(int *new_mat,int new_range){
+    mma7361::GS=new_range;
+    mma7361::range=new_range;
+    for(int i=0; i<4; i++){
+        for(int j=0; j<3; j++){
+            if(new_mat[i*3+j]!=def){
+                mma7361::mat[i][j]=new_mat[i*3+j];
+            }
+        }
+    }
+}
+
+void mma7361::set_range(int new_range){
+    mma7361::GS=new_range;
+    mma7361::range=new_range;
+}
+
+void mma7361::clear_mat(){
+    mma7361::set_each_num(A00,A10,A20,A01,A11,A21,G00,G10,G20,G01,G11,G21,mma7361::range);
+}
+
+int mma7361::read_bit(int axis){
+    int v;
+    switch(axis){
+    case 0:
+        v=mma7361::dx.read_u16();
+        break;
+    case 1:
+        v=mma7361::dy.read_u16();
+        break;
+    case 2:
+        v=mma7361::dz.read_u16();
+        break;
+    default:
+        v=def;
+        break;
+    }
+    return v;
+}
+
+int mma7361::read_bit_0(int axis){
+    int v;
+    v=mma7361::read_bit(axis);
+    v-=mat[mma7361::range][axis];
+    return v;
+}
+
+float mma7361::read_by_g(int axis){
+    float v;
+    v=mma7361::read_bit_0(axis);
+    v/=mat[mma7361::range+2][axis];
+    return v;
+}
+    
+void mma7361::low_pass_filter(int *int_bit,int axis){
+    *int_bit=*int_bit*0.9+mma7361::read_bit(axis)*0.1;
+}
+
+void mma7361::show_mat(){
+    for(int i=0; i<4; i++){
+        for(int j=0; j<3; j++){
+            mma7361::pcdev.printf("%d ",mat[i][j]);
+        }
+        mma7361::pcdev.printf("\n\r");
+    }
+}
+
+float mma7361::bit_to_g(int bit,int axis){
+    float v=0;
+    v=bit-mma7361::mat[mma7361::range][axis];
+    v/=mma7361::mat[mma7361::range+2][axis];
+    return v;
+}
+
+void mma7361::set_1st_bit(int *variable,int axis,float direction_G){
+    *variable=mma7361::mat[mma7361::range][axis]+mma7361::mat[mma7361::range+2][axis]*direction_G;
+}
+
+
+float mma7361::rotate(int *a_value,int a_axis,int *b_value,int b_axis){
+    float ga,gb,g;
+    ga=mma7361::bit_to_g(*a_value,a_axis);
+    gb=mma7361::bit_to_g(*b_value,b_axis);
+    if(abs(ga)<THHO){
+        ga=0;
+    }
+    if(abs(gb)<THHO){
+        return 0;
+    }else{
+        g=ga/gb;
+        g=atan(g);
+        return g;
+    }
+}
+
+float mma7361::rad_to_deg(float rad){
+    float deg;
+    deg=rad*180/PI;
+    return deg;
+}
\ No newline at end of file