单片机互通调试初步完成

This commit is contained in:
2025-05-27 16:44:45 +08:00
parent 22e1109d81
commit 6aaae06bac
22 changed files with 1678 additions and 129 deletions

View File

@@ -0,0 +1,74 @@
#include "sensor_handler.h"
void sensor_setup() {
// 超声波传感器引脚设置
pinMode(ULTRASONIC_FRONT_TRIG_PIN, OUTPUT);
pinMode(ULTRASONIC_FRONT_ECHO_PIN, INPUT);
pinMode(ULTRASONIC_SIDE_TRIG_PIN, OUTPUT);
pinMode(ULTRASONIC_SIDE_ECHO_PIN, INPUT);
Serial.println("超声波传感器引脚已初始化。");
// TCRT5000 循迹传感器引脚设置
// 如果TCRT5000模块的DOUT引脚直接给出高低电平则设为INPUT
// 如果是AOUT引脚需要用analogRead()引脚模式通常不需要显式设置但INPUT也可以
pinMode(TCRT5000_LEFT_PIN, INPUT);
pinMode(TCRT5000_RIGHT_PIN, INPUT);
Serial.println("TCRT5000循迹传感器引脚已初始化。");
}
// --- 超声波传感器函数 ---
long get_ultrasonic_distance_cm(int trig_pin, int echo_pin) {
digitalWrite(trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin, LOW);
long duration = pulseIn(echo_pin, HIGH, 30000); // 等待脉冲返回超时时间30ms (约5米)
// 声速为 340m/s 或 29.412 µs/cm (1 / (34000 / 1000000 / 2))
// (duration / 2) * 0.034 = duration * 0.017
// More precise: duration / 58.8 (for cm)
if (duration == 0) { // 超时或检测失败
return -1; // 返回-1表示无效读数或超出范围
}
return duration / 58; // Convert duration to cm
}
long get_front_obstacle_distance() {
return get_ultrasonic_distance_cm(ULTRASONIC_FRONT_TRIG_PIN, ULTRASONIC_FRONT_ECHO_PIN);
}
long get_side_spot_distance() {
return get_ultrasonic_distance_cm(ULTRASONIC_SIDE_TRIG_PIN, ULTRASONIC_SIDE_ECHO_PIN);
}
// --- TCRT5000 循迹传感器函数 ---
// 辅助函数:根据模拟值判断是否在线上
// 注意: TCRT5000输出特性可能不同白色反射强->低电压/低模拟值,黑色吸收->高电压/高模拟值
// 或者相反取决于模块设计。这里的THRESHOLD假设的是检测到黑线时读数高于阈值。
// 您需要根据实际情况校准和调整逻辑。
bool is_on_line(int sensor_pin, int threshold) {
int sensor_value = analogRead(sensor_pin);
// Serial.print("Sensor pin "); Serial.print(sensor_pin);
// Serial.print(" value: "); Serial.println(sensor_value);
return sensor_value > threshold; // 示例:高于阈值是在黑线上
// 如果您的传感器是检测到黑线时值变小,则应为: return sensor_value < threshold;
}
LineFollowValues get_line_follow_values() {
LineFollowValues values;
// 如果TCRT5000的DOUT引脚直接连接到数字引脚则使用digitalRead()
// values.left_on_line = digitalRead(TCRT5000_LEFT_PIN) == HIGH; // 假设HIGH表示在黑线上
// values.right_on_line = digitalRead(TCRT5000_RIGHT_PIN) == HIGH;
// 如果使用AOUT引脚并进行模拟比较
values.left_on_line = is_on_line(TCRT5000_LEFT_PIN, TCRT5000_THRESHOLD);
values.right_on_line = is_on_line(TCRT5000_RIGHT_PIN, TCRT5000_THRESHOLD);
// 调试输出
// Serial.print("Line Follow: Left OnLine="); Serial.print(values.left_on_line);
// Serial.print(", Right OnLine="); Serial.println(values.right_on_line);
return values;
}