Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 5:a7c3f446a1f1, committed 2021-12-19
- Comitter:
- Tomo1213
- Date:
- Sun Dec 19 17:12:27 2021 +0000
- Parent:
- 4:e1aa0b348aeb
- Commit message:
- toriaezu modottekita
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Sun Dec 19 15:43:05 2021 +0000
+++ b/main.cpp Sun Dec 19 17:12:27 2021 +0000
@@ -1,4 +1,4 @@
-//2021/12/18更新
+//2021/12/20更新
//YUKA本番機用プログラム
//入力切替確認済み
//一定時間の入力なしで動作切替
@@ -72,6 +72,11 @@
void set_MODE_V(void);
void set_MODE_T(void);
+void vel_stop(void);
+void vel_forward(int);
+void vel_backward(int);
+
+
int nodeall=4;
int main(){
@@ -90,31 +95,17 @@
//モータ回転数
int rpm = 600;
- //各モータ回転数
- int rpm1 = rpm; //Velocity Setting[rpm]
- int rpm2 = rpm; //Velocity Setting[rpm]
- int rpm3 = rpm; //Velocity Setting[rpm]
- int rpm4 = rpm; //Velocity Setting[rpm]
-
//エンコーダ関係
int ActPos = 0;
int Init_Pos = 0;
//超音波センサ関係パラメータ
- int max_rpm = rpm + 200;
- int min_rpm = rpm -200;
- int wall_distance = 0;
- int dist1, dist2,dist3, dist4;
-
+ int dist1,dist2,dist3,dist4;
//PID制御関係
//角度調整パラメータ
- int p1, i1, d1;
- int error_before1 = 0;
- int error_now1 = 0;
- int feedback_val1;
- int integral1;
- int pid_sum1;
+
+
#define DELTA_T1 0.1
#define target_val1 0
#define Kp1 3
@@ -163,6 +154,8 @@
sendTgtTrq(3,trq);
sendTgtTrq(4,trq);
+ int state_1 = 0;
+
while(1){
ActPos = 0;
@@ -174,126 +167,93 @@
ActPos -= 0x1000000;//16進数でのマイナス処理 16^7 = 16,777,216 = 0x1000000
}
Init_Pos = ActPos;//起動時の角度を保存
- t.reset();
- t.start();
+ t.reset();
+ t.start();
+
+ set_MODE_T();
- while(1){
-
- Time = t.read();
+ while(1){
- readActPos(1);
- ActPos=canmsgRx.data[4]+canmsgRx.data[5]*256+canmsgRx.data[6]*65536;
- if(ActPos > 8388608){
- ActPos -= 0x1000000;//16進数でのマイナス処理 16^7 = 16,777,216 = 0x1000000
- //printf("check\r\n");
- }
- u1.start();
- u2.start();
-
- dist1 = u1.get_dist_cm();
- dist2 = u2.get_dist_cm();
-
- printf("dsit1 %d\r\n",dist1);
- /*--------------------------*/
- //前方向に入力があった時
- if(0){//ActPos < Init_Pos - KICK){
-
- set_ACC(ACC_B);
- set_DEC(ACC_C);
-
- //速度制御モード送信
- set_MODE_V();
-
- while(1){
-
- u1.start();
- u2.start();
- dist1 = u1.get_dist_cm();
- dist2 = u2.get_dist_cm();
-
- //速度を指定
- sendTgtVel(1,rpm*(-1));
- sendTgtVel(2,rpm*(-1));
- sendTgtVel(3,rpm);
- sendTgtVel(4,rpm);
- //指令値を送信
- for(int i=1;i<= 4;i++){
- sendCtrlEN(i);
- }
-
- if(dist1 < 100 && dist1 >= 70){
- break;
- }
- printf("dsit1 %d\r\n",dist1);
- }
+ Time = t.read();
- //速度を指定
- sendTgtVel(1,0);
- sendTgtVel(2,0);
- sendTgtVel(3,0);
- sendTgtVel(4,0);
- //指令値を送信
- for(int i=1;i<= 4;i++){
- sendCtrlEN(i);
- }
- //実行時間
- printf("stop!!\r\n");
- wait(5.0);
-
- //printf("2\r\n");
-
- //速度を指定
-
- while(1){
- readActPos(1);
- ActPos=canmsgRx.data[4]+canmsgRx.data[5]*256+canmsgRx.data[6]*65536;
- if(ActPos > 8388608){
- ActPos -= 0x1000000;//16進数でのマイナス処理 16^7 = 16,777,216 = 0x1000000
- //printf("check\r\n");
- }
-
- if(ActPos > -10000){
- break;
- }
-
- sendTgtVel(1,rpm);
- sendTgtVel(2,rpm);
- sendTgtVel(3,rpm*(-1));
- sendTgtVel(4,rpm*(-1));
- //指令値を送信
- for(int i=1;i<= 4;i++){
- sendCtrlEN(i);
- }
- //printf("3\r\n");
- }
-
- //ブレーキ
- sendTgtVel(1,0);
- sendTgtVel(2,0);
- sendTgtVel(3,0);
- sendTgtVel(4,0);
- for(int i=1;i<= 4;i++){
- sendCtrlEN(i);
- }
-
- wait(0.5);
-
- set_MODE_T();
-
- dist1 = 0;
-
+ readActPos(1);
+ ActPos=canmsgRx.data[4]+canmsgRx.data[5]*256+canmsgRx.data[6]*65536;
+ if(ActPos > 8388608){
+ ActPos -= 0x1000000;//16進数でのマイナス処理 16^7 = 16,777,216 = 0x1000000
+ //printf("check\r\n");
+ }
+ u1.start();
+ u2.start();
+
+ dist1 = u1.get_dist_cm();
+ dist2 = u2.get_dist_cm();
+
+ //printf("dsit1 %d\r\n",dist1);
+ printf("%d\r\n",state_1);
+ /*--------------------------*/
+ //前方向に入力があった時
+ if(state_1 == 0){//入力判断フェーズ
+ if(ActPos < Init_Pos - KICK){
+ state_1 = 1;
+ }else{
+
+ }
+ }else if(state_1 == 1){//前進→壁検出フェーズ
+ if(dist1 < 50 && dist1 >= 30){
+ state_1 = 2;
+ }else{
+ set_ACC(ACC_B);//加速度設定
+ set_DEC(ACC_C);//減速度設定
+ set_MODE_V();//速度制御モード送信
+ vel_forward(rpm);//前進速度指令
+ }
+ }else if(state_1 == 2){//帰還フェーズ
+ if(ActPos > -10000){
+ vel_stop();
wait(3.0);
break;
+ }else{
+ vel_backward(rpm);
}
+ }
+ }
+ }
+}
+
+void vel_stop(){
+ //速度を指定
+ sendTgtVel(1,0);
+ sendTgtVel(2,0);
+ sendTgtVel(3,0);
+ sendTgtVel(4,0);
+ //指令値を送信
+ for(int i=1;i<= 4;i++){
+ sendCtrlEN(i);
+ }
+}
- /*--------------------------*/
-
- /*--------------------------*/
- //右方向に入力があった時
-
- }
- wait(0.5);
- }
+void vel_backward(int rpm){
+ //速度を指定
+ sendTgtVel(1,rpm);
+ sendTgtVel(2,rpm);
+ sendTgtVel(3,rpm*(-1));
+ sendTgtVel(4,rpm*(-1));
+ //指令値を送信
+ for(int i=1;i<= 4;i++){
+ sendCtrlEN(i);
+ }
+}
+
+void vel_forward(int rpm){
+ //速度を指定
+ sendTgtVel(1,rpm*(-1));
+ sendTgtVel(2,rpm*(-1));
+ sendTgtVel(3,rpm);
+ sendTgtVel(4,rpm);
+ //指令値を送信
+ for(int i=1;i<= 4;i++){
+ sendCtrlEN(i);
+ }
}
void set_ACC(int setACC_val){
@@ -623,6 +583,4 @@
void SerialRX(void){
Serialdata = pc.getc();
//pc.printf("%c\r\n",Serialdata);
-}
-
-
\ No newline at end of file
+}
\ No newline at end of file