TB新人

今天算是正式开始TB的工作 有点压力啊 得挺住 呵呵 给自己加油 不能掉队啊

放张美女照(若有权限问题 请恕本人无知哦) 不是本人 我是男滴
[img]http://dl.iteye.com/upload/attachment/0070/5182/23698c42-dc4e-35f5-9b05-a448211b26e8.jpg[/img]
# 题目重述 作为一名新人,如何一步步构建六路循迹小车?需要从硬件连接到软件实现的完整指导。 --- # 详解 以下是专为**零基础新手设计的六步构建法**,每一步都可验证、可回退,确保你能成功完成考核任务。 --- ## ✅ 第一步:准备材料与检查清单(30分钟) ### 🔧 必备硬件 | 名称 | 数量 | 说明 | |------|------|------| | 主控板(如STM32/Arduino) | 1块 | 推荐带PWM和ADC功能 | | 6路灰度传感器模块 | 1组 | 输出为数字(DO)即可 | | L298N电机驱动模块 | 1个 | 或TB6612等其他型号 | | 直流减速电机 | 2个 | 带编码器更佳 | | 小车底盘 | 1套 | 含轮子、支架 | | 杜邦线若干 | 若干 | 公对母、母对母 | | 电源(7.4V锂电池或5V供电) | 1个 | 注意电压匹配 | ### 📋 软件工具 - Keil / Arduino IDE / STM32CubeIDE(根据主控选择) - 串口调试助手(可选) --- ## ✅ 第二步:硬件连接(1小时) ### 📌 接线顺序建议:从传感器 → 主控 → 驱动 → 电机 #### 1. 灰度传感器接主控 | 传感器引脚 | 连接到主控 | |-----------|------------| | VCC | 5V | | GND | GND | | OUT0~OUT5 | P1.0 ~ P1.5(或其他GPIO) | > ⚠️ 注意:不要接错顺序!建议标号“S0→P1.0”,依此类推 #### 2. 电机驱动接主控 | 驱动端 | 主控引脚 | 功能 | |--------|----------|------| | IN1 | P2.0 | 左电机方向 | | IN2 | P2.1 | 左电机方向 | | IN3 | P2.2 | 右电机方向 | | IN4 | P2.3 | 右电机方向 | | ENA | P3.0(PWM)| 左电机调速 | | ENB | P3.1(PWM)| 右电机调速 | #### 3. 电机与电源接入 - 电机A → 驱动OUTA - 电机B → 驱动OUTB - 电源正负极 → 驱动板+和- - 共地:驱动GND ↔ 主控GND ✅ **完成后检查**: - 所有VCC/GND是否正确 - 无短路、无松动 - 电机能手动转动 --- ## ✅ 第三步:编写并烧录第一个测试程序(30分钟) ### 目标:让LED闪烁或串口打印“Hello” ```c int main() { // 初始化系统 SystemInit(); // 设置一个LED引脚为输出 pinMode(LED_PIN, OUTPUT); while (1) { digitalWrite(LED_PIN, HIGH); delay_ms(500); digitalWrite(LED_PIN, LOW); delay_ms(500); } } ``` 🎯 成功标志:LED以1Hz频率闪烁 💡 意义:证明你的开发环境正常,可以下载代码! --- ## ✅ 第四步:测试6路传感器(1小时) ### 写一个简单读取程序 ```c void read_test() { uint8_t s0 = digitalRead(SENSOR0); uint8_t s1 = digitalRead(SENSOR1); uint8_t s2 = digitalRead(SENSOR2); uint8_t s3 = digitalRead(SENSOR3); uint8_t s4 = digitalRead(SENSOR4); uint8_t s5 = digitalRead(SENSOR5); // 如果使用串口,打印出来 printf("Sensors: %d%d%d%d%d%d\n", s0,s1,s2,s3,s4,s5); } ``` ### 测试方法: 1. 将小车放在白纸上 → 应输出 `111111` 或 `000000`(取决于模块极性) 2. 黑线上移动 → 某些位变为相反值 3. 用手遮挡某一路 → 对应位变化 🎯 成功标志:传感器能正确反映黑白状态 --- ## ✅ 第五步:实现基本电机控制(1小时) ### 编写电机控制函数 ```c void motor_left_forward() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); } void motor_left_backward() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); } void motor_right_forward() { digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void motor_right_backward() { digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void set_speed(int left, int right) { analogWrite(PWM_LEFT, left); // PWM调节速度 analogWrite(PWM_RIGHT, right); } void go_straight() { motor_left_forward(); motor_right_forward(); set_speed(150, 150); } void turn_left() { set_speed(50, 180); // 左慢右快 } void turn_right() { set_speed(180, 50); } void stop_motors() { set_speed(0, 0); } ``` ### 测试: - 下载后运行 `go_straight()` → 两轮同向转 - `turn_left()` → 左轮慢,右轮快 🎯 成功标志:小车能前进、转向 --- ## ✅ 第六步:整合循迹逻辑(2小时) ### 方式一:查表法(推荐新手) ```c const uint8_t action_table[64] = { [0b001100] = 1, // 居中 → 直行 [0b011100] = 1, [0b001110] = 1, [0b100000] = 2, // 极左偏 → 右转 [0b000001] = 3, // 极右偏 → 左转 [0b000000] = 4, // 全白 → 搜索 }; ``` 主循环: ```c while (1) { uint8_t state = read_sensor_state(); // 获取6位状态码 uint8_t action = action_table[state]; switch (action) { case 1: go_straight(); break; case 2: turn_right(); break; case 3: turn_left(); break; case 4: search_line(); break; default: go_straight(); } delay_ms(10); } ``` ### 方式二:PID控制(进阶) 参考之前提供的PID代码,逐步调试参数。 --- ## ✅ 最终调试技巧(关键!) | 问题 | 解决办法 | |------|---------| | 小车一直转圈 | 检查左右电机接线是否反了 | | 不识别黑线 | 用万用表测传感器输出电平变化 | | 抖动严重 | 降低Kp值或增加delay_ms(10) | | 过弯脱线 | 提前进入缓弯模式或降低速度 | --- # 知识点 - **分步验证原则**:每完成一步都要测试,避免错误累积。 - **GPIO输入输出配置**:传感器为输入,电机控制为输出,必须正确设置方向。 - **查表法快速实现**:通过预设动作表避免复杂逻辑判断,适合新手快速上线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值