Dzisiaj chciałem zaprezentować projekt, który nie jest ściśle związany z automatyką domową, ale Arduino zostało zastosowane w dość ciekawym miejscu. Uczestniczy w obsłudze plotera drukującego, choć nie wprost i nie tylko.
Ploter to taka duża drukarka. Wydruki do niego wysyła komputer, więc po co to komplikować? Dla wygody i oszczędności czasu. Przygotowanie 8 metrów kwadratowych wydruku przez dość młody komputer zajmuje kilkadziesiąt minut (przy dużym projekcie około 1GB pliku wyjściowego) – potem zaczyna się drukowanie. Oczywiście nic nie stoi na przeszkodzie, żeby plik do wydruku (prn) wygenerować raz, a potem tylko kopiować go na port drukarki/plotera. Jednak podczas wysyłania wydruku komputer musi być włączony. A bywa, że te same wydruki uruchamia się jeden po drugim przez parę godzin albo nawet dni. Co byłoby najwygodniejsze do obsługi plotera? Włącznik „drukuj” załączany rano i wyłączany gdy kończy się rolka papieru. Bez uruchamiania komputera. Do tego będziemy dążyć.
Koncepcja rozwiązania jest taka – włącznik jak od światła podłączony będzie do urządzenia bazującego na Arduino Pro Mini, komunikującego się ze światem przez Ethernet. Po załączeniu urządzenie powinno wysyłać informację o tym fakcie do serwera www. Serwerem www będzie router z systemem OpenWRT, konkretnie energooszczędny TP-Link TL-MR3020. Router ma port USB, który zostanie użyty do przechowywania na pendrive plików wydruków. Gdy serwer www dostanie powiadomienie o załączeniu włącznika, zacznie wysyłanie pliku do plotera. Gdy przyjdzie kolejna informacja o włączniku (bo urządzenie będzie ponawiać co 10 sekund tę informację, do czasu wyłączenia włącznika), router sprawdzi, czy wydruk już się skończył i w takim wypadku zacznie go wysyłać ponownie. Będziemy mieć więc sytuację, że po załączniu, wyruki będą wykonywane cyklicznie i o to chodzi.
Żeby urządzenie się „nie nudziło”, będzie pełniło jeszcze jedną funkcję. W drukarni istotne są parametry środowiska – wilgotność i temperatura. Będą one monitorowane przy pomocy czujnika AM2301, będącego w praktyce czujnikiem DHT-21 (zbliżonym do DHT-22) w obudowie. Urządzenie będzie cyklicznie wysyłać informacje o środowisku do serwera www. Serwer będzie przyjmował informacje, logował je i przygotowywał wykresy zmian temperatury i wilgotności.
Do komunikacji ethernetowej można użyć tańszego niż Ethernet Shield układu ENC28J60. Nie jest on tak dobry jak standardowy shield, ale jest tańszy, mały i bardzo dobrze spełnia swoją funkcję w tym przypadku. Wybór jest tym bardziej naturalny, że trudno znaleźć małe układy oparte o w5100 (czyli odpowiedniki Ethernet Shield), a szkoda. Same „porty ethernetowe” oparte o ENC28J60 występują w różnych odmianach i wielkościach płytki. Standarowo wymagają zasilania napięciem 3,3V, ale są też wersje z regulatorem napięcia, pozwalające na podłączenie 5V. Jest to istotne, gdy chcemy użyć Arduino Pro Mini w wersji 5V, który jak wiadomo nie ma wyprowadzonego napięcia 3,3V.
W tym wypadku najbardziej naturalne jest użycie Pro Mini 3,3V i najprostszej wersji ENC28J60. Urządzenie zostało zamknięte w dość dużej hermetycznej obudowie. Może nieco zbyt dużej jak na liczbę i wielkość podzespołów, ale początkowo obawiałem się nieco o chłodzenie – niepotrzebnie. Jako sygnalizacja stanu, została wyprowadzona dioda LED.
Obsługę modułu ENC28J60 zapewnia biblioteka UIPEthernet w wersji 1.01. Jej zaletą jest obsługa połączeń TCP, łącznie z DHCP i DNS. Wadą natomiast jest dość duża objętość, więc na program nie zostaje już zbyt wiele miejsca. W tym wypadku nie jest to jednak problemem, bo poza odczytem temperatury i wilgotności (z użyciem DHTlib), komunikacją i sprawdzaniem stanu przełączników, urządzenie nic więcej robić nie będzie. Istotne tylko jest, żeby nie było wycieków pamięci, bo urządzenie ma działać niezawodnie.
Po stronie Arduino, od strony programistycznej nie ma więc nic, czego nie możnaby znaleźć w przykładach do bibliotek. Dla porządku tylko napiszę, że dane z czujnika DHT odczytujemy w pętli loop przez:
int chk = DHT.read21(DHT_PIN); if( chk==0 ) { h=DHT.humidity*10; t=DHT.temperature*10; }
Natiomiast wysłanie stanu przycisków (przechowywanego z zmiennej but), to połączenie się na port 80 serwera i wykonanie kodu:
aclient.print("GET "); aclient.print(URLPRINT); aclient.print(but); aclient.println(" HTTP/1.0"); aclient.print("Host: "); aclient.println(HOSTPRINT); aclient.println();
Co po stronie tp-linka? OpenWRT jako podstawa, uhttpd jako serwer www z włączoną obsługą php. Skrypt php służacy do drukowania, sprawdza stan przycisków i wywołuje w tle właściwy skrypt shell, który z kolei wykonuje dwie rzeczy. Po pierwsze sprawdza czy już nie działa, jak tak, to kończy działanie (bo drukowanie już/jeszcze trwa). W przeciwnym wypadku uruchamia program netcat, kierując plik wydruku na port 9100 (protokół raw) plotera.
Jeżeli chodzi o temperaturę i wilgotność, to program jest równie prosty. Przechowywanie danych bazuje na rrdtool, podobnie cykliczne rysowanie wykresów. Może przy jakiejś okazji szerzej opiszę to świetne narzędzie.
Jak widać, dzięki Arduino można szybko i prosto zbudować urządzenie, które ułatwi codzienną pracę. Wszystkie elementy składa się jak z klocków, a programowanie w większości przypadków również nie jest skomplikowane. Potrzebny jest tylko dobry pomysł i plan, jak go zrealizować.
Zazdroszczę umiejętności i wolnego czasu 🙂
Ja swoje inteligentne mieszkanie zdążyłem okablować, na instalacje urządzeń automatyki nie mogę znaleźć wolnej chwili od początku roku…
Nie bardzo łapię czemu by nie ustawić w opcjach wydruku, że drukarka, czy plotter nie mają wydrukować np. 154 kopie i iść spać zamiast tworzyć takie komplikacje. Oczywiście poza satysfakcją, że udało się skomplikować coś co jest proste. Pomijam kwestie pomiaru wilgotności i temperatury.
Po pierwsze, po co prądożerny komputer ma być włączony? Po drugie do uruchomienia wydruku przyciskiem nie trzeba pracownika, który obsługuje komputer, ma uprawnienia, itp. Po trzecie – wygoda. Nie da się też zapuścić 154 wydruków i iść spać, bo trzeba zmieniać rolki.
Opss! Myślałem że żądanie ilości kopii do wydrukowania wysyła się poleceniem do drukarki i ona już to realizuje, po czym można wyłączyć kompa. Jeśli tak nie jest to cofam pytanie.
Dużo zależy od wielkości pracy, rodzaju urządzenia i jego pamięci.