AKTUALIZACJA - > patrz post #2Projekt pod nazwą i2c-tiny-usb jest znany od dawna. Autorem tej przystawki jest Till Harbaum, który prowadzi swoja stronkę pod adresem
http://www.harbaum.org/till/. Można tam znaleźć wiele innych projektów, m.in. lcd2usb.
Wracając do i2c-tiny. Autor udostępnia schematy oraz wzory płytek PCB. Postanowiłem wykorzystać je i dokonać paru drobnych poprawek. Zmieniłem gniazdo USB oraz dodałem inne złącze na wyjściu. Idea projektu została zachowana.

Schemat:

Układ PCB:
InstalacjaWszystkie potrzebne moduły do pracy i2c-tiny są dostępne w OpenWrt Attitude Adjustment oraz trunk.
Moduł:opkg update
opkg install kmod-i2c-tiny-usb
Narzędzia i2c-tools:opkg install i2c-tools
ZastosowanieCała gama układów pracujących na szynie i2c z jednym ograniczeniem -
zasilanym napięciem 5V. Taka jest idea tego schematu, aż się prosi o dodanie prostego pola lutowniczego do wyboru napięcia zasilania układu oraz szeregiem dwóch diod, aby ograniczyć do ~3.3V. Niestety nie przyjrzałem się dokładnie schematowi i nie dokonałem takiej poprawki. Może kiedyś...
Pomimo ograniczenia jest wiele takich układów np.
PCF8574(A) - expander GPIO ( do 8 wejść/wyjść)
SAA1064 - driver LED
LM75 - czujnik temperatury
PCF8582C-2 - pamięć EEPROM 256 × 8-bit
PCF8583 - RTC z kalendarzem
itp.
Przykład zastosowania PCF8574A.

PCF8574A dostarcza nam 8 wejść/wyjść. Wykorzystać można je dowolnie, do sterowania przekaźnikiem, tranzystorem MOSFET czy dioda LED jak wyżej. Unikał bym podłączania bezpośrednio odbiorników o większym poborze prądu, gdyż skończyć się to może uszkodzeniem układu PCF. Zawsze przez jakiś tranzystor lub układ UL2803A (8 tranzystorów w układzie Darlingtona, obciążalność do 500mA).
Układ PCF8574A widziany jest pod adresem 0x38, przy założeniu ze piny A0-A2 podłączymy do masy.
Najpierw wyszukajmy naszą szynę I2C:
root@OpenWrt:/tmp# i2cdetect -l
i2c-0 i2c i2c-gpio0 I2C adapter
i2c-1 i2c i2c-tiny-usb at bus 002 device 003 I2C adapter
Jako ze używam już routera(JWAP003) który ma już i2c w standardzie to znalazł mi obie. Wykorzystujemy oczywiście i2c-tiny - tutaj szyna "1"
Szukamy podłączonych odbiorników I2C:
root@OpenWrt:/tmp# i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Jest tylko jeden i jak pisałem adres 0x38
Pora na Hello World w elektronice, czyli zapalmy diodę LED. Dioda podłączona pod wyjście P0(pin 4) PCFa.
i2cset -y 1 0x38 0x0 0 /* on */
i2cset -y 1 0x38 0x0 1 /* off */
Dioda się pali. Dziwna jest trochę logika

bo zapalamy zerem, gasimy jedynką.
W ten spsób możemy zrobić zdalny przekaźnik stosując jego wersje elektromagnetyczną lub półprzewodnikową (SSR Relay):

Tutaj HFS41F-1D-240A5Z 5A. Może być sterowany napięciem od 3 do 15V. Odbiornik 240V może pobierać max 5A.
PS: Mam kilka takich układów i samych PCB. Jak ktoś potrzebuje to PW.
----- Dodano ----- 15 lip 2012, o 15:36 -----
Skompletowałem prosty przekaźnik wykorzystując PCF8574A jako expander GPIO oraz PCF8582C-2 jako pamięć stanu przekaźnika:

Skrypt do zarządzania przekaźnikiem:
#!/bin/sh
bus=1
exp_addr=0x38
eep_addr=0x50
status_addr=0x0
if [ -z "$1" ]; then
state=`i2cget -y $bus $eep_addr $status_addr`
i2cset -y $bus $exp_addr 0x0 $state
else
i2cset -y $bus $exp_addr 0x0 $1
i2cset -y $bus $eep_addr $status_addr $1
fi
Przyjmuje argument "1" i "0". Brak argumentu to przywrócenie ostatniego stanu, przydatne jak się doda do /etc/rc.local i po zbotowaniu router przywróci ostatni stan przekaźnika.