[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(){
主程序();
}