
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.


Mikroprocesory należące do tej rodziny
Device | Flash | SRAM | Ethernet TX/RX Buffer | I/O | 10-Bit A/D (ch) | CCP/ECCP | MSSP | SPI | Master I2C | EUSART | Comparators | Timers 8/16-Bit | PSP | External Memory Bus |
PIC18F66J60 | 64K | 3808 | 8192 | 39 | 11 | 2/3 | 1 | Y | Y | 1 | 2 | 2/3 | N | N |
PIC18F66J65 | 96K | 3808 | 8192 | 39 | 11 | 2/3 | 1 | Y | Y | 1 | 2 | 2/3 | N | N |
PIC18F67J60 | 128K | 3808 | 8192 | 39 | 11 | 2/3 | 1 | Y | Y | 1 | 2 | 2/3 | N | N |
PIC18F86J60 | 64K | 3808 | 8192 | 55 | 15 | 2/3 | 1 | Y | Y | 2 | 2 | 2/3 | N | N |
PIC18F86J65 | 96K | 3808 | 8192 | 55 | 15 | 2/3 | 1 | Y | Y | 2 | 2 | 2/3 | N | N |
PIC18F87J60 | 128K | 3808 | 8192 | 55 | 15 | 2/3 | 1 | Y | Y | 2 | 2 | 2/3 | N | N |
PIC18F96J60 | 64K | 3808 | 8192 | 70 | 16 | 2/3 | 2 | Y | Y | 2 | 2 | 2/3 | Y | Y |
PIC18F96J65 | 96K | 3808 | 8192 | 70 | 16 | 2/3 | 2 | Y | Y | 2 | 2 | 2/3 | Y | Y |
PIC18F97J60 | 128K | 3808 | 8192 | 70 | 16 | 2/3 | 2 | Y | Y | 2 | 2 | 2/3 | Y | Y |
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:

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).

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

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:

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:

Projekt płytki w Eagle:

Ściąganie papieru:

W trakcie trawienia:
Po wytrawieniu:

Po wyczyszczeniu acetonem:

Po przylutowaniu PICa w TQFP64:

W trakcie lutowania:


W trakcie programowania (płytka podłącza do mojego klona PICKIT2, który również jest opisany na DIY):


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:

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