i2c-tiny-USB, czyli konwerter z i2c na USB

I2C to dwukierunkowa magistrala zaprojektowana przez firmę Philips w latach 80. ubiegłego wieku. Ten prosty konwerter umożliwia podłączenie układów scalonych w nią wyposażonych do komputera lub innych urządzeń z portem USB.

Tytułem wstępu

I2C to, przynajmniej według mnie, najpopularniejsza i najczęściej implementowana dwukierunkowa magistrala danych, wyróżniające urządzenia master i slave. Za jej pomocą można połączyć ze sobą mikrokontrolery i procesory oraz układy RTC (real time clock), pamięci EEPROM i NVRAM, expandery I/O, wyświetlacze LCD, przetworniki analogowo-cyfrowe i cyfrowo-analogowe (ADC i DAC), całą gamę sensorów, m.in. temperatury, ciśnienia, wilgotności, oświetlenia oraz mnóstwo innych układów. W porównaniu do konkurencyjnej 1wire, za „cenę” dodatkowego przewodu (I2C to 2 linie – SCL i SDA, plus masa) otrzymujemy możliwość użycia nieporównywanie większej ilości różnych chipów, a także zastosowania innej częstotliwości taktowania magistrali.

Interfejs I2C można zaimplementować w dowolnym urządzeniu, które udostępnia 2 wolne linie danych GPIO. W przypadku mikrokontrolerów w samodzielnie projektowanych układach nie ma problemu – po prostu należy podłączyć linie SCL i SDA do wolnych nóżek mikroprocesora. Gorzej, gdy urządzenia I2C (znany także jako IIC lub TWI) chcemy podłączyć na przykład do routera z openWRT, nie otwierając jego obudowy lub po prostu do komputera PC.

i2c-tiny-usb z bliska
i2c-tiny-usb z bliska

Układ i2c-tiny-usb

Z pomocą przychodzi układ zaprojektowany przez Tilla Harbauma, czyli i2c-tiny-usb. To bardzo tania i prosta przejściówka z I2C na USB, oparta na tanim mikrokontrolerze firmy AVR – ATtiny45 oraz kilku elementach pasywnych. Układ jest obsługiwany przez systemy Linux, Windows i Mac. Działa też pod kontrolą dystrybucji openWRT na routerach. Poprawnie wykonany nie wymaga żadnej konfiguracji i działa od pierwszego podłączenia.

Programowanie i fusebity

Należy  zwrócić uwagę na poprawne zaprogramowanie fusebitów. Układ do prawidłowej pracy wymaga zablokowanie pinu RESET. Oznacza to, że za pomocą typowych, tanich programatorów można zaprogramować wyłącznie jeden raz, gdyż do prawidłowej pracy wymagają one właśnie działającego RESETU. W przypadku pomyłki, procesor będzie można uratować wyłącznie za pomocą programatora równoległego lub wysokonapięciowego.

Prawidłowe fusebity to 0x5F HIGH oraz 0xDF LOW.
Aby uniknąć pomyłek polecam zastosowanie polskiego programu MkAvrCalculator.

Współpraca z systemem Linux

Aby konwerter działał z Linuxem/openWRT należy zainstalować odpowiednie pakiety:

opkg update
opkg install kmod-i2c-tiny-usb
opkg install i2c-tools

Po podłączeniu urządzenia zostaje ono poprawnie rozpoznane:

root@Gargoyle:~# dmesg
[1570377.260000] usb 1-1.4.2: new low-speed USB device number 11 using ehci-platform
[1570377.510000] i2c-tiny-usb 1-1.4.2:1.0: version 1.05 found at bus 001 address 011
[1570377.720000] i2c i2c-0: connected i2c-tiny-usb device

Teraz należy wyszukać szynę i2c:

root@Gargoyle:~# i2cdetect -l
i2c-0   i2c             i2c-tiny-usb at bus 001 device 011      I2C adapter

i wyświetlić podłączone urządzenia:

root@Gargoyle:~# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- c0 -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Wykryte zostało jedno urządzenie, czujnik ciśnienia MPL3115A2 o adresie 0xC0.

Współpraca z systemem Windows

W systemie Windows wymagane są dedykowane sterowniki. Autor projektu na swojej stronie udostępnia paczkę sterowników, które jednak nie współpracują poprawnie z systemem Windows 7 64bit. Działające sterowniki są dostępne do pobrania w pliku z dokumentacją.

i2c-tiny-usb top layer
i2c-tiny-usb top layer

PCB

Schemat płytki drukowanej został zaprojektowany przeze mnie. Płytka jest jednostronna, z kilkoma przelotkami na warstwie top. Można je wykonać cienkim przewodem, lub jako ścieżka na płytce – przy zastosowaniu laminatu dwustronnego. Zastosowałem w większości elementy SMD, z kilkoma wyjątkami. Przewlekane są diody zenera oraz mikrokontroler, gdyż łatwiej go zaprogramować, gdy jest w obudowie DIP. Użyłem mikroprocesora Attiny45 oraz układu MAX604 (który jest konwerterem napięcia 5V->3.3V LDO), dzięki czemu można zasilać konwerter i czujniki I2C przystosowane do zasilania napięciem właśnie 3.3V. Napięcie zasilania można ustawić, zwierając odpowiednie piny. Dokumentacja zawiera schemat i układ płytki (.brd i .sch). Odpowiednie biblioteki eagle są do pobrania stąd.

i2c-tiny-usb bottom layer
i2c-tiny-usb bottom layer

Pobierz dokumentację

I2c-tiny-usb
I2c-tiny-usb
i2ctiny-usb.zip
424.3 KiB
173 Downloads
Szczegóły
Udostępnij:Share on FacebookEmail this to someoneWykop!Share on Google+Print this pageShare on TumblrTweet about this on Twitter

2 odpowiedzi do “i2c-tiny-USB, czyli konwerter z i2c na USB”

  1. Dobry wpis.
    Dodam tylko, że głównym zastosowaniem I2C jest komunikacja pomiędzy różnymi układami w obrębie jednego obwodu drukowanego, ewentualnie do łączenia modułów na niewielkie odległości . Natomiast 1wire może mieć długość do kilkudziesięciu metrów ( pojemność linii) i służy do zupełnie czego innego. Można np na przewodzie o długości 150 metrów podłączyć czujnik temperatury DS18B20.

    Pozdr.

  2. To prawda. Chociaż stosując układu P82B715 można prawdopodobnie wydłużyć magistralę I2C do kilkudziesięciu metrów, co mam zamiar przetestować w najbliższym czasie, łącząc w sieć czujniki i2c w domu jednorodzinnym. Wnioski opiszę tutaj

Dodaj komentarz

Twój adres email nie zostanie opublikowany.