Uruchomienie litery z tablicy dworcowej, część III

Nie miałem jeszcze zrzuconego programu ze sterownika, więc postanowiłem spróbować metody brute force – do programu generującego przebieg prostokątny dodałem możliwość sterowania czterema pozostałymi pinami – ustawiając ich stan na niski, wysoki, lub co najważniejsze – losowy, zmieniający się z każdą zmianą stanu pinu zegarowego. Dodałem też możliwość generowania różnych ciągów losowych na różne piny, lub użycia jednego na kilku. Na koniec zaimplementowałem bardzo ważną funkcję – zapamiętywanie tego, co zostało wysłane i przerywanie transmisji za dotknięciem jednego klawisza. Ponownie podłączyłem moduł do płytki rozwojowej za pomocą zapałek i uruchomiłem zasilanie.

Po poprawnym resecie wydałem pierwsze polecenie – losowy przebieg na A1. Chwila oczekiwania i… nic. Losowy przebieg na A6 – to samo, głuche nic. Te same losowe wartości na A1 i A6 – nic. Losowe, różne od siebie, wartości na A1 i A6? Czekam… czekam… i wtem silnik kręci! Podekscytowany czekałem na zatrzymanie i obejrzałem pełny obrót modułu. Po prostu wrócił do pozycji początkowej – prawdopodobnie mikrokontroler zresetował się samoczynnie po otrzymaniu danych z mojej płytki. Mimo wszystko był to jednak sukces – zmusiłem go do tego resetu sam, więc najprawdopodobniej do sterowania wystarczą tylko piny A1 i A6.

Wykonałem kolejną próbę, która zakończyła się jeszcze ciekawiej – moduł zaczął kręcić się bez końca. Jeszcze ciekawszy problem – pomyślałem i zresetowałem go prądowo. Kolejna próba przyniosła reset taki jak za pierwszym razem. Spodziewałem się, że jeszcze co najmniej kilkanaście prób czeka mnie przed zbliżeniem się do rozwiązania, ale wiedziałem że jest ono całkiem blisko. Następna próba potwierdziła moje oczekiwania – po chwili bezruchu silnik zaczął się obracać aby zatrzymać się niemal natychmiast, na literze „D”. Szybkie zatrzymanie wysyłania danych i okrzyk radości oznaczający kolejny sukces.

Przypadek, czy nie? Zgrałem zapisaną transmisję ze swojej płytki i umieściłem ją w programie po czym ponowiłem próbę. Moduł bez chwili zawahania obrócił się znów do litery D. Działa! Gdzieś pośród prawie dwóch tysięcy bajtów które wysyłałem do modułu było kilka takich, które wprawiały je w ruch. Tylko które dokładnie to są? Nie miałem oczywiście pojęcia, więc wprowadziłem kolejne poprawki do programu, dodając opcje wycinania zadanego przedziału bajtów. Pomysł okazał się strzałem w dziesiątkę i po rozszerzeniu tej opcji do działania na bitach i kilkudziesięciu minutach prób otrzymałem ciąg mający około 10 bajtów i ustawiający moduł na D.

Wciąż oczywiście wycinałem kolejne bity i za którymś razem zauważyłem coś bardzo ciekawego – po wycięciu niektórych bitów zamiast D ustawiała się litera A. Potem udało mi się jeszcze uzyskać I oraz E. Czasami udawało się przełączanie między tymi literami, ale nie było to regułą. Spory i spektakularny sukces, ale kryje się za nim jedna ważna informacja – skoro wycinając jeden bit jestem w stanie ustawić A zamiast D, to znaczy że protokół sterowania nie ma sum kontrolnych. Gdyby wiadomości były nimi sprawdzane, taka podmiana uczyniłaby komunikat nieprawidłowym, tutaj jednak po prostu zadziałał. Brak sum kontrolnych to szczególnie niepokojąca informacja w kontekście sterowania grupą znaków, obawiałem się że bez dobrej znajomości protokołu będę mieć problemy z tym zadaniem.

Następnego dnia, będą w pracy, przystąpiłem do zgrywania zawartości kości pamięci EPROM z dwóch płytek sterownika. Po ustawieniu kilkunastu przełączników i zworek w Willemie na właściwe pozycje a następnie zmuszeniu systemu operacyjnego do pracy z tym zabytkiem (co było zdecydowanie trudniejszym zadaniem) udało się. Dwa programy były już na moim dysku. Nie zabrałem się jednak za ich deasemblację – byłem na tyle blisko rozpracowania protokołu, że byłaby ona stratą cennego czasu.

Popołudnie, wieczór i noc spędziłem na wycinaniu kolejnych bitów z transmisji. Zostało ich już tylko 8, ale litery wciąż były te same i nie udawało mi się znaleźć sposobu na wyświetlanie innych i na pewne przełączanie się między tymi już ustawionymi (wciąż szwankowało). Późnym wieczorem, rozrysowałem transmisje bitowo, na kartce w kratkę, planując następny dzień poświęcić na ich analizę.

Świeży umysł widząc notatki z dnia poprzedniego zadziałał zdecydowanie lepiej – po kilkudziesięciu minutach wpatrywania się w czarne i białe prostokąty odnalazłem miejsca w których moim zdaniem były zapisane znaki i miejsce w którym zapisany był adres modułu. Nie tracąc czasu, przetestowałem swoje pomysły – pomijając kilka początkowych problemów, udało się właściwie od razu! Wciąż nie byłem do końca pewien co robią wszystkie bity które wysyłam, wiedziałem jednak gdzie muszę ustawić adres i gdzie muszę ustawić znak. Po wysłaniu tych dwóch wartości należało jeszcze wysłać nierozpoznaną do końca przeze mnie grupę bitów i dopiero wtedy moduł obracał się na wybraną pozycję. Czyżby była to wiadomość włączająca obrót?

Przetestowałem kilka różnych, działających kombinacji bitów w to miejsce i szybko znalazłem taką, która „nie psuła” modułu, czyli pozwalała na zmianę raz ustawionego znaku. Po kilkudziesięciu próbach upewniłem się, że program faktycznie działa! Adres modułu również mogłem zmieniać i wciąż móc ustawiać dowolny znak. Udało się! Wiedziałem, że na pewno w moim programie są jeszcze błędy które odkryję mając więcej liter, ale na chwilę obecną działał niezawodnie!

Rozpracowanie protokołu do stanu, w którym mogłem sterować pojedynczą literą zajęło mi tydzień – całkiem nieźle, jak na coś rzekomo niemożliwego do zrealizowania. Jedyne co mi pozostało, to czekać na załatwienie formalności przez PKP, transport samych tablic do Wrocławia i dostarczenie podzespołów elektronicznych które zamierzałem wykorzystać do zbudowania własnego sterownika.

Uruchomienie litery z tablicy dworcowej, część II

Zastanawiałem się długo, czy do wykorzystanej liczby pinów bardziej pasuje protokół SPI czy I²C, ale żeby uzyskać więcej odpowiedzi musiałem skorzystać z bardziej zaawansowanego sprzętu niż multimetr za 20zł z giełdy elektronicznej. Na szczęście nie blefowałem na dworcu w Bydgoszczy – faktycznie posiadam dostęp do jednego z lepiej wyposażonych laboratoriów w mieście i następnego dnia z kolegą z pracy zamiast zabawkowego zasilacza podłączyliśmy profesjonalny laboratoryjny, a multimetr zastąpił potężny oscyloskop Tektroniksa. Kiedy już udało się nam go uruchomić (niestety na co dzień nie korzystam z takich zabawek), naciśnięcie jednego guzika udzieliło wszystkich odpowiedzi na temat sygnału generowanego przez sterownik. Na wyświetlaczu widniał delikatnie poszarpany wykres fali prostokątnej, a wyliczona przez oscyloskop częstotliwość wynosiła 980Hz.

980Hz. To mało. Na tyle mało, że było do zmierzenia kartą muzyczną w komputerze. I jest to sporo mniej niż najniższa częstotliwość dla I²C (100kHz). Nie znałem i nie poznałem żadnego protokołu, który bazowałby na tej częstotliwości. Czyżby coś własnościowego? Nie miałem pojęcia co to może być. Aby pomóc sobie w rozwiązaniu zagadki, przyjrzałem się dokładnie płytkom od Pana Mariana – zawierały oddzielne, wymienne kości pamięci z programami. Z nich, mając odpowiedni sprzęt, można już zgrać program. Tak starego sprzętu niestety w laboratorium nie miałem, ale czego nie ma firma – mają koledzy i na następny dzień zaplanowałem zrzut programu z użyciem niegdyś standardowego, ale archaicznego dzisiaj, programatora Willem.

Będąc już w domu, postanowiłem kontynuować próby – potrzebowałem jakoś wygenerować przebieg prostokątny 980Hz i przypomniałem sobie o od dawna leżącej w mojej szafie płytce rozwojowej Freescale FRDM. Trochę czytania dokumentacji, instalowania środowiska programistycznego i użerania się z narzędziami mającymi ułatwić, a tak naprawdę utrudniającymi tworzenie oprogramowania i jest. Mam. Program który na wybranym pinie płytki generuje falę prostokątną o częstotliwości 980Hz. Podłączenie nie było łatwe, bo nie miałem jeszcze żadnych narzędzi pomocniczych w rodzaju płytek stykowch – skręcałem więc druciki i wciskałem je w dziurki na płytce rozwojowej z pomocą pociętej zapałki. Po kilkukrotnym upewnieniu się, że niczego nie poplątałem i nie wysadzę litery w powietrze, włączyłem zasilanie, ustawiając uprzednio ręcznie literę na pozycję ‚A’.

Obraca się. Kolejne znaki przeskakują, a ja czekam w napięciu. Już mija ‚N’. Czy uda się za pierwszą próbą nawiązać nić porozumienia z nieznanym programem w module, czy konieczne będzie żmudne analizowanie programu ze sterownika? Przelatują już polskie znaki, będące jednymi z ostatnich. Ł. Ń. Ó. Ś. Ź. Ż. Kropka. Myślnik. Ukośnik. To już zaraz! Małe n. Spacja. Dalej spacja. To złudzenie, wywołane podekscytowaniem, czy naprawdę stoi? Stoi! Wydałem z siebie głośny okrzyk radości i sprawdziłem ponownie zachowanie modułu, wyłączając i włączając zasilanie – znów nastąpił poprawny reset. Tak samo jak za każdą kolejną próbą. Kolejny sukces zaliczony, w bardzo krótkim czasie! Teraz zostało jednak dużo trudniejsze zadanie – zmusić moduł do obrócenia się na żądaną pozycję…

Uruchomienie litery z tablicy dworcowej, część I

Moduł tablicy który wziąłem ze sobą posiada dwudziestopinowe złącze. Do czego służy aż tyle pinów? Nie wiadomo i nie ma szybkiej drogi do zdobycia tych informacji – jeżeli nawet ktoś uruchomił te moduły przede mną, to nie udostępnił żadnych wskazówek w internecie. KZŁ Bydgoszcz też, rzecz jasna, nie opublikowało nigdzie protokołu sterowania. Pomyślałem o wystosowaniu zapytania do tej firmy – ale stwierdziłem, że zrobię to dopiero wtedy, kiedy uznam że nie uda mi się rozpracować sterowania samodzielnie.

Z takim nastawieniem usiadłem do pracy. Pierwszych osiem pinów nie sprawiło mi żadnych problemów – bardzo dobrze widać grube ścieżki na płytce łączące dwie pary pinów i prowadzące do odseparowanego od reszty układu zasilania silnika na 220V i pozostałe dwie pary które rozdzielają piny zasilające i nie są do niczego podłączone. Z pomocą multimetru ustawionego w tryb testowania ciągłości obwodu z łatwością zlokalizowałem 5 pinów połączonych z masą. Zostało już tylko 7. Dwa kolejne okazały się być zwarte ze sobą i prowadzić do małego układu scalonego, zaraz przy samym gnieździe. Wyszukanie jego numeru w sieci potwierdziło moje przypuszczenia – był to stabilizator napięcia, a badane piny przyjmowały dodatni biegun zasilania układu.

Zostało już tylko pięć pinów. Wszystkie prowadziły do serca modułu – mikrokontrolera. Według znalezionej przeze mnie dokumentacji, nie da się zrzucić z niego raz zapisanego programu. Pocieszające jest to, że musi być on bardzo prosty z racji małej dostępnej pamięci. Jedyne co mogłem zrobić, to opisać piny wyprowadzeniami mikrokontrolera do jakich były podłączone. W ten sposób uzyskałem nazwy A1, A6 i B0, odpowiadające portom µC o tych nazwach i mogące być właściwie czymkolwiek oraz RST i INT. RST to wyprowadzenie resetujące układ, więc do tego najprawdopodobniej służy pin, INT natomiast to sterownik przerwań – wyprowadzenie go na zewnątrz delikatnie zasugerowało mi, że na tym pinie może być prowadzona linia zegara taktującego transmisję danych do modułu. Nie musiało tak jednak wcale być, dokumentacja stwierdzała jasno, że w rolę kontrolera przerwań można wcielić dowolne złącze portu A, w tym 1 i 6, które również były dostępne wprost z gniazda modułu.

Tyle statycznej analizy wystarczyło. Wybrałem się do sklepu elektronicznego gdzie zakupiłem pasujące złącze, krótki odcinek taśmy pasującej do niego, wtyczkę do gniazdka i kabel do niej. W domu połączyłem to wszystko w całość, wyprowadzając napięcie z gniazdka sieciowego na odpowiednie złącza gniazda w module, zasilanie stałonapięciowe podłączyłem do zasilacza ustawionego na 9V, wartość leżącą w bezpiecznym przedziale stabilizatora. Włożyłem dwie wtyczki do wyłączonego przedłużacza i kilkukrotnie sprawdziłem poprawność połączeń. Będąc bardzo niepewnym tego, co miało nastąpić, ostrożnie wcisnąłem przełącznik na przedłużaczu.

W chwili kiedy lampka w przełączniku zapaliła się, sygnalizując obecność napięcia na gniazdach przedłużacza w pokoju rozległ się głośny dźwięk. Pierwszy sukces, moduł żyje! Obraca się! Pierwszy raz od chwili zerwania tablicy ze ściany tunelu, pracuje. Dźwięk opadających klapek zagłuszany jest przez chrobot hamulca na kołach zębatych. Coś cudownego. Ale zaraz, coś jest nie do końca tak, jak sobie wyobrażałem i czego w początkowej euforii nie zauważyłem – moduł kręci się bez przerwy, tak jakby oczekiwał na coś, czego nie dostaje. Samo zasilanie to za mało aby zatrzymał się na pustym polu. Wyłączyłem zasilanie i przystąpiłem do dalszych prac.

Jedną z płytek otrzymanych od Pana Mariana zidentyfikowałem jako bezpośredni kontroler modułów z tablicy – tylko jedna posiadała dwa dwudziestopinowe złącza (każdy z dwóch rzędów modułów miał oddzielną taśmę i w związku z tym, złącze). Uruchomiłem ją z pomocą tego samego zasilacza którego użyłem do ożywienia modułu i sprawdziłem stany pinów. Kilka miało stan niski (0V), kilka wysoki (5V), natomiast przy pinie oznaczonym przeze mnie jako INT zobaczyłem wskazanie w okolicach 2,5V. To jeszcze bardziej potwierdziło moje przypuszczenia – mój tani multimetr nie posiadał pomiaru TrueRMS, więc jeśli wartość zmieniała się w czasie – uśredniał ją. Takie wskazanie z pewnością oznaczało że coś się tam zmienia i sugerowało że faktycznie jest tam linia zegarowa. Spróbowałem oczywiście ustawić resztę pinów na takie stany jakie zmierzyłem (za wyjątkiem INT), nie przyniosło to jednak żadnych zmian – moduł wciąż kręcił się bez końca. Potrzebowałem zaprząc do pracy lepsze narzędzia…