Port GPIO a sběrnice I2C

Počítač Raspberry Pi ve verzi 4 dosahuje podobných výkonů jako klasické PC pro nenáročnou práci, navíc ale disponuje 40ti pinovým portem GPIO (2x20 pinů), který poskytuje napětí 3.3V, 5V a zem (GND) pro napájení externích modulů, a umožňuje těmto zařízením jejich stavové nebo datové připojení jako vstupních nebo výstupních, a dále několik typů sběrnic. Schéma zapojení slotu GPIO je na obrázcích. 

Pro práci programátora v jazyce Python je důležité ujasnit si označování pinů GPIO, které je dvojí. Buďto pracujeme s čísly pinů, jak jsou umístěny na konektoru 1-40 (vlevo lichá čísla, vpravo sudá), pak použijeme "GPIO.setmode(GPIO.BOARD)", nebo budeme používat číslování GPIO 2-27 (oranžová pole), pak použijeme GPIO.setmode(GPIO.BCM). Všechny GPIO piny 2-27 jsou použitelné pro programátora, pokud nevyužívá jejich dalších možností (UART - univerzální asynchronní přijímač/vysílač, SPIO - 4 vodičová sériová sběrnice). 
Rozhodně nebudeme používat piny GPIO 2 a 3 k ničemu jinému, než jako sběrnici I2C. Tato sběrnice umožňuje připojení mnoha doplňkových zařízení a modulů pouze dvěma datovými vodiči + dvěma vodiči napájení. V případě sběrnice I2C je důležité, aby každá adresa připojeného zařízení byla jedinečná. Pokud chceme připojit více stejných zařizení, musíme u druhého a dalšího nastavit jinou adresu. U některých modulů lze adresu nastavit spojením dvou pájecích bodů, buďto přímo můstkem z cínu nebo drátovou spojkou, u jiných zařízení se dá adresa nastavit propojkou (tzv. jumper) mezi příslušnými piny. Pokud bychom potřebovali zapojit další tato zařízení nebo zařízení, která neumožňují nastavit jinou adresu, můžeme použít multiplexor TCA9548A, který by měl poskytovat dalších 8 sběrnic I2C. S tímto multiplexorem jsem si ale moc nepotykal, protože se z mého pohledu choval podivně. Asi jsem jeho funkci dostatečně nepochopil, ostatně jsem ani duplicitu adres řešit nemusel. Pro mě nastal jiný problém. Po připojení všech modulů, kterými je robot osazen, docházelo k totální nefunkčnosti sběrnice, nebo, v lepším případě, "zneviditelnění" některých modulů, přestože jejich adresy v kolizi nebyly. Nejlepším východiskem se ukázalo vytvoření další, "logické" sběrnice I2C na systémové úrovni Debianu za cenu obsazení dvou volných GPIO pinů. Po vytvoření nové sběrnice jsem potom metodou pokus-omyl jednotlivé moduly připojil ke sběrnicím tak, aby vše fungovalo.
Abychom se ve sběrnicích I2C trochu více vyznali, existují také sběrnice I2C-0 a I2C-2, které jsou systémové,  a není tedy radno házet jim cokoliv pod 0 nebo 1. Základní, fyzická I2C sběrnice, používá piny GPIO  2 a  3, a  má označení I2C-1. Další sběrnice I2C, kterou můžeme vytvořit, je I2C-3, případně I2C-4. V případě více přidávaných sběrnic je třeba uvádět jejich parametrický řádek nejprve pro sběrnici s vyšším číslem. Jako GPIO piny pro SDA a SCL můžeme zvolit jakékoliv volné GPIO piny. Následující příklad ukazuje, jak je třeba pro vytvoření dvou dalších I2C sběrnic upravit soubor /boot/config.txt .

za řádek
dtparam=i2c_arm=on       
vložíme řádky
dtoverlay=i2c-gpio,bus=4,i2c_gpio_delay_us=1,i2c_gpio_sda=20,i2c_gpio_scl=21 
dtoverlay=i2c-gpio,bus=3,i2c_gpio_delay_us=1,i2c_gpio_sda=14,i2c_gpio_scl=15 

Nové sběrnice I2C se v systému objeví po restartu počítače. Jejich existenci zjistíme příkazem i2cdetect -l, obsazení sběrnice I2C-1 pak příkazem i2cdetect -y 1, obsazení I2C-3 příkazem i2cdetect -y 3.

V případě robota Kamila, u kterého byla vytvořena jen jedna nová sběrnice, uvidíme tento výpis: