news 2026/6/13 8:02:57

从Arduino到树莓派:手把手教你玩转UART、IIC、SPI通信(附代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从Arduino到树莓派:手把手教你玩转UART、IIC、SPI通信(附代码)

从Arduino到树莓派:三大通信协议实战指南

在开源硬件领域,UART、IIC和SPI就像电子设备之间的三种"语言",让不同模块能够相互理解、协同工作。无论是Arduino Uno的简单易用,还是树莓派Pico/4B的强大性能,掌握这些通信协议都是硬件开发的必修课。本文将带您从接线到代码,亲手实现OLED显示、RFID读取和上下位机通信等实际项目,让抽象的理论变成看得见的成果。

1. UART通信:硬件界的通用语言

UART(Universal Asynchronous Receiver/Transmitter)是最基础的异步串行通信协议,几乎存在于所有微控制器中。它的魅力在于只需要两根线(TX和RX)就能建立设备间的对话。

1.1 硬件连接要点

在Arduino Uno上使用UART时,需要注意:

  • 0号(RX)和1号(TX)引脚默认用于串口通信
  • 与电脑通信时,板载USB转串口芯片会自动处理电平转换
  • 与其他3.3V设备通信时,建议使用逻辑电平转换器

树莓派Pico的UART引脚配置更为灵活:

# Pico的UART0默认引脚 UART0_TX = GP0 UART0_RX = GP1 # UART1默认引脚 UART1_TX = GP4 UART1_RX = GP5

注意:连接两个设备的UART时,切记TX要接RX,RX要接TX,这是新手最容易犯的错误。

1.2 代码实现对比

Arduino端的串口初始化非常简单:

void setup() { Serial.begin(115200); // 设置波特率为115200 } void loop() { if(Serial.available()) { String received = Serial.readString(); Serial.print("Echo: "); Serial.println(received); } }

树莓派Pico使用MicroPython的实现:

from machine import UART, Pin import time uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1)) while True: if uart.any(): data = uart.read() print("Received:", data) uart.write(b"Echo: " + data) time.sleep(0.1)

2. IIC协议:优雅的双线解决方案

IIC(Inter-Integrated Circuit)以其简洁的两线制(SDA和SCL)闻名,特别适合连接多个低速外设。以下是IIC的三大优势:

  1. 节省引脚:理论上可连接128个设备(通过7位地址)
  2. 内置冲突检测:多主机架构也不会导致总线混乱
  3. 广泛支持:从温度传感器到显示屏,各类模块都有IIC版本

2.1 OLED显示屏实战

以常见的SSD1306 OLED屏为例,接线非常简单:

OLED引脚Arduino Uno树莓派Pico
VCC3.3V3V3
GNDGNDGND
SCLA5GP1
SDAA4GP0

Arduino驱动OLED的核心代码:

#include <Wire.h> #include <Adafruit_SSD1306.h> Adafruit_SSD1306 display(128, 64, &Wire); void setup() { Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Hello Arduino!"); display.display(); }

树莓派Pico的MicroPython实现:

from machine import Pin, I2C import ssd1306 i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000) oled = ssd1306.SSD1306_I2C(128, 64, i2c) oled.text("Hello Pico!", 0, 0) oled.show()

2.2 IIC地址扫描技巧

当不确定设备地址时,可以使用扫描功能:

# 树莓派Pico扫描IIC设备 devices = i2c.scan() if len(devices) == 0: print("No I2C devices found!") else: print("I2C devices found:", [hex(x) for x in devices])

3. SPI协议:高速数据传输之王

SPI(Serial Peripheral Interface)是三大协议中速度最快的,特别适合需要高速数据传输的场景,如SD卡、显示屏和无线模块。

3.1 SPI的四线制解析

SPI使用四条主线:

  • SCK:时钟信号,由主机产生
  • MOSI:主机输出,从机输入
  • MISO:主机输入,从机输出
  • SS/CS:片选信号,每个从机单独一条

Arduino Uno的默认SPI引脚:

  • SCK - 13
  • MOSI - 11
  • MISO - 12
  • SS - 10

树莓派Pico的SPI配置:

from machine import SPI spi = SPI(0, baudrate=1000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(4))

3.2 RFID模块实战

以MFRC522 RFID模块为例,典型接线如下:

MFRC522引脚Arduino Uno树莓派Pico
SDA(SS)10GP5
SCK13GP2
MOSI11GP3
MISO12GP4
IRQ未连接未连接
GNDGNDGND
RST9GP1
3.3V3.3V3V3

Arduino读取RFID卡的代码片段:

#include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { SPI.begin(); mfrc522.PCD_Init(); Serial.begin(115200); } void loop() { if(!mfrc522.PICC_IsNewCardPresent()) return; if(!mfrc522.PICC_ReadCardSerial()) return; Serial.print("UID:"); for(byte i=0; i<mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); }

4. 协议对比与项目选择指南

三大通信协议各有特点,选择时需考虑以下因素:

特性UARTIICSPI
线数2(TX/RX)2(SDA/SCL)4(标准)
速度中等
寻址方式7/10位地址片选信号
多设备支持点对点多从机多从机
复杂度简单中等较高

项目选择建议

  • 传感器数据采集 → IIC(节省引脚)
  • 高速数据传输 → SPI(如摄像头、显示屏)
  • 设备间简单通信 → UART(调试、日志输出)
  • 长距离通信 → RS485(UART的工业级变种)

在实际项目中,我经常同时使用这三种协议。比如一个气象站可能这样配置:

  1. 使用IIC连接温湿度传感器(BME280)
  2. 通过SPI驱动无线模块(nRF24L01)
  3. 利用UART输出调试信息到电脑

调试通信问题时,逻辑分析仪是得力助手。它能直观显示时序波形,帮助定位波特率不匹配、信号干扰等问题。如果没有专业设备,也可以先用简单的串口打印调试信息。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 8:02:55

如何快速提取Wallpaper Engine资源:RePKG终极转换工具指南

如何快速提取Wallpaper Engine资源&#xff1a;RePKG终极转换工具指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经被Wallpaper Engine中精美的动态壁纸所吸引&#x…

作者头像 李华
网站建设 2026/6/13 7:59:59

Python Flask+Bootstrap 5.3实战:30分钟搭出可提交的响应式表单

1. 这不是又一篇“Hello World”式的Bootstrap入门——它是一份能让你30分钟内真正用起来的Python联动实战指南你点开这篇内容&#xff0c;大概率不是为了再看一遍“Bootstrap是Twitter开源的前端框架”这种百科式定义。我干这行十多年&#xff0c;带过上百个刚转行的新人&…

作者头像 李华
网站建设 2026/6/13 7:52:51

PYTHON+AI LLM DAY SEVENTY-FOUR

今天介绍几种python的环境.不论哪种python环境,里面都是python解释器和一系列python包或者是python库.除了前面提到的anaconda环境,还有python原生的解释器虚拟环境,这种环境就是一个解释器里面安装的各种库.但是在实际问题中,往往存在各种库之间的冲突问题,还有就是python库和…

作者头像 李华
网站建设 2026/6/13 7:46:03

大模型稀疏激活原理:MoE架构中2%参数调用的工程真相

1. 项目概述&#xff1a;参数规模与稀疏激活的真相拆解“GPT-4 Has 1.8 Trillion Parameters. It Uses 2% of Them Per Token.”——这句话过去两年在技术社区反复刷屏&#xff0c;常被当作“AI算力爆炸”的佐证&#xff0c;也常被误读为“GPT-4每次推理只调用360亿个参数”。但…

作者头像 李华
网站建设 2026/6/13 7:42:53

保姆级教程:在华为AR路由器上配置DHCPv6 PD(前缀代理)与SLAAC,实现IPv6子网自动分发

华为AR路由器IPv6自动化部署实战&#xff1a;DHCPv6 PD与SLAAC深度配置指南1. IPv6地址分配技术演进与企业级部署挑战在IPv6网络规模部署的今天&#xff0c;传统手工配置地址的方式早已无法满足现代企业网络的需求。网络工程师们面临着地址空间管理复杂化、终端设备激增以及运维…

作者头像 李华
网站建设 2026/6/13 7:31:54

【Zephyr|ESP32-S3】基础学习:BLE服务搭建与手机蓝牙控灯

【Zephyr|ESP32-S3】基础学习:BLE服务搭建与手机蓝牙控灯 哈喽,我是余火,一个普通的牛马打工人,目前正在学如何使用Zephyr RTOS。 之前已通过 UDP server 实现了局域网控灯,手机或电脑发个命令过去,WS2812 就变色。这次来试试给ESP32-S3加上 BLE(蓝牙低功耗)——手机…

作者头像 李华