CanSat2018_4にGPSとtweliteをつけ足して関数化したもの
Dependencies: mbed
main.cpp@2:b257a71f0655, 2018-08-13 (annotated)
- Committer:
- ponpoko1939
- Date:
- Mon Aug 13 08:20:44 2018 +0000
- Revision:
- 2:b257a71f0655
- Parent:
- 1:342818b81499
?????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kurikuri | 0:704adb172e40 | 1 | /*MPU9250_PROGRAM ver2.1 PROGRAMED BY RYOTARO FUNAI 2018/08/10*/ |
kurikuri | 0:704adb172e40 | 2 | #include <mbed.h> |
kurikuri | 0:704adb172e40 | 3 | #include <math.h> |
kurikuri | 0:704adb172e40 | 4 | #define PI 3.14159265359 |
kurikuri | 0:704adb172e40 | 5 | |
kurikuri | 0:704adb172e40 | 6 | DigitalOut motor1(p21); |
kurikuri | 0:704adb172e40 | 7 | DigitalOut motor2(p22); |
kurikuri | 0:704adb172e40 | 8 | DigitalOut motor3(p23); |
kurikuri | 0:704adb172e40 | 9 | DigitalOut motor4(p24); |
kurikuri | 0:704adb172e40 | 10 | I2C i2c(p9, p10); |
kurikuri | 0:704adb172e40 | 11 | Serial pc(USBTX, USBRX); //TWELITE使う予定なら13,14ピン |
kurikuri | 0:704adb172e40 | 12 | Serial gps(p28,p27); // tx, rx |
kurikuri | 0:704adb172e40 | 13 | Serial twelite(p13,p14); //twelite.printfでtwilite経由で通信できる |
kurikuri | 0:704adb172e40 | 14 | DigitalOut led1(p12); |
kurikuri | 0:704adb172e40 | 15 | AnalogIn Lx_in(p15); |
kurikuri | 0:704adb172e40 | 16 | |
kurikuri | 0:704adb172e40 | 17 | //GPS用変数群 |
kurikuri | 0:704adb172e40 | 18 | int i,rlock,mode; |
kurikuri | 0:704adb172e40 | 19 | char gps_data[256]; |
kurikuri | 0:704adb172e40 | 20 | char ns,ew; |
kurikuri | 0:704adb172e40 | 21 | float x=135.585800, y=34.648525; //実験用初期位地 |
kurikuri | 0:704adb172e40 | 22 | float w_time,hokui,tokei; |
kurikuri | 0:704adb172e40 | 23 | float g_hokui,g_tokei,old_hokui, old_tokei; //oldとg_を比べることで距離と角度を出す |
kurikuri | 0:704adb172e40 | 24 | float d_hokui,m_hokui,d_tokei,m_tokei; |
kurikuri | 0:704adb172e40 | 25 | unsigned char c; |
kurikuri | 0:704adb172e40 | 26 | |
kurikuri | 0:704adb172e40 | 27 | #define MPU9250_ADDRESS 0x68<<1 //I2CでのMPU9250のスレーブアドレス |
kurikuri | 0:704adb172e40 | 28 | #define AK8963_ADDRESS 0x0c<<1 //磁気センサのスレーブアドレス |
kurikuri | 0:704adb172e40 | 29 | #define Whoami 0x75 //who_am_iレジスタのアドレス、0x71が返ってくる |
kurikuri | 0:704adb172e40 | 30 | #define PWR 0x6b //スリープモードをonにするためのアドレス |
kurikuri | 0:704adb172e40 | 31 | #define MAG_OPN 0x37 //mpu9250から磁気センサにアクセスできるようにする |
kurikuri | 0:704adb172e40 | 32 | #define ACC_CONFIG 0x1c //加速度センサ設定用のアドレス |
kurikuri | 0:704adb172e40 | 33 | #define ACC_2G 0x00 //加速度センサのレンジ(2G) |
kurikuri | 0:704adb172e40 | 34 | #define ACC_4G 0x08 //加速度センサのレンジ(4G) |
kurikuri | 0:704adb172e40 | 35 | #define ACC_8G 0x10 //加速度センサのレンジ(8G) |
kurikuri | 0:704adb172e40 | 36 | #define ACC_16G 0x18 //加速度センサのレンジ(16Gまで計測可能) |
kurikuri | 0:704adb172e40 | 37 | #define MAG_CONFIG 0x0a //磁気センサ設定用のアドレス |
kurikuri | 0:704adb172e40 | 38 | #define MAG_8HZ 0x12 //磁気センサの出力周期(8Hz) |
kurikuri | 0:704adb172e40 | 39 | #define MAG_100HZ 0x16 //磁気センサの出力周期(100Hz) |
kurikuri | 0:704adb172e40 | 40 | #define accRange 16.0 //加速度センサの測定レンジ |
kurikuri | 0:704adb172e40 | 41 | #define ST2 0x02 //磁気センサのステータスが入っているアドレス |
kurikuri | 0:704adb172e40 | 42 | #define Ain 35 |
kurikuri | 0:704adb172e40 | 43 | #define SDA 21 |
kurikuri | 0:704adb172e40 | 44 | #define SCL 22 |
kurikuri | 0:704adb172e40 | 45 | #define led 2 //チェック用のLEDピン |
kurikuri | 0:704adb172e40 | 46 | |
kurikuri | 0:704adb172e40 | 47 | //void LCD_Reset(); //m5stackLCDを更新 |
kurikuri | 0:704adb172e40 | 48 | float Lx_Read(); //cdsセルから値を取得 |
kurikuri | 0:704adb172e40 | 49 | void Ac_Read(int16_t*, int16_t*, int16_t*); //9軸から加速度の値を取得 |
kurikuri | 0:704adb172e40 | 50 | void Mag_Read(int16_t*, int16_t*, int16_t*); |
kurikuri | 0:704adb172e40 | 51 | //addrにスレーブアドレス、regにアクセスするアドレスを入力する |
kurikuri | 0:704adb172e40 | 52 | void i2cRead(uint8_t addr,uint8_t reg, uint8_t bytes,uint8_t* data); |
kurikuri | 0:704adb172e40 | 53 | void i2cWrite(uint8_t addr,uint8_t reg, uint8_t data); |
kurikuri | 0:704adb172e40 | 54 | uint8_t IDcheck(); |
kurikuri | 0:704adb172e40 | 55 | void Breky(); |
kurikuri | 0:704adb172e40 | 56 | void Turn(); |
kurikuri | 0:704adb172e40 | 57 | void Return(); |
kurikuri | 0:704adb172e40 | 58 | void Right(); |
kurikuri | 0:704adb172e40 | 59 | void Left(); |
kurikuri | 0:704adb172e40 | 60 | void release(); |
kurikuri | 0:704adb172e40 | 61 | void Faling(); |
kurikuri | 0:704adb172e40 | 62 | void nikurom(); |
kurikuri | 0:704adb172e40 | 63 | void getGPS(); |
kurikuri | 0:704adb172e40 | 64 | void distance(); |
kurikuri | 0:704adb172e40 | 65 | void geoDirection(); |
kurikuri | 0:704adb172e40 | 66 | void compass(); |
kurikuri | 0:704adb172e40 | 67 | |
kurikuri | 0:704adb172e40 | 68 | uint8_t accgyrodata[14]; |
kurikuri | 0:704adb172e40 | 69 | uint8_t magneticdata[7]; |
kurikuri | 0:704adb172e40 | 70 | uint8_t ST2_Bit; //磁気センサのステータスを入れておく |
kurikuri | 0:704adb172e40 | 71 | |
kurikuri | 0:704adb172e40 | 72 | int main() { |
kurikuri | 0:704adb172e40 | 73 | gps.baud(9600); |
kurikuri | 0:704adb172e40 | 74 | twelite.baud(115200); |
kurikuri | 0:704adb172e40 | 75 | void Release(); //放出判定 |
kurikuri | 0:704adb172e40 | 76 | gps.attach(getGPS,Serial::RxIrq); //GPS割り込み |
kurikuri | 0:704adb172e40 | 77 | void Faling();//落下判定 |
kurikuri | 0:704adb172e40 | 78 | void nikurom(); //ニクロム線を切る |
kurikuri | 0:704adb172e40 | 79 | void compass();//九軸で進む方向決める |
kurikuri | 0:704adb172e40 | 80 | |
kurikuri | 0:704adb172e40 | 81 | } |
kurikuri | 0:704adb172e40 | 82 | |
kurikuri | 0:704adb172e40 | 83 | |
kurikuri | 0:704adb172e40 | 84 | /****************関数群****************/ |
kurikuri | 0:704adb172e40 | 85 | //cdsセルからアナログ値を持ってくる |
kurikuri | 0:704adb172e40 | 86 | float Lx_Read(){ |
kurikuri | 0:704adb172e40 | 87 | float lx; |
kurikuri | 0:704adb172e40 | 88 | lx = Lx_in.read(); |
kurikuri | 0:704adb172e40 | 89 | return lx; |
kurikuri | 0:704adb172e40 | 90 | } |
kurikuri | 0:704adb172e40 | 91 | |
kurikuri | 0:704adb172e40 | 92 | //Who_am_Iアドレスで接続確認ができる。0x71もしくは10進数で113が返ってくればok |
kurikuri | 0:704adb172e40 | 93 | uint8_t IDcheck(){ |
kurikuri | 0:704adb172e40 | 94 | uint8_t address; |
kurikuri | 0:704adb172e40 | 95 | i2cRead(MPU9250_ADDRESS, Whoami, 1, &address); |
kurikuri | 0:704adb172e40 | 96 | return address; |
kurikuri | 0:704adb172e40 | 97 | } |
kurikuri | 0:704adb172e40 | 98 | |
kurikuri | 0:704adb172e40 | 99 | //mpu9250から加速度センサのみ引っ張ってくる |
kurikuri | 0:704adb172e40 | 100 | void Ac_Read(int16_t* ax, int16_t* ay, int16_t* az){ |
kurikuri | 0:704adb172e40 | 101 | i2cWrite(MPU9250_ADDRESS, PWR, 0x00); //スリープモードの解除 |
kurikuri | 0:704adb172e40 | 102 | i2cWrite(MPU9250_ADDRESS, ACC_CONFIG, ACC_16G);//加速度センサの測定レンジの設定 |
kurikuri | 0:704adb172e40 | 103 | i2cRead(MPU9250_ADDRESS, 0x3b, 14, accgyrodata); |
kurikuri | 0:704adb172e40 | 104 | *ax = (accgyrodata[0] << 8) | accgyrodata[1];//accGyroTempData[0]を左に8シフトし(<<),accGyroTempData[1]を足し合わせる(|) |は論理和 |
kurikuri | 0:704adb172e40 | 105 | *ay = (accgyrodata[2] << 8) | accgyrodata[3];//accGyroTempData[2]を左に8シフトし(<<),accGyroTempData[3]を足し合わせる(|) |
kurikuri | 0:704adb172e40 | 106 | *az = (accgyrodata[4] << 8) | accgyrodata[5];//accGyroTempData[4]を左に8シフトし(<<),accGyroTempData[5]を足し合わせる(|) |
kurikuri | 0:704adb172e40 | 107 | } |
kurikuri | 0:704adb172e40 | 108 | |
kurikuri | 0:704adb172e40 | 109 | //mpu9250から磁気センサのみ引っ張ってくる |
kurikuri | 0:704adb172e40 | 110 | void Mag_Read(int16_t* mx, int16_t* my, int16_t* mz){ |
kurikuri | 0:704adb172e40 | 111 | i2cWrite(MPU9250_ADDRESS, PWR, 0x00); //スリープモードの解除 |
kurikuri | 0:704adb172e40 | 112 | i2cWrite(MPU9250_ADDRESS, MAG_OPN, 0x02); //磁気センサの起動 |
kurikuri | 0:704adb172e40 | 113 | i2cWrite(AK8963_ADDRESS, MAG_CONFIG, MAG_100HZ);//磁気センサの測定レンジの設定 |
kurikuri | 0:704adb172e40 | 114 | i2cRead(AK8963_ADDRESS, ST2, 1, &ST2_Bit);//読み出し準備ができたか確認 |
kurikuri | 0:704adb172e40 | 115 | if(ST2_Bit & 0x01){ //ちゃんと読めたかをST2レジスタの値を読んで確認 |
kurikuri | 0:704adb172e40 | 116 | i2cRead(AK8963_ADDRESS, 0x03, 7, magneticdata); |
kurikuri | 0:704adb172e40 | 117 | } |
kurikuri | 0:704adb172e40 | 118 | else pc.printf("ERROR!!\n"); |
kurikuri | 0:704adb172e40 | 119 | *mx = (magneticdata[0] << 8) | magneticdata[1]; |
kurikuri | 0:704adb172e40 | 120 | *my = (magneticdata[2] << 8) | magneticdata[3]; |
kurikuri | 0:704adb172e40 | 121 | *mz = (magneticdata[4] << 8) | magneticdata[5]; |
kurikuri | 0:704adb172e40 | 122 | } |
kurikuri | 0:704adb172e40 | 123 | |
kurikuri | 0:704adb172e40 | 124 | //mpu9250からデータを取得(bytesに受け取るデータのバイト数、dataに実際のデータを挿入していく) |
kurikuri | 0:704adb172e40 | 125 | void i2cRead(uint8_t addr,uint8_t reg, uint8_t bytes,uint8_t* data){ |
kurikuri | 0:704adb172e40 | 126 | char cmd[1]; |
kurikuri | 0:704adb172e40 | 127 | char written_data[14]; |
kurikuri | 0:704adb172e40 | 128 | cmd[0] = reg; |
kurikuri | 0:704adb172e40 | 129 | i2c.write(addr, cmd, 1, 1); |
kurikuri | 0:704adb172e40 | 130 | i2c.read(addr, written_data, bytes, 0); |
kurikuri | 0:704adb172e40 | 131 | for(int ii = 0; ii < bytes; ii++) { |
kurikuri | 0:704adb172e40 | 132 | data[ii] = written_data[ii]; |
kurikuri | 0:704adb172e40 | 133 | } |
kurikuri | 0:704adb172e40 | 134 | } |
kurikuri | 0:704adb172e40 | 135 | |
kurikuri | 0:704adb172e40 | 136 | //mpu9250にデータを送信(dataに送信するデータを入力する) |
kurikuri | 0:704adb172e40 | 137 | void i2cWrite(uint8_t addr,uint8_t reg, uint8_t data){ |
kurikuri | 0:704adb172e40 | 138 | char cmd[2]; |
kurikuri | 0:704adb172e40 | 139 | cmd[0] = reg; //レジスタ指定 |
kurikuri | 0:704adb172e40 | 140 | cmd[1] = data; //送信するデータ |
kurikuri | 0:704adb172e40 | 141 | i2c.write(addr, cmd, 2); //レジスタ指定はどうする? |
kurikuri | 0:704adb172e40 | 142 | } |
kurikuri | 0:704adb172e40 | 143 | |
kurikuri | 0:704adb172e40 | 144 | //各種モータの関数 |
kurikuri | 0:704adb172e40 | 145 | void Breky(){ |
kurikuri | 0:704adb172e40 | 146 | motor1 = 0; |
kurikuri | 0:704adb172e40 | 147 | motor2 = 0; |
kurikuri | 0:704adb172e40 | 148 | motor3 = 0; |
kurikuri | 0:704adb172e40 | 149 | motor4 = 0; |
kurikuri | 0:704adb172e40 | 150 | } |
kurikuri | 0:704adb172e40 | 151 | |
kurikuri | 0:704adb172e40 | 152 | void Turn(){ |
kurikuri | 0:704adb172e40 | 153 | motor1 = 1; |
kurikuri | 0:704adb172e40 | 154 | motor2 = 0; |
kurikuri | 0:704adb172e40 | 155 | motor3 = 1; |
kurikuri | 0:704adb172e40 | 156 | motor4 = 0; |
kurikuri | 0:704adb172e40 | 157 | } |
kurikuri | 0:704adb172e40 | 158 | |
kurikuri | 0:704adb172e40 | 159 | void Return(){ |
kurikuri | 0:704adb172e40 | 160 | motor1 = 0; |
kurikuri | 0:704adb172e40 | 161 | motor2 = 1; |
kurikuri | 0:704adb172e40 | 162 | motor3 = 0; |
kurikuri | 0:704adb172e40 | 163 | motor4 = 1; |
kurikuri | 0:704adb172e40 | 164 | } |
kurikuri | 0:704adb172e40 | 165 | |
kurikuri | 0:704adb172e40 | 166 | void Left(){ |
kurikuri | 0:704adb172e40 | 167 | motor1 = 1; |
kurikuri | 0:704adb172e40 | 168 | motor2 = 0; |
kurikuri | 0:704adb172e40 | 169 | motor3 = 0; |
kurikuri | 0:704adb172e40 | 170 | motor4 = 1; |
kurikuri | 0:704adb172e40 | 171 | } |
kurikuri | 0:704adb172e40 | 172 | |
kurikuri | 0:704adb172e40 | 173 | void Right(){ |
kurikuri | 0:704adb172e40 | 174 | motor1 = 0; |
kurikuri | 0:704adb172e40 | 175 | motor2 = 1; |
kurikuri | 0:704adb172e40 | 176 | motor3 = 1; |
kurikuri | 0:704adb172e40 | 177 | motor4 = 0; |
kurikuri | 0:704adb172e40 | 178 | } |
kurikuri | 0:704adb172e40 | 179 | |
kurikuri | 0:704adb172e40 | 180 | void release(){ |
kurikuri | 0:704adb172e40 | 181 | while(1){ |
kurikuri | 0:704adb172e40 | 182 | //cdsセルの値の確認 |
kurikuri | 0:704adb172e40 | 183 | //暗いときは0.8~1.0程度の値 |
kurikuri | 0:704adb172e40 | 184 | float blight; |
kurikuri | 0:704adb172e40 | 185 | blight = Lx_Read(); |
kurikuri | 0:704adb172e40 | 186 | pc.printf("%4.1f\n\r",blight); |
kurikuri | 0:704adb172e40 | 187 | if(blight<=0.6) break;// 明るさが0.6以下なら次のフェーズに進む |
kurikuri | 0:704adb172e40 | 188 | } |
kurikuri | 0:704adb172e40 | 189 | } |
kurikuri | 0:704adb172e40 | 190 | |
kurikuri | 0:704adb172e40 | 191 | void Faling(){ |
kurikuri | 0:704adb172e40 | 192 | while(1){ |
kurikuri | 0:704adb172e40 | 193 | int16_t ax, ay, az; |
kurikuri | 0:704adb172e40 | 194 | float accX, accY, accZ, acc; |
kurikuri | 0:704adb172e40 | 195 | //加速度の値を取得し、落下判定 |
kurikuri | 0:704adb172e40 | 196 | Ac_Read(&ax,&ay,&az); |
kurikuri | 0:704adb172e40 | 197 | accX = ax * accRange / 32768.0;//[G]に変換 |
kurikuri | 0:704adb172e40 | 198 | accY = ay * accRange / 32768.0;//[G]に変換 |
kurikuri | 0:704adb172e40 | 199 | accZ = az * accRange / 32768.0;//[G]に変換 |
kurikuri | 0:704adb172e40 | 200 | acc = sqrt((accX * accX) + (accY * accY) + (accZ * accZ)); |
kurikuri | 0:704adb172e40 | 201 | // 各軸のGを表示 |
kurikuri | 0:704adb172e40 | 202 | pc.printf("accX :%f\n\raccY :%f\n\raccZ :%f\n\racc :%f\n\r",accX, accY, accZ, acc); |
kurikuri | 0:704adb172e40 | 203 | //静止時は1.0程度、落下時はそれを超える為、電源を入れるのは1.1以下にした |
kurikuri | 0:704adb172e40 | 204 | if(acc <= 1.10){ |
kurikuri | 0:704adb172e40 | 205 | pc.printf("PWRON!!"); |
kurikuri | 0:704adb172e40 | 206 | Turn(); |
kurikuri | 0:704adb172e40 | 207 | break; |
kurikuri | 0:704adb172e40 | 208 | //led1 = 0; |
kurikuri | 0:704adb172e40 | 209 | }else{ |
kurikuri | 0:704adb172e40 | 210 | Breky(); |
kurikuri | 0:704adb172e40 | 211 | //led1 = 0; |
kurikuri | 0:704adb172e40 | 212 | } |
kurikuri | 0:704adb172e40 | 213 | } |
kurikuri | 0:704adb172e40 | 214 | } |
kurikuri | 0:704adb172e40 | 215 | |
kurikuri | 0:704adb172e40 | 216 | void nikurom(){ |
kurikuri | 0:704adb172e40 | 217 | wait(60); |
kurikuri | 0:704adb172e40 | 218 | } |
kurikuri | 0:704adb172e40 | 219 | |
kurikuri | 0:704adb172e40 | 220 | void getGPS() { |
kurikuri | 0:704adb172e40 | 221 | c = gps.getc(); |
kurikuri | 0:704adb172e40 | 222 | if( c=='$' || i == 256){ |
kurikuri | 0:704adb172e40 | 223 | mode = 0; |
kurikuri | 0:704adb172e40 | 224 | i = 0; |
kurikuri | 0:704adb172e40 | 225 | for(int j=0; j<256; j++){ |
kurikuri | 0:704adb172e40 | 226 | gps_data[j]=NULL; |
kurikuri | 0:704adb172e40 | 227 | } |
kurikuri | 0:704adb172e40 | 228 | } |
kurikuri | 0:704adb172e40 | 229 | |
kurikuri | 0:704adb172e40 | 230 | if(mode==0){ |
kurikuri | 0:704adb172e40 | 231 | if((gps_data[i]=c) != '\r'){ |
kurikuri | 0:704adb172e40 | 232 | i++; |
kurikuri | 0:704adb172e40 | 233 | }else{ |
kurikuri | 0:704adb172e40 | 234 | gps_data[i]='\0'; |
kurikuri | 0:704adb172e40 | 235 | |
kurikuri | 0:704adb172e40 | 236 | if( sscanf(gps_data, "$GPGGA,%f,%f,%c,%f,%c,%d",&w_time,&hokui,&ns,&tokei,&ew,&rlock) >= 1){ |
kurikuri | 0:704adb172e40 | 237 | if(rlock==1){ |
kurikuri | 0:704adb172e40 | 238 | // pc.printf("Status:Lock(%d)\n\r",rlock); |
kurikuri | 0:704adb172e40 | 239 | //logitude |
kurikuri | 0:704adb172e40 | 240 | d_tokei= int(tokei/100); |
kurikuri | 0:704adb172e40 | 241 | m_tokei= (tokei-d_tokei*100)/60; |
kurikuri | 0:704adb172e40 | 242 | g_tokei= d_tokei+m_tokei; |
kurikuri | 0:704adb172e40 | 243 | //Latitude |
kurikuri | 0:704adb172e40 | 244 | d_hokui=int(hokui/100); |
kurikuri | 0:704adb172e40 | 245 | m_hokui=(hokui-d_hokui*100)/60; |
kurikuri | 0:704adb172e40 | 246 | g_hokui=d_hokui+m_hokui; |
kurikuri | 0:704adb172e40 | 247 | //現在地のgpsデータ |
kurikuri | 0:704adb172e40 | 248 | pc.printf("Lat:%.6f, Lon:%.6f\n\r",g_hokui, g_tokei); |
kurikuri | 0:704adb172e40 | 249 | twelite.printf("%.6f,%.6f\n\r",g_hokui, g_tokei); |
kurikuri | 0:704adb172e40 | 250 | //前回の計測からの変化量 |
kurikuri | 0:704adb172e40 | 251 | //pc.printf("ch_Lat:%.6f, ch_Lon:%.6f\n\r",old_hokui-g_hokui, old_tokei-g_tokei); |
kurikuri | 0:704adb172e40 | 252 | //pc.printf("dis : %fm\n\r", 1000*6378.137*acos(sin(y*PI/180)*sin(g_hokui*PI/180)+cos(y*PI/180)*cos(g_hokui*PI/180)*cos(x*PI/180-g_tokei*PI/180))); //別の距離の出し方 |
kurikuri | 0:704adb172e40 | 253 | distance(); |
kurikuri | 0:704adb172e40 | 254 | geoDirection(); |
kurikuri | 0:704adb172e40 | 255 | old_hokui=g_hokui; |
kurikuri | 0:704adb172e40 | 256 | old_tokei=g_tokei; |
kurikuri | 0:704adb172e40 | 257 | }else{//gpsデータ未受信時 |
kurikuri | 0:704adb172e40 | 258 | //pc.printf("\n\rStatus:unLock(%d)\n\r",rlock); |
kurikuri | 0:704adb172e40 | 259 | ////pc.printf("%s",gps_data); |
kurikuri | 0:704adb172e40 | 260 | } |
kurikuri | 0:704adb172e40 | 261 | } |
kurikuri | 0:704adb172e40 | 262 | } |
kurikuri | 0:704adb172e40 | 263 | } |
ponpoko1939 | 2:b257a71f0655 | 264 | __disable_irq(); //割り込み禁止 |
kurikuri | 0:704adb172e40 | 265 | } |
kurikuri | 0:704adb172e40 | 266 | |
kurikuri | 0:704adb172e40 | 267 | //ヒューベニの公式で距離出す |
kurikuri | 0:704adb172e40 | 268 | void distance(){ |
kurikuri | 0:704adb172e40 | 269 | float rlat1 = y*PI/180, rlon1 = x*PI/180; |
kurikuri | 0:704adb172e40 | 270 | float rlat2 = g_hokui*PI/180, rlon2 = g_tokei*PI/180; |
kurikuri | 0:704adb172e40 | 271 | float a=6378137.000, a2=pow(a,2), e=sqrt((a2-pow(6356752.314,2))/a2); |
kurikuri | 0:704adb172e40 | 272 | float lat_diff = rlat1-rlat2; |
kurikuri | 0:704adb172e40 | 273 | float lon_diff = rlon1-rlon2; |
kurikuri | 0:704adb172e40 | 274 | float lat_ave = (rlat1+rlat2)/2; |
kurikuri | 0:704adb172e40 | 275 | float w = sqrt(1-pow(e,2)*pow(sin(lat_ave),2)); |
kurikuri | 0:704adb172e40 | 276 | float meridian = a*(1-pow(e,2))/pow(w,3); |
kurikuri | 0:704adb172e40 | 277 | float n=a/w; |
kurikuri | 0:704adb172e40 | 278 | float distance2 = sqrt(pow(lat_diff*meridian,2)+pow(lon_diff*n*cos(lat_ave),2)); |
kurikuri | 0:704adb172e40 | 279 | //pc.printf("dis2 : %fm\n\r",distance2); |
kurikuri | 0:704adb172e40 | 280 | } |
kurikuri | 0:704adb172e40 | 281 | |
kurikuri | 0:704adb172e40 | 282 | //角度出す |
kurikuri | 0:704adb172e40 | 283 | void geoDirection() { |
kurikuri | 0:704adb172e40 | 284 | // 緯度 g_hokui(lat1),経度 g_tokei(lng1) の点を出発として、緯度 y(lat2),経度 x(lng2) への方位 |
kurikuri | 0:704adb172e40 | 285 | // 北を0度で右回りの角度0~360度 |
kurikuri | 0:704adb172e40 | 286 | float Y = cos(x*PI/180)*sin(y*PI/180-g_hokui*PI/180); |
kurikuri | 0:704adb172e40 | 287 | float X = cos(g_tokei*PI/180)*sin(x*PI/180)-sin(g_tokei*PI/180)*cos(x*PI/180)*cos(y*PI/180-g_hokui*PI/180); |
kurikuri | 0:704adb172e40 | 288 | float dirE0 = 180*atan2(Y, X)/PI; |
kurikuri | 0:704adb172e40 | 289 | if(dirE0 < 0){ |
kurikuri | 0:704adb172e40 | 290 | dirE0 = dirE0 + 360; |
kurikuri | 0:704adb172e40 | 291 | } |
kurikuri | 0:704adb172e40 | 292 | float dirN0 = (int)(dirE0 + 90) % 360; |
kurikuri | 0:704adb172e40 | 293 | pc.printf("%f\n\r",dirN0); |
kurikuri | 0:704adb172e40 | 294 | } |
kurikuri | 0:704adb172e40 | 295 | |
kurikuri | 0:704adb172e40 | 296 | //方角だす |
kurikuri | 0:704adb172e40 | 297 | void compass(){ |
ponpoko1939 | 1:342818b81499 | 298 | double maveX = 0, maveY = 0, maveZ = 0; |
ponpoko1939 | 1:342818b81499 | 299 | int16_t ax, ay, az; |
ponpoko1939 | 1:342818b81499 | 300 | float accX, accY, accZ, acc; |
kurikuri | 0:704adb172e40 | 301 | int16_t mx, my, mz; |
kurikuri | 0:704adb172e40 | 302 | float magX, magY, magZ, mag; |
ponpoko1939 | 1:342818b81499 | 303 | double rad; |
ponpoko1939 | 1:342818b81499 | 304 | double degree; |
ponpoko1939 | 1:342818b81499 | 305 | double roll; |
ponpoko1939 | 1:342818b81499 | 306 | double pitch; |
ponpoko1939 | 1:342818b81499 | 307 | //補正する為に取得 |
ponpoko1939 | 1:342818b81499 | 308 | accX = ax * accRange / 32768.0;//[G]に変換 |
ponpoko1939 | 1:342818b81499 | 309 | accY = ay * accRange / 32768.0;//[G]に変換 |
ponpoko1939 | 1:342818b81499 | 310 | accZ = az * accRange / 32768.0;//[G]に変換 |
ponpoko1939 | 1:342818b81499 | 311 | roll = atan2(accY, accZ); |
ponpoko1939 | 1:342818b81499 | 312 | pitch = atan2(-accX, sin(accY) + cos(accZ)); |
kurikuri | 0:704adb172e40 | 313 | //磁気の値を取得し、方位判定 |
ponpoko1939 | 1:342818b81499 | 314 | for(int i = 0;i < 150;i++){ |
ponpoko1939 | 1:342818b81499 | 315 | Mag_Read(&mx, &my, &mz); |
ponpoko1939 | 1:342818b81499 | 316 | maveX += mx; |
ponpoko1939 | 1:342818b81499 | 317 | maveY += my; |
ponpoko1939 | 1:342818b81499 | 318 | maveZ += mz; |
ponpoko1939 | 1:342818b81499 | 319 | wait_ms(10); |
ponpoko1939 | 1:342818b81499 | 320 | } |
ponpoko1939 | 1:342818b81499 | 321 | maveX /= 150; |
ponpoko1939 | 1:342818b81499 | 322 | maveY /= 150; |
ponpoko1939 | 1:342818b81499 | 323 | maveZ /= 150; |
ponpoko1939 | 1:342818b81499 | 324 | magX = (maveX - 168.75) / 32768.0f * 4800.0f;//[uT]に変換 |
ponpoko1939 | 1:342818b81499 | 325 | magY = (maveY - 18.75) / 32768.0f * 4800.0f;//[uT]に変換 |
kurikuri | 0:704adb172e40 | 326 | magZ = mz / 32768.0f * 4800.0f;//[uT]に変換 |
ponpoko1939 | 1:342818b81499 | 327 | pc.printf("%f,%f\n\r", magX, magY); |
ponpoko1939 | 1:342818b81499 | 328 | //ID = IDcheck(); |
ponpoko1939 | 1:342818b81499 | 329 | //pc.printf("%f\n\r", ID); |
ponpoko1939 | 1:342818b81499 | 330 | rad = atan2(magZ * sin(roll) - magY * cos(roll), magX * cos(pitch) + magY * sin(pitch) * sin(roll) + magZ * sin(pitch) * cos(roll)); |
ponpoko1939 | 1:342818b81499 | 331 | degree = -((int)(rad * 180.0 / 3.141592 + 270.0 - 7.5) % 360 - 360.0); |
ponpoko1939 | 1:342818b81499 | 332 | /* |
ponpoko1939 | 1:342818b81499 | 333 | if(degree < 0){ |
ponpoko1939 | 1:342818b81499 | 334 | degree += 360; |
ponpoko1939 | 1:342818b81499 | 335 | } |
ponpoko1939 | 1:342818b81499 | 336 | */ |
ponpoko1939 | 1:342818b81499 | 337 | pc.printf("%d\n\r",(int)degree); |
ponpoko1939 | 2:b257a71f0655 | 338 | __enable_irq(); //割り込み許可 |
kurikuri | 0:704adb172e40 | 339 | } |