python怎么制作蓝牙+红外循迹小车

发布时间:2022-01-13 10:29:38 作者:iii
来源:亿速云 阅读:195
# Python怎么制作蓝牙+红外循迹小车

## 一、项目概述

蓝牙+红外循迹小车是结合无线控制与自动巡线功能的智能机器人项目,适合作为Python物联网(IoT)和嵌入式开发的入门实践。本项目将使用:

- **Python**作为主控语言(树莓派/Raspberry Pi Pico)
- **HC-05/HC-06蓝牙模块**实现手机远程控制
- **TCRT5000红外传感器**实现黑线检测
- **L298N电机驱动模块**控制直流电机
- **PWM调速技术**实现精准运动控制

## 二、硬件准备清单

| 组件 | 型号 | 数量 | 备注 |
|------|------|------|------|
| 主控板 | Raspberry Pi 4B/Pico | 1 | 推荐使用Pico W(内置蓝牙) |
| 蓝牙模块 | HC-05/HC-06 | 1 | 若用Pico W可省略 |
| 红外传感器 | TCRT5000 | 5 | 建议呈"一"字排列 |
| 电机驱动 | L298N | 1 | 支持双电机控制 |
| 直流电机 | TT马达 | 2 | 带减速齿轮箱 |
| 车轮 | 65mm橡胶轮 | 2 | 配套TT马达使用 |
| 电池 | 18650锂电池组 | 1 | 7.4V输出 |
| 车体底盘 | 亚克力/3D打印 | 1 | 建议长15cm宽10cm |

![硬件连接示意图](https://example.com/smart_car_diagram.png)

## 三、电路连接详解

### 3.1 主控板与L298N连接
```python
# Raspberry Pi 4B引脚示例
L298N    ->  RPi GPIO
ENA      ->  GPIO18 (PWM)
IN1      ->  GPIO23
IN2      ->  GPIO24
IN3      ->  GPIO27
IN4      ->  GPIO22
ENB      ->  GPIO17 (PWM)
GND      ->  共地

3.2 红外传感器阵列连接

# TCRT5000接法(从左到右编号1-5)
Sensor1 -> GPIO5
Sensor2 -> GPIO6
Sensor3 -> GPIO13
Sensor4 -> GPIO19
Sensor5 -> GPIO26
VCC     -> 3.3V
GND     -> 共地

3.3 蓝牙模块接线

HC-05    ->  RPi
TX       ->  GPIO15 (RXD)
RX       ->  GPIO14 (TXD)
VCC      ->  5V
GND      ->  GND

四、Python核心代码实现

4.1 初始化设置

import RPi.GPIO as GPIO
import time
import serial

# 引脚定义
MOTOR_PINS = {
    'ENA': 18, 'IN1': 23, 'IN2': 24,
    'ENB': 17, 'IN3': 27, 'IN4': 22
}
IR_SENSORS = [5, 6, 13, 19, 26]

# 初始化GPIO
GPIO.setmode(GPIO.BCM)
for pin in MOTOR_PINS.values():
    GPIO.setup(pin, GPIO.OUT)
for sensor in IR_SENSORS:
    GPIO.setup(sensor, GPIO.IN)

# PWM初始化
pwm_a = GPIO.PWM(MOTOR_PINS['ENA'], 1000)
pwm_b = GPIO.PWM(MOTOR_PINS['ENB'], 1000)
pwm_a.start(0)
pwm_b.start(0)

# 蓝牙串口
bluetooth = serial.Serial("/dev/ttyS0", 9600, timeout=1)

4.2 电机控制函数

def motor_control(speed_left, speed_right, direction_left, direction_right):
    """控制双电机运动
    :param speed: 0-100 PWM占空比
    :param direction: 0停止 1正转 2反转
    """
    # 左电机控制
    if direction_left == 0:
        GPIO.output(MOTOR_PINS['IN1'], GPIO.LOW)
        GPIO.output(MOTOR_PINS['IN2'], GPIO.LOW)
    elif direction_left == 1:
        GPIO.output(MOTOR_PINS['IN1'], GPIO.HIGH)
        GPIO.output(MOTOR_PINS['IN2'], GPIO.LOW)
    else:
        GPIO.output(MOTOR_PINS['IN1'], GPIO.LOW)
        GPIO.output(MOTOR_PINS['IN2'], GPIO.HIGH)
    pwm_a.ChangeDutyCycle(speed_left)

    # 右电机同理
    ...

4.3 红外循迹算法

def line_following():
    sensor_values = [GPIO.input(s) for s in IR_SENSORS]
    
    # 传感器状态判断
    if sensor_values == [0,0,1,0,0]:  # 居中
        motor_control(60, 60, 1, 1)
    elif sensor_values[0] == 1:       # 极左偏
        motor_control(30, 80, 1, 1)
    elif sensor_values[-1] == 1:      # 极右偏
        motor_control(80, 30, 1, 1)
    # 更多状态判断...
    else:
        motor_control(0, 0, 0, 0)    # 停止

4.4 蓝牙指令处理

def bluetooth_handler():
    while True:
        cmd = bluetooth.readline().decode().strip()
        if cmd:
            print(f"Received: {cmd}")
            if cmd == 'F':  # 前进
                motor_control(70, 70, 1, 1)
            elif cmd == 'S':  # 停止
                motor_control(0, 0, 0, 0)
            # 更多指令...

五、系统整合与优化

5.1 多线程控制

import threading

def main():
    # 创建线程
    bt_thread = threading.Thread(target=bluetooth_handler)
    lf_thread = threading.Thread(target=line_following)
    
    # 启动线程
    bt_thread.daemon = True
    lf_thread.daemon = True
    bt_thread.start()
    lf_thread.start()
    
    while True:
        time.sleep(0.1)

5.2 PID算法优化

class PIDController:
    def __init__(self, Kp, Ki, Kd):
        self.Kp = Kp
        self.Ki = Ki
        self.Kd = Kd
        self.last_error = 0
        self.integral = 0
    
    def compute(self, error, dt):
        self.integral += error * dt
        derivative = (error - self.last_error) / dt
        output = self.Kp*error + self.Ki*self.integral + self.Kd*derivative
        self.last_error = error
        return output

pid = PIDController(0.5, 0.01, 0.2)

六、常见问题解决

  1. 蓝牙连接失败

    • 检查AT指令模式:按住HC-05按键上电,LED慢闪进入AT模式
    • 使用minicom测试串口通信
  2. 红外误检测

    • 调节TCRT5000上的电位器
    • 增加软件去抖:
      
      def read_sensor(pin):
       return GPIO.input(pin) if sum([GPIO.input(pin) for _ in range(5)]) >= 3 else 0
      
  3. 电机抖动

    • 确保PWM频率在1kHz以上
    • 添加滤波电容(100μF)到电机电源

七、项目扩展方向

  1. 添加OLED显示屏

    • 使用SSD1306显示实时传感器数据
  2. 接入物联网平台

    • 通过MQTT协议上传数据到Home Assistant
  3. 视觉增强

    • 配合OpenCV实现颜色识别跟踪
  4. ROS集成

    • 将小车作为ROS节点开发

八、完整代码获取

项目完整代码已开源至GitHub:

git clone https://github.com/username/smart-car-python.git

(注:实际字数约2800字,完整3950字版本需补充更多技术细节和调试日志) “`

这篇文章包含了: 1. 完整的硬件配置清单 2. 详细的电路连接说明 3. Python核心代码实现 4. 系统优化方案 5. 常见问题解决方法 6. 项目扩展方向

如需达到3950字,可以: 1. 增加每个传感器的原理说明 2. 补充PID参数调试过程 3. 添加具体的性能测试数据 4. 扩展蓝牙APP开发内容 5. 加入3D打印车体的设计文件说明

推荐阅读:
  1. 红外图像处理
  2. python3怎么实现网页版树莓派小车控制

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:Python怎么实现自动浇花系统

下一篇:python如何DIY蓝牙智能小车

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》