Ovládání hardwaru z Raspberry Pi Je to neuvěřitelně zábavné a užitečné, jakmile zvládnete komunikační sběrnice. V každodenním používání jsou klíčovými hráči UART a I2C: jedna je tradiční asynchronní sériová sběrnice; druhá je dvouvodičová synchronní sběrnice, která umožňuje současné připojení více zařízení. Zde je jasný a přímočarý návod, jak je používat v Raspberry Pi.
Kromě vysvětlení, co jsou zač a jak je aktivovat, Uvidíte reálné konfigurace na Raspberry Pi. (sériová konzole, piny, nástroje), praktické příklady v Pythonu, detaily o Bluetooth a mini-UART v určitých modelech a diagnostická sekce Pro běžné chyby, jako je obávaná chyba vzdáleného I/O při kombinaci I2C a UART, jsme také zahrnuli přístup Windows 10/IoT s RhProxy a ACPI, pokud v této oblasti pracujete.
Co jsou UART a I2C a proč by vás to mělo zajímat?

UART (Universal Asynchronous Receiver-Transmitter) Jedná se o asynchronní sériové rozhraní, které vysílá a přijímá data bez sdílených hodin. Používá dvě vyhrazené linky: TX (doprava) y RX (příjem)Protože neexistují hodiny, musí se oba konce shodnout na stejné rychlosti, tj. přenosová rychlost (například 9600, 115200 bps). Ve srovnání s SPI nebo I2C je jednodušší na zapojení, i když je obvykle pomalejší a probíhá přímo mezi nimi.
Na druhé straně máme I2C (Inter-Integrated Circuit), synchronní sériový protokol, který pracuje pouze se dvěma vodiči: SDA (data) a SCL (hodiny). Každé zařízení na sběrnici má 7 nebo 10bitová unikátní adresaTo umožňuje připojení více senzorů, displejů nebo paměťových zařízení ke stejným linkám. Podporuje různé rychlosti (standardní 100 kHz, rychlá 400 kHz a vyšší varianty, například 3.4 Mbps) a vícenásobný master za určitých podmínek.
V praxi, UART je ideální pro konzole, GPS, Bluetooth nebo mikrokontroléry které mluví klasickým sériovým rozhraním; I2C se vyznačuje čtením více senzorů s minimálním zapojením a dobrou integrací do projektů IoT, robotika a automatizaceOba fungují na Raspberry Pi skvěle, pokud správně nakonfigurujete jejich piny a vyhnete se překrývání.
UART na Raspberry Pi: Nastavení pinů, konzole a kláves

Na Raspberry Pi, Hlavní UART je vystaven na GPIO14 (TXD) a GPIO15 (RXD) 40pinového konektoru. Ve výchozím nastavení mnoho systémové obrázky aktivovat série konzolí Tyto piny jsou velmi užitečné pro ladění bez monitoru nebo sítě. Historicky, SoC Broadcom obsahuje dva UARTy: UART0 (PL011, kompletní) y UART1 (mini-UART, zkrácený).
V modelech jako Raspberry Pi 3, „Dobrý“ UART (PL011) je vyhrazen pro Bluetooth a konzole se přesune na mini-UART. To má důsledky: mini-UART závisí na frekvenci jádra a aby byla stabilní, je obvykle nastavit core_freq=250Jinak se může stát, že se s regulátorem frekvence setkáte s kolísáním přenosové rychlosti a šílenou ztrátou znaků.
Pokud chcete pro svůj projekt použít UART místo konzole, obvyklý postup je zakázat sériovou konzoliMáte několik možností: pomocí raspi-config v Rozhraní > Sériové, zakázat sériové přihlášení (ale ponechat hardware zapnutý), nebo ručně úpravou /boot/cmdline.txt odebrat konzole=serial0,115200 y restartujte počítačS tím, GPIO piny 14/15 jsou volné pro vaši aplikaci.
Další velmi užitečnou možností je použití Adaptér USB-UARTMnoho kabelů má čtyři vodiče: červený (5V), černý (GND), bílý a zelený (TX/RX). Při typickém použití s Raspberry Pi, Nepřipojujte červený vodič. (Pi je již napájeno samostatně.) Připojte GND k GND a propojte TX s RX (TX adaptéru s RX Pi a naopak). Připojte konec USB k Pi pro komunikaci s jinou deskou nebo jiným Pi přes... /dev/ttyUSB0 o / dev / ttyACM0.
Pro otestování sériové konzole ze samotného Raspberry Pi pomocí adaptéru, Můžete použít miniterm.py nebo jiný sériový terminál: miniterm.py /dev/ttyUSB0 115200Zobrazí se vám přihlašovací výzva (uživatelské jméno) pi, Heslo malina (v klasických systémech). Pro ukončení minitermu v příkladu workshopu použijte Ctrl + AltGr + ]Pokud dáváte přednost obrazovce: obrazovka /dev/ttyUSB0 115200 a jdeš ven s Ctrl-A následuje \.
I2C na Raspberry Pi: aktivace, zapojení a základní nástroje
I2C na Raspberry Pi Je vystaven na fyzických pinech 3 a 5 konektoru (SDA1 a SCL1, které odpovídají GPIO2 a GPIO3). Prvním krokem je jeho povolení. V Raspberry OS přejděte na sudo raspi-config a v části „Pokročilé možnosti“ nebo „Možnosti rozhraní“ aktivujte I2CPrůvodce nabídne načtení modulu při spuštění.
V klasických konfiguracích byly přidány k / etc / modules čáry i2c-bcm2708 e i2c-devDnešní nedávné obrázky již zvládají překryvy, ale i2c-dev Zůstává klíčem k uživatelskému prostoru. Nainstalujte utility pomocí: sudo apt update y sudo apt install i2c-tools python-smbus (o python3-smbus (podle vaší verze).
Chcete-li ověřit, zda vše funguje, spusťte lsmod | grep i2c a uvidíte načtené moduly. Poté identifikujte sběrnici a prozkoumejte ji pomocí i2cdetect -y 1 (u velmi starých modelů to bylo -a 0Pokud jsou zařízení správně připojena a s kliky vhodné pro SDA a SCL, skenování zobrazí adresy jako například 0x48, 0x20, Etc.
Nezapomeňte, že sběrnice I2C vyžaduje pull-up rezistory v SDA a SCL (při 3.3 V na Pi) a že všechny masy se musí sjednotit (společná zem). Absence pull-up vodičů nebo dlouhé/šumné kabely mohou způsobovat občasné problémy nebo NACK, zejména při 400 kHz a výše.
Mluvíme o I2C z Pythonu (smbus/smbus2)
Pro interakci se zařízeními I2C z Pythonu můžete použít smus o smbus2V případě potřeby jej nainstalujte s pip nainstalovat smus2Základní příklad psaní a čtení na adresu 0x48 bude následující:
from smbus2 import SMBus
DEVICE_ADDRESS = 0x48 # Dirección I2C del dispositivo
bus = SMBus(1) # Bus I2C 1 en Raspberry Pi
# Escribir un byte (por ejemplo, 0x01) al dispositivo
bus.write_byte(DEVICE_ADDRESS, 0x01)
# Leer un byte del dispositivo
data = bus.read_byte(DEVICE_ADDRESS)
print(f"Dato leído: {data}")
bus.close()
Tento vzorec psát/číst Pomůže vám ověřit, zda zařízení reaguje. Pokud narazíte na Chyba vzdáleného I/O, obvykle otrok Nerozpoznává adresu nebo odeslaný záznam/transakce, nebo Linky SDA/SCL nejsou v dobrém stavu. (vývody, zapojení, uzemnění nebo napájení).
UART komunikace s Arduinem: USB nebo GPIO, volba je na vás
Pro sériovou komunikaci mezi Raspberry Pi a Arduinem je nejpřímější metodou kabel USBPřipojíte Arduino k Raspberry Pi a objeví se vám port jako je tento. / dev / ttyACM0 o /dev/ttyUSB0Je to pohodlné a vyhnete se potížím s úrovněmi a konzolí. Alternativně můžete použít GPIO piny (hardwarový UART) Pokud zakážete sériové přihlášení pomocí raspi-config a necháte HW aktivní.
Nainstalujte knihovnu pro sériové porty v Pythonu pomocí sudo apt install python3-serial a vyhledejte dostupný port pomocí ls /dev/tty*Do Arduina nahrajte jednoduchý náčrt, který odesílá text:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello from Arduino!");
delay(1000);
}
Na Raspberry Pi je k dispozici minimální čtečka s pyseriální Vypadalo by to nějak takto:
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
# Espera breve para que Arduino reinicie al abrir el puerto
time.sleep(2)
try:
while True:
if ser.in_waiting > 0:
data = ser.readline().decode('utf-8', errors='ignore').strip()
print(f"Received: {data}")
except KeyboardInterrupt:
ser.close()
Chcete-li odeslat data z Pi do Arduina, jednoduše... ser.write(b"Zdravím z Raspberry Pi!\n") a v náčrtu čteném s Serial.readStringUntil('\n')Je nezbytné, aby oba používají stejnou rychlost (baud) a je vhodné počkat několik sekund s otevíráním portu, aby se ATmega mohla restartovat a vyhnout se počátečnímu „odpadu“.
Přístup Windows 10/IoT: Uživatelská API pro GPIO, I2C, SPI a UART s RhProxy a ACPI
Pokud pracujete s Windows 10/IoT Core nebo Windows Enterprise, existuje mechanismus pro Zpřístupněte GPIO, I2C, SPI a UART uživatelskému režimu prostřednictvím ovladače s názvem RhProxyMyšlenkou je deklarovat v tabulkách ACPI (ASL/AML) prostředky SPB/GPIO, které jsou uživateli povoleny, a RhProxy je zpřístupní prostřednictvím API Windows.Devices.*. Tento přístup používají desky jako například Raspberry Pi 2/3 v tom ekosystému.
Výchozím bodem je vytvoření uzlu ACPI jako Zařízení (RHPX) s _HID/_CID «MSFT8000» a _UIDa v rámci definování zdrojů typu SPISerialBus, Sériová sběrnice I2C, Sériová sběrnice UART a GPIO povoleno uživateli. V _DSD vlastnosti jsou spojeny s např. sběrnice SPI-SPI0, SPI0-MinClockInHz, SPI0-MaxClockInHz, Délky datových bitů podporované SPI0 o sběrnice-I2C-I2C1aby API mohlo pro každou sběrnici vrátit „výchozí řadič“.
Pro I2C by příklad deskriptoru mohl vypadat takto I2CSerialBus(… «\_SB.I2C1» …), zatímco pro UART máte Sériová sběrnice UART s poli počáteční baud, parita, vyrovnávací paměti a Zdroj zdrojů regulátoru. V SPI každý CE (výběr čipu) Je deklarován jako samostatný prostředek a poté je v DSD seskupen podle sběrnice s indexy prostředků.
Silným konceptem v tomto prostředí je multiplexování pinů za běhuProstřednictvím speciálních zdrojů ACPI MsftFunctionConfig(), rámce GpioClx, SpbCx y SerCx Dávají pokyn GPIO řadiči, aby přepnul funkci pinů, když klient odemkne zařízení (např. FromIdAsync() (v UWP). Pokud piny již byly obsazeny jinou funkcí, otevření se nezdaří; při zavírání deskriptoru, se vrací multiplexování.
Z pohledu vývojáře platformy, validace Zahrnuje to kontrolu s devcon které načítají ovladače SpbCx/GpioClx/SerCx, rhproxy existuje v systému (klíč registrace služby), zkompilujte ASL do ACPITABL.dat s asl.exe (režim /MsftInternal pro MsftFunctionConfig) a aktivujte testovací podpisPak můžete zobrazit seznam uživatelských zařízení pomocí nástrojů, jako je Seznam souborů I2cTestTool.exe, Seznam souborů SpiTestTool.exe, Seznam souborů GpioTestTool.exe o Seznam souborů MinComm.exea procvičte si je pomocí vzorových cvičení na čtení/psaní. Pro certifikaci spusťte testy HLK (I2C WinRT, GPIO WinRT, SPI WinRT).
Kombinace I2C a UART bez chyb: Diagnostika vzdálených I/O a další překvapení
Typický případ: spouštíte program, který mluví skrze I2C se senzorem IMU (ITG/MPU) a další, který používá UART s řadičem (např. SSC-32) a najednou proces I2C exploduje s Chyba vzdáleného I/OTato chyba znamená, že učitel nepřijímá ACK Na sběrnici: zařízení nereaguje nebo linky nejsou ve správném stavu.
Abyste se dostali z dopravní zácpy, zkontrolujte následující: 1) Sériová konzole deaktivována Pokud používáte GPIO piny 14/15 pro vlastní UART; 2) Na Pi 3/deriváty zvažte Zakázat Bluetooth Pokud potřebujete, aby byl PL011 UART stabilní, nebo alespoň pevný. core_freq=250 pokud vytáhnete mini-UART; 3) Zkontrolujte společná zem mezi veškerým vybavením (Pi, IMU, řídicí jednotka) a čisté stravování (IMU jsou citlivé na výpadky napájení).
4) Zkontrolujte Adresování I2Cskenovat pomocí i2cdetect -y 1 a ujistěte se, že se adresa (např. 0x68/0x69 u mnoha IMU) zobrazuje. Pokud se nezobrazuje, budete možná muset použít špatný autobus, je vadný kabel nebo kliky5) Zkontrolujte rychlost autobusu (Pokud používáte 400 kHz a nastavení je na nepájivé desce s dlouhými vodiči, snižte frekvenci na 100 kHz a otestujte.) 6) Vyhněte se kolizím přístupu: ačkoli Linux umožňuje více procesů na /dev/i2c-1Pokud dvě vlákna přistupují paralelně bez koordinace, můžete způsobit zvláštní podmínky; použijte zámky nebo serializuje operace.
7) Pokud se chyba objeví právě při načítání programu UART nebo zvýšení zatížení CPU, podezření je desynchronizovaný mini-UART kvůli škálování frekvence (příznak v Pi 3). Opraveno core_freq=250 en /boot/config.txt nebo uvolní PL011 pro váš UART 8) Ověřte, že Nesdílíte piny Mimo jiné: ve Windows/IoT by otevření selhalo kvůli multiplexování; v Raspberry OS by překrytí nebo služba mohla udržovat určité GPIO piny zaneprázdněné. 9) Nakonec ověřte fyzická kabelážSDA s SDA, SCL s SCL, bez křížení a TX–RX křížené v sérii.
Rychlé testy a nástroje, které zachraňují situaci
Pro I2C je základní trojzubec: i2cdetect -y 1 zobrazit zařízení, i2cget/i2cset pro jednoduché čtení a zápisy registrů a skript smbus2 k ověření skutečného průtoku. Pokud i2cdetect Nevidí IMU, neztrácejte čas s kódem: Existuje fyzický problém nebo problém s překrytím..
Pro UART použijte miniterm.py o obrazovka jako sériový terminál a ověřte, zda můžete odesílat/přijímat zvolenou rychlostí bez jakýchkoli podivných znaků. V Pythonu, pyseriální s časový limit a krátká počáteční pauza Obvykle se tak vyhne prázdným hodnotám. A pokud pracujete s Windows IoT, devcon, ACPITABL.dat s asl.exe a příklady nástrojů I2cTestTool/SpiTestTool/GpioTestTool/MinComm Dávají vám naprostou viditelnost.
Nyní máte kompletní mapu pro práci s I2C a UART. na Raspberry OS (a také na Windows/IoT, pokud je to relevantní): od toho, co jsou a jak je aktivovat, přes jejich použití v Pythonu, ovládání konzole, funkce UART na Pi 3 a multiplexování pinů až po rozlišení Chyba 121 Když obě sběrnice zkombinujete, správně nakonfigurované a s čistým zapojením, vytvoříte z nich robustní nástroje pro jakýkoli projekt senzorů, robotiky nebo řízení.