niedziela, 20 marca 2011

DIY: Zdalny kontroler urządzeń sieciowych ATmega8 + RFM73


Autor: mike77
Redakcja: Dondu

Projekt przedstawia zastosowanie mini serwera jako kontrolera urządzeń sieciowych. Projekt składa się z dwóch układów.

Pierwszym układem jest mini serwer na bazie modułu ENC28J60. Drugim układem jest odbiornik, który steruje urządzeniami zasilanych z sieci.

Komunikacja między układami odbywa się za pomocą modułów radiowych RFM73 pracujących na częstotliwości 2,4 GHz. Dodatkowa projekt został wzbogacony w aplikacje na system Android, która umożliwia sterowanie głosowe.

Poniżej przedstawiam filmik pokazujący działanie kontrolera z wykorzystaniem aplikacji na Androida. W celu pokazowym do urządzenia została podpięta lampka oraz zwykła żarówka. Na filmie widać że aplikacja posiada dwa sposoby sterowania: poprzez komendę głosową lub poprzez kliknięcie komendy w liście komend.







Krótki opis działania


UWAGA!!!

Jako że urządzenie pracuje przy napięciu sieciowym, autor projektu nie ponosi odpowiedzialności za jakiekolwiek szkody, w tym również szkody pośrednie lub bezpośrednie polegające na uszkodzeniu ciała lub rozstroju zdrowia lub inne szkody o charakterze majątkowym poniesione przez użytkownika bądź osoby trzecie w związku z wykonaniem tego projektu na własną rękę.

Zaczynamy od tego, że do poprawnego działania układu, należy odpowiednio skonfigurować swój router. Nie opisuję tego ponieważ jest to zależne od routera, ale jeżeli będą pytania w komentarzach, to postaram się podpowiedzieć.

Zdalny kontroler urządzeń sieciowych
... w akcji :-)


Zdalny kontroler urządzeń sieciowych


Po wywołaniu adresu serwera sprawdzane jest hasło, które wpisujemy bezpośrednio po adresie. Jeśli hasło jest poprawne zostanie wyświetlona prosta strona internetowa:


Widok strony po wpisaniu poprawnego hasła

Jeśli podane hasło będzie błędne, pojawi się komunikat: "403 Forbidden":


Widok strony po wpisaniu błędnego hasła


Po zaakceptowaniu hasła zostanie sprawdzana dalsza część kodu url, gdzie wpisujemy polecania. Odebrane polecenia są wysyłane bezpośrednio do odbiornika, gdzie sprawdzana jest jego poprawność. Gdy polecenie jest poprawne to zostaje wykonane, natomiast jeśli jest niepoprawne to nie dzieje się nic.

W odbiorniku możemy sterować czteroma urządzeniami, co daje nam w sumie 8 poleceń ( na każde urządzenie 2 polecenia - włącz i wyłącz).

Polecenie włączenia urządzenia wygląda następująco: "Sn=ON", gdzie "n" numer urządzenia(od 1- 4). Analogicznie polecenie wyłączenia wygląda następująco: "Sn=OFF". Przykładowo aby włączyć urządzenie podpięte do pierwszego gniazda w przeglądarce wpisujemy: http://adres_serwera/haslo/S1=ON





Aplikacja na system Android

Aplikacja została stworzona przy użyciu MIT App Inventor 2. Do poprawnego działania aplikacji należy w ustawieniach podać adres serwera oraz hasło. Następnie dodajemy polecania poprzez wpisanie bądź wprowadzenie głosowe oraz wpisanie kodu url. Wybieranie polecenia może nastąpić poprzez komendę głosową lub też wybranie komendy z listy dostępnych komend.


Menu główne aplikacji




Moduł ENC28J60

Moduł ENC28J60 firmy Microchip jest autonomicznym kontrolerem sieci Ethernet,  kompatybilnym ze standardem IEEE 802.3. Jedne z najważniejszych własności układu to praca w trybach Full Duplex i Half Duplex, retransmisja po wykryciu kolizji, usuwanie błędnych pakietów, programowe mechanizmy detekcji polaryzacji.

Komunikacja z modułem odbywa się za pomocą interfejsu SPI z maksymalną prędkością 20MHz. Zakres napięcia zasilania modułu jest od 3,1V do 3,6V, ale piny interfejsu SPI akceptują 5V. Biblioteki do modułu ENC28J60 oraz przykłady realizacji serwera http są ogólnodostępne w sieci na prawach licencji "GNU GPLv2".




Moduł RFM73

Moduł RFM73 firmy HOPERF Electronic to radiowy transmiter niskiej mocy działający na nośnej 2,4 GHz. Moduł RFM73 podobnie jak moduł ENC28J60 do komunikacji z mikrokontrolerem używa interfejsu SPI. Moduł może być zasilany napięciem od 1,9 V do 3,6 V, ale piny interfejsu SPI modułu RFM73 też akceptują 5V.

Do najważniejszych cech wyróżniających moduł jest wyjątkowo niski pobór prądu: 3 µA w trybie Power_Down; 50 µA w trybie oczekiwania na dane; 400 µA w trybie transmisji lub odbioru. Dodatkowym atutem jest możliwość regulowania mocy wyjściowej w zakresie od -40dBm do 5dBm.

Biblioteki do obsługi modułu znajdują się na stronie producenta, lecz wymagają kilku przeróbek aby mogły współpracować z mikrokontrolerami AVR. Ja zdecydowałem się użyć bibliotek Woutera van Ooijena zamieszczonych  w sieci, ponieważ jest ona dostępna do swobodnego korzystania i modyfikowania na prawach licencji "zlib". Biblioteki te, również wymagają kilku kosmetycznych zmian, takich jak zmienienie funkcji transmisji SPI.




Komunikacja SPI

Jako że oba moduły korzystają z interfejsu SPI, postanowiłem zrobić osobną bibliotekę do obsługi tego interfejsu. Biblioteka zawiera tylko dwie funkcje. Pierwsza z nich służy do inicjalizowania SPI natomiast druga do transmitowania danych.


spi.h

/*
 * spi.h
 *
 * Created: 2014-01-13 18:57:03
 *  Author: Michał Mazur
 */ 


#ifndef SPI_H_
#define SPI_H_

// Includes -------------------------------------------------
#include <avr/io.h>

// Defines -_------------------------------------------------
#define SPI_PORT  PORTB
#define SPI_DIR_PORT DDRB 
#define SPI_MOSI  PORTB3
#define SPI_MISO  PORTB4 
#define SPI_SCK   PORTB5
#define SPI_SS   PORTB2
// Functions ------------------------------------------------
void SPI_Init(void);
uint8_t SPI_Transmit(uint8_t data);


#endif /* SPI_H_ */



spi.c

/*
 * spi.c
 *
 * Created: 2014-01-13 18:57:15
 *  Author: Michał Mazur
 */ 


// Includes ----------------------------------------
#include "spi.h"


/***************************************************
Opis: Funkcja inicjalizuje SPI  
 **************************************************/ 
void SPI_Init(void)
{
 //Ustaw MISO jako wejście
 SPI_DIR_PORT &= ~(1<<SPI_MISO); 
 //Ustaw MOSI i SCK jako wyjścia
 SPI_DIR_PORT |= (1<<SPI_MOSI) | (1<<SPI_SCK);
 //Ustaw SS jako wyjście
 SPI_DIR_PORT |= (1<<SPI_SS);
 //Ustaw MOSTER MODE i odblokuj SPI    
 SPCR = (1<<SPE) | (1<<MSTR);
 //Podwójna prędkość SPI (fosc/2)
 SPSR |= (1<<SPI2X);
}


/***************************************************
Opis: Funkcja wysyła i odbiera bajt poprzez interfejs SPI
 **************************************************/ 
uint8_t SPI_Transmit(uint8_t data)
{
 //Wyślij dane
 SPDR = data;
 //Czekaj na zakończenie transmisji
 while(!(SPSR & (1<<SPIF)));
 //Zwroc dane
 return SPDR;
}



W funkcji inicjalizującej na początku ustawiane są kierunki pinów biorących udział w transmisji SPI, czyli SCK i MOSI ustawiamy jako wyjścia, a MISO jako wejście. Należy również pamiętać, aby na początku ustawić pin SS jako wyjście. W rejestrze  kontroli SPI (SPCR) ustawiamy bity MSTR, który włącz tryb master oraz SPE, który odblokowuje interfejs SPI.

Następnie w rejestrze statusu SPI (SPSR) ustawiamy bit SPI2X, który zwiększa prędkość transmisji SPI dwukrotnie, co ostatecznie daje nam prędkość fosc/2.

W przypadku wysyłania danych jako argument funkcji SPI_Transmit podajemy bajt, który chcemy wysłać. Bajt ten trafia do rejestru danych po czym jest automatycznie wysyłany. Następnie należy poczekać na zakończenie transmisji. Stanie się to gdy bit SPIF w rejestrze statusu SPSP przejdzie w stan wysoki.

W przypadku wysyłania zwracana dana nie ma dla nas znaczenia. Jeśli natomiast chcemy odebrać daną(bajt) to jako argument funkcji podajemy 0. Po wyzerowaniu rejestru danych zaczynamy odbierać daną, która zapisywana jest do rejestru danych, a następnie po zakończeniu transmisji jest zwracana.





Układ mini serwera


Układ mini serwera od góry



Układ mini serwera od dołu


Podstawowym elementem układu jest mikrokontroler ATmega8 taktowany wewnętrznym zegarem 8MHz. Atmega zasilana jest napięciem 5V ze stabilizatora TS1117B. Na płytce dodatkowo znajduje się stabilizator 3,3V do zasilania modułów RFM73 oraz ENC28J60.

Całość jest zasilana z zasilacza 12V. Moduł RFM73 znajduje się bezpośrednio na płytce, natomiast połączenie z modułem ENC28J60 jest za pośrednictwem złącza IDC10. Dodatkowo na płytce jest złącze ISP do programowania oraz 3 pinowe złącze GOLDPIN podpięte pod piny UARTu mikrokontrolera Atmega8. UART nie jest wykorzystany w projekcie, ponieważ służył tylko do testowania programu.


Schemat układu mini serwera


Płytka PCB mini serwera


Program główny opiera się na analizowaniu otrzymywanych pakietów IP i przypadku wystąpienia komendy, jest ona wysyłana do odbiornika poprzez moduł RFM73. W programie głównym należy zmienić adres IP i MAC w zależności od swojej lokalnej sieci.

HomeControllerv2.c

Dondu: Niestety z powodu faktu, iż kod źródłowy zawiera elementy HTML nasz system kolorowania składni nie radzi sobie prawidłowo z tym problemem. Plik ten znajdziesz w załączniku na końcu artykułu.





Układ odbiornika


Układ odbiornika od góry


Układ odbiornika od dołu


Jako że układ przełącza napięcie sieciowe, to zasilanie podzespołów układu uzyskujemy bezpośrednio z sieci poprzez zastosowanie transformatora z mostkiem prostowniczym. Podobnie jak w układzie mini serwera, głównym układem sterującym jest ATmega8 taktowana wewnętrznym zegarem 8MHz. Poza układem zasilania oraz ukladem przełączania napięcia sieciowego na płytce znajduje się moduł RFM73 oraz złącza ISP do programowania oraz 3 pinowe złącze do UARTu.


Schemat układu odbiornika


Płytka PCB odbiornika.


Układ sterujący przełączaniem napięcia sieciowego składa się z optotriaka MOC3041 oraz z triaka BT06. Sam układ MOC3041 ma za małą wydajność prądową, dlatego optotriak wbudowany w układ MOC3041 przełącza triak BTA06, który ma już wydajność  6 A.


Układ przełączania napięcia sieciowego


Układ przełączania napięcia sieciowego został połączony zgodnie z zaleceniami producenta układu MOC3041. Układ ten zapewnia izolację napięcia sieciowego od układu sterującego, dzięki zastosowaniu wewnątrz diody emitującej która po poprawnym spolaryzowaniu włącza triak.

Układ ten dodatkowo posiada detekcję zera sieci, dzięki czemu obciążenie będzie przełączane w chwil przejścia napięcia z sieci przez "zero". Takie rozwiązanie ogranicza zakłócenia i układ nie wpływa na inne włączone w sieć urządzenia.


Układ MOC3041


Program główny odbiornika polega na sprawdzaniu czy zastały odebrane dane przesłane do modułu RFM73 i podejmowaniu decyzji o przełączeniu stanu odpowiedniego gniazda jeśli dane będą zawierać poprawną komendę.

HomeController_Receiver.c

Dondu: Niestety z powodu faktu, iż kod źródłowy zawiera elementy HTML nasz system kolorowania składni nie radzi sobie prawidłowo z tym problemem. Plik ten znajdziesz w załączniku na końcu artykułu.






Kosztorys


Poniżej zestawienie elementów wraz z ich cenami w 2014r.

Lp. Element Ilość Wartość
1 Moduł ENC28J60 1 20zł
2 ATmega8a 2 10zł
3 Transformator 1 8zł
4 MOC3041 4 5,20zł
5 Triak BTA06 4 4zł
6 Moduł RFM73 2 20zł
7 Reszta - ok 5zł
Suma: 72,20 zł

Jak widać nie jest to szczególnie drogie urządzenie, a daje naprawdę spore możliwości w sterowaniu różnych urządzeń.




Do pobrania

Pliki programów i bibliotek oraz z projektem urządzenia: Zdalny_kontroler_urzadzen_sieciowych.rar (kopia)
Aplikacja na androida: aplikacja.rar (kopia)


4 komentarze:

  1. chciałbym zwrócić uwagę na mały błąd literowy w artykule:
    Układ sterujący przełączaniem napięcia sieciowego składa się z optotriaka MOC3041 oraz z triaka BT06. Triak zgodnie z kosztorysem i dalszą częścią artykułu to BTA06. Pozdrawiam

    OdpowiedzUsuń
  2. Cześć, czy te biblioteki do rfm73 można użyć do ATmega32+LCD i ATmega32+DS18B20? Plik spi też jest potrzebny? Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. Cześć.

      Odpowiem za autora:

      Po przeglądnięciu bibliotek rfm73 wygląda na to, że są napisane w sposób uniwersalny więc powinieneś spokojnie sobie poradzić z ich wykorzystaniem, pamiętając, że należy odpowiednio ustawić piny w pliku rfm73.h.

      Co do spi.h to oczywiście jest potrzebny.

      Usuń
    2. spi.c także oczywiście :)

      Usuń