HomeAtionMain – integrator-konwerter ENC28J60/NRF24L01+

HomeAtionMain – integrator-konwerter ENC28J60/NRF24L01+

Witam!

To mój pierwszy artykuł na portalu majsterkowo.pl. Chciałbym przedstawić zbudowany przeze mnie moduł łączący dwa światy komunikacji – sieć radiową opartą o moduły NRF24L01 oraz sieć LAN-Ethernet. Płytka ta w założeniu stanowi centralny punkt sterowania “moim inteligentnym domem”. Ma umożliwiać komunikację poprzez lokalną sieć Ethernet lub Wifi z czujnikami i układami wykonawczymi komunikującymi się tylko z wykorzystaniem połączenia radiowego 2.4GHz, wykorzystującego wspomniane powyżej moduły NRF24. Jest to pierwszy artykuł z cyklu. W następnych, będę przedstawiał moduły, które będą komunikowały się z HomeAtionMain. Zatem – do roboty.

Lista elementów:

Budowa
Na rys.1. przedstawiam schemat elektryczny układu z mikrokontrolerem Atmega z wyprowadzeniami do podłączenia modułu Ethernet i radiowego.

Schemat elektryczny modułu HomeAtionMainRys.1. Schemat elektryczny modułu HomeAtionMain

Numeracja pinów dla modułu NRF24:

  1. GNDNRF24L01
  2. 3V3
  3. CE
  4. CSN
  5. SCK
  6. MOSI
  7. MISO
  8. IRQ

Numeracja pinów dla modułu Ethernet:

  1. GND
  2. MOSI (SI)
  3. MISO (SO)
  4. SCK
  5. CS
  6. VCC (mój moduł jest zasilany napięciem 5V, przy 3,3V nie chciał współpracować)

Nie mając zbytniego doświadczenia w projektowaniu płytek PCB swój moduł poskładałem na płytce uniwersalnej. Żeby sobie jednak ułatwić zadanie narysowałem najpierw schemat rozmieszczenia elementów, przedstawiony na rys. 2.

Schemat modułu HomeAtionMain na płytce uniwersalnejRys.2. Schemat modułu HomeAtionMain na płytce uniwersalnej

Oprogramowanie wbudowane

Na koniec zostawiłem to, co zajęło mi najwięcej czasu, czyli oprogramowanie. Czasochłonność tego elementu wynikała głównie z konieczności znalezienia bibliotek obsługujących moduły: radiowy i Ethernet, które będą chciały ze sobą współpracować. Ponieważ oba moduły komunikują się z mikrokontrolerem za pomocą interfejsu SPI nie była to sprawa trywialna. Zatem na początek lista wykorzystywanych bibliotek. Źródła bibliotek są na Githubie i chciałem serdecznie podziękować ich autorom za ten wkład w rozwój OpenSource.

Powyższe biblioteki można ściągnąć w postaci plików .ZIP z Githuba i zainstalować w Arduino IDE w sposób opisany tutaj. Problem może być z biblioteką arduino-nrf24l01, gdyż w pliku ZIP jest jeden folder za dużo. Tutaj – przygotowany przeze mnie ZIP do instalacji w Arduino IDE.

Kod oprogramowania jest dosyć długi. Całość możecie znaleźć na Github – https://github.com/mariusz-pazur/arduino/blob/master/HomeAtion/homeation_main_simple/homeation_main_simple.ino. Poniżej umieszczam kilka fragmentów wraz z ogólnym opisem działania.

Na listingu 1 widzimy funkcję setupEthernet(). Służy ona do inicjalizacji biblioteki obsługującej moduł Ethernetowy. Rozpoczynamy od metody begin, która inicjalizuje bufor do odbierania i wysyłania danych, ustawia adres MAC modułu oraz określa pin CS (ang. chip select) dla komunikacji SPI. Następnie, zależnie od dyrektywy STATIC, następuje ustawienie statycznego adresu IP lub pobranie adresu z serwera DHCP. Na koniec uruchamiany jest nasłuch na porcie UDP (element dodatkowy w tym przykładzie – nie jest niezbędny do działania).

Na listingu 2 mamy funkcję inicjalizacji modułu NRF24. Musimy podać piny wykorzystywany jako CE (ang. chip enable) i CSN (ang. chip select not), adres lokalnego modułu, wielkość wysyłanej zawartości (ang. payload) oraz kanał nadawania (musi być taki sam po stronie odbiorczej i nadawczej). Dodatkowo wykonujemy jeszcze konfigurację modułu poprzez rejestr RF_SETUP. Gdy zajrzymy do noty katalogowej układu, to możemy sprawdzić, że powyższe bity ustawiają maksymalną moc nadawania przez radio oraz prędkość nadawania na 250 kb/s.

Na listingu 3 widzimy funkcję wysyłającą komendy i odbierającą odpowiedzi na nie, przez moduł NRF24. Dodatkowo przesyłane komendy są szyfrowane za pomocą algorytmu AES-256 (aes256_encrypt_ecb(…)). Przed wysyłką musimy ustawić adres modułu, do którego będziemy nadawać (Mirf.setTADDR(…)), a właściwa wysyłka jest realizowana za pomocą komendy Mirf.send(…). Protokół przeze mnie wymyślony do tej komunikacji zakłada, że na każdą wysłaną komendę przyjdzie odpowiedź. Oczekiwanie na odpowiedź odbywa się w pętli (Mirf.dataReady()), natomiast odczytanie danych realizujemy wywołując Mirf.getData(…). Odebrane dane są deszyfrowane (aes256_decrypt_ecb(…)).

Listing 4 przedstawia funkcję wykonującą ekstrakcję parametrów z zapytania HTTP do postaci tablicy bajtów. Przyjąłem założenie, że w żądaniu HTTP przychodzą 4 parametry typu uint8_t, które są przepisywane do tablicy bajtów, a następnie przesyłane drogą radiową. Powyższa metoda wyszukuje w linijce żądania znaki ‘=’ (rozdzielające kolejne parametry w zapytaniu HTTP), a następnie za pomocą funkcji atoi(…) konwertuje je do postaci liczb jednobajtowych. Przykładowe zapytanie – http://192.168.0.5/command?id=1&type=1&cmd=0&param=3.

Na listingu 5, w głównej pętli, program odbiera pakiety TCP i poszukuje w początkowych danych pakietu treści świadczącej o tym, że jest to żądanie HTTP – GET /command. Jeżeli takie żądanie zostanie rozpoznane, za pomocą funkcji z listingu 4 wyciągane są parametry żądania, następnie są one przesyłane drogą radiową (patrz listing 3), a odpowiedź od drugiej strony połączenia radiowego jest wstawiana w zdefiniowany w programie obiekt JSON i wysyłana jako odpowiedź na żądanie HTTP.

Poniżej zdjęcia zmontowanego i działającego modułu.

HomeAtionMain

Na koniec jeszcze filmik pokazujący współpracę modułu HomeAtionMain z elementem odbierającym komendy wysyłane drogę radiową – HomeAtion-RemotePower. Ponieważ to mój pierwszy wpis na tym portalu, na pewno sporo mu brakuje do ideału. Jestem otwarty na konstruktywną krytykę i sugestie usprawniające. W następnym wpisie postaram się przedstawić jak zaprojektować i wykonać moduł odbiorczy.

Ocena: 4.47/5 (głosów: 88)

Podobne posty

8 komentarzy do “HomeAtionMain – integrator-konwerter ENC28J60/NRF24L01+

    • Schemat był rysowany w programie Fritzing i tam są takie symbole masy i zasilania. Ostatnio się podszkoliłem trochę i nowe schematy staram się rysować w Eagle.

      Odpowiedz
  • Widzę tu bardzo dużo włożonej pracy i bardzo starannie wykonane urządzenie, mogę zapytać, czy nie lepiej byłoby skorzystać z napisanego już oprogramowania i bibliotek MySensors. Nie neguję pisania własnego, ale tak łatwiej byłoby o integrację projektu z kilkoma dystrybucjami serwera do automatyki, a sprzętowo dokładnie to samo.
    Co do pokazanego tu projektu i biblioteki do ENC24l01, czy nie zdarza się, że karta sieciowa zawiesza się niespodziewanie, z niewiadomych przyczyn i z różnymi odstępami czasu???
    Pozdrawiam

    Odpowiedz
    • Dzięki za dobre słowo. Projekt był realizowany półtora roku temu, kiedy MySensors było jeszcze w fazie beta. Napisanie własnego oprogramowania miało dla mnie wysoki walor dydaktyczny, gdyż był to mój pierwszy program na mikrokontroler. Jeśli chodzi o integrację z serwerami do automatyki to w tej chwili pracuję nad integracją z Domoticzem, więc nie widzę tutaj żadnych wad.
      Jeśli zaś chodzi o wieszanie się modułu Ethernet ENC28J60 to rzeczywiście miewa on problemy. Przy kilku requestach dziennie (gdy miałem tylko moduł do uruchamiania lampek na choince) właściwie nie było problemu. Jednak gdy podłączyłem czujniki temperatury, które wysyłają dane co minutę, moduł rzeczywiście zaczął się zawieszać w sposób losowy. Zaimplementowałem jednak rozwiązanie programowe, które w pewien sposób rozwiązuje ten problem.

      Odpowiedz

Odpowiedz

anuluj

Masz uwagi?