在树莓派3B上用Python编程完成流水灯实验
在树莓派3B上用Python编程完成流水灯实验
1. 准备工作与步骤:
步骤 1:安装Python和RPi.GPIO库
- 目的: 准备Python环境和控制GPIO的库。
- 操作:
- 确保树莓派已连接网络,更新系统:
sudo apt update && sudo apt upgrade -y
- 安装Python 3和pip:
sudo apt install python3 python3-pip
- 安装RPi.GPIO库:
sudo pip3 install RPi.GPIO
- 确保树莓派已连接网络,更新系统:
- 解释:
- RPi.GPIO是Python中常用的树莓派GPIO控制库。
pip3
是Python 3的包管理器。
步骤 2:连接LED灯
- 目的: 将LED灯正确连接到树莓派的GPIO引脚。
- 操作:
- 准备材料:树莓派3B、几个LED灯、电阻(220Ω左右)、杜邦线、面包板。
- 连接:
- 将每个LED的正极(长脚)通过一个电阻连接到树莓派的GPIO引脚(例如GPIO 17, 18, 22, 23)。
- 将每个LED的负极(短脚)连接到树莓派的GND引脚。
- 注意: 不要将LED直接连接到GPIO,必须串联电阻,防止电流过大烧毁GPIO或LED。
- 解释: GPIO引脚输出高电平时,电流从GPIO流经电阻和LED到GND,LED点亮;输出低电平时,LED熄灭。
步骤 3:编写Python脚本 - 目的: 编写控制LED依次点亮和熄灭的Python程序。
- 操作:
- 使用任何文本编辑器(如nano、vim或树莓派的文本编辑器)创建一个新文件,例如
流水灯.py
。 - 编写代码:
import RPi.GPIO as GPIO import time # 设置GPIO模式 GPIO.setmode(GPIO.BCM) # 使用BCM编号方式 # 定义LED连接的GPIO引脚 led_pins = [17, 18, 22, 23] # 根据实际连接修改 # 设置引脚为输出模式 for pin in led_pins:GPIO.setup(pin, GPIO.OUT) try:while True: # 无限循环# 依次点亮每个LEDfor pin in led_pins:GPIO.output(pin, GPIO.HIGH) # 点亮time.sleep(0.5) # 延时0.5秒GPIO.output(pin, GPIO.LOW) # 熄灭# 依次熄灭每个LED(反向)for pin in reversed(led_pins):GPIO.output(pin, GPIO.HIGH) # 点亮time.sleep(0.5) # 延时0.5秒GPIO.output(pin, GPIO.LOW) # 熄灭 except KeyboardInterrupt: # 捕获Ctrl+C,优雅退出# 清理GPIO设置GPIO.cleanup()print("程序已停止")
- 保存文件。
- 使用任何文本编辑器(如nano、vim或树莓派的文本编辑器)创建一个新文件,例如
- 解释:
GPIO.setmode(GPIO.BCM)
:设置使用树莓派芯片的引脚编号方式(BCM)。GPIO.setup(pin, GPIO.OUT)
:设置指定引脚为输出模式。GPIO.output(pin, GPIO.HIGH)
:将引脚输出高电平(3.3V),点亮LED。GPIO.output(pin, GPIO.LOW)
:将引脚输出低电平(0V),熄灭LED。time.sleep(0.5)
:程序暂停0.5秒。try...except KeyboardInterrupt...
:捕获用户按下Ctrl+C的信号,执行GPIO.cleanup()
清理GPIO设置,防止引脚状态异常。
步骤 4:运行脚本
- 目的: 执行Python脚本,观察LED效果。
- 操作:
- 打开终端(在树莓派上)。
- 导航到脚本所在目录。
- 运行脚本:
python3 流水灯.py
- 解释:
- 脚本会开始运行,LED灯会按照顺序依次点亮和熄灭,形成一个“流水”效果。
- 按下Ctrl+C可以停止脚本。
步骤 5:故障解决办法
- 问题1:运行脚本报错,提示`ImportError:没有安装RPi.GPIO库。
- 解决:
pip3 install RPi.GPIO
- 解决:
- 错误2:LED灯不亮或行为异常。
- 解决:检查GPIO引脚连接是否正确,电阻是否接入,代码中的引脚号是否与实际连接的引脚号一致,脚本是否有权限访问GPIO(可能需要
sudo python3 led_blink.py
)。
- 解决:检查GPIO引脚连接是否正确,电阻是否接入,代码中的引脚号是否与实际连接的引脚号一致,脚本是否有权限访问GPIO(可能需要