とりあえず 簡単に
Dependencies: CruizCore_R1370P EC_speedcontrol_1010 enc_1multi mbed
Diff: main.cpp
- Revision:
- 0:b811f40948e2
- Child:
- 1:2189d6238ac7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Oct 06 02:30:36 2018 +0000 @@ -0,0 +1,104 @@ +#include "mbed.h" +#include "SpeedController.h" +#include "EC.h" +#include "R1370P.h" +#include "enc_1multi.h" +#include "math.h" +#define BASIC_SPEED 24 //モーターはこの角速度で駆動させる +#define PI 3.141592 + + +SpeedControl Motor_RF(NC,NC,NC,500,0.05,NC,NC); +SpeedControl Motor_LF(NC,NC,NC,500,0.05,NC,NC); +SpeedControl Motor_LB(NC,NC,NC,500,0.05,NC,NC); +SpeedControl Motor_RB(NC,NC,NC,500,0.05,NC,NC);//モーター定義 + +Ec EC1(NC,NC,NC,300,0.05); +Ec EC2(NC,NC,NC,300,0.05);//エンコーダ定義 + +Ticker motor_tick; //角速度計算用ticker +Ticker ticker;//for enc + +Serial pc(USBTX, USBRX); // tx, rx //PC USB +R1370P gyro(PC_6,PC_7); + +void calOmega() //角速度計算関数 +{ + Motor_RF.CalOmega(); + Motor_LF.CalOmega(); + Motor_LB.CalOmega(); + Motor_RB.CalOmega(); + EC1.CalOmega(); + EC2.CalOmega(); +} +double new_dist1=0,new_dist2=0; +double old_dist1=0,old_dist2=0; +double d_dist1=0,d_dist2=0;//座標計算用関数 +double now_x;//現在地X座標 +double now_y;//現在地Y座標 +double now_angle; //現在角度 + +double start_x=0; +double start_y=0; + +double target_RF=0,target_LF=0,target_LB=0,target_RB=0;//目標速度 +Timer t; +int i=0;//い つ も の + + + +void idou(double iRF,double iLF,double iLB,double iRB)//各モーターの動作明瞭化 +{ + target_RF=BASIC_SPEED*iRF; + target_LF=BASIC_SPEED*iLF; + target_LB=BASIC_SPEED*iLB; + target_RB=BASIC_SPEED*iRB; +} + + +int main() +{ + gyro.initialize(); //main関数の最初に一度だけ実行 + gyro.acc_offset(); //やってもやらなくてもいい + printf("start\r\n"); + + motor_tick.attach(&calOmega,0.05); + Motor_RF.setDOconstant(30); + Motor_LF.setDOconstant(30);//c + Motor_LB.setDOconstant(30); + Motor_RB.setDOconstant(30);//c + + Motor_RF.setPDparam(0,0); + Motor_LF.setPDparam(0,0);//pd + Motor_LB.setPDparam(0,0); + Motor_RB.setPDparam(0,0);//pd + + + EC1.setDiameter_mm(48); + EC2.setDiameter_mm(48);//測定輪半径 + double getDistance_mm(); + + void reset(); + EC1.reset(); + + now_x=start_x; + now_y=start_y; + while(1) { + now_angle=gyro.getAngle(); + + new_dist1=EC1.getDistance_mm(); + new_dist2=EC2.getDistance_mm(); + d_dist1=new_dist1-old_dist1; + d_dist2=new_dist2-old_dist2; + old_dist1=new_dist1; + old_dist2=new_dist2;//微小時間当たりのエンコーダ読み込み + + + double d_x=d_dist2*sin(now_angle*3.1415926535/180)-d_dist1*sin(now_angle*3.1415926535/180); + double d_y=d_dist2*sin(now_angle*3.1415926535/180)+d_dist1*cos(now_angle*3.1415926535/180);//微小時間毎の座標変化 + + + now_x=now_x+d_x; + now_y=now_y+d_y;//微小時間毎に座標に加算 + } +}