1. 树莓派机载计算机硬件资源概述
树莓派作为一款功能强大的微型计算机,在嵌入式系统和机载计算机领域有着广泛的应用。本教程将重点介绍如何利用树莓派的硬件接口资源,包括GPIO、PWM、UART和I2C等,实现与各种外设的交互。这些接口是树莓派与物理世界交互的重要通道,掌握它们的使用方法对于开发机载计算机系统至关重要。
树莓派4B作为当前主流型号,提供了丰富的硬件资源:
- 40个GPIO引脚(部分功能复用)
- 4路硬件PWM输出
- 5组UART串口(含一组全功能串口)
- 2个I2C总线接口
- SPI、CSI/DSI等专用接口
这些硬件资源在出厂时默认并未全部启用,需要通过系统配置进行激活。与传统的单片机开发不同,树莓派上的硬件接口操作需要结合Linux系统特性,这为开发者带来了新的挑战和机遇。
2. 开发环境准备与配置
2.1 系统远程访问设置
在开始硬件开发前,建议配置好远程访问环境。树莓派支持多种远程访问方式:
- NoMachine:提供高性能的远程桌面体验,适合图形界面操作
- VNC Viewer:轻量级远程桌面解决方案
- SSH:命令行访问,适合纯代码开发
对于有显示器的情况,可以直接通过Micro HDMI接口连接。需要注意的是,当使用某些GPIO功能(如硬件PWM)时,可能需要重新启动系统才能使配置生效。
2.2 开发目录结构
示例代码通常存放在以下目录中:
~/rpi_python_opencv/ ├── 1_树莓派资源样例 ├── 2_机器视觉基础例程 └── 3_机器视觉进阶例程硬件资源示例主要位于"1_树莓派资源样例"目录下,包含:
- GPIO控制RGB灯
- 硬件PWM输出
- UART串口通信
- I2C设备操作等示例
2.3 开发工具配置
推荐使用Visual Studio Code作为开发环境,它提供了优秀的Python支持:
- 打开VSCode后,通过文件浏览器导航到项目目录
- Python扩展会自动识别已安装的第三方库并提供代码补全
- 内置终端可以直接运行Python脚本,方便调试
对于Python开发,建议创建虚拟环境以隔离项目依赖:
python3 -m venv venv source venv/bin/activate pip install -r requirements.txt3. GPIO接口应用实战
3.1 RGB灯控制原理
树莓派的GPIO引脚可以配置为输出模式,直接驱动LED等外设。本示例中使用的是共阳极RGB LED,控制逻辑为:
- 高电平:LED熄灭
- 低电平:LED点亮
RGB LED需要三个GPIO引脚分别控制红、绿、蓝三个通道。在树莓派上,我们使用BCM编号方式(而非物理引脚号)来引用GPIO。
3.2 示例代码解析
1_gpio_rgb.py的核心代码如下:
import RPi.GPIO as GPIO import time # 引脚定义 RED_PIN = 17 GREEN_PIN = 27 BLUE_PIN = 22 # 初始化设置 GPIO.setmode(GPIO.BCM) GPIO.setup(RED_PIN, GPIO.OUT) GPIO.setup(GREEN_PIN, GPIO.OUT) GPIO.setup(BLUE_PIN, GPIO.OUT) try: while True: # 红色 GPIO.output(RED_PIN, GPIO.LOW) GPIO.output(GREEN_PIN, GPIO.HIGH) GPIO.output(BLUE_PIN, GPIO.HIGH) time.sleep(1) # 绿色 GPIO.output(RED_PIN, GPIO.HIGH) GPIO.output(GREEN_PIN, GPIO.LOW) # ... 省略其余颜色代码 finally: GPIO.cleanup()3.3 实际应用技巧
- 引脚选择:避免使用系统保留的引脚(如UART的TX/RX)
- 电流限制:树莓派GPIO单引脚最大输出电流为16mA,驱动大功率LED需使用晶体管
- 消抖处理:当连接按钮时,需要软件消抖
- 安全关闭:务必在程序退出时调用GPIO.cleanup()
提示:使用GPIO时,建议在电路上串联适当电阻(通常220Ω-1kΩ)以保护树莓派和LED。
4. 硬件PWM高级应用
4.1 树莓派PWM特性
树莓派4B提供4路硬件PWM输出:
- PWM0 (GPIO12/18)
- PWM1 (GPIO13/19)
- PWM0和PWM1与UART0的TX/RX引脚复用
- 独立时钟源,精度高于软件PWM
4.2 PWM配置示例
2_hardwave_pwm.py展示了如何配置硬件PWM:
import time import subprocess # 启用PWM0和PWM1 subprocess.run(['sudo', 'sh', '-c', 'echo 1 > /sys/class/pwm/pwmchip0/export']) subprocess.run(['sudo', 'sh', '-c', 'echo 1 > /sys/class/pwm/pwmchip1/export']) # 设置频率和占空比 def set_pwm(chip, channel, freq, duty): period = int(1e9 / freq) duty_cycle = int(period * duty / 100) commands = [ f'echo {period} > /sys/class/pwm/pwmchip{chip}/pwm{channel}/period', f'echo {duty_cycle} > /sys/class/pwm/pwmchip{chip}/pwm{channel}/duty_cycle', f'echo 1 > /sys/class/pwm/pwmchip{chip}/pwm{channel}/enable' ] for cmd in commands: subprocess.run(['sudo', 'sh', '-c', cmd]) try: # 从0%到100%渐变 for duty in range(0, 101, 5): set_pwm(0, 0, 1000, duty) time.sleep(0.1) finally: # 清理 subprocess.run(['sudo', 'sh', '-c', 'echo 0 > /sys/class/pwm/pwmchip0/unexport'])4.3 PWM应用场景
- 电机控制:调节直流电机速度
- LED调光:实现平滑的亮度变化
- 音频生成:结合滤波电路产生简单音调
- 舵机控制:标准舵机使用50Hz PWM信号
注意:当需要将PWM引脚重新用作UART时,必须重启系统才能使配置生效。
5. UART串口通信详解
5.1 树莓派串口资源
树莓派4B提供5组UART:
- UART0:全功能串口(默认用于蓝牙)
- UART1:迷你UART
- UART2-UART4:额外串口
在示例中,我们使用UART4(/dev/ttyAMA2)进行通信测试。
5.2 串口配置检查
查看可用串口设备:
ls -l /dev/ttyAMA*安装串口调试工具:
sudo apt install cutecom5.3 串口通信示例
发送示例(3_uart_send.py):
import serial import time uart = serial.Serial( port='/dev/ttyAMA2', baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) try: while True: uart.write(b'Hello,World\n') time.sleep(1) finally: uart.close()收发一体示例(4_uart_receive_and_send.py):
import serial uart = serial.Serial('/dev/ttyAMA2', 115200, timeout=1) try: while True: if uart.in_waiting > 0: data = uart.read(uart.in_waiting) print(f"Received: {data.decode()}") uart.write(data) # 回传接收到的数据 finally: uart.close()5.4 串口调试技巧
- 波特率匹配:确保通信双方使用相同波特率
- 流控制:长距离通信建议启用硬件流控
- 数据格式:常见配置为8N1(8数据位,无校验,1停止位)
- 权限问题:普通用户可能需要加入dialout组才能访问串口
6. I2C总线设备操作
6.1 I2C基础配置
树莓派默认启用I2C-1总线(GPIO2/3)。检查I2C设备:
sudo i2cdetect -y 1安装I2C工具:
sudo apt install i2c-tools6.2 MPU6050加速度计操作
5_i2c_mpu6050.py展示了如何读取MPU6050数据:
import smbus import time DEVICE_ADDRESS = 0x68 bus = smbus.SMBus(1) # 唤醒MPU6050 bus.write_byte_data(DEVICE_ADDRESS, 0x6B, 0x00) def read_word(reg): high = bus.read_byte_data(DEVICE_ADDRESS, reg) low = bus.read_byte_data(DEVICE_ADDRESS, reg+1) value = (high << 8) + low return value if value < 32768 else value - 65536 try: while True: # 读取加速度计数据 accel_x = read_word(0x3B) / 16384.0 accel_y = read_word(0x3D) / 16384.0 accel_z = read_word(0x3F) / 16384.0 print(f"Accel: X={accel_x:.2f}g, Y={accel_y:.2f}g, Z={accel_z:.2f}g") time.sleep(0.1) finally: bus.close()6.3 SSD1306 OLED显示控制
树莓派驱动OLED显示屏需要安装额外库:
pip install Adafruit-SSD1306 pillow图像显示示例(6_i2c_oled_1306_image.py):
from PIL import Image import Adafruit_SSD1306 disp = Adafruit_SSD1306.SSD1306_128_64(rst=None, i2c_address=0x3C) disp.begin() disp.clear() disp.display() image = Image.open('happycat_oled_64.ppm').convert('1') disp.image(image) disp.display()文本绘制示例(7_i2c_oled_1306_draw.py):
from PIL import Image, ImageDraw, ImageFont import Adafruit_SSD1306 import subprocess disp = Adafruit_SSD1306.SSD1306_128_64(rst=None) disp.begin() # 创建空白图像 image = Image.new('1', (disp.width, disp.height)) draw = ImageDraw.Draw(image) # 绘制边框 draw.rectangle((0,0,disp.width-1,disp.height-1), outline=1) # 获取系统信息 cmd = "hostname -I | cut -d' ' -f1" IP = subprocess.check_output(cmd, shell=True).decode("utf-8") # 绘制文本 font = ImageFont.load_default() draw.text((10,10), f"IP: {IP}", font=font, fill=255) draw.text((10,30), "Raspberry Pi", font=font, fill=255) # 显示图像 disp.image(image) disp.display()6.4 I2C开发注意事项
- 设备地址:确保设备地址正确(可通过i2cdetect检测)
- 上拉电阻:I2C总线需要适当的上拉电阻(通常4.7kΩ)
- 线缆长度:I2C总线长度不宜过长(一般不超过1米)
- 多设备冲突:同一总线上设备地址不应冲突
- 速率选择:标准模式(100kHz)和快速模式(400kHz)的选择
7. 硬件资源综合应用建议
在实际机载计算机项目中,往往需要同时使用多种硬件接口。以下是一些综合应用建议:
资源分配规划:
- 提前规划各外设使用的接口,避免冲突
- 优先使用硬件PWM和硬件UART,减少CPU负载
- 为未来扩展预留部分接口
电源管理:
- 大功率外设使用独立电源
- 添加适当的滤波电容减少电源噪声
- 考虑使用电源监控芯片
系统稳定性:
- 添加看门狗定时器防止程序卡死
- 实现完善的错误处理和恢复机制
- 考虑使用RTOS或实时内核补丁提高实时性
开发调试技巧:
- 使用逻辑分析仪调试硬件接口
- 实现详细的日志记录功能
- 开发模拟器在无硬件环境下测试代码
性能优化:
- 对于高频操作,考虑使用C扩展
- 合理使用DMA传输减少CPU干预
- 优化中断处理例程
通过本教程介绍的基础接口操作,结合上述应用建议,开发者可以构建出功能强大、稳定可靠的树莓派机载计算机系统。在实际项目中,还需要根据具体需求选择合适的传感器和执行机构,并设计相应的控制算法和通信协议。