上一篇
光感智能三轮小车程序
- 行业动态
- 2025-04-22
- 4
硬件组成与连接
组件 | 型号/规格 | 连接方式 | 功能说明 |
---|---|---|---|
主控板 | Arduino UNO | 数字引脚2/3/4连接电机驱动模块 | 核心控制单元 |
光感传感器 | BH1750FVI | 模拟引脚A0(数据)+数字引脚2(时钟) | 环境光照强度检测 |
电机驱动模块 | L298N | IN1/IN2/IN3/IN4接数字引脚5-8 | 控制三个电机正反转 |
三轮车体 | 3D打印底盘+橡胶轮 | 电机输出轴直接连接车轮 | 机械运动平台 |
电源模块 | 4V锂电池组 | 接驱动模块VIN/GND | 系统供电 |
程序逻辑框架
// 初始化阶段 void setup() { Serial.begin(9600); // 开启串口监视 BH1750.begin(); // 初始化光感传感器 pinMode(5, OUTPUT); // 左前电机控制引脚 pinMode(6, OUTPUT); pinMode(7, OUTPUT); // 右前电机控制引脚 pinMode(8, OUTPUT); pinMode(9, OUTPUT); // 后驱电机控制引脚 pinMode(10, OUTPUT); } // 主循环阶段 void loop() { int lightValue = BH1750.readLightLevel(); // 获取光照强度值(0-65535) // 动态阈值计算 int threshold = map(lightValue, 0, 65535, 300, 800); // 运动决策逻辑 if(lightValue > threshold) { moveForward(200, 200, 150); // 全速前进 } else { avoidObstacle(-150, 150, 0); // 原地右转规避 } delay(100); // 10Hz控制频率 } // 电机控制函数 void moveForward(int leftFrontSpeed, int rightFrontSpeed, int rearSpeed) { setMotor(5, leftFrontSpeed); setMotor(6, rightFrontSpeed); setMotor(9, rearSpeed); } void avoidObstacle(int leftFrontSpeed, int rightFrontSpeed, int rearSpeed) { setMotor(5, leftFrontSpeed); setMotor(6, rightFrontSpeed); setMotor(9, rearSpeed); } // 底层电机控制 void setMotor(int pin1, int pin2, int speed) { if(speed >= 0) { digitalWrite(pin1, HIGH); digitalWrite(pin2, LOW); analogWrite(pin1, map(speed, 0, 255, 0, 255)); } else { digitalWrite(pin1, LOW); digitalWrite(pin2, HIGH); analogWrite(pin2, map(-speed, 0, 255, 0, 255)); } }
关键参数说明表
参数项 | 默认值 | 调节范围 | 作用效果 |
---|---|---|---|
光照阈值基准值 | 500 | 300-800 | 控制转向灵敏度 |
电机PWM占空比 | 150 | 0-255 | 速度调节范围 |
转向修正系数 | 85 | 5-1.2 | 转弯半径调整 |
采样周期 | 100ms | 50-200ms | 环境响应速度 |
常见问题与解决方案
Q1:小车在均匀光照下频繁左右摆动
- 原因分析:环境光接近阈值导致频繁触发转向逻辑
- 解决方法:增加滞环比较机制,当光照值在[阈值-50, 阈值+50]区间时保持原运动状态
Q2:电机出现异常抖动现象
- 排查步骤:
- 检查驱动模块供电是否稳定(建议并联电容)
- 验证PWM信号频率是否匹配电机特性(建议200Hz以上)
- 检测电机接线是否牢固,霍尔元件是否正常