Controlar maquinari des d'una Raspberry Pi és molt entretingut i útil quan domines els seus busos de comunicacions. En el dia a dia, els reis del mambo són UART i I2C: un és sèrie asÃncron de tota la vida; l'altre, un bus sÃncron de dos fils que permet penjar diversos dispositius alhora. Aquà tens una guia per manejar-los a RaspberryOS de forma clara i sense embuts.
A més d'explicar què són i com activar-los, veuràs configuracions reals a Raspberry Pi (consola sèrie, pins, eines), exemples prà ctics a Python, detalls fins sobre Bluetooth i mini-UART en certs models, i una secció de diagnòstic per a errors habituals com el temut Remot I/O error en barrejar I2C i UART. També incloem lenfocament de Windows 10/IoT amb RhProxy i ACPI, per si et mous en aquest món.
Què són UART i I2C i per què t'interessen

UART (Receptor-Transmissor AsÃncron Universal) és una interfÃcie sèrie asÃncrona que transmet i rep dades sense rellotge compartit. Fes servir dues lÃnies dedicades: TX (enviament) y RX (recepció). Com que no hi ha rellotge, tots dos extrems han d'acordar la mateixa velocitat, és a dir, el velocitat de transmissió (per exemple 9600, 115200 bps). Davant SPI o I2C, és més simple de cablejar, encara que sol ser més lent i punt a punt.
A l'altra banda tenim I2C (Inter-Integrated Circuit), un protocol sèrie sÃncron que funciona amb només dos fils: SDA (dades) i SCL (rellotge). Cada dispositiu del bus té adreça única de 7 o 10 bits, el que permet penjar diversos sensors, pantalles o memòries sobre les mateixes lÃnies. Suporta diferents velocitats (100 kHz està ndard, 400 kHz rà pid, i variants superiors com 3.4 Mbps) i multimestre sota certes condicions.
A la prà ctica, UART és ideal per a consoles, GPS, Bluetooth o microcontroladors que parlin sèrie clà ssica; I2C brilla per llegir diversos sensors amb poc cablejat i bona integració en projectes de IoT, robòtica i automatització. Totes dues conviuen de meravella a Raspberry Pi, sempre que configuris bé els seus pins i evitis solapaments.
UART a Raspberry Pi: pins, consola i configuracions clau

A la Raspberry Pi, la UART principal s'exposa a GPIO14 (TXD) i GPIO15 (RXD) del connector de 40 pins. Per defecte, moltes imatges de sistema activen la consola sèrie sobre aquests pins, molt útil per depurar sense monitor ni xarxa. Històricament el SoC Broadcom inclou dos UART: UART0 (PL011, completa) y UART1 (mini-UART, retallada).
En models com Raspberry Pi 3, la UART «bona» (PL011) es reserva per a Bluetooth i la consola es mou a la mini-UART. Això té conseqüències: la mini-UART depèn de la freqüència del core, i perquè sigui estable se sol fixar core_freq=250. Si no, pots patir variacions de baud amb el governor de freqüència i perdre carà cters a la bogeria.
Si vols fer servir UART per al teu projecte en lloc de la consola, l'habitual és deshabilitar la consola sèrie. Tens diverses opcions: mitjançant raspi-config a Interfaces > Serial, desactivar el login per sèrie (però mantenir el maquinari activat), o de forma manual editant /boot/cmdline.txt per eliminar consola=serial0,115200 y reiniciar. Amb això, els pins GPIO14/15 queden lliures per a la teva aplicació.
Una altra opció molt socorreguda és emprar un adaptador USB-UART. Molts cables porten quatre fils: vermell (5 V), negre (GND), blanc i verd (TX/RX). En ús tÃpic amb la Raspberry Pi, no connectis el vermell (la Pi ja s'alimenta sola), enllaça GND amb GND, i creua TX amb RX (el TX de l'adaptador cap a RX de la Pi i viceversa). Connecta l'extrem USB a la Pi per parlar amb una altra placa o amb una altra Pi a través de /dev/ttyUSB0 o / Dev / ttyACM0.
Per provar la consola en sèrie des de la pròpia Raspberry Pi amb l'adaptador, pots fer servir miniterm.py o una altra terminal sèrie: miniterm.py /dev/ttyUSB0 115200. Veureu el prompt de login (usuari pi, contrasenya gerds sistemes clà ssics). Per sortir de miniterm a l'exemple del taller, utilitza Ctrl + AltGr + ]. Si prefereixes screen: screen /dev/ttyUSB0 115200 i sals amb Ctrl-A seguit de \.
I2C a Raspberry Pi: habilitar, cablejar i eines imprescindibles
I2C a Raspberry Pi està exposat als pins fÃsics 3 i 5 de l'encapçalament (SDA1 i SCL1, que corresponen a GPIO2 i GPIO3). El primer és habilitar-ho. A RaspberryOS entra a suo raspi-config i, a Advanced Options o Interface Options, activa I2C. L'assistent us ofereix carregar el mòdul a l'arrencada.
En configuracions clà ssiques s'afegien a / Etc / modules les lÃnies i2c-bcm2708 e i2c-dev; avui dia les imatges recents ja gestionen els overlays, però i2c-dev segueix sent clau per a lespai dusuari. Instal·la les utilitats amb: sudo apt update y sudo apt install i2c-tools python-smbus (o python3-smbus segons la teva versió).
Per comprovar que està tot en marxa, executa lsmod | grep i2c i veuràs els mòduls carregats. Després, identifica el bus i explora'l amb i2cdetect -i 1 (en models molt antics, era -i 0). Si hi ha dispositius correctament connectats i amb flexions adequats a SDA i SCL, l'escaneig mostrarà adreces com 0x48, 0x20, Etc
Recorda que el bus I2C requereix resistències pull-up a SDA i SCL (a 3.3 V a la Pi) i que totes les masses han d'estar unides (GND comú). L'absència de pull-ups o un cablejat llarg/sorollós pot donar problemes intermitents o NACK, sobretot a 400 kHz i superiors.
Parlar I2C des de Python (smbus/smbus2)
Per interactuar amb dispositius a I2C des de Python, pots utilitzar smbus o smbus2. Instal·la-ho si cal amb pip install smbus2. Un exemple bà sic d'escriptura i lectura a la direcció 0x48 seria el següent:
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()
Aquest patró de write/read et serveix per validar que el dispositiu respon. Si et topes amb un Remot I/O error, normalment l'esclau no està reconeixent la direcció o el registre/operació enviada, o bé les lÃnies SDA/SCL no estan en bon estat (pull-ups, cablatge, GND o alimentació).
Comunicació UART amb Arduino: USB o GPIO, tu tries
Perquè Raspberry Pi i Arduino parlin per sèrie, el més directe és el cable USB: connectes l'Arduino a la Pi, i apareixerà un port de l'estil / Dev / ttyACM0 o /dev/ttyUSB0. És còmode i evita embolics de nivells i consola. Alternativament, pots fer servir els pins GPIO (UART hardware) si deshabilites el login per sèrie amb raspi-config i deixes actiu el HW.
Instal·la la llibreria de Python per a sèrie amb sudo apt install python3-serial i localitza el port disponible amb ls /dev/tty*. A Arduino puja un esbós simple que enviï text:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello from Arduino!");
delay(1000);
}
A la Raspberry Pi, un lector mÃnim amb pisèrial quedaria tal que aixÃ:
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()
Per enviar des de la Pi cap a Arduino, només cal ser.write(b»Hola des de Raspberry Pi!\n») i al sketch llegir amb Serial.readStringUntil('\n'). És vital que tots dos usin la mateixa velocitat (baud), i convé esperar un parell de segons en obrir el port perquè l'ATmega reiniciï i evitis «escombraries» inicials.
L'enfocament Windows 10/IoT: API d'usuari per a GPIO, I2C, SPI i UART amb RhProxy i ACPI
Si treballes amb Windows 10/IoT Core o Windows Enterprise, hi ha un mecanisme per exposar GPIO, I2C, SPI i UART al mode usuari mitjançant un controlador anomenat RhProxy. La idea és declarar, a les taules ACPI (ASL/AML), els recursos SPB/GPIO que es permeten a l'usuari, i RhProxy els fa accessibles a través de les API de Windows.Devices.*. Aquesta aproximació és la que usen plaques com Raspberry Pi 2/3 en aquest ecosistema.
El punt de partida és crear un node ACPI com Device(RHPX) amb _HID/_CID «MSFT8000» i un _UID, i dins definir recursos de tipus SPISerialBus, I2CSerialBus, UARTSerialBus i als GPIO permesos a lusuari. Al _DSD s'associen propietats com bus-SPI-SPI0, SPI0-MinClockInHz, SPI0-MaxClockInHz, SPI0-SupportedDataBitLengths o bus-I2C-I2C1, de manera que l'API pugui tornar un controlador per defecte per a cada bus.
Per a I2C, un exemple de descriptor seria una cosa com I2CSerialBus(… «\_SB.I2C1» …), mentre que per a UART tens UARTSerialBus amb camps de baud inicial, paritat, bufets i ResourceSource del controlador. A SPI, cada CE (xip select) es declara com a recurs separat i després s'agrupen per bus al DSD amb Ãndexs de recurs.
Un concepte potent en aquest entorn és la multiplexació de pins en temps d'execució. A través de recursos ACPI especials MsftFunctionConfig(), els frameworks GpioClx, SpbCx y SerCx demanen al controlador GPIO que commuti la funció dels pins quan un client obre el dispositiu (p. ex., FromIdAsync() a UWP). Si els pins ja els tenia una altra funció, l'obertura falla; en tancar el descriptor, es reverteix la multiplexació.
Del costat del desenvolupador de plataforma, la validació passa per comprovar amb devcon que els drivers SpbCx/GpioClx/SerCx carreguen, que rhproxy existeix al sistema (clau de registre de servei), compilar l'ASL a ACPITABL.dat amb asl.exe (mode /MsftInternal per a MsftFunctionConfig) i activar testsigning. Després, podeu llistar dispositius d'usuari amb eines com I2cTestTool.exe -list, SpiTestTool.exe -list, GpioTestTool.exe -list o MinComm.exe -list, i exercitar-los amb lectures/escriptures d'exemple. Per a certificació, executa les proves de HLK (I2C WinRT, GPIO WinRT, SPI WinRT).
Barrejar I2C i UART sense errors: diagnòstic del Remot I/O i altres ensurts
Un cas tÃpic: executes un programa que parla per I2C amb un sensor IMU (ITG/MPU) i un altre que utilitza UART amb una controladora (p. ex., SSC-32), i de sobte el procés d'I2C rebenta amb Remot I/O error. Aquest error indica que el mestre no rep ACK al bus: el dispositiu no contesta o les lÃnies no estan en estat correcte.
Per sortir de l'embús, revisa el següent: 1) Consola sèrie desactivada si uses els pins GPIO14/15 per al teu propi UART; 2) A Pi 3/derivades, considera deshabilitar Bluetooth si necessites la UART PL011 estable, o almenys fixa core_freq=250 si tires de mini-UART; 3) Verifica GND comú entre tots els equips (Pi, IMU, controladora), i una alimentació neta (les IMU són sensibles a bajones).
4) Comprova el adreçament I2C: escaneja amb i2cdetect -i 1 i assegura't que la direcció (p. ex., 0x68/0x69 a moltes IMU) apareix. Si no surt, pot ser que facis servir el bus incorrecte, hi hagi un cable malament, o faltin les flexions. 5) Revisa la velocitat del bus (si vas a 400 kHz i el muntatge és de protoboard amb cables llargs, baixa a 100 kHz i prova). 6) Evita col·lisions d'accés: encara que Linux permet múltiples processos sobre /dev/i2c-1, si dos fils accedeixen en paral·lel sense coordinar-se pots provocar condicions estranyes; utilitza bloquejos o serialitza operacions.
7) Si l'error apareix just quan el programa UART carrega o eleva cà rrega de CPU, sospita de la mini-UART desincronitzada per l'escalat de freqüència (sÃmptoma a Pi 3). Fixa core_freq=250 en /boot/config.txt o allibera la PL011 pel teu UART desactivant Bluetooth. 8) Verifica que no comparteixes pins entre funcions: a Windows/IoT l'obertura fallaria per la multiplexació; a RaspberryOS, un overlay o servei podria estar mantenint ocupats certs GPIO. 9) Finalment, valida el cablejat fÃsic: SDA amb SDA, SCL amb SCL, sense creuar, i TX-RX creuats en sèrie.
Proves rà pides i utilitats que et salven el dia
Per a I2C, el trident bà sic és: i2cdetect -i 1 per veure dispositius, i2cget/i2cset per a lectures i escriptures de registres simples, i un script de smbus2 per validar el flux real. Si i2cdetect no veu la IMU, no perdis temps amb el codi: hi ha un problema fÃsic o d'overlay.
Per a UART, utilitza miniterm.py o pantalla com a terminal sèrie i verifica que pots enviar/rebre a la velocitat escollida sense carà cters estranys. A Python, pisèrial amb timeout i petita pausa inicial sol evitar lectures buides. I si et mous a Windows IoT, devcon, ACPITABL.dat amb asl.exe i les eines d'exemple I2cTestTool/SpiTestTool/GpioTestTool/MinComm et donen visibilitat total.
Ja tens el mapa complet per treballar I2C i UART a RaspberryOS (i també a Windows/IoT si t'aplica): des de què són i com s'activen, al seu ús a Python, maneig de consola, particularitats de la UART a Pi 3 i la multiplexació de pins, fins a la resolució del Errno 121 quan combines tots dos busos. Ben configurats i amb un cablejat net, són eines robustes per a qualsevol projecte de sensors, robòtica o control.