智能小车程序设计概述
智能小车作为嵌入式系统与人工智能结合的典型应用,其程序设计涵盖了传感器数据采集、运动控制、路径规划等多个核心模块,本文将详细介绍一个基于Arduino平台的智能小车程序,包括硬件连接、核心功能实现、代码结构优化及调试技巧,帮助开发者快速构建自主导航与避障能力的小车系统。

硬件环境与程序架构
硬件组件选型
智能小车的程序设计需依赖特定的硬件基础,核心组件包括:
- 主控板:Arduino UNO R3(基于ATmega328P,适合初学者且资源丰富);
- 传感器模块:超声波传感器(HC-SR04,用于测距避障)、红外巡线传感器(TCRT5000,识别黑线轨迹);
- 驱动模块:L298N电机驱动板(控制直流电机正反转与转速);
- 执行机构:TT减速电机(提供动力)、舵机(SG90,用于转向控制);
- 电源模块:18650锂电池组(7.4V,配合降压模块为Arduino供电)。
程序整体架构
程序采用模块化设计,主要分为四大模块:
- 传感器数据采集模块:实时获取超声波距离与红外巡线信号;
- 运动控制模块:根据传感器数据调整电机转速与舵机角度;
- 决策逻辑模块:基于阈值判断实现避障、循线等行为;
- 通信调试模块:通过串口输出运行状态,便于调试。
核心功能代码实现
传感器数据采集
超声波传感器通过触发Trig引脚发送10μs的高电平信号,接收Echo引脚返回的高电平持续时间计算距离(单位:cm),红外巡线传感器通过检测反射光强度判断是否处于黑线上(输出低电平表示在黑线上)。
// 超声波测距函数
float getUltrasonicDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2; // 声速340m/s,时间转距离
}
// 红外巡线状态读取
bool readLineSensor() {
return digitalRead(IR_PIN) == LOW; // 返回true表示在黑线上
}
运动控制模块
L298N驱动板通过IN1、IN2控制电机正反转,EN引脚输入PWM信号调节转速,舵机通过write()函数设置角度(0-180°)。
// 电机控制函数
void motorControl(int leftSpeed, int rightSpeed) {
// 左电机控制
digitalWrite(IN1, leftSpeed > 0 ? HIGH : LOW);
digitalWrite(IN2, leftSpeed > 0 ? LOW : HIGH);
analogWrite(EN_A, abs(leftSpeed));
// 右电机控制
digitalWrite(IN3, rightSpeed > 0 ? HIGH : LOW);
digitalWrite(IN4, rightSpeed > 0 ? LOW : HIGH);
analogWrite(EN_B, abs(rightSpeed));
}
// 舵机转向控制
void steerServo(int angle) {
servo.write(constrain(angle, 0, 180)); // 限制角度范围
}
避障与循线决策逻辑
避障逻辑通过超声波检测前方障碍物距离(阈值20cm),若小于阈值则停止前进并转向;循线逻辑根据红外传感器状态调整左右轮速,实现沿黑线行驶。

void avoidObstacle() {
float distance = getUltrasonicDistance();
if (distance < 20) {
motorControl(0, 0); // 停止电机
delay(500);
steerServo(90); // 舵机回正
motorControl(-150, -150); // 后退1秒
delay(1000);
motorControl(0, 150); // 右转避障
delay(800);
} else {
motorControl(150, 150); // 正常前进
}
}
void lineFollowing() {
if (readLineSensor()) {
motorControl(120, 150); // 稍微左转修正
} else {
motorControl(150, 120); // 稍微右转修正
}
}
程序优化与调试技巧
模块化与代码复用
将重复功能封装为函数(如motorControl()、getUltrasonicDistance()),避免冗余代码,使用#define定义引脚常量,提高可读性:
#define TRIG_PIN 12 #define ECHO_PIN 11 #define EN_A 5 #define IN1 4 #define IN2 3
串口调试与日志输出
通过Serial.print()输出传感器数据与决策结果,便于定位问题:
void setup() {
Serial.begin(9600);
Serial.println("Smart Car Initialized");
}
void loop() {
float distance = getUltrasonicDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(100);
}
阈值校准与参数调整
避障距离、循线灵敏度等参数需根据实际环境调整,在光线较强的环境下,红外传感器可能需要降低阈值或增加滤波算法(如滑动平均滤波)。
扩展功能与进阶方向
蓝牙/WiFi远程控制
通过HC-05蓝牙模块或ESP8266 WiFi模块,结合手机APP实现远程遥控,需扩展串口通信协议(如定义十六进制指令控制电机启停)。
路径规划与自主导航
结合PID算法优化循线精度,或采用SLAM(同步定位与地图构建)技术实现自主导航,需集成IMU惯性测量单元与摄像头模块。

多任务调度
对于复杂功能(如同时避障与循线),可引入FreeRTOS实时操作系统,通过任务管理实现多线程并发处理。
本文分享的智能小车程序以模块化设计为核心,覆盖了从硬件连接到功能实现的完整流程,通过超声波避障与红外循线等基础功能的代码示例,开发者可快速理解智能小车的工作原理,在实际开发中,需根据硬件差异调整参数,并结合调试工具优化性能,未来可进一步融合人工智能算法,实现更高级的自主决策能力,推动智能小车在教育、服务等领域的应用。



















