Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60

p.kaczmarek2 23 Dec 2016 16:32 3726 8
Automation24
  • Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Witajcie moi drodzy
    Dzisiaj chciałbym wam przedstawić prosty mikroserwer oparty o PIC18F67J60, czyli sposób na sterowanie diodami, światłem i odczyt czujników przez internet.
    Na bazie tego sterownika zrealizowałem proste sterowanie lampkami świątecznymi przez stronę WWW.
    Projekt wykonałem na własnej płytce z PIC w obudowie TQFP, ponieważ jestem przeciwny używaniu wszędzie gotowców takich jak Arduino i gotowe moduły pod Ethernet!!!

    Rodzina PIC18FxxJ60/PIC18FxxJ65
    Jest to jedyna znana mi rodzina PICów, które mają wbudowane wszystkie peryferia potrzebne do komunikacji Ethernetowej. Na pokładzie jest zarówno kontroler MAC i PHY, czyli nie potrzebna żadnych zewnętrznych modułów, by zkomunikować się z internetem. Nie potrzeba żadnego ENC28J60, wszystko jest w jednym scalaku.
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60 Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Mikroprocesory należące do tej rodziny
    DeviceFlashSRAMEthernet TX/RX BufferI/O10-Bit A/D (ch)CCP/ECCPMSSP SPIMaster I2CEUSARTComparatorsTimers 8/16-BitPSPExternal Memory Bus
    PIC18F66J6064K3808819239112/31YY122/3NN
    PIC18F66J6596K3808819239112/31YY122/3NN
    PIC18F67J60128K3808819239112/31YY122/3NN
    PIC18F86J6064K3808819255152/31YY222/3NN
    PIC18F86J6596K3808819255152/31YY222/3NN
    PIC18F87J60128K3808819255152/31YY222/3NN
    PIC18F96J6064K3808819270162/32YY222/3YY
    PIC18F96J6596K3808819270162/32YY222/3YY
    PIC18F97J60128K3808819270162/32YY222/3YY

    Ja wybrałem najmniejszego i najtańszego z nich, czyli PIC18F66J60, ponieważ cała konstrukcja to był duży eksperyment i nie miałem nawet pewności czy uda mi się metodą termotransferu wytrawić odpowiednią płytkę pod obudowę TQFP64 a potem całość dobrze zlutować...

    Tutaj warto wspomnieć o tym, że jest dużo PICów, np. z rodzin PIC32MX i PIC32MZ, które mają wbudowaną obsługę Ethernetu, ale do działania wymagają PHY na zewnętrznym chipie. Przykładowo PIC32MZ2048EFH064:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Zrzut ekranu z Datasheetu któregoś z PIC32MZ, w którym jest mowa, że do działania Ethernetu potrzebny jest zewnętrzny moduł PHY

    Dlatego jednak wybrałem rodzinę PIC18FxxJ60/PIC18FxxJ65, bo tylko ona ma na pokładzie wszystko co potrzeba do działania Ethernetu.

    Ciekawostka: Jak się na stronie Microchipa wejdzie Interfaces and Networking -> Ethernet -> Ethernet PIC MCUs, to na liście jest tylko PIC18F66J60 i PIC18F67J60. Pozostałe PICe z tej rodziny są pominięte, mimo iż również mają moduł Ethernet, zresztą takie sam jak tamte...



    Programowanie PIC18FxxJ60/PIC18FxxJ65
    PICe te stosunkowo łatwo można zaprogramować, obsłuży je najprostszy klon PICKIT2 (nie trzeba nawet aktualizować Devices.dat).
    Należy tylko pamiętać, że napięcie zasilania mikroprocesora wynosi 3.3V, 5V może go uszkodzić. Natomiast piny PGD/PGC są 5V tolerant, więc nie ma tego problemu co z PIC32MX (ich piny PGD/PGC mogą wymagać poziomów logicznych 0-3.3V, których proste klony PICKIT2 nie są w stanie wytworzyć).
    W przypadku mojej płytki wszystkie potrzebne piny (MCLR, PGD, PGC) są wyprowadzone, ale nie są ustawione razem w rzędzie (nie chciałem komplikować ścieżek).
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Zrzut ekranu z datasheetu rodziny PICów użytej w projekcie, pokazuje które piny/porty są 5V-tolerant

    Zalety i wady rozwiązania single-chip
    Rozwiązanie single-chip, tzn. mikroprocesor który zawiera wszystko, co potrzeba do komunikacji Ethernet (zarówno MAC i PHY).
    + mając Ethernet od razu w MCU nie trzeba się martwić komunikacją z zewnętrznym sterownikiem tak jak w przypadku ENC28J60
    + mniejszy rozmiar całości
    + bogate peryferia, SPI, I2C, pięć timerów i aż do 70 pinów IO
    + gotowy do odpalenia i łatwy w edycji przykład serwera HTTP w środowisku mikroC PRO for PIC
    - PIC18FxxJ60/PIC18FxxJ65 są dostępne tylko w obudowach pokroju TQFP, natomiast ENC28J60 jest nawet w DIP
    - PIC18FxxJ60/PIC18FxxJ65 wg. datasheetu wytrzymują około 100 cykli programowania

    Co należy zmienić w kodzie?
    Wsady HEX które udostępniam są skonfigurowane dla mojej sieci domowej.

    Jeślimy chcemy ustawić własne adresowanie, to musimy je przekompilować (w razie czego mogę to zrobić za was, mam mikroC PRO pod ręką, i udostępnić HEX). Do naszych potrzeb dostosowujemy następujące zmienne:
    - adres IP naszego urządzenia
    - adres IP routera (gateway)
    Opcjonalnie:
    - MAC naszego urządzenia
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60


    Skąd wziąć dane routera, IP, gateway?
    Na windowsie posłużyłem się komendą ipconfig /all. Wpisujemy ją w wierszu poleceń. Wyświetla ona informacje o stanie połączenia sieciowego urządzenia. Można tam znaleźć IP routera (gateway), adresy DNS oraz maskę naszej sieci:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Adres IP płytki dobieramy samodzielnie tak, by należał do naszej sieci i był wolny.

    Projekt płytki i wykonanie
    Jest to moja pierwsza konstrukcja z użyciem mikroprocesora w obudowie tak małej, jak TQFP64. Do tej pory używałem niemalże zawsze montażu przewlekanego (za wyjątkiem Pinguino2550 na PICu w obudowie SOIC). Nie chciałem sobie całości bardziej komplikować, dlatego w miarę możliwości część elementów pozostawiłem w montażu THT. Następną wersję tej płytki wykonam natomiast w pełni w SMD.
    Całość wykonałem metodą termotransferu i wyszła za pierwszym razem.

    Schemat wzorowałem na projektach z sieci oraz na tym z datasheetu PICa:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Projekt płytki w Eagle:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Ściąganie papieru:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    W trakcie trawienia:

    Po wytrawieniu:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Po wyczyszczeniu acetonem:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    Po przylutowaniu PICa w TQFP64:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60

    W trakcie lutowania:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60 Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60
    W trakcie programowania (płytka podłącza do mojego klona PICKIT2, który również jest opisany na DIY):
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60 Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60

    Parametry plytki
    Napięcie zasilania: 3.3V
    Pobór prądu przy wgranym "Blink Ethnernet Leds": 0.03A
    Pobór prądu po uruchomieniu Ethnernetu z poziomu kodu: 0.15A (czasem 0.17A)
    Po chwili jedna dioda się ciągle świeci, druga bardzo rzadko mrugnie.

    Użyte rezystory: 4x 49.9 Ohm 1% (kupione specjalnie pod ten projekt)
    Natomiast do testowania można użyć dwóch rezystorów 100Ohm w parach, tak by wyszło rezystancja wynikowa 50Ohm.
    Rezystor RBIAS 2.26k wzięty z paska 2.2k (akurat w miarę pasowała rezystancja)
    Ferrite Bead - z wylutu, nie mierzony. W datasheecie jest mowa, że powinien mieć 120Ohm. Na płytce ENC28J60-MOD użyty jest FB/0805/600.
    Transformatorek Ethernet: H1102NL, czyli osobny od gniazda (istnieją takie połączone z gniazdem RJ45, ale ja miałem już osobne gniazdo więc dokupiłem tylko H1102NL)

    Testowanie plytki
    Płytkę testowałem na bieżąco w trakcie tworzenia i lutowania elementów. Wyróżniłem nastepujące kroki:
    1. po przylutowaniu PICa, kondensatora VCAP oraz LDO 3.3V z kondensatorami odsprzęgającymi, sprawdziłem czy PIC jest widziany przez PICKIT2. Od razu został rozpoznany.
    2. po dolutowaniu rezonatora kwarcowego, rezystora 10k oraz diód LED wraz z resystorami wgrałem mój hex PIC18F67J60, by sprawdzić czy diody mrugają i czy UART działa. Oba testy również wypadły pomyślnie.
    3. dopiero wtedy dolutowałem transformatorek separujący, gniazdo RJ45 i resztę osprzętu dla Ethernetu i wgrałem HTTP demo z adresami IP poprawionymi pod moją sieć. Po chwili pobór prądu płytki wzrósł do 0.15A, zapaliła się jedna z diod LED a oczekiwana strona WWW była dostepna pod ustawionym przeze mnie adresie IP! Pełny sukces!

    Praktyczne Zastosowanie - sterowanie lampkami
    Kod stanowi przerobioną wersję przykładu dla EasyPICv7 (PIC18F87J60) z mikroC PRO for PIC. W zasadzie wystarczyło zmienić w ustawieniach projetu na odpowiedniego PICa oraz ustawić odpowiednie parametry sieci. Do tego zmodyfikowałem kod HTML stronki by zawierał tylko to, co jest potrzebne.
    Sterowanie lampkami odbywa się poprzez przekaźnik na 5V (w zasadzie z pinu digital PICa jest napięcie 3.3V a nie 5V, ale przekaźnik i tak działa).

    Najprostsza możliwa stronka WWW:
    Sterowanie świątecznymi lampkami przez sieć Ethernet - 100% DIY - PIC18F67J60

    Filmik pokazujący działanie w praktyce (sterowanie lampkami przez przeglądarke WWW na telefonie):




    Podsumowanie
    Projekt uważam za udany. Był to pierwszy projekt w którym użyłem części w obudowie TQFP. Płytkę wykonałem metodą termotransferu ale o dziwo nie było z nią kłopotów (ani z trawieniem, ani z lutowaniem). Również odpalenie Ethernetu poszło sprawnie. Wsad oparty o demo http płytki EasyPICv7 po ustawieniu IP zadziałal od razu.

    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • Automation24
  • #2
    mariomario
    Level 18  
    ciekawy projekt

    a dało by się tym jakoś sterować z zewnątrz (z internetu) bez stałego IP ?
  • Automation24
  • #3
    maliniak80
    Level 17  
    Quote:
    a dało by się tym jakoś sterować z zewnątrz (z internetu) bez stałego IP ?

    Bez stalego IP da sie jak najbardziej, mozna skorzystac z jakiegos serwisu np. noip.com i ustawic odpowiednia opcje w routerze zeby aktualizowal adres, natomiast problem jest jak dostawca blokuje porty, wtedy nie ma szans dobicia sie z zewnątrz, tak jest przykladowo u dostawcow sieci komórkowych
  • #4
    p.kaczmarek2
    Moderator Smart Home
    mariomario wrote:

    a dało by się tym jakoś sterować z zewnątrz (z internetu) bez stałego IP ?


    Co masz na myśli poprzez "stałe IP"? Chodzi Ci o IP domowe, czy o uruchomienie DHCP na płytce?

    Tutaj jest duże pole do popisu, bo można nawet np. zaprogramować tę płytkę tak, by miała rolę klienta a nie serwera i komunikowała się z serwerem znajdującym sie w sieci. Wtedy nie ograniczaja nas żadne zmienne IP, NATy, itp. Jak będzie większe zainteresowanie (dużo plusów) to zrobię i to i wrzucę przykład na DIY.

    EDIT:
    maliniak80 wrote:
    natomiast problem jest jak dostawca blokuje porty, wtedy nie ma szans dobicia sie z zewnątrz, tak jest przykladowo u dostawcow sieci komórkowych

    Rozwiązanie o którym napisałem wyżej (płytka w roli klienta, najlepiej HTTP lub TCP dowolny wolny port) omija ten problem.
  • #5
    Pan Rak
    Level 12  
    maliniak80 wrote:
    natomiast problem jest jak dostawca blokuje porty, wtedy nie ma szans dobicia sie z zewnątrz, tak jest przykladowo u dostawcow sieci komórkowych

    No nie do końca, można zainwestować w jakiś niedrogi VPS, np. w DigitalOcean (~25zł/msc) i postawić serwer VPN, albo najprostszy tunel SSH.
  • #6
    mariomario
    Level 18  
    p.kaczmarek2 wrote:
    mariomario wrote:

    a dało by się tym jakoś sterować z zewnątrz (z internetu) bez stałego IP ?


    Co masz na myśli poprzez "stałe IP"? Chodzi Ci o IP domowe, czy o uruchomienie DHCP na płytce?

    Tutaj jest duże pole do popisu, bo można nawet np. zaprogramować tę płytkę tak, by miała rolę klienta a nie serwera i komunikowała się z serwerem znajdującym sie w sieci. Wtedy nie ograniczaja nas żadne zmienne IP, NATy, itp. Jak będzie większe zainteresowanie (dużo plusów) to zrobię i to i wrzucę przykład na DIY.

    EDIT:
    maliniak80 wrote:
    natomiast problem jest jak dostawca blokuje porty, wtedy nie ma szans dobicia sie z zewnątrz, tak jest przykladowo u dostawcow sieci komórkowych

    Rozwiązanie o którym napisałem wyżej (płytka w roli klienta, najlepiej HTTP lub TCP dowolny wolny port) omija ten problem.



    Dokładniej to chodziło mi o zmienne publiczne IP, z zablokowanymi portami z zewnątrz (internet LTE). A konkretniej to czy da się ten projekt zrobić coś na podobnej zasadzie co ten projekt w internecie Link , a jeszcze lepiej jakby komunikacja odbywała się w 2 strony.. :)

    np aby z internetu można było włączyć lampki choinkowe, a wysyłane byłyby informacje o tym czy lampki się włączyły (feedback) + może napięcie zasilające na lampkach

    oczywiście bez użycia takich usług jak https://ubidots.com/ albo https://thingspeak.com/ (do gromadzenia wysłanych danych) :)
  • #7
    p.kaczmarek2
    Moderator Smart Home
    Opisana przeze mnie wyzej metoda pozwoliłaby na komunikację w obie strony bez względu na brak publicznego IP, aczkolwiek lampki mogłyby się załączać z pewnym opóźnieniem.

    @mariomario, na jak szybkiej reakcji na sterowanie Ci zależy?

    Zaktualizowałem pierwszy post - dodałem zdjęcia mojego klonu PICKIT2 podłączonego do płytki (czyli całość w trakcie programowania).
  • #8
    IS
    Level 17  
    Można znaleźć tańsze VPSy niż 25zł/m., także w Polsce. Wtedy wszelakie łączności poprzez sieć komórkową przestają być większym problemem. Nie musimy mieć żadnych dodatkowych serwisów za pośredników. Jednak poziom trudności w konfiguracji jest "trochę" większy niż konfiguracja DynDNS na domowym routerze.
    1. Na VPS musimy ustawić podstawowe dane o sieci, routingu, maskaradę itp
    2. Urządzenie po drugiej stronie tunelu musi w ogóle mięć możliwość łączenia się np. poprzez OpenVPN,. Do tego dochodzi kwestia skonfigurowania routingu, najlepiej ze znaczeniem pakietów aby główny ruch np. do Internetu odbywał się poza VPN.

    Osobiście mam taką sieć skonfigurowaną od roku, VPS wyniósł poniżej 100zł, do tego dochodzi tania domena za ok.10zł. Mam tak podłączone parędziesiąt urządzeń, także podgląd z monitoringu i jedną sieć w UK. Wszystko działa jak trzeba.
  • #9
    mariomario
    Level 18  
    VPS i VPN - tak pewnie da się, tylko czy trzeba strzelać do muchy z armaty ? Myślałem o czymś prostszym co umożliwi obustronną komunikację dowolnego komputera podpiętego do internetu oraz ESP8266 podłączonego też do internetu ale za pomocą wspomnianego wcześniej 3G/LTE (przy założeniu czasu reakcji w dowolną stronę ~ <10s) :


    Wysyłanie informacji (feedback) z ESP8266 do dowolnego komputera/smartfona/tabletu z przeglądarką internetową
    1.) na ESP8266 postawić web client, tak aby z poziomu ESP8266 można było wchodzić na dowolny link (np. http://xxxxx.xx/logikaDlaESP8266.php?state=off , gdzie xxxxx to nasza dowolna domena nawet i na darmowym serwerze www wraz z logiką w PHP gdzie state=off lub state=on to część linku pod które ma wejść nasze ESP8266 i tym samym "zwrócić" informację o stanie np. pinu.
    2.) "prosta logika" na serwerze www, napisana w PHP zapisuje do pliku tekstowego odebrany stan on lub off (po wejściu przez ESP w dany link)
    3.) ciąg dalszy logiki w PHP - sam pobiera z tego pliku tekstowego informację o zapisanym stanie on/off i wyświetla go na stronie www, odświeżając stronę co kilka sekund
    4.) od tego momentu można pokusić się o napisanie prostej aplikacji na androida (opartej o jakąś prostą przeglądarkę) do wyświetlania i sterowania ESP8266 lub aplikacji na PC
    Ps. Idąc dalej tym tokiem rozumowania można zamiast on/off, wysyłać z ESP np wartość ADC. A nawet wiele zmiennych. Dodatkowo aby podnieść poziom bezpieczeństwa można by zamiast metody wysyłania informacji GET użyć POST i połączenia https, a zebrane informacje trzymać w bazie danych a nie w pliku na serwerze.


    Wysyłanie informacji z komputera/tabletu/smartfonu z przeglądarką do ESP8266
    1.) http://blog.nyl.io/esp8266-led-arduino/



    Trzeba tylko powyższe części połączyć w całość. Czym aktualnie się zajmuję, ale zapytałem tu na forum - bo myślałem, że może ktoś już wcześniej dokonał czegoś podobnego i niekoniecznie na ESP8266 / Arduino / raspberry (bez używania VPS / VPN / ubidots / thingspeak).