Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MotionSensor SDFileSystem mbed
Fork of TanecCon by
Diff: main.cpp
- Revision:
- 0:029ef267b1bc
- Child:
- 1:2992de38cf3e
diff -r 000000000000 -r 029ef267b1bc main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Feb 10 08:39:51 2017 +0000
@@ -0,0 +1,272 @@
+/*
+ * MAG3110 Sensor Library for mbed
+ * TODO: Add proper header
+ */
+
+
+#include "mbed.h"
+#include "MotionSensor.h"
+#include "MAG3110.h"
+#include "math.h"
+//#include "SDFileSystem.h"
+
+//SDFileSystem sd(p5, p6, p7, p8, "sd");
+//Serial pc(USBTX,USBRX);
+Serial pc(p9,p10);
+
+int16_t x,y,z;
+LocalFileSystem local("local");
+MAG3110 mag(p28,p27);
+Serial gps(p13,p14);
+
+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);
+
+char gps_c[250];
+int offset_x,offset_y;
+int x_max,y_max,x_min,y_min;
+int count_offset,count_gps;
+int a,b,c,d,e,f,g;
+float x_target,y_target,d_target;
+float longitude_target = 36.11707;
+float latitude_target = 139.4720;
+float utc_time,latitude,longitude,speed,course,utc_date,gps_magnetic;
+char pos_status;
+float direction,x_dat,y_dat;
+char angle_c;
+
+
+void init(){
+
+ x_max = -32500;//x,yの最大値を初期化
+ y_max = -32500;
+ x_min = 32500;
+ y_min = 32500;
+
+}
+
+int gps_save(){
+ a=0;
+ count_gps = 0;
+ pc.printf("sequence2\n");
+
+ while(a <= 159 && count_gps < 3)
+ {
+ bit4=1;
+
+ for(a=0; gps_c[a-1] != '\r' && gps_c[a] != '\n'; a++)
+ {
+ gps_c[a] = gps.getc();
+ pc.printf("%c \n",gps_c[a]);
+ }
+
+ bit4=0;
+
+ bit2=1;
+ if(memcmp(gps_c,"$GPRMC",6) == 0)
+ {
+ sscanf(gps_c,"$GPRMC,%f,%c,%f,N,%f,E,%f,%f,%f,%f,W",&utc_time,&pos_status,&latitude,&longitude,&speed,&course,&utc_date,&gps_magnetic);
+ pc.printf("$GPRMC,%f,%c,%f,N,%f,E,%f,%f,%f,%f,W \n",utc_time,pos_status,latitude,longitude,speed,course,utc_date,gps_magnetic);
+
+ if(latitude!=0)
+ {bit3=1;}
+ //mkdir("/sd/gps", 0777);
+
+ if(local_on == 1)
+ {
+ FILE *fp = fopen("/local/gps.txt", "a");
+ if(fp == NULL) {
+ error("Could not open file for write\n");
+ }
+
+ fprintf(fp,"$GPRMC,%f,%c,%f,N,%f,E,%f,%f,%f,%f,W \n",utc_time,pos_status,latitude,longitude,speed,course,utc_date,gps_magnetic);
+ fclose(fp);
+ }
+ bit3=0;
+ count_gps++;
+ }
+
+ /*else if(memcmp(gps_c,"$GPGGA",6) == 0)
+ { sscanf(gps_c,"$GPGGA,%f,%f,N,%f,E",&utc_time,&latitude,&longitude);
+ pc.printf("$GPGGA,%f,%f,N,%f,E \n",utc_time,latitude,longitude);
+
+ if(latitude!=0)
+ {bit3=1;}
+ // mkdir("/sd/gps", 0777);
+ if(local_on == 1){
+ FILE *fp = fopen("/local/gps.txt", "a");
+ if(fp == NULL) {
+ error("Could not open file for write\n");
+ }
+
+ fprintf(fp,"$GPGGA,%f,%f,N,%f,E \n",utc_time,latitude,longitude);
+ fclose(fp); }
+ bit3=0;
+ count_gps++;
+ }*/
+
+ else if(memcmp(gps_c,"$GPGLL",6) == 0)
+ { sscanf(gps_c,"$GPGLL,%f,N,%f,E \n",&latitude,&longitude);
+ pc.printf("$GPGLL,%f,N,%f,E \n",latitude,longitude);
+
+ if(latitude!=0)
+ {bit3=1;}
+ //mkdir("/sd/gps", 0777);
+
+ if(local_on == 1)
+ {
+ FILE *fp = fopen("/local/gps.txt", "a");
+ if(fp == NULL) {
+ error("Could not open file for write\n");
+ }
+
+ fprintf(fp,"$GPGLL,%f,N,%f,E \n",latitude,longitude);
+ fclose(fp);
+ }
+ bit3=0;
+ count_gps++;
+ }
+ bit2=0;
+ }
+
+
+ return 0;
+}
+
+int offset(int x_rd,int y_rd){
+
+ if(x_max == 0 || y_max == 0 || x_min == 0 || y_min == 0){
+ init();}//最大値、最小値に0が入った時初期化
+
+ if(x_max<x_rd && x_rd != 0){
+ x_max=x_rd;}
+
+ if(y_max<y_rd && y_rd != 0){
+ y_max=y_rd;}
+
+ if(x_min>x_rd && x_rd != 0){
+ x_min=x_rd;}
+
+ 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);
+
+ if(count_offset < 301){
+ count_offset++;}
+ if(count_offset > 300){//300個分のサンプ取得
+ x_dat = x + offset_x;
+ y_dat = y - offset_y;}
+
+ return 0;
+}
+
+void cal_gps(){
+ y_target = (latitude_target-latitude)*111319.49;
+ x_target = (longitude_target-longitude)*cos(latitude*(3.1415926535/180))*111319.49;
+ d_target = sqrt(pow(x,2.0)*pow(y,2.0));
+}
+
+void cal_con(){
+
+ 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 = '?';}*/
+
+ if(north == 1){
+ angle_c = 'N';}
+
+ else if(east == 1){
+ angle_c = 'E';}
+
+ else if(south == 1){
+ angle_c = 'S';}
+
+ else if(west == 1){
+ angle_c = 'W';}
+
+ else{ angle_c = '?';}
+
+}
+
+void con_save(){
+
+ bit1=1;//led4を1にしてデータを保存
+ FILE *fp = fopen("/local/commpas_new.txt","a");
+ fprintf(fp,"%c,%f,%f,%f,%f\n",angle_c,d_target,x_dat,y_dat,direction);
+ //fprintf(fp,"%d,%d,%d,%d,%d\n",x,y,z,offset_x,offset_y);
+ fclose(fp);
+ bit1=0;
+}
+
+void dele(){
+
+ bit2=1;//led3を1
+
+ remove("/local/commpas_new.txt");
+ remove("/local/gps.txt");
+
+ bit2=0;
+}
+
+int main(){
+
+ mag.enable();//コンパス有効化
+ mag.sampleRate(0x40);
+ init(); //初期化
+
+ while(1){
+
+ if(cds == 0){
+ while(1){
+ //void disable(void);
+ //uint32_t whoAmI(void);
+ //uint32_t dataReady(void);
+ mag.getX(&x);
+ mag.getY(&y);
+ mag.getZ(&z);
+ //void getX(float * x);
+ //void getY(float * y);
+ //void getZ(float * z);
+ //void getAxis(MotionSensorDataCounts &data);
+ //void getAxis(MotionSensorDataUnits &data);
+ //void readRegs(int addr, uint8_t * data, int len);
+ offset(x,y);//x,y オフセット計算
+ //cal(x_dat,y_dat);
+ cal_con();
+ cal_gps();
+ if(local_on == 1){con_save();}//pin20がhighの時、データ保存
+ if(local_del == 1){dele();}//pin19がhighの時、保存したデータを消去
+ gps_save();
+ 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
