Od pewnego czasu przymierzam się do zdalnej obsługi swojego shacku. Po pokonaniu problemu z przełączaniem anten zabrałem się za zabezpieczenie radia przy utracie łączności albo zawieszeniu się komputera. Wierzę konstruktorom Icoma, że radio nie da sobie zrobić krzywdy, jak się przy 100W PTT zawiesi na trzy godziny, ale nie chciałbym siać w eter (do momentu zwęglenia radia…. 😉 ).
I’m trying to operate my station remotely. After solving automatic antenna switching issue I turned my eyes to transceiver protection circuits, in case of PC crash or loss of connectivity. I trust Icom that the IC-7200 will not let the magic smoke after 3 hours of continous transmit, however I would like not to transmit anything without control.

Architektura

Całość zabezpieczenia musi się opierać o elementy sprzętowe, programowe i łączność.
overview
Część sprzętowa otrzymuje zmienny kod, który jest liczony zdalnie w aplecie klienta. Serwer nie posiada żadnej logiki do generowania kodu (odbiera gotowy kod z apletu klienta). Zabezpiecza to radio zarówno przed zawieszeniem komputera, jak i utratą łączności z komputerem.

Od strony sprzętowej potrzebna jest maksymalnie prosta i niezawodna konstrukcja, która musi działać niezależnie od komputera (czyli będzie potrzebny jakiś mikrokontroler). Przeglądając swój junk box natrafiłem na paczkę ATtiny25 – bardzo mały procek (8 nóg) z 2KB flasha. Od strony komputera miałem dostępne tylko złącza USB (szeregówki być może są gdzieś na pinach w środku…). ATtiny25 nie posiada sprzętowego kontrolera USB, więc stos USB musi być zrealizowany programowo (bit-bang). Istnieje gotowe programowe rozwiązanie stosu USB na AVRy – V-USB – zamienia praktycznie każdy mikrokontroler AVR w urządzenie USB low-speed. Wymaga jedynie szybkiego i odpowiedniego zegara mikrokontrolera oraz właściwego podłączenia mikrokontrolera do magistrali USB.

Sprzęt

Schemat mojego watchdoga wygląda następująco:
schematic

Mikrokontroler i reszta układu są zasilane napięciem 3,3V ze stabilizatora pobierającego prąd z kabla USB, żeby nie martwić się o dopasowanie poziomów logicznych do magistrali USB. Do obsługi USB wymagany jest stabilny zegar, co wymusza zastosowanie generatora kwarcowego (można wbudowany oscylator mikrokontrolera skalibrować do potrzeb USB, ale stabilność rozwiązania będzie zależna od temperatury). Mikrokontroler ma osiem nóg, po odjęciu dwóch na zasilanie, dwóch na kwarc, dwóch na USB zostają dwie wolne nogi na sterowanie elementami wykonawczymi. W układzie jest wykorzystana linia RESET procesora, więc trzeba go programować wysokonapięciowo poza układem (polecam AVR Dragon).

Elementem wykonawczym są tranzystory. Wykorzystałem tutaj TIP122 – lekko archaiczne rozwiązanie przy współczesnych MOSFETach, ale nie gorsze niż poczciwy ULN2003 i ULN2803. Oba w układzie otwarty kolektor – można spokojnie sterować przekaźniki 12V. W tranzystory są wpięte także dwa LEDy (a diody D1-D2 zabezpieczają je przed przebiciem np. przy 12V), które bezpośrednio pokazują stany wyjść. Do układu można dołączyć dalsze elementy wykonawcze w różnych kombinacjach:

  • przekaźniki z cewkami 12V sterujące 230VAC dla zasilacza radia
  • przekaźniki samochodowe z cewkami 12V sterujące 12VDC dla radia za zasilaczem (albo z akumulatora)
  • przekaźniki z cewkami 5V sterujące 230VAC dla zasilacza (przekaźniki można zasilać wprost z USB stąd dwa dodatkowe goldpiny na linii 5V USB)
  • optotriak i triak sterujący 230VAC dla zasilacza
  • wyjście RESET komputera przez transoptor albo bezpośrednio

„Podejrzane” rezystory i kondensatory przy tranzystorach są po to, żeby na tej samej płytce można było wykonać woltomierz z USB 🙂

Tak wygląda płytka watchdoga:
pcb

A tak pierwsze wykonane urządzenia:
watchdog

Firmware

Od strony firmwaru watchdog jest lekko przerobionym referencyjnym demem V-USB używającym klasy HID. Watchdog ma ustawiony (sztywno) timer na 60s, przy braku poprawnej transmisji od komputera wyłącza oba wyjścia. Każdorazowa paczka danych do watchdoga składa się z:

  • liczby 0x43 (początek pakietu)
  • kodu – dwóch liczb, druga większa od pierwszej o jeden, w każdym kolejnym pakiecie obie liczby są zwiększane o jeden (z przepełnieniem przy 255)
  • stanu wyjść – dwóch liczb 0/1 (1-włączony, 0-wyłączony)

Watchdog reaguje na komendy ustawienia wyjść po otrzymaniu trzech kolejnych poprawnych kodów.
USB jest dosyć wymagającym protokołem jeżeli chodzi o zasoby mikrokontrolera, po skompilowaniu całość zajęła 1920 bajtów flasha czyli akurat na styk 🙂

Software

Watchdog zgłasza się w systemie jako urządzenie USB klasy HID (tej samej co np. mysz i klawiatura), przez co nie wymaga dodatkowych sterowników. Podstawowym programem do obsługi jest hidtool z referencyjnego dema V-USB, który wysyła surowe bajty do urządzenia (umożliwia też odczyt niektórych wartości, ale jest to przydatne tylko przy debugowaniu). Napisałem prosty serwer TCP z weryfikacją poprawności danych na bazie shella i netcata (plik tcp_server.sh). Protokół sam w sobie nie jest szczególnie zabezpieczony, ale nie wprowadza dziur w systemie. Osobiście do zdalnego dostępu używam OpenVPNa.

Stronę zdalnego klienta obsługuje prosty applet javy (działa też jako zwykła aplikacja). Czas wysyłania pakietów powinien być krótszy od minuty.
applet

Całe rozwiązanie działa na Linuxie, Windowsie 7, MacOS X. Dla Windowsa jest potrzebny dodatkowo Cygwin. Zintegrowany serwer na Windowsa jest w przygotowaniu, podobnie jak binarka na routery z procesorami MIPS (OpenWRT) 🙂

Paczka: – – – > > schemat, płytka, firmware, software < < - - -

Praktyczne wykonanie

Pierwszego watchdoga wykorzystuję w swoim shacku KF. Wszystkie urządzenia mam zasilane buforowo z dużej żelówki, więc najprościej jest mi po prostu odcinać 12V do radia. Użyłem do tego dwa wysokoprądowe przekaźniki samochodowe. Cewki pobierają razem ok. 250mA. Na obu końcach są złącza DC w klubowym standardzie PUT-2000. Miałem obawy, czy noga RESET mikrokontrolera (ma trochę inną budowę) będzie w stanie wysterować tranzystor do nasycenia (inaczej strasznie by się grzał). W praktyce okazało się, że nie ma z tym problemu. Tranzystor przewodzący 250mA był jedynie lekko ciepły (co jest normalne przy bipolarach).
DC_watchdog_01

DC_watchdog_02

Aktualizacja 02.09.2014

Pierwotny serwer na bazie netcata i shella działał dobrze na Unixach, ale na Windowsie były spore problemy, na niektórych komputerach działał, na niektórych nie, więc napisałem prosty serwer w czystej Javie. Program musi mieć w swoim katalogu hidtool.exe (albo samo hidtool na Unixach). Nie pojawia się żadne okno (ale widać proces javaw.exe w managerze zadań), można skrót do jara dodać wprost do autostartu. Serwer po 25s niekatywności klienta zrywa połączenie i oczekuje na nowe (czyli po wciśnięciu stop w applecie trzeba odczekać 25s zanim start ponownie zadziała).
SERWER JAVA – – > > >AGXWatchdogServer_maven

Artur SP2AGX

Architecture

The whole solution consists of hardware, software and connectivity.
overview
(sieć – network, zmienny kod – rolling code).

The final hardware receives rolling code that is computed by a remote client applet. The server has absolutely no logic to generate such codes, therefore the transceiver is protected both from loss of conectivity (the watchdog will timeout) or computer crash.

The hardware should be as simple and reliable as possible, it must be able to run even when the PC crashes. While digging through my junk box I stumbled upon some ATtiny25 – a very small, 8-pin MCU with 2KB of flash. The PC had only USB ports available. ATtiny25 has no USB hardware support, however there is a software bit-bang USB stack for AVRs – V-USB. V-USB can turn any MCU into a low-speed USB device. It requires just two pins and a fast (eg. 12MHz), stable quartz oscillator.

Hardware

The schematic:
schematic

Everything is powered by a 3,3V USB bus-powered LDO. The MCU has to be run at 3,3V to avoid logic level problems with USB bus. Due to the supply voltage, the MCU can be only run at 12MHz. V-USB accepts only certain quartz fequencies. The internal RC generator can albo be calibrated for USB operation, however it can drift significantly with temperature, which is bad for overall system reliability. The MCU has eight pins: two for power supply, two for quartz, two for the USB bus so there are two legs free for output transistors. The RESET leg is also used, so the MCU has to be programmed outside the device using high-voltage serial programming (I used AVR Dragon).

Outputs are controlled by transistors. I picked TIP122 – not a cutting-edge part, however certainly not worse than a ULN2003 or ULN2803. A pinout-compatible MOSFET will also fit (it must have a low threshold voltage, like IRLZ44N). Both outputs are open-collector. There are also two leds to indicate output statuses (D1 and D2 protect them from reverse current at voltages like 12V). Some other components can also be used:

  • relays with 12V coils to cut 230VAC for radio’s PSU
  • automotive type 12V relays to cut 12VDC after the PSU (or when running the transceiver from a battery)
  • relays with 5V coils to switch 230VAC for the trasceiver PSU (5V relays can be powered directly from USB)
  • TRIAC and optocoupler to switch 230VAC PSU
  • PC reset wiring using an optocoupler (or directly)

„Odd” resistors and caps near the transistors are there to use the PCB for a USB voltmeter 🙂

PCB layout:
pcb

First completed devices:
watchdog

Firmware

The firmware is a modified V-USB reference demo enumarating as a HID class device. The watchdog has a hardcoded 60s timer, when not fed with proper codes both outputs will be disabled. Each data packet contains:

  • number 0x43 (magic number)
  • code – two numbers, the second larger than the first exactly by one, each following packet has to increment both numbers (with overflow at 255)
  • demanded output state – two numbers 0/1 (1-on, 0-off)

The device changes the outputs only after receiving three consecutive correct packets. USB is quite demanding for the firmware, so the compiled program occupies 1920 bytes of flash. Just right for 2KB 🙂

Software

The watchdog enumerates as a HID class device (the same as keyboards and mice), so no drivers are needed (even for Windows…). Main binary is hidtool from the reference V-USB demo, it sends raw bytes to the device (reading some data is also supported for debugging). I wrote a very simple TCP server with data verification using shell and netcat (file tcp_server.sh).
The protocol itself is not secure, however it does not introduce new vulnerabilities to the system. I use OpenVPN for remote access.

The remote client uses a simple Java applet (works also standalone). The interval between packets should be shorter than one minute/
applet

Everything works on Linux, Windows 7 and MacOS X. Windows additionally requires Cygwin. A MIPS binary for OpenWRT routers is on the way 🙂

Release: – – – > > schematic, PCB, firmware and software < < - - -

A working example

The first assembled watchdog is used in my remote HF shack. Everything in the shack is battery powered from a big AGM battery and solar panels, so the watchdog switches two 12VDC parallel relays from the battery to the radio. Both coils consume about 250mA. High-current connectors at both ends are our club standard PUT-2000. i was not sure if the MCU’s RESET pin will be able to fully drive a transistor to avoid heating losses (the pin has a slightly different construction than all others). It turned the transistor on without problems, the temperature increase is bearly sensable.
DC_watchdog_01

DC_watchdog_02

Update 02.09.2014

The original server based on netcat and shell turned out to be fine on Unixes, but terrible to work reliably on Windows. I wrote a simple server in pure Java. The server must have hidtool.exe (or hidtool binary on Unixes) in its working directory. After double clicking on the jar file no window appears, but the server continues to run and a javaw.exe is visible in the process manager. The server resets the connection after 25s of client inactivity (and then starts again, so after pressing stop in the applet you have to wait 25s for the system to establish a connection again).
JAVA SERVER – – > > >AGXWatchdogServer_maven

Tips:
BTC 15RXzysGYaV6sZnnztBFB9zupjNGDZysPj
LTC Ld1zhCLjvHmvmMFp9NKcTJU7AjAtSBmgaU

Artur SP2AGX


0 komentarzy

Dodaj komentarz