toshi mura
/
NRP2020_main
gjyrjyykkudt
Revision 6:cd2671c141cc, committed 2020-02-01
- Comitter:
- muratoshi
- Date:
- Sat Feb 01 06:40:55 2020 +0000
- Parent:
- 5:8a0663298e2c
- Commit message:
- kaljrgaogivrjnae:
Changed in this revision
MCP/MCP.cpp | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/MCP/MCP.cpp Sat Jan 25 06:38:16 2020 +0000 +++ b/MCP/MCP.cpp Sat Feb 01 06:40:55 2020 +0000 @@ -38,6 +38,7 @@ } void MCP::Update(void) { + i2c.frequency(100000); char data[2] = {GPPUA, 0xff}; int lost = i2c.write(0x40, data, 2); if(lost) {
--- a/main.cpp Sat Jan 25 06:38:16 2020 +0000 +++ b/main.cpp Sat Feb 01 06:40:55 2020 +0000 @@ -5,142 +5,185 @@ #include <stdint.h> #include <stdio.h> #include <math.h> -#define SDA PB_7 +#define SDA PB_7 #define SCL PB_6 #define MCP_ADDRESS 0x40 MCP MCP(SDA, SCL, MCP_ADDRESS); XBEE::ControllerData *controller; MOTOR::MotorStatus motor[MOUNTING_MOTOR_NUM]; - +Serial pc(USBTX,USBRX); /* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */ - + #define omni 0 #define mekanamuR 1 #define mekanamuL 2 - -long map(long x, long in_min, long in_max, long out_min, long out_max) { - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + +long map(long x, long in_min, long in_max, long out_min, long out_max) +{ + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } void outputMecani(double right_value, double left_value, double omni_value); // メカニ平行移動数 -void driveMecani(double power, double degree) { - //powerには、 出力の大きさを0~255で入れてください。255で最大です。 - //degreeには、進みたい角度を0~360で入れてください。0で右進です。 +void driveMecani(double power, double degree) +{ + //powerには、 出力の大きさを0~255で入れてください。255で最大です。 + //degreeには、進みたい角度を0~360で入れてください。0で右進です。 - double right_value;//右メカナムの値 - double left_value;//左メカナムの値 - double omni_value;//オムニの値 - double pa;//前後の速度 - double pb;//左右の速度 + double right_value;//右メカナムの値 + double left_value;//左メカナムの値 + double omni_value;//オムニの値 + double pa;//前後の速度 + double pb;//左右の速度 - pa = -(sin((degree)) * fabs(sin((degree))) * power); - pb = cos((degree)) * fabs(cos((degree))) * power; - right_value = -(pa + pb); - left_value = -(pa - pb); - omni_value = -pb * 0.75; - //if (left_value < 0) { - // left_value = left_value * 0.95; - // } else { - right_value = right_value * 0.95; - // } - outputMecani(right_value, left_value, omni_value); + pa = -(sin((degree)) * fabs(sin((degree))) * power); + pb = cos((degree)) * fabs(cos((degree))) * power; + right_value = -(pa + pb); + left_value = -(pa - pb); + omni_value = -pb; + //if (left_value < 0) { + // left_value = left_value * 0.95; + // } else { + left_value = left_value * 0.85; + right_value = right_value * 0.85; + // } + outputMecani(right_value, left_value, omni_value); } // メカニ旋回関数 -void turnMecani(double power, double center) { - //powerには、 出力の大きさを-255~255で入れてください。255で最大です。 - //centerには、回転の中心の位置を-255~255で入れてください。中心の位置は、値が大きいとメカナム寄り、小さいとオムニ寄りになります。 +void turnMecani(double power, double center) +{ + //powerには、 出力の大きさを-255~255で入れてください。255で最大です。 + //centerには、回転の中心の位置を-255~255で入れてください。中心の位置は、値が大きいとメカナム寄り、小さいとオムニ寄りになります。 - double right_value; //右メカナムの値 - double left_value; //左メカナムの値 - double omni_value; //オムニの値 + double right_value; //右メカナムの値 + double left_value; //左メカナムの値 + double omni_value; //オムニの値 - if (center <= 0) { - omni_value = - power * fabs(center); - right_value = power; - left_value = -power; - } else { - omni_value = -power; - right_value = power * (center); - left_value = -power * (center); - } + if (center <= 0) { + omni_value = - power * fabs(center); + right_value = power; + left_value = -power; + } else { + omni_value = -power; + right_value = power * (center); + left_value = -power * (center); + } - outputMecani(right_value, left_value, omni_value); + outputMecani(right_value, left_value, omni_value); } // メカニピン出力関数Arduino用 -void outputMecani(double right_value, double left_value, double omni_value) { +void outputMecani(double right_value, double left_value, double omni_value) +{ - if (right_value < 0) { - motor[mekanamuR].dir=BACK; - } else { - motor[mekanamuR].dir=FOR; - } + if (right_value < 0) { + motor[mekanamuR].dir=BACK; + } else { + motor[mekanamuR].dir=FOR; + } + + if (left_value < 0) { + motor[mekanamuL].dir=FOR; + } else { + motor[mekanamuL].dir=BACK; + } - if (left_value < 0) { - motor[mekanamuL].dir=FOR; - } else { - motor[mekanamuL].dir=BACK; - } + if (omni_value > 0) { + motor[omni].dir=BACK; + } else { + motor[omni].dir=FOR; + } + + double R=fabs(right_value); + double L=fabs(left_value); + double om=fabs(omni_value); + R=map(R,0,255,0,100); + L=map(L,0,255,0,100); + om=map(om,0,255,0,100); + motor[mekanamuR].pwm=R; + motor[mekanamuL].pwm=L; + motor[omni].pwm=om; - if (omni_value > 0) { - motor[omni].dir=BACK; - } else { - motor[omni].dir=FOR; - } - motor[mekanamuR].pwm=fabs(right_value); - motor[mekanamuL].pwm=fabs(left_value); - motor[omni].pwm=fabs(omni_value); - //横移動時に曲がってしまう場合は調整してください。 +//横移動時に曲がってしまう場合は調整してください。 } /* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */ -int main() { - +int main() +{ + XBEE::Controller::Initialize(); MOTOR::Motor::Initialize(); - - __enable_irq(); - + + __enable_irq(); + /* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */ - - - + + + /* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */ - + while(1) { - + controller = XBEE::Controller::GetData(); MCP.Update(); - + /* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */ - + int A=controller->AnalogL.X-7; int B=controller->AnalogL.Y-7; - float shita=atan(double(B)/double(A)); + double shita=atan(double(B)/double(A)); double power=sqrt(double(A)*double(A)+double(B)*double(B)); - power=map(power,0,9.90,0,255); - - if(A<0&&B<0){ - shita=shita+3.141592f; - }else if(A<0&&B>0){ - shita=shita+3.141592/2; + power=map(power,0,7.0,0,255); + pc.printf("\r\n"); + + if(A<0) { + if(B>0) { + shita=3.141592-atan(fabs(double(B/A))); + } else if(B<0) { + shita=-3.141592+atan(fabs(double(B/A))); + } else if(B==0) { + shita=3.141592; } - if(A==0){ - if(B>0){ - shita=3.141592; - }else if(B<0){shita=-3.141592; - }else if(B==0){shita=0; - } - } - + } + + + driveMecani(power,shita); + if(A==0&&B==0) { + motor[omni].dir=BRAKE; + motor[omni].pwm=100; + motor[mekanamuR].dir=BRAKE; + motor[mekanamuR].pwm=100; + motor[mekanamuL].dir=BRAKE; + motor[mekanamuL].pwm=100; + int turn=controller->AnalogR.X; + turn=map(turn,0,14,-255,255); + turnMecani(turn,1); + } else if(A==0&&B>0) { + motor[omni].dir=BRAKE; + motor[omni].pwm=100; + motor[mekanamuR].dir=FOR; + motor[mekanamuR].pwm=power; + motor[mekanamuL].dir=BACK; + motor[mekanamuL].pwm=power; + } else if(A==0&&B<0) { + motor[omni].dir=BRAKE; + motor[omni].pwm=100; + motor[mekanamuR].dir=BACK; + motor[mekanamuR].pwm=power; + motor[mekanamuL].dir=FOR; + motor[mekanamuL].pwm=power; + } + pc.printf("right=%lf,left=%lf,omni=%lf",motor[mekanamuR].pwm,motor[mekanamuL].pwm,motor[omni].pwm); + + + /* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */ - + MOTOR::Motor::Update(motor); } }