查看: 232|回复: 4

[C/C++] NOC “智慧社区”满分源码分享

[复制链接]

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7674
人气
176
分享
52

最佳新人活跃会员

发表于 2024-7-14 20:53:52 | 显示全部楼层 |阅读模式
如题,最近被我们老师拉去参加NOC比赛了,老师给了我们一个“满分”源码(指随机赛道无法运行,需要我们重头编写

在这个逻辑框架的基础上,我和队友重新编写了业务逻辑,然后真拿满分了(doge)
把源码分享给大家(老师强制中文编程qwq)
[C++] 纯文本查看 复制代码
#include "TAI_finder_X1.h"

volatile int32_t left_coder_count;
volatile int32_t right_coder_count;
volatile boolean left_motion_state = false;
volatile boolean right_motion_state = false;
volatile boolean left_dir_state;
volatile boolean right_dir_state;
TAI_finder_X1 TAI_finder_X1;

volatile int 车位;
volatile int 灰度前进速度;
volatile int 巡线速度;
volatile int 速度;
volatile int 灰度阈值;
volatile int 视觉巡线速度;
volatile int 灰度巡线速度;
volatile int 停车距离;
volatile int 社区状态;

void 灰度巡线impl() {
  if (TAI_finder_X1.get_I2C_Gray(1) >= 灰度阈值) {
    灰度小幅度左调();

  } else if (TAI_finder_X1.get_I2C_Gray(2) >= 灰度阈值) {
    灰度小幅度右调();
  } else if (TAI_finder_X1.get_I2C_Gray(0) >= 灰度阈值) {
    灰度左转();
  } else if (TAI_finder_X1.get_I2C_Gray(3) >= 灰度阈值) {
    灰度右转();
  } else {
    直行();

  }
}

// 注意:只能在车头朝右的情况下使用
void 开始位置到巡线() {
  TAI_finder_X1.motion(3, 30, 速度, 1);
}

void 泊车到取卡() {
  TAI_finder_X1.show_all_led(0, 255, 0);
  灰度巡线(165 - 停车距离);
}

void 学校() {
  灰度巡线(60);
  灰度巡线速度 = 75;
  灰度前进速度 = 75;
  灰度巡线(170);
}

void 灰度左转() {
  TAI_finder_X1.set_pwm(1, (灰度前进速度 * -1));
  TAI_finder_X1.set_pwm(2, (灰度前进速度 * -1));
  TAI_finder_X1.set_pwm(3, 灰度前进速度);
  TAI_finder_X1.set_pwm(4, 灰度前进速度);
}

void 巡线到取卡() {
  灰度巡线(175);
}

void 取卡到除障碍() {
  TAI_finder_X1.turn_motion(1, 2, 速度, 1);
  while (TAI_finder_X1.get_front_sonar_dis_cm() > 8) {
    灰度巡线(1);
  }
  TAI_finder_X1.show_all_led(255, 255, 255);
}

void 取卡() {
  TAI_finder_X1.turn_motion(1, 90, 速度, 1);
  TAI_finder_X1.motion(1, 27, 速度, 1);
  delay(500);
  TAI_finder_X1.motion(4, 27, 速度, 1);
  TAI_finder_X1.turn_motion(2, 90, 速度, 1);
}

void 灰度右转() {
  TAI_finder_X1.set_pwm(1, 灰度前进速度);
  TAI_finder_X1.set_pwm(2, 灰度前进速度);
  TAI_finder_X1.set_pwm(3, (灰度前进速度 * -1));
  TAI_finder_X1.set_pwm(4, (灰度前进速度 * -1));
}

void 灰度巡线(int 距离) {
  TAI_finder_X1.clear_coder_count();
  while (TAI_finder_X1.get_distance_cm() <= 距离) {
    灰度巡线impl();
  }
  刹车();
}

void 除障碍() {
  TAI_finder_X1.motion(2, 12, 速度, 1);
  TAI_finder_X1.motion(1, 23.5, 速度, 1);
  TAI_finder_X1.motion(3, 24, 速度, 1);
  TAI_finder_X1.motion(2, 12, 速度, 1);
  // 到达社区
  TAI_finder_X1.turn_motion(1, 89, 速度, 1);
}

void 取卡到泊车() {
  灰度巡线(80);
}

void 刹车() {
  TAI_finder_X1.set_pwm(1, (-255));
  TAI_finder_X1.set_pwm(2, (-255));
  TAI_finder_X1.set_pwm(3, (-255));
  TAI_finder_X1.set_pwm(4, (-255));
  delay(10);
  停车();
}

void 灰度小幅度左调() {
  TAI_finder_X1.set_pwm(1, (灰度巡线速度 / 2));
  TAI_finder_X1.set_pwm(2, (灰度巡线速度 / 2));
  TAI_finder_X1.set_pwm(3, 灰度巡线速度);
  TAI_finder_X1.set_pwm(4, 灰度巡线速度);
}

void 泊车() {
  // 车位=1:第一个
  // 以此类推
  if (车位 == 1) {
    TAI_finder_X1.show_all_led(255, 0, 0);
    停车距离 = 3;
    灰度巡线(停车距离);
    TAI_finder_X1.turn_motion(2, 89, 速度, 1);
    TAI_finder_X1.motion(4, 35, 速度, 1);
    delay(3000);
    TAI_finder_X1.motion(1, 34, 速度, 1);
    TAI_finder_X1.turn_motion(1, 89, 速度, 1);

  } else if (车位 == 2) {
    TAI_finder_X1.show_all_led(0, 255, 0);
    停车距离 = 27;
    灰度巡线(停车距离);
    TAI_finder_X1.turn_motion(2, 89, 速度, 1);
    TAI_finder_X1.motion(4, 35, 速度, 1);
    delay(3000);
    TAI_finder_X1.motion(1, 34, 速度, 1);
    TAI_finder_X1.turn_motion(1, 89, 速度, 1);
  } else if (车位 == 3) {
    TAI_finder_X1.show_all_led(0, 0, 255);
    停车距离 = 58;
    灰度巡线(停车距离);
    TAI_finder_X1.motion(2, 35, 速度, 1);
    delay(3000);
    TAI_finder_X1.motion(3, 34, 速度, 1);
  } else {
    TAI_finder_X1.show_all_led(255, 255, 255);
    停车距离 = 92;
    灰度巡线(停车距离);
    TAI_finder_X1.motion(2, 35, 速度, 1);
    delay(3000);
    TAI_finder_X1.motion(3, 34, 速度, 1);

  }
  TAI_finder_X1.show_all_led(0, 0, 0);
}

void 灰度小幅度右调() {
  TAI_finder_X1.set_pwm(1, 灰度巡线速度);
  TAI_finder_X1.set_pwm(2, 灰度巡线速度);
  TAI_finder_X1.set_pwm(3, (灰度巡线速度 / 2));
  TAI_finder_X1.set_pwm(4, (灰度巡线速度 / 2));
}

void 停车() {
  TAI_finder_X1.set_pwm(1, 0);
  TAI_finder_X1.set_pwm(2, 0);
  TAI_finder_X1.set_pwm(3, 0);
  TAI_finder_X1.set_pwm(4, 0);
}

void 社区() {
  if (社区状态 == 0) {
    TAI_finder_X1.show_all_led(100, 100, 0);
    TAI_finder_X1.motion(3, 20, 速度, 1);
    while(!(TAI_finder_X1.get_front_sonar_dis_cm() <= 10)) {
      TAI_finder_X1.func1(1 ,速度);
    }
    TAI_finder_X1.func2(1);
    TAI_finder_X1.motion(2, 35, 速度, 1);
    while(!(TAI_finder_X1.get_front_sonar_dis_cm() <= 10)) {
      TAI_finder_X1.func1(1 ,速度);
    }
    TAI_finder_X1.func2(1);
    TAI_finder_X1.motion(3, 40, 速度, 1);
    while(!(TAI_finder_X1.get_front_sonar_dis_cm() <= 10)) {
      TAI_finder_X1.func1(1 ,速度);
    }
    TAI_finder_X1.func2(1);
    TAI_finder_X1.motion(2, 25, 速度, 1);

  } else {
    TAI_finder_X1.show_all_led(0, 100, 100);
    TAI_finder_X1.motion(2, 20, 速度, 1);
    while(!(TAI_finder_X1.get_front_sonar_dis_cm() <= 10)) {
      TAI_finder_X1.func1(1 ,速度);
    }
    TAI_finder_X1.func2(1);
    TAI_finder_X1.motion(3, 35, 速度, 1);
    while(!(TAI_finder_X1.get_front_sonar_dis_cm() <= 10)) {
      TAI_finder_X1.func1(1 ,速度);
    }
    TAI_finder_X1.func2(1);
    TAI_finder_X1.motion(2, 40, 速度, 1);
    while(!(TAI_finder_X1.get_front_sonar_dis_cm() <= 10)) {
      TAI_finder_X1.func1(1 ,速度);
    }
    TAI_finder_X1.func2(1);
    TAI_finder_X1.motion(3, 25, 速度, 1);

  }
  TAI_finder_X1.show_all_led(0, 0, 0);
}

void 直行() {
  TAI_finder_X1.set_pwm(1, 灰度巡线速度);
  TAI_finder_X1.set_pwm(3, 灰度巡线速度);
  TAI_finder_X1.set_pwm(2, 灰度巡线速度);
  TAI_finder_X1.set_pwm(4, 灰度巡线速度);
}

void 初始化状态() {
  while (1) {
    TAI_finder_X1.show_all_led(0, 0, 0);
    if (TAI_finder_X1.get_self_lock_state()) {
      break;

    }
    if (digitalRead(5) == 0) {
      TAI_finder_X1.show_all_led(255, 0, 0);
      车位 = 车位 + 1;
      delay(1000);

    }
    // 社区是往左走还是往右走
    if (digitalRead(6) == 1) {
      TAI_finder_X1.show_all_led(0, 0, 255);
      社区状态 = 1;

    }
  }
}

void 主程序() {
  初始化状态();
  开始位置到巡线();
  巡线到取卡();
  取卡();
  取卡到泊车();
  泊车();
  泊车到取卡();
  取卡();
  取卡到除障碍();
  除障碍();
  社区();
  社区到学校();
  学校();
  while(true);
}

void 社区到学校() {
  TAI_finder_X1.motion(1, 35, 速度, 1);
  TAI_finder_X1.turn_motion(2, 90, 速度, 1);
}

void setup(){
  TAI_finder_X1.init();
  车位 = 1;
  灰度前进速度 = 255;
  巡线速度 = 100;
  速度 = 255;
  灰度阈值 = 150;
  视觉巡线速度 = 150;
  灰度巡线速度 = 255;
  停车距离 = 0;
  社区状态 = 0;
  pinMode(5, INPUT);
  pinMode(6, INPUT);
}

void loop(){
  主程序();

}

BTW,其实着玩意是有图形化的,但是老师不让用

评分

参与人数 1人气 +3 收起 理由
Andy + 3 赞一个!

查看全部评分

小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2024-7-15 23:47:42 | 显示全部楼层
什么C++中文编程
Just do it.

0

技术

7

魅力

1

原创

退休版主

心如止水,笑对人生!

Rank: 8Rank: 8

积分
11198
人气
125
分享
525

最佳新人活跃会员

发表于 2024-7-16 12:26:34 | 显示全部楼层

离谱
faryou的个人主页
一名在学业与生活夹缝中生存的小站长

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7674
人气
176
分享
52

最佳新人活跃会员

 楼主| 发表于 2024-7-16 13:03:05 | 显示全部楼层

xswl我们老师说除了框架给的源码,其他全部中文(上次用英语老师说看不懂)
小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7674
人气
176
分享
52

最佳新人活跃会员

 楼主| 发表于 2024-7-16 13:03:47 | 显示全部楼层

确实很离谱
小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表