Mikroserwer PIC18F67J60
Mikroserwer bazujący na mikrokontrolerze PIC18F67J60.
Układ PIC18F67J60 to mikrokontroler 8-bitowy z dużą ilością wbudowanej pamięci FLASH (128 kB) i zintegrowanym kontrolerem Ethernet i PHY analogicznym do popularniejszego "dostępnego luzem" ENC28J60.
Skuszony prostotą jednoukładowego mikroserwera wykonałem jego eksperymentalną wersję na niewielkiej jednostronnej płytce drukowanej z kawałkiem przestrzeni przypominającej płytkę uniwersalną.
Pierwszym oprogramowaniem które wypróbowałem był stos TCP/IP Microchipa zmodyfikowany przez Jorge'a Amodio. Ponieważ na płytce nie umieściłem pamięci EEPROM na system plików dla serwera www makro MPFS_USE_EEPROM powinno zostać wyłączone a pliki umieszczone w wewnętrznej pamięci FLASH (szczegółowy opis na ww. stronie w rozdziale "Building the code image").
Dodatkowy link (wygląda na to, strona ljcv.net jest w przebudowie): http://www.ljcv.net/library/en/en002b.pdf.
Schemat elektryczny mikroserwera PIC18F67J60 (pdf)
2010.05.05: Zwiększone pojemności przy pinie VCAP, datasheet zaleca min. 1uF, typ. 10uF (sumarycznie). Na schemacie
PCB pozostawione zostały obudowy 0805, łatwiejsze może być znalezienie kondensatorów 1..10uF w obudowie 1206
(nawet jako wyluty ze starej płyty głównej PC).
Schemat elektryczny + PCB (Eagle Light)
Biblioteka Eagle (5.0) z transformatorem Pulse H1102
Transformator Pulse H1102
Inne sugerowane transformatory
Do zaprogramowania mikrokontrolera niezbędny jest programator pickit 2, ICD2 lub podobny. Układ nie jest obsługiwany przez proste programatory pracujące na porcie szeregowym (JDM, COM84).
Zaskakujące cechy:
- "The Flash cells for program memory are rated to last 100 erase/write cycles". Typowa ilość cykli kasowania jest szacowana na 1000.
- Pobór prądu przez moduł Ethernet: max. 214 mA w trakcie transmisji - układ scalony nagrzewa się zauważalnie. Jeżeli całość zasilana będzie napięciem > ok. 6V przyda się drobny radiator na stabilizatorze lub dodanie szeregowych diod w celu obniżenia napięcia.
Układ pracuje obecnie jako "termometr" mierząc temperaturę, wilgotność i ciśnienie powietrza.
Spakowane źródła projektu (MPLAB 8.14 + C18): MCHPTCP_v3.75.6.7z.
Ponieważ MPLAB korzysta z bezwzględnych ścieżek do narzędzi przy otwarciu projektu konieczne będzie
prawdopodobnie potwierdzenie zmiany ścieżek kompilatora C18.
Dane pomiarowe udostępniane są na żądanie przy połączeniu z serwerem tcp na porcie 7777 oraz cyklicznie składowane są w bazie
danych za pośrednictwem protokołu http.
Źródła klienta http zawarte są w pliku tcp_client_ex1.c. Wymagana jest docelowego hosta (some_host.com) i wywoływanego
pliku (hidden.php):
BYTE ServerName[] = "www.some_host.com"; WORD ServerPort = 80; BYTE httpPost1[] = "POST /hidden.php HTTP/1.0\r\n"\ "Host: some_host.com\r\n" "Content-type: application/x-www-form-urlencoded\r\n" "Content-length: ";
Przykładowy plik php interpretujący dane i zapisujący do bazy:
<?php $string=$_POST['s']; connect_to_database(); // replace with your code $n = sscanf($string, "Temp: %fC RH: %d%% %dhPa", $temperature, $humidity, $pressure); $result = mysql_query("insert into logi_temp (temp,czas) values('$temperature',NOW())",$db); if (result) $result = mysql_query("insert into logi_rh (rh,czas) values('$humidity',NOW())",$db); if (result) $result = mysql_query("insert into logi_pressure (pressure,czas) values('$pressure',NOW())",$db); ?>
Skrypt php przetestować można używając narzędzia curl:
curl --data-urlencode "s=Temp: -3.4C RH: 81% 1021hPa" www.tomeko.net/hidden.php
Kod mikroserwera nie zawiera w tym momencie funkcji urlencode (lenistwo) generując zapytanie które jest niepoprawnie sformułowane i może nie być akceptowane przez wszystkie serwery HTTP, jest to odpowiednik testu:
curl -d "s=Temp: -3.4C RH: 81% 1021hPa" www.tomeko.net/hidden.php
Dla bezpieczeństwa wskazane jest dodanie funkcji urlencode lub sformułowanie zapytania w taki sposób any nie wymagało kodowania.
Uaktualnienie: wskazana jest modyfikacja źródeł, podstawienie innego (i unikalnego w skali projektu) numeru portu źródłowego niż zerowy w pliku dns.c, MySocket = UDPOpen(0, &Remote, DNS_PORT);. Pozostawienie wartości zerowej skutkuje losowym niedziałaniem klienta DSN (brak odpowiedzi z serwera).