Podłączenie czujników 1-wire bezpośrednio do RPi pozwala, co prawda, testować różne koncepcje, nie nadaje się jednak do zastosowania w automatyce domowej. Przyczyny są dwie:
Aby sprawdzić, czy rozwiązanie oparte o RPi nadawać się będzie do mojej rozległej sieci domowej, zbudowałem 2 testowe moduły w oparciu o chipy Maxim’a DS2382-100 i DS2382-800.
Wszystko, co tu widzicie, jest efektem przetworzenia przykładów znalezionych w sieci. Podczas pracy wielokrotnie stwierdzałem, że nie mam zielonego pojęcia o tym, co tak naprawdę robię. Koniec końców jednak, udało mi się zaprojektować i wytrawić płytkę, przylutować elementy i skutecznie uruchomić oba moduły. Miejcie się jednak na baczności i w przypadku znalezienia błędów w sztuce – alarmujcie.
Pierwszym krokiem było zaprojektowanie płytek. Na forum www.temperatur.nu znalazłem obraz przykładowego rozszerzenia do RPi. Gotową płytkę lub zestaw do samodzielnego montażu można kupić na www.m.nu. Dzięki zdjęciom i dokładnej liście użytych elementów udało mi się objąć neofickim umysłem, co z czym i do czego. Znalazłem też schemat podobnego obwodu na www.abelectronics.co.uk. Ostatecznie schematy moich płytek wyglądają następująco:
W przypadku płytki z DS2482-100 zdecydowałem się na zamontowanie PINów (tu – SV1) umożliwiających zmianę adresu. Da to możliwość – jeśli byłaby taka potrzeba – użycia kilku modułów równocześnie.
Dużo myślałem nad tym, jak podłączać poszczególne kable. Czy zasilanie powinno być wtyczką microUSB, czy przewody z I2C powinny być łączone po RJ… Ostatecznie zdecydowałem się na zaciski śrubowe i piny - jako że tak łączona jest większość modułów w mojej szafie.
Oto obrazy płytek:
Płytki, których zdjęcia zamieściłem na początku, różnią się one nieco od zamieszczonych powyżej rysunków. W międzyczasie dokonałem kilku korekt. Przykładowo – dioda P6KE6.8A zastąpiona jest SMBJ6.0A, której w czasie robienia płytek po prostu nie miałem…
Płytki w obudowach na szynę DIN wyglądają tak:
Wszyscy, którzy dotychczas – tak jak ja – bali się lutownicy, powinni wiedzieć, że wykonanie własnej płytki jest banalnie proste i… niezwykle satysfakcjonujące. Powyższe płytki są pierwszymi w moim życiu. Cienki drut cynowy, pożyczona lutownica, 1/2h spędzona na oglądaniu tutoriali na EEVBlog i… to wszystko. Okazuje się, że rzecz nie jest trudna... a radość z wkroczenia na niedostępny dotychczas teren elektroniki (nawet jeśli bez pełnego zrozumienia rzeczy) jest olbrzymia.
Powyższe moduły zasilane są z odrębnego źródła 5VDC, kanał 1-wire i GND zabezpieczone są układami DS9503P. Przewód 5VDC zasilający sieć 1-Wire: zabezpieczenie przed przeciążeniem – bezpiecznik (np. 1206L050YR), przed przepięciami dioda transil (np. SMBJ6.0A).
Aby przetestować ich pełne możliwości muszę jeszcze poumieszczać w całym domu czujniki temperatury… czyli przygotować rozległą sieć.
DS2482 (w wersji -100 lub -800), są „mostami” pomiędzy sieciami I2C i 1-Wire. Po stronie RPi wykorzystuję piny 1 (3.3VDC), 3 i 5 (SDA i SCL portu I2C) i 6 (GND). Konieczne jest też doinstalowanie aplikacji związanych z obsługą I2C i przekonfigurowania samego RPi, które – zamiast samodzielnie kontrolować komunikację po 1-Wire (GPIO 4), powinno teraz zająć się komunikacją po I2C.
Trzeba więc wpisać komendę:
nano /etc/modprobe.d/raspi-blacklist.conf
i dodać znak „#” przed „blacklist i2c-bcm2708”, następnie komendę:
nano /etc/modules
i dodać na samym dole „i2c-dev”. Potem doinstalować narzędzia do obsługi i2c:
apt-get install i2c-tools
po restarcie RPi I wpisaniu:
i2cdetect -y 1
powinna pojawić się ‘tabela’ wykazująca znalezienie urządzenia korzystającego z magistrali i2c.
Aby OWFS obsługiwał czujniki podłączone do DS2482, trzeba:
/opt/owfs/bin/owfs --i2c=ALL:ALL --allow_other /mnt/1wire/
(owfs może zainstalować się do innego katalogu, np: /usr/bin/owfs
Wykryte DS2482 (zgłaszane jako BUS.0, BUS.1 itd.) oraz czujniki znaleźć można w katalogu /mnt/1-wire.
Całkiem dobry opis powyższych kroków znalazłem na http://wiki.temperatur.nu.
Konieczne też było przebudowanie skryptów PHP odczytujących wskazania czujników:
<?php if ($MainDir = opendir('/mnt/1wire/bus.0')) { while (false !==($MainDirItem = readdir($MainDir))){ if (preg_match('/[0-9]{2}./', $MainDirItem)) { $TempFile = fopen("/mnt/1wire/$MainDirItem/temperature", "r"); if (!$TempFile) { echo "...some problems with temp. file opening..."; } else { $Temperature = fgets($TempFile); echo "Temperature of ".$MainDirItem." = "; echo $Temperature."°C"; } } } }
Tyle na teraz. Zainteresowanych tym, jak zrobić własną płytkę zapraszam do Dodatek 1 – Robimy własną płytkę PCB.