12/16用テスト
Dependencies: ATP3012 mbed a HMC US015_2 getGPS
Diff: Function.h
- Revision:
- 0:79033ee3c961
- Child:
- 3:ec2b7587be78
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Function.h Sat Nov 06 03:09:38 2021 +0000 @@ -0,0 +1,195 @@ +#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"); + } +} \ No newline at end of file