mbed_2018
Dependencies: mbed JY901 TinyGPS AsyncSerial
main.cpp
- Committer:
- Minato
- Date:
- 2019-12-23
- Revision:
- 0:e4bf955dac58
File content as of revision 0:e4bf955dac58:
#include "mbed.h" #include "AsyncSerial.hpp" #include "TinyGPS.h" #include "JY901.h" Serial pc(USBTX, USBRX);//CoolTermを用いてパソコン上に表示 JY901 i2c(p28,p27);// sda, scl AsyncSerial Serial1(p9,p10,38400,128); // tx, rx AsyncSerial Serial2(p13,p14,9600,256); // tx, rx DigitalOut myled(LED1); InterruptIn alt(p21); InterruptIn rot(p22); DigitalIn mid(p23); AnalogIn an1(p19); AnalogIn an2(p20); Ticker flipper; Ticker flipper2; TinyGPS gps; Timer t; Timer t2; int rot_count_buf=0; int send_f1=0; int send_f2=0; #define coef_a -21.05 //ELE #define coef_b 22.2 //RUD float mid_a=0.5,mid_b=0.5; int mid_t=0; struct DATA{ int height; int rot_count; float air_speed; float analog[2];//0=ELE 1=RUD float fmps,falt; unsigned long fix_age; long lat, lon; unsigned long time, date, speed, course; float angle[3]; int a,b; }; DATA data; void ini(){ data.height=0;data.rot_count=0;data.air_speed=0;data.analog[0]=0.0;data.analog[1]=0.0; data.time=0;data.date=0; data.lat=0;data.lon=0.0;data.fmps=0.0;data.falt=0.0;data.fix_age=0; data.course=0; data.angle[0]=0.0;data.angle[1]=0.0;data.angle[2]=0.0; send_f1=0; send_f2=0; mid.mode(PullUp); } float con(float a){ if(a>180.0)return a-360.0; else return a; } void read_gyro(){ data.angle[0]=con(i2c.getXaxisAngle()); data.angle[1]=con(i2c.getYaxisAngle()); data.angle[2]=con(i2c.getZaxisAngle()); } void read_analog(){ data.analog[0]=an1.read();//ELE data.analog[1]=an2.read();//RUD data.a=(int)((data.analog[0]-mid_a)*coef_a+4.5); data.b=(int)((data.analog[1]-mid_b)*coef_b+4.5); if(data.a>8)data.a=8; if(data.a<0)data.a=0; if(data.b>8)data.b=8; if(data.b<0)data.b=0; } void mid1(){ mid_t=t2.read_ms(); mid_a=an1.read(); mid_b=an2.read(); } void alt1() { t.start(); } void alt2() { t.stop(); data.height=(int)(t.read_us()/58); t.reset(); } void rot1(){ rot_count_buf++; } void rot2(){ data.rot_count=rot_count_buf; rot_count_buf=0; send_f1=1; } void send(){//disp //def Serial2.printf("%d,%d,%.2f,%d,%d,%.2f,%.2f,%f,%f\r\n",data.height,data.rot_count,data.air_speed,data.a,data.b,data.fmps,data.angle[0],data.analog[0],data.analog[1]); //pc.printf("%d,%d,%.2f,%d,%d,%.2f,%.2f,%f,%f\r\n",data.height,data.rot_count,data.air_speed,data.a,data.b,data.fmps,data.angle[0],data.analog[0],data.analog[1]); pc.printf("time=%5ds, height=%4.2fm, rot=%3drpm, speed=%4.2fm/s, ELE=%f, RUD=%f, %d, %d, %d, %d, %d, %.2f, %.2f, %.2f, %.2f, %.2f\r\n" ,t2.read_ms()/1000,data.height/100,data.rot_count,data.air_speed ,data.analog[0],data.analog[1],data.date,data.time ,data.lat,data.lon,data.course,data.fmps,data.falt,data.angle[0],data.angle[1],data.angle[2]); //rudele //Serial2.printf("ELE,RUD,%d,%d,%f,%f\r\n",data.a,data.b,data.analog[0],data.analog[1]); //Serial2.printf("%d,%d,%.2f,%.2f\r\n",data.a,data.b,data.analog[0],data.analog[1]); /*Serial2.printf("%d,%d,%d,%.2f,%f,%f,%d,%d,%d,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f\r\n" ,t2.read_ms(),data.height,data.rot_count,data.air_speed ,data.analog[0],data.analog[1],data.date,data.time ,data.lat,data.lon,data.course,data.fmps,data.falt,data.angle[0],data.angle[1],data.angle[2]);*/ } void send2(){//log Serial1.printf("%d,%d,%d,%.2f,%f,%f,%d,%d,%d,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f\r\n" ,t2.read_ms(),data.height,data.rot_count,data.air_speed ,data.analog[0],data.analog[1],data.date,data.time ,data.lat,data.lon,data.course,data.fmps,data.falt,data.angle[0],data.angle[1],data.angle[2]); } void send2_f(){ send_f2=1; } int main() { char a[10];//バッファ int i=0;//count用 int prev_m=0; ini(); t.start(); t2.start(); alt.rise(&alt1);//立ち上がり alt.fall(&alt2);//立ち下がり rot.rise(&rot1);//立ち上がり rot.fall(&rot1);//立ち下がり //mid.fall(&mid1);//立ち上がり flipper.attach(&rot2, 0.5);//0.5sごとに回転数更新&送信 i2c.calibrateAll(3000); flipper2.attach(&send2_f, 0.2);//0.2sごとに送信 while(1) { while(Serial1.readable()>0){ a[i]=Serial1.getc(); if(a[i]=='\r'){ a[i]=Serial1.getc();//\n a[i]='\0'; i=0; data.air_speed=atof(a); }else{ i++; } } while(Serial2.readable()>0){ char c = Serial2.getc(); if(gps.encode(c)){ gps.get_position(&(data.lat), &(data.lon), &(data.fix_age));// retrieves +/- lat/long in 100000ths of a degree gps.get_datetime(&(data.date), &(data.time), &(data.fix_age));// time in hhmmsscc data.course = gps.course();// course in 100ths of a degree data.fmps = gps.f_speed_mps(); // speed in m/sec data.falt = gps.f_altitude(); // +/- altitude in meters } } if(send_f1==1){ send_f1=0; send(); } if(send_f2==1){ read_gyro(); read_analog(); send_f2=0; send2(); int a; a=mid; if(a==prev_m && !a && mid_t==0){ mid1(); Serial1.printf("##%f,%f\r\n",mid_a,mid_b); Serial2.printf("##%f,%f\r\n",mid_a,mid_b); } prev_m=a; } } }