Moduly PI-AIO a PI-DIO jsou připojené k Raspberry Pi na I2C sběrnici na pinech GPIO2 (SDA) a GPIO3 (SCL). Pro ovládání je tedy možné použít I2C stack, který je již integrovaný v Raspberry OS. Podívejme se, jak na to v programovacím jazyku Python.
Předpokládejme, že máte již Raspberry OS nainstalovaný a funkční. Není nutné instalovat žádné doplňkové balíčky, vše potřebné je již v základním nastavení.
Doporučujeme přečíst si datasheet k obou modulům, jakým způsobem je zapojen.
V prvé řadě je vhodné přímo při startu systému nastavit piny GPIO2 a GPIO2 na I2C mód. Do souboru /boot/firmware/config.txt stačí přidat řádek:
dtoverlay=i2c-gpio,i2c_gpio_sda=2,i2c_gpio_scl=3
Tím se v systému vytvoří nová I2C sběnice, pravděpodobně bude mít číslo 22 (i2c-22), protože v systému již existují sběrnice 20 a 21.
U modulu PI-DIO je obvod MCP23008 resetován pomocí pinu GPIO4. Je to z toho důvodu, aby při selhání systému po resetu byly výstupy v klidovém stavu vypnuty. pokud by to tak nebylo, mohly by být po resetu výstupy stále zapnuté, což může být nebezpečné. Z příkazové řádky je možné toho docílit takto:
> gpioset 0 4=1
Poté můžeme zkusit detekovat obvody na sběrnici i2c-22 příkazem:
> gpiodetect 22
Zobrazit by se měly všechny detekované obvody, u nás tedy 0x20 u PI-DIO a 0x60 a 0x68 u PI-AIO. Číslo se může lišit podle nastavení jumperů na modulu.
PI-DIO
Nyní vytvoříme jednoduchý program v Pythonu. Nejprve je nutné vytvořit přístup na I2C sběrnici:
i2cbus = SMBus(I2CBUS)
Kde I2CBUS je číslo sběrnice, v našem případě je to 22.
Poté zinicializujeme vstupy a výstupy GPIO expandéru:
i2cbus.write_byte_data(I2CADDR, MCP_IODIR, DIN1 | DIN2 | DIN3 | DIN4 | DOF1 | DOF2)
I2CADDR je adresa MCP23008 a MCP_IODIR je adresa GPIO registru.
Číst vstupy DIN a DOUT Fault můžeme pomocí příkazu:
val = i2cbus.read_byte_data(I2CADDR, MCP_GPIO)
Ovládat výstupy DOUT můžeme pomocí příkazu:
i2cbus.write_byte_data(I2CADDR, MCP_GPIO, val)
Hodnotě val nastavíme bity 5 resp. 7 pro DOUT1 resp. DOUT2.
PI-AIO
U modulu PI-AIO je to podobné. Nejprve se přihlásíme k I2C sběrnici:
i2cbus = SMBus(I2CBUS)
U AD převodníku MCP3424 spustíme převod zápisem do konfiguračního registru:
i2cbus.write_byte(I2CADDR, channel | MCP3424_RATE_15SPS_16B | MCP3424_GAIN_1 | MCP3424_RDY)
A poté přečteme výsledek:
read = i2c_msg.read(I2CADDR, 3)
i2cbus.i2c_rdwr(read)
val1 = int.from_bytes(read.buf[0])
val2 = int.from_bytes(read.buf[1])
val = (val1 << 8) + val2
U DA převodníku MCP47CMB22 je to podobné. Výstup nastavíme zápisem do registru:
val1 = (val >> 8) & 0xff
val2 = val & 0xff
write = i2c_msg.write(I2CADDR, [channel, val1, val2])
i2cbus.i2c_rdwr(write)
Kompletní program
Jako ukázka mohou sloužit tři programy pro ovládání dio, ain a aout. Těmi lze ovládat vstupy a výstupy z příkazové řádky. Příklady použití pro PI-DIO:
python dio.py din1 # Read input 1
python dio.py dout1 1 # Enable output 1
python dio.py dout1 0 # Disable output 1
python dio.py dof1 # Read output 1 fault
Pro analogové vstupy a výstupy (program převádí vstupy 0-10 V a výstupy 0-5 V):
ain 1 # Read analog input 1
aout 1 2.5 # Set analog output 1 to 2.5V