12/16用テスト
Dependencies: ATP3012 mbed a HMC US015_2 getGPS
Function.h
- Committer:
- miyajitakenari
- Date:
- 2021-11-06
- Revision:
- 0:79033ee3c961
- Child:
- 3:ec2b7587be78
File content as of revision 0:79033ee3c961:
#include "mbed.h" #include "getGPS.h" #include "us015.h" #include "HMC6352.h" #include "TB6612.h" #include "ATP3011.h" US015 hs(D2, D3); DigitalOut Ultra(D2); GPS gps(D1, D0); HMC6352 compass(D4, D5); ATP3011 talk(D4,D5); // I2C sda scl TB6612 motor_a(D10,D6,D7); //モータA制御用(pwma,ain1,ain2) TB6612 motor_b(D11,D8,D9); //モータB制御用(pwmb,bin1,bin2) Serial pc(USBTX, USBRX); Serial xbee(A7, A2); double GPS_x, GPS_y; // 現在地の座標 double next_CP_x, next_CP_y; double CPs_x[100]; // = []; //CPリスト(x座標) double CPs_y[100]; // = []; // CPリスト(y座標) double *pGPS_x = &GPS_x, *pGPS_y = &GPS_y; double theta; double delta; int FrontGet() { Ultra = 1; //超音波on hs.TrigerOut(); wait(1); int distance; distance = hs.GetDistance(); pc.printf("distance=%d\r\n", distance); //距離出力 xbee.printf("distance=%d\r\n", distance); Ultra=0;//超音波off if(distance < 200) { return 1; } else { return 0; } } void catchGPS() { pc.printf("GPS Start\r\n"); xbee.printf("GPS Start\r\n"); /* 1秒ごとに現在地を取得してターミナル出力 */ while(1) { if(gps.getgps()) { //現在地取得 pc.printf("%lf %lf\r\n", gps.latitude, gps.longitude);//緯度と経度を出力 xbee.printf("%lf %lf\r\n", gps.latitude, gps.longitude);// *pGPS_x = gps.latitude; *pGPS_y = gps.longitude; break; } else { pc.printf("No data\r\n");//データ取得に失敗した場合 xbee.printf("No data\r\n"); wait(1); } } return; } void Move(char input_data, float motor_speed) { switch (input_data) { case '1': // 停止 motor_a = 0; motor_b = 0; break; case '2': // 前進 motor_a = motor_speed; motor_b = motor_speed; break; case '3': // 後退 motor_a = -motor_speed; motor_b = -motor_speed; break; case '4': // 時計回りに回転 motor_a = motor_speed; motor_b = -motor_speed; break; case '5': // 反時計回りに回転 motor_a = -motor_speed; motor_b = motor_speed; break; case '6': // Aのみ正転 motor_a = motor_speed; break; case '7': // Bのみ正転 motor_b = motor_speed; break; case '8': // Aのみ逆転 motor_a = -motor_speed; break; case '9': // Bのみ逆転 motor_b = -motor_speed; break; } pc.printf("input_data=%d\r\n", input_data); xbee.printf("input_data=%d\r\n", input_data); } double AngleGet() { double angle = 0; compass.setOpMode(HMC6352_CONTINUOUS, 1, 20); angle = compass.sample() / 10; double theta; double delta; pc.printf("gps.latitude=%f, gps.longitude=%f\r\n", gps.latitude, gps.longitude); xbee.printf("gps.latitude=%f, gps.longitude=%f\r\n", gps.latitude, gps.longitude); theta = atan2(next_CP_x - gps.latitude , next_CP_y - gps.longitude) * 180 / 3.14159265359; printf("theta=%f\r\n", theta); if(theta >= 0) { delta = angle - theta; } else { theta = theta + 360; delta = angle - theta; } printf("%f-%f=%f\r\n", angle, theta, delta); wait(2); return delta; } void Calibration() { pc.printf("calibration start\r\n"); xbee.printf("calibration start\r\n"); compass.setCalibrationMode(0x43); Timer t; t.start(); while(t.read()<=60){ Move('4', 0.5); } t.stop(); t.reset(); compass.setCalibrationMode(0x45); pc.printf("calibration end\r\n"); xbee.printf("calibration end\r\n"); while(1) { if(gps.getgps()) { //現在地取得 pc.printf("%lf %lf\r\n", gps.latitude, gps.longitude);//緯度と経度を出力 *pGPS_x = gps.latitude; *pGPS_y = gps.longitude; break; } else { pc.printf("No data\r\n");//データ取得に失敗した場合 xbee.printf("No data\r\n"); wait(1); } } return; } /*地上局から新情報を送るときはflag=がでてきたらスペースか.を入力 3秒後ぐらいにmessage=が出てくるので、そしたら新情報を入力*/ void speak() { int timeout_ms=500; char mess[100]; if(talk.IsActive(timeout_ms)==true){ pc.printf("Active\n\rflag=xbee ni Input"); xbee.printf("Active\n\rflag="); wait(3); if(xbee.readable()){ pc.printf("\n\rmessage=xbee ni Input"); xbee.printf("\n\rmessage="); int i=0; do{ mess[i++]= xbee.getc(); } while(mess[i-1]!= 0x0d && i<99); talk.Synthe(mess); } else{ pc.printf("preset_message speak\r\n"); xbee.printf("preset_message speak\r\n"); talk.Synthe("purissetommese-ji,,konnichiwa."); } } else{ pc.printf("\r\nNot Active\n"); xbee.printf("\r\nNot Active\n"); } }