MAG3110

Dependencies:   MotionSensor mbed

Fork of MAG3110 by kyunsat

Files at this revision

API Documentation at this revision

Comitter:
Nike3221
Date:
Tue Feb 28 17:43:35 2017 +0000
Parent:
8:c8512336fa70
Commit message:
mag3110
;

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Mon Jan 16 14:23:38 2017 +0000
+++ b/main.cpp	Tue Feb 28 17:43:35 2017 +0000
@@ -7,6 +7,7 @@
 #include "mbed.h"
 #include "MotionSensor.h"
 #include "MAG3110.h"
+#include "math.h"
 
 Serial pc(USBTX,USBRX);
 int16_t x,y,z;
@@ -14,14 +15,22 @@
 MAG3110 mag(p28,p27);
 DigitalIn local_on(p20);
 DigitalIn local_del(p19);
+DigitalIn north(p21);
+DigitalIn east(p22);
+DigitalIn south(p23);
+DigitalIn west(p24);
+DigitalIn cds(p29);
 DigitalOut bit1(LED4);
 DigitalOut bit2(LED3);
 DigitalOut bit3(LED2);
 DigitalOut bit4(LED1);
 
 int offset_x,offset_y;
-int x_max,y_max,x_min,y_min;
+float x_max,y_max,x_min,y_min;
 int count_offset;
+float direction;
+float x_dat,y_dat;
+char angle_c;
 
 
 void init(){
@@ -50,44 +59,93 @@
     if(y_min>y_rd && y_rd != 0){
         y_min=y_rd;}
         
-    offset_x = ((abs(x_min)+abs(x_max))/2);
-    offset_y = ((abs(y_min)+abs(y_max))/2);
+    offset_x = (x_min+x_max)/2;
+    offset_y = (y_min+y_max)/2;
     
-    //offset_x = (x_min + x_max)/2;
-    //offset_y = (y_min + y_max)/2;
-    
-    count_offset++;
-    if(count_offset > 300){//300個分のサンプ取得
-           x = x + offset_x;
-           y = y - offset_y;}
+    if(count_offset < 301){
+           count_offset++;}
+    if(count_offset > 300)//300個分のサンプ取得
+     {
+           if(0 < offset_x)
+            { x_dat = x + offset_x; }
+           else if(0 > offset_x)
+            { x_dat = x - offset_x; }
+           
+           if(0 < offset_y)
+            { y_dat = y - offset_y; }
+           else if(0 > offset_y)
+            { y_dat = y + offset_y; }
+            /*
+            if(0 < offset_x)
+             { x_dat = x + offset_x*1.3; }
+            else if(0 > offset_x)
+              { x_dat = x - offset_x*1.3; }
+           
+            if(0 < offset_y)
+              { y_dat = y + offset_y*1.3; }
+            else if(0 > offset_y)
+              { y_dat = y - offset_y*1.3; }*/
+            
+     }
         
     return 0;    
 }
 
+void cal(){
+           
+           direction = atan2(y_dat,x_dat);
+           if(direction < 0)
+             {direction = direction + 2*3.1415926535;}
+             
+           direction = direction*57.2958;//ラジアンに変換
+           //direction = (atan(y_dat/x_dat))*57.2958;
+           //direction = (atan(y_cal/x_cal))*57.2958;
+           
+           if(0 < direction && 89 > direction){
+               angle_c = 'N';}
+               
+           else if(90 < direction && 179 > direction){
+               angle_c = 'E';}
+               
+           else if(180 < direction && 269 > direction || -180 < direction && -91 > direction){
+               angle_c = 'S';}
+               
+           else if(270 < direction && 359 > direction || -90 < direction && -1 > direction){
+               angle_c = 'W';}
+        
+           else{ angle_c = '?';}     
+    
+}
+
 void save(){
 
     bit1=1;//led4を1にしてデータを保存
     FILE *fp = fopen("/local/commpas_new.txt","a");
-               fprintf(fp,"%d,%d,%d\n",x,y,z);
+               fprintf(fp,"%c,%d,%d,%d,%f,%f,%f\n",angle_c,x,y,z,x_dat,y_dat,direction);
+               //fprintf(fp,"%d,%d,%d,%d,%d\n",x,y,z,offset_x,offset_y);
                fclose(fp);
-    bit1=0;
+    bit1=0;    
+}
+
+void dele(){
     
-    if(local_del == 1){//pin19がhighの時、保存したデータを消去
-               bit2=1;//led3を1
-               if(remove("/local/commpas_new.txt") == 0){
-                   pc.printf("delete finished");}}
-    else{bit2=0;}
-    
+    bit2=1;//led3を1
+               
+    if(remove("/local/commpas_new.txt") == 1){
+              pc.printf("delete errer");}
+    bit2=0;
 }
 
 int main(){
     
     mag.enable();//コンパス有効化
-    mag.sampleRate(0x80);
+    mag.sampleRate(0x40);
     init(); //初期化
     
     while(1){
-    
+           
+           if(cds == 0){
+           while(1){
            //void disable(void);
            //uint32_t whoAmI(void);
            //uint32_t dataReady(void);
@@ -101,8 +159,14 @@
            //void getAxis(MotionSensorDataUnits &data);
            //void readRegs(int addr, uint8_t * data, int len);
            offset(x,y);//x,y オフセット計算
-           if(local_on == 1){save();}//データ保存
-           pc.printf("x: %d  y: %d  z: %d x_max: %d  x_min: %d\n",x,y,z,x_max,x_min);
+           //cal(x_dat,y_dat);
+           cal();
+           if(local_on == 1){save();}//pin20がhighの時、データ保存
+           if(local_del == 1){dele();}//pin19がhighの時、保存したデータを消去
+           pc.printf("<%c> x: %d , y: %d , x_dat: %f , y_dat: %f , direction: %f \n",angle_c,x,y,x_dat,y_dat,direction);    
+           //pc.printf("x_dat: %d  y_dat: %d  x: %d  offset: %d x_max: %d  x_min: %d\n",x_dat,y_dat,x,offset,x_max,x_min);
+            }
+           }
     
      }
 }
\ No newline at end of file