sobota, 15 marca 2014

Historia jednej płytki: Internet rzeczy, czyli kocioł Buderusa (cz.2)

Sterownik NetIO

Tak jak pisaliśmy w poprzedniej części: "Historia jednej płytki (cz. 1)", elementem pośredniczącym pomiędzy adapterem EMS a Ethernet'em będzie prosty kontroler firmy Pollin o nazwie AVR NetIO (link tutaj)
Sterownik AVR-NET-IO firmy Pollin
Choć koszt samej płytki nie jest duży (€19.90), to niestety trzeba się liczyć z niemałym kosztem przesyłki do Polski. Dodatkowym wydatkiem - i to kilkudziesięciu złotych - jest również wymiana mikrokontrolera ATmega32 znajdującego się w zestawie: należy zastąpić go wersją ATMEGA644P 20PU. Ma ona drugi wolny port szeregowy, który nie jest zablokowany jako UART0 przez MAX232.
Oszczędność kosztów energii można uzyskać poprzez bezpośrednie zasilanie 5V/1A na złącze  "J6" NET-IO. Ten sposób zasilania, potwierdzony doświadczeniami autora, pozwala również zasilić płytę adaptera (poprzez 10-pinowe złącze).

Oprogramowanie Ethersex

Tak, Wasze skojarzenia są prawidłowe. Zwłaszcza że logo "Ethersex" nie wymaga żadnego dodatkowego komentarza....
Chodzi oczywiście o niezwykle prostą w konfiguracji platformę, która nawet osobom nie będącym biegłymi w programowaniu mikrokontrolerów pozwala samodzielnie zbudowanie działającego i kompletnego oprogramowania.

Pobranie pakietu Ethersex możliwe jest poprzez stronę GitHub: https://github.com/ethersex/ethersex/. W Ethersex Wiki można znaleźć wyczerpujące instrukcje instalacji i konfiguracji, tak więc nie będziemy się tutaj na ten temat rozpisywać. Natomiast niejaki Danny Baumann (zwany "Danny") dodatkowo zintegrował w Ethersex "układ ramkowania EMS", więc nasza instalacja staje się jeszcze prostsza. Dziękujemy Danny!

Po ściągnięciu plików i rozpakowaniu (tak! na serwerze Lunux'owym!), możemy przystąpić do wyboru konfiguracji. Uruchamiamy terminal, przechodzimy do katalogu, w którym rozpakowaliśmy Ethersex i  wpisujemy polecenie "make menuconfig" a następnie zaznaczamy opcje jak poniżej:

General setup --->
  (AVR) Target Architecture   
  (ATmega644P) Target MCU 
  (16000000) MCU frequency 
  (NetIO) Hardware / Periphery Class 
  [*] Status LEDs --->      
    [*] Status LED (Transmitted) 
    [*] EMS TX      
    [*] Status LED (Received)    
    [*] EMS RX OK      
    [*] Status LED (Error)   
    [*] EMS RX Failure   
  [*] VFS (Virtual File System) support --->    
    [*] VFS file inlining --->    
      [*] Inline IO 
      [*] Inline ADC 
      [*] Inline OneWire 
      [*] Support Inline SVG

Network --->; 
  Host Name: "EMS" 
  (500) Network Buffer Size 
  [*] Ethernet (ENC28J60) support --->
    MAC address: "the MAC address from the label of the ATmega32 Enter" 
    --- Static IPv4 configuration 
      - IP address: "192.168.xxx.xxx" 
      - Netmask: "255.255.255.0" 
  [*] TCP support 
  [*] ICMP support

I / O --->
  (Simple) I / O abstraction model (Port I / O) 
  [*] Onewire support ---> 
    [*] Onewire device detection support

Protocols --->
  [*] ECMD (Ethersex Command) support ---> 
    [*] TCP / Telnet 
    (2701) TCP port 
  [*] EMS Support ---> 
    (64) EMS Buffer Length 
    (7950) EMS TCP port 
    [*] Statistics ECMD

Applications --->
  [*] System clock support ---> 
    [*] Date and Time support 
    TimeZone ---> 
      (60) Local time offset to UTC (minutes) 
      --- Daylight saving 
      (60) Time offset (minutes ) 
      --- Begin of daylight saving 
      (3) Month (1-12) 
      (5) Week (1-5) 
      (0) Day of week (0-6) 
      (2) Hour (0-23) 
      --- End of daylight saving 
      (10) Month (1-12) 
      (5) Week (1-5) 
      (0) Day of week (0-6) 
      (3) Hour (0-23) 
    [*] HTTP server ---> 
      (80) HTTP port (default 80) 
      (8000) HTTP alternative port (default 8000)

AVRDUDE configuration ---> 
  If you work with AVRDUDE: 
  Select your programmer. 
  
The fuses are assigned as follows:    
  (e7) Fuse Low byte (FLB) 
  (dc) Fuse High byte (FHB)   
  (ff) Extended Fuse byte (EFB)

Po dokonaniu konfiguracji polecenie "make show-config" powinno zwrócić następujące informacje:

MCU: atmega644p
Hardware: netio

These modules are currently enabled: 
======================================
 * ADC * ADC_INLINE * CLOCK * CLOCK_CPU * CLOCK_DATETIME * ECMD_PARSER
 * ECMD_TCP * EMS * ENC28J60 * ETHERNET * HTTPD * HTTP_FAVICON * I2C_MASTER
 * I2C_PCF8574X * ICMP * IPV4 * IRMP * NET * NTP * ONEWIRE * ONEWIRE_DETECT
 * ONEWIRE_DETECT_ECMD * ONEWIRE_INLINE * PORTIO_SIMPLE
 * STATUSLED_EMS_RX_FAIL * STATUSLED_EMS_RX_OK * STATUSLED_EMS_TX
 * STATUSLED_ERROR * STATUSLED_RX * STATUSLED_TX * TCP * UDP * UIP * UPTIME
 * VFS * VFS_INLINE * VFS_INLINE_INLINESVG * VFS_IO_INLINE * WHM

Oczywiście moduły takie jak: przetwornik analagowo-cyfrowy (ADC), mini serwer webowy (HTTPD), interface OneWire czy VFS są niezależne od oprogramowania EMS i mogą być w miarę potrzeb i życzeń włączane lub wyłączane.
Ostatecznie, zanim skompilujemy przygotowaną konfigiracę potrzebne są jeszcze zmiany w pliku"./pinning/hardware/netio.m4":

ifdef (`conf_ONEWIRE ',` dnl 
  / * OneWire port range * / 
  ONEWIRE_PORT_RANGE (PD5, PD5) 
') dnl 

ifdef (`conf_EMS ',` 
  pin (EMS_UART_TX, PD3) 
') 
ifdef (`conf_STATUSLED_EMS_TX ',` 
  pin (STATUSLED_EMS_TX, PD4, OUTPUT) 
') 
ifdef (`conf_STATUSLED_EMS_RX_OK ',` 
  pin (STATUSLED_EMS_RX_OK, PD6, OUTPUT) 
') 
ifdef (`conf_STATUSLED_EMS_RX_FAIL ',` 
  pin (STATUSLED_EMS_RX_FAIL, PB0, OUTPUT) 
')

Przypisanie portów w ATmega644P jest teraz następujące:
PD2 = RX
PD3 = TX
PD4 = LED TX
PD5 = 1-Wire
PD6 = LED RX OK
PD7 = n/c
PB0 = RX LED FAIL

Teraz już tylko pozostaje nam polecenie "make" i powiniśmy otrzymać plik typu .hex"ethersex.hex", który możemy wprogramować do naszej ATmegi644P.

WAŻNE!

Podczas programowania ATmegi należy pamiętać o poprawnym ustawieniu "fuse-bitów". Muszą mieć one następujące wartości:
Fuse Low byte (FLB) = e7,
Fuse High byte (FHB) = dc,
Extended Fuse byte (EFB) = ff

W moim przypadku złe ustawienie fuse-bitów spowodowało taktowanie ATmegi zegarem dzielonym 8x, więc działał, ale nie nadążał czytać telegramów EMS m(.

Hexfile

Jeśli nie chemy, nie umiemy lub nie możemy wykonać powyższych kroków, można skorzystać z gotowego pliku, który znajduje się tutaj.

Uwaga! w powyższym skompilowanym pliku adres IP ustawiony jest na: 192.168.0.0, a MAC na FF: FF: FF: FF: FF: FF (broadcast).
Należy to odpowiednio zmienić! W Net-IO jest to możliwe poprzez przeglądarkę w następujący sposób:

  1. http://192.168.0.0/ecmd?mac "nowy MAC" (wpisujemy bez "". MAC swojego Net-IO można znaleźć na etykiecie naklejonej na ATmega32)
  2. http://192.168.0.0/ecmd?ip "nowe IP" (wpisujemy IP bez "").
Polecenie "... /ecmd?help" wyświetla wszystkie dostępne polecenia, a bardziej szczegółowo można zapoznać się z nim tutaj.

Co dalej?

W części 3 opiszemy, jak skonfigurować nasze Raspberry Pi, aby zbierało i prezentowało dane z EMS-Net-IO Adaptera.

Ogromne podziękowania dla Ingo Fischer - powyższy tekst powstał na bazie jego opracowania znalezionego pod adresem: http://ems-gateway.myds.me/dokuwiki/doku.php?id=wiki:ems:net_io
aktualizacja 2016-06-01: http://emswiki.thefischer.net/doku.php

Brak komentarzy: