Toto je starší verze dokumentu!
−Obsah
Převodník USB na I²C USBI2C01A
I²C je velmi rozšířená sběrnice vhodná pro připojování nejrůznějších čidel na krátké vzdálenosti. Avšak není obvyklé, aby byla vyvedena na běžných počítačích a dostupná tak k přímému použití. 1)
Modul se proto snaží řešit tento problém použitím obvodu Silicon Labs CP2112, který je přímým převodníkem mezi USB a SMBus resp. I2C.
Použití modulu
Modul se po připojení k USB chová, jako standardní HID zařízení. Toto chování má výhodu, že teoreticky nepotřebuje žádné speciální ovladače. A s modulem lze komunikovat přímo přes standardní USB HID rozhraní. Některé operační systémy však obsahují programové vybavení pro použití sběrnice I2C/SMBus. V takových případech je výhodné nahradit generický USB HID ovladač speciálním driverem, který tento modul zapojí do systémové sběrnice I2C.
HIDAPI
HIDAPI je platforma, přes kterou se dá k převodníku přistupovat z Linuxu, Windows nebo MAC OS na různých procesorových platformách. Podmínkou je, že na dané platformě je nainstalováno libusb-1.0.
Ubuntu 14.04
Na počítač, ke kterému převodník připojíme, musíme nejdříve nainstalovat hidapi a některé další balíky. Od Ubuntu 14.04 to jde jednoduše pomocí:
sudo apt-get install libudev-dev libusb-1.0-0-dev libhidapi-dev python-setuptools python-pip python-smbus cython
Dále pak potřebujeme pouze balík Pymlab, jak je zmíněno na stránce i2c.
sudo pip install pymlab
Příklad blikání LEDkami na USBI2C01A pomocí Pythonu:
import hid import time try: print "Opening device" h = hid.device() h.open(0x10C4, 0xEA90) print "Manufacturer: %s" % h.get_manufacturer_string() print "Product: %s" % h.get_product_string() print "Serial No: %s" % h.get_serial_number_string() h.write([0x02, 0xFF, 0x00, 0x00, 0x00]) # nastaveni vystupu v rezimu open-drain time.sleep(0.1) for k in range(10): h.write([0x04, 0xFF, 0xFF]) # zapise 1 na vsech 8 vystupnich IO pinu time.sleep(0.1) h.write([0x04, 0x00, 0xFF]) # zapise 0 na vsech 8 vystupnich IO pinu time.sleep(0.1) print "Closing device" h.close() except IOError, ex: print ex print "Done"
Příklad je nutné spustit s oprávněním správce.
Podrobnosti k ovládání IO portů přes HID API najdete v tomto dokumentu
Nastavení přístupových práv k USB
Aby se skript nemusel spouštět s právy roota, je třeba vytvořit v adresáři /etc/udev/rules.d soubor SiliconLabs.rules s obsahem:
SUBSYSTEM=="usb", ATTRS{idVendor}=="10c4", MODE="0666" SUBSYSTEM=="usb_device", ATTRS{idVendor}=="10c4", MODE="0666"
Linux Kernel
Linux je případem operačního systému, kde existuje systémové řešení komunikace se sběrnicí I2C, takže je výhodné generický HID ovladač vyměnit za modul v kernelu. Obvod CP2112 je podporován v linuxovém kernelu od verze jádra 3.16. K jeho funkci proto stačí zavést modul i2c-dev, jak je popsáno v návoudu na použití I²C. Následně ověříme, že v systému vidíme novou sběrnici I²C.
kaklik@UST-vyvoj:~$ sudo i2cdetect -l i2c-0 i2c i915 gmbus ssc I2C adapter i2c-1 i2c i915 gmbus vga I2C adapter i2c-2 i2c i915 gmbus panel I2C adapter i2c-3 i2c i915 gmbus dpc I2C adapter i2c-4 i2c i915 gmbus dpb I2C adapter i2c-5 i2c i915 gmbus dpd I2C adapter i2c-6 i2c DPDDC-B I2C adapter i2c-7 smbus CP2112 SMBus Bridge on hiddev0 SMBus adapter i2c-8 smbus CP2112 SMBus Bridge on hiddev0 SMBus adapter kaklik@UST-vyvoj:~$
Pokud ano, tak rozhraním můžeme pracovat stejně jako s klasickou SMBus sběrnicí. S tím rozdílem, že modul neumí SMBus Quick Write, musíme proto použít parametr -r, jako je uvedeno v následujícím příkladu:
kaklik@UST-vyvoj:~$ sudo i2cdetect -y -r 8 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- kaklik@UST-vyvoj:~$
Vidíme, že je na sběrnici připojeno zařízení s adresou 0x70, které je v tomto případě modul I²C Hubu.