Image
15.8.2019 0 Comments

IoT prakticky - programovanie Raspberry Pi v Pythone 5: I2C komunikácia

Mini seriál je zameraný na obsluhu hardvéru pripojeného na dosku Raspberry PI. V tejto časti na praktických príkladoch ukážeme možnosti komunikácie cez zbernicu I2C, konkrétne obsluhu expanderu  - obvodu MCP23008 určeného na rozšírenie počtu portov. 

Príklady sú v vo videu

Upozorňujeme, že nie každý pin portu sa dá použiť kedykoľvek a na čokoľvek. Napríklad porty GPIO2 a GPIO3 môžete na všeobecné účely použiť iba v prípade aj nie je aktivovaná komunikácia na I2C zbernici. A to je práve v príkladoch z tohoto článku. Preto porty GPIO2 a GPIO3 nevyužívajte na iné účely. Na obrázku sú zeleným vyznačené porty, ktoré môžete využiť kedykoľvek a žltým porty, ktoré sa dajú využiť len za určitých okolností.  

I2C (Inter-Integrated Circuit)je dvojvodičová obojsmerná sériová zbernica, určená napríklad na komunikáciu jednočipových procesorov s podriadenými obvodmi. Vodič SDA (Serial Data) je určený na prenos sériových dát a vodič SLC (Serial Clock) na prenos taktovacieho signálu. Signály sú na pinoch GPIO2 (SDA) a GPIO3 (SCL).

Každý obvod na zbernici je identifikovaný jedinečnou adresou, preto zbernica I2C nevyžaduje signál CS (chip select) ani inú logiku na výber čipu. Pomocou I2C zbernice sa k mikrokontroléru pripájajú rôzne komponenty, napríklad displeje, prevodníky, expandery portov, pamäte EEPROM a podobne. Inak povedané zariadenia, ktoré napotrebujú prenášať veľa údajov vysokou rýchlosťou.  Prenosová rýchlosť je štandardne do 100 kbit/s, vo Fast móde až 400 kbit/s.

Pri implicitnom nastavení je komunikácia cez I2C zakázaná, preto ju musíte najskôr v konfigurácii mikropočítača Raspberry Pi povoliť

Aby sme nemuseli nič zapájať a vašu pozornosť sústredili na softvérovú obsluhu, v prvom príklade sme využili dosku určenú pre domácu automatizáciu UniPi 1.1 Lite.

Doska má 6 digitálnych vstupov, na čítanie stavu externých zariadení, ktoré sú pripojené priamo na porty. Pre nás je zaujímavé, že na doske je 6 spínacích relé aj so signalizačnými LED diódami a tieto relé nie sú pripojené na výstupné porty, ale sú ovládané po zbernici I2C cez obvod MCP23008 na adrese 0x20. Tento obvod funguje ako I/O extendér, takže pomocou neho môžete mať 8 digitálnych vstupov, alebo výstupov. Často sa používa v príkladoch na ovládanie jednotlivých segmentov sedem segmentových displejov. Môžete prípadne skúsiť zapojenie s týmto obvodom na prepojovacom poli, je to jednoduché.

Obvod sa  vyrába vo verzii s klasickými nožičkami s roztečou 2.54 mm, prípadne vo verzii pre plošnú montáž. Cena je okolo 2 eurá.

Pomocou príkazu zadaného cez konzolu Raspberry Pi zistíte adresy pripojených zariadení.

sudo i2cdetect -y 1

 

    0  1  2  3  4  5 6  7  8  9  a  b   c  d  e  f
00:         -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Komunikačný protokol I2C je súčasťou knižnice SMBus (System Management Bus), takže stačí importovať túto knižnicu a využiť funkcie read_byte_data() a write_byte_data(), prípadne read_i2c_block_data() a write_i2c_block_data()

V príklade využijeme funkciu na nastavenie bitu. Môže mať dve varianty. V prvej nastaví iba príslušný bit na hodnotu 1 a ostatné pony zostanú na hodnote 0

def nastavPin(pin, hodnota):
    stav = 0
    if hodnota:
       stav = stav | (1 << pin)
    else:
       stav = stav & ~(1 << pin)
   bus.write_byte_data(DEVICE,GPIO,stav)        

Druhý variant nastaví len príslušný pin bez ohľadu na stav ostatných.

def nastavPin(pin, hodnota):
    stav = bus.read_byte_data(DEVICE, GPIO)
    if hodnota:
       stav = stav | (1 << pin)
    else:
       stav = stav & ~(1 << pin)
   bus.write_byte_data(DEVICE,GPIO,stav)        

Príklad, kódu ktorý postupne zapne jednotlivé relé

import smbus
import time
 
bus = smbus.SMBus(1)
 
DEVICE = 0x20 # Adresa obvodu MCP23008
IODIR = 0x00 # Register prepinajuci vstup a vystup
OLAT  = 0x0A # Register pre vystupy
GPIO  = 0x09 # Register pre vstupy
 
def nastavPin(pin, hodnota):
    stav = bus.read_byte_data(DEVICE, GPIO)
    if hodnota:
       stav = stav | (1 << pin)
    else:
       stav = stav & ~(1 << pin)
   bus.write_byte_data(DEVICE,GPIO,stav)       
 
# všetky piny výstupné IODIR na 0
bus.write_byte_data(DEVICE,IODIR,0x00)
 
# všetky piny na 0
bus.write_byte_data(DEVICE,GPIO,0)
time.sleep(1)
bus.write_byte_data(DEVICE,GPIO,0xFF)
time.sleep(1)
bus.write_byte_data(DEVICE,GPIO,0)
 
nastavPin(1, 1)
time.sleep(1)
 
nastavPin(2, 1)
time.sleep(1)
 
nastavPin(8, 1)
time.sleep(1)
 
# vstupy do nuly
bus.write_byte_data(DEVICE,GPIO,0)

 

V niektorom z ďalších dielov ukážeme softvérovú obsluhu iných zaujímavých zariadení pripojených cez I2C, predovšetkým senzorov a displejov. V budúcom pokračovaní ukážeme pripojenie externých zariadení cez zbernicu 1-Wire.

Ostatné časti seriálu:

Programovanie Raspberry Pi v Pythone 1: Konfigurácia https://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone---1-cast--konfiguracia

Programovanie Raspberry Pi v Pythone 2: Vstupy a výstupy https://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone---2-cast--vstupy-a-vystupy

Programovanie Raspberry Pi v Pythone 3: PWM výstup a ovládanie servomotorov https://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone-3--PWM-vystup-a-ovladanie-servomotorov

Programovanie Raspberry Pi v Pythone 4: softvérová obsluha vstupov

https://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone-4--softverova-obsluha-vstupov

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Mikrokontroléry

Robotika – ovládanie modelov Lego Technic mikropočítačom BBC Micro:bit 1 - servá pre Lego

23.08.2019 00:00

Vlani sme cez prázdniny v trojici článkov Robotický podvozok, Segway z Lega a Digitálne dvojča predstavili možnosti robotickej stavebnice Lego Mindstorms. Čitateľov možnosti tejto stavebnice zaujali, ...

Mikrokontroléry

Robotika: možnosti programovania a senzorová výbava pokročilého robota InO-Bot

17.08.2019 00:10

Postupne sme predstavili niekoľko robotov, ktoré sa používajú, alebo začínajú používať na školách, pri výučbe logického myslenia, algoritmizácie a následne programovania. Zatiaľ čo roboty Bee-Bot a Bl ...

Mikrokontroléry

IoT prakticky - programovanie Raspberry Pi v Pythone 6: 1-Wire zbernica

16.08.2019 00:01

Mini seriál je zameraný na obsluhu hardvéru pripojeného na dosku Raspberry PI. V tejto časti na praktických príkladoch ukážeme možnosti komunikácie pomocou zbernice 1-Wire.  Príklady sú v vo videu & ...

q

Žiadne komentáre

Vyhľadávanie

eFocus_2019

Najnovšie videá