
Opisywane w artykule narzędzie to własnoręcznie napisany program, za pomocą którego na podstawie zdjęć PCB (górna i dolna strona), użytkownik odtwarza wszystkie połączenia, a następnie program generuje dla niego schemat w formacie SCH (Eagle).
Motywacja
Często, gdy zachodzi potrzeba naprawy jakiegoś urządzenia, trzeba zdiagnozować wadliwy układ, a do tego konieczne jest zwykle posiadanie schematu urządzenia. Schematy także przydają się, gdy chcemy dokonać jakiejś modyfikacji. Niestety, zwykle autor urządzenia (producent) ich nie dostarcza, ręczne odtwarzanie na podstawie oglądania PCB wymaga wielogodzinnych żmudnych prac z płytką - wzrokowa analiza wszystkich ścieżek i punktów lutowniczych, połączona z notorycznym odwracaniem płytki, czasami wspomagana testerem ciągłości obwodu. Gdy zanotujemy gdzieś sobie połączenia wszystkich pinów, następnie czeka nas praca z programem do tworzenia schematu, często wspomagana analizą not katalogowych układów, aby wcześniej przygotowane opisy połączeń doń wprowadzić
Sam kilkukrotnie odczułem potrzebę skorzystania z oprogramowania, które by w tym pomogło. Niestety, w internecie kompletnie nie ma pod tym kątem żadnych wyników. Gdzieś na elektrodzie ktoś poruszał nawet takie tematy, ale zwykle dyskusja kończyła się bez podania rozwiązania. Jedyny program o podobnej funkcjonalności, który kiedyś znalazłem, miał automatyczną detekcję prowadzenia ścieżek i okazał się klapą (też gdzieś się walał po elektrodzie).
Przygotowania
Przed rozpoczęciem zabawy należy wykonać zdjęcia obu stron płytki, którą chcemy analizować. Najlepsze efekty uzyskamy, gdy z płytki wylutujemy wszystkie elementy, a zdjęcia wyonamy w skanerze o rozdzielczości co najmniej 300 dpi (polecane 600 dpi). Aczkolwiek samo zdjęcie aparatem także daje dobre efekty, ważne tylko, aby aparat trzymać równolegle do płytki. Posłużmy się jako przykładem - kardridżem od Pegasusa 4-in-1. Kardridż posiada oprócz pamięci, układy z rodziny 74XX, obsługujące przełączanie pamięci, którego mechanizm jest na razie nieznany. Odtwarzając schemat od razu będziemy mogli rozpracować sposób bankowania pamięci. Do dzieła.
Gdy już mamy wykonane zdjęcia, nie musimy się martwić o ich obracanie, odbicie lustrzane, kadrowanie, itp. - to wszystko ustawimy już w programie (tutaj celowo zdjęcia wykonano różnych rozmiarów i pod różnymi kątami, aby zademonstrować możliwości programu).


Praca z programem - zgrywanie warstw
Program tuż po uruchomieniu wita oknem roboczym, przedstawionym poniżej.

Główna część okna podzielona jest na dwie części - lewą, w której pracujemy z górną warstwą PCB i prawą, w której pracujemy z dolną warstwą PCB.
W lewym górnym rogu mamy przyciski z akcjami: stworzenie nowego projektu, wczytanie projektu istniejącego oraz stworzenie schematu w Eaglu. Program sam podczas pracy tworzy kopię zapasową co 5 minut, więc nawet nagła awaria programu, który jest ciągle w fazie beta nie powinna kosztować nas utraty zbyt wielu minut pracy.
W prawym górnym rogu widoczne są statystyki projektu.
W dolnej części ekranu widać podpowiedzi ze skrótami klawiszowymi do głównych zadań w programie. Wszystkie czynności wykonujemy po naciśnięciu jakiegoś klawisza (mniej męczy to rękę, niż ciągłe klikanie myszą, wybór z menu kontekstowego) i przyspiesza pracę w programie - jedną ręką operujemy myszą (jedynie przesuwanie kursora), a drugą - klawiaturą poprzez naciskanie jednoklawiszowych skrótów.
Po wybraniu New program poprosi nas o podanie lokalizacji do pliku ze zdjęciem górnej warstwy PCB, dolnej warstwy PCB, a następnie o wybranie lokalizacji, gdzie będzie zapisany plik projektu. Po wczytaniu plików, w oknie programu ujrzymy obie warstwy:

Kolejną czynnością jest "zgranie" ze sobą zdjęć. Widok na PCB w programie, podobnie jak w wielu programach typu EDA do tworzenia PCB jest `z góry`, tzn. górną warstwę widzimy tak jak widać na PCB od góry, natomiast dolną warstwę - tak, jakby prześwitywała przez laminat od góry. Dlatego powinniśmy przy zdjęciu dolnej warstwy wcisnąć checkbox `mirror`, który odbije nam lustrzanie zdjęcie.

Kolejnym krokiem jest obrót obu zdjęć i przeskalowanie w taki sposób, aby oba były w identycznym rozmiarze. Obie czynności wykonuje za nas program - wystarczy zaznaczyć na obu zdjęciach jakiś "wirtualny" odcinek, który powinien być równoległy do dolnej osi i być identycznej długości na obu zdjęciach - np. dolna krawędź PCB albo jakiś długi rządek punktów lutowniczych. Ja wybiorę to drugie.
Zaczynamy od lewego zdjęcia - ustawiamy kursor na początku takiego odcinka, wciskamy przycisk R (od Rotate), potem ustawiamy kursor na końcu takiego odcinka i ponownie wciskamy klawisz R. Przesuwanie obu zdjęć odbywa się za pomocą strzałek.


Po tej operacji widzimy, że lewe zdjęcie jest już wyprostowane.

Podobnie postępujemy z prawym zdjęciem:


Po tej operacji prawe zdjęcie zostanie także obrócone, a dodatkowo - ponieważ na wszystkich zdjęciach zaznaczyliśmy już odcinek, program przeskaluje zdjęcia tak, aby były tych samych rozmiarów (najmniejsze zdjęcie zostaje niezmienione, a większe zdjęcia zostają pomniejszone):

Ostatnim etapem jest zgranie zdjęć w ten sposób, aby pokazać programowi, gdzie znajdują się te same punkty na obu zdjęciach - np. aby w sytuacji, gdy ustawimy kursor na przelotce na jednym zdjęciu, na drugim zdjęciu także pokazał się kursor na tej samej przelotce. W tym celu należy przesunąć jedno ze zdjęć do odpowiedniej pozycji. Gdy trzymamy klawisz CTRL (CTRL jest po lewej stronie) - lewe zdjęcie pozostaje nieruchome, a gdy trzymamy ALT (ALT jest po prawej stronie) - prawe zdjęcie pozostaje nieruchome. Razem z trzymaniem tego klawisza, za pomocą strzałek przesuwamy jedno ze zdjęć. Jeśli dodatkowo będziemy trzymać klawisz SHIFT, to przesuwanie będzie odbywać się precyzyjniej - z mniejszym skokiem. Po tej operacji oba zdjęcia są zgrane - można się o tym przekonać wskazując kursorem na jakąś przelotkę na jednej warstwie. Wtedy na drugiej warstwie dokładnie w tym samym miejscu powinno być widać także kursor. Najlepiej to sprawdzić dla dwóch lub nawet czterech przelotek, w przeciwległych rogach PCB. Jeśli wykonaliśmy to poprawnie, to efekt powinien być taki, jak poniżej. Ta czynność kończy etap przygotowań.


Praca z programem - wskazywanie punktów lutowniczych
Kolejnym etapem jest wskazanie na PCB, gdzie znajdują się punkty lutownicze (pady): dwustronne (THT) i jednostronne (SMD). Aby umieścić na PCB taki punkt, ustawiamy kursor w odpowiednim miejscu i wciskamy klawisz:
* P (dla umieszczenia pada THT) lub
* V (dla umieszczenia pada SMD).
Jeśli dodatkowo włączona jest opcja wyrównania do siatki (SNAP) - klawisz S, to program po umieszczeniu pierwszego pada, kolejne będzie umieszczał z wyrównaniem do siatki 0.05 czyli połowa odstępu między nóżkami w standardowej obudowie DIP.
Jest to przydatna opcja, pozwalająca przyspieszyć ten etap, gdyż nie trzeba wówczas dokładnie umieszczać kursora w środku pada.
Bez włączonej opcji SNAP - jeśli nie będziemy dokładni, pady będą umieszczane nie centralnie.

Z włączoną opcją SNAP - idealnie rozmieszczenie padów:

Tu przy okazji warto wspomnieć, że jeśli w którymś momencie pomylimy się, wystarczy w programie kliknąć przycisk Undo, lub też - jeśli umieściliśmy jakiś element na PCB w złym miejscu, wystarczy go wskazać kursorem i kliknąć przycisk DELETE.

Padów typu SMD można "używać" nie tylko dla wskazywania faktycznych padów od elementów SMD, ale także np. do złącza krawędziowych czy generowania dodatkowych punktów lutowniczych, gdy np. dwa elementy są przylutowane do jednego pada `na pająka`. Wygląd po zaznaczeniu wszystkich padów w programie (przy okazji w statystykach możemy oglądać ilość umieszczonych padów):

Praca z programem - wskazywanie połączeń
Kolejnym krokiem jest wskazanie połączeń między padami - w tym celu w miejscu, gdzie chcemy rozpocząć rysowanie połączenia, umieszczamy kursor i wciskamy klawisz W (wire). Program zaznaczy niebieskim kursorem, że zapamiętał wskazaną lokalizacje. Kolejne wciskanie klawisza W będzie prowadziło połączenie do wskazanego miejsca i przenosiło kursor. W momencie, gdy połączenie zakończy się na padzie (lub wciśniemy klawisz ESC), kursor zniknie i będziemy mogli zacząć rysować nowe połączenie od innego miejsca:



Jeśli chcemy zacząć rysować połączenie od pada, wystarczy na niego wskazać i wcisnąć klawisz W)


Podobnie, gdy chcemy zacząć rysować połączenie od jakiegoś istniejącego już połączenia (aby tworzyć rozgałęzienie) - wystarczy wskazać na punkt węzłowy takiego połączenia i wcisnąć klawisz W:


Ta część pracy z programem jest najdłuższym etapem projektu, w którym często może dochodzić do pomyłek. Być może dałoby się tą czynność chociaż częściowo zautomatyzować, np. poprzez automatyczne wykrywanie krawędzi celem detekcji przebiegu ścieżek, jednak komputer nigdy nie jest nieomylny, i często mogłoby to prowadzić do tworzenia fałszywych, nieistniejących połączeń lub niewskazywania połączeń istniejących. Często sam człowiek patrząc na zdjęcie ma wątpliwości co do przebiegu ścieżki i konieczne jest obejrzenie PCB pod światło, albo np. warstwa opisowa na PCB zasłania faktyczny przebieg ścieżek:

dlatego chyba warto, aby człowiek od początku do końca wykonywał ten etap, jeśli można dzięki temu zminimalizować ryzyko pomyłek:
Podczas pracy z programem mamy na bieżąco dostęp do statystyk - ilości poprowadzonych segmentów połączeń, czy ilości sygnałów (sygnał to zbiór punktów lutowniczych + segmentów połączeń, które są ze sobą powiązane). Często podczas pracy z programem możemy popełnić błąd poprzez naszą niedokładność, np. zostawiając niepołączoną końcówkę ścieżki. Takie połączenia program wykrywa jako złe ("wires BAD") i wskazuje w statystykach. Podobnie, niepołączone w obu warstwach pady SMD lub THT także są zliczane.

Wystarczy kliknąć na napis "wires BAD" / "unconn. pads" / "unconn. SMDs", a program sam wskaże elementy, co do których ma wątpliwości:



Kolejną ciekawą opcją jest śledzenie sygnałów. Jeśli wskażemy na jakąś część sygnału (pad SMD / THT lub ścieżkę) i wciśniemy klawisz I (info), program podświetli cały przebieg sygnału, a na górze wyświetli jego nazwę (o nazywaniu trochę później).

Podczas umieszczania przelotek / ścieżek, jest możliwość ustawiania ich rozmiaru / grubości:

Natomiast opcja `alpha blending`, pozwala włączyć lub wyłączyć prześwitywanie ścieżek i punktów lutowniczych przez zdjęcie. Wyłączone prześwitywanie pozwala lepiej widzieć umieszczane przez nas ścieżki i punkty lutownicze, natomiast włączone - pozwala widzieć oryginalne ścieżki na zdjęciu i konfrontować je ze wskazywanymi przez nas.

Wygląd po wskazaniu wszystkich ścieżek:

Praca z programem - przypisywanie punktów lutowniczych
Kolejnym etapem jest przypisanie punktów lutowniczych do elementów występujących na PCB. W tym celu wskazujemy jakiś punkt lutowniczy (np. pierwszą nóżkę układu U2 74LS174) i wciskamy klawisz A - assign. Otwiera się okno, ale ponieważ nie mamy dodanych żadnych urządzeń - lista urządzeń oraz dostępnych padów urządzenia jest pusta:

Aby dodać urządzenie, klikamy przycisk ADD. Otwiera się okno, w którym możemy wyszukać interesujący nas element (program po uruchomieniu wczytuję wszystkie biblioteki z programu Eagle, więc mamy bardzo dużą swobodę manewru). Wyszukiwanie elementów odbywa się podobnie jak w programie Eagle - wystarczy wpisać fragment interesującej nas nazwy i wstawić gwiazdkę w miejscu, gdzie może wystąpić dowolny ciąg znaków. W rozwijalnej strukturze hierarchicznej poniżej od razu pojawiają się tylko elementy spełniające kryterium. Po wybraniu elementu w interesującej nas obudowie, program sam ustawia jego nazwę wg prefiksu zdefiniowanego dla tego urządzenia w bibliotece Eagle-a, dodając pierwszy wolny numer. Nazwę możemy oczywiście ustawić też sami. Dodatkowo możemy zdefiniować wartość (np. dla elementów RLC) i ważność elementu przy ustalaniu nazw sygnału (o tym później). Wartość, obudowę czy nawet samo urządzenie można potem zmienić, klikając przycisk modify.

Po kliknięciu OK, wracamy do poprzedniego ekranu, gdzie mamy już dodane wybrane urządzenie, natomiast w liście jego końcówek pojawiają się wszystkie dostępne końcówki.

Wybieramy interesujące nas wyprowadzenie, klikamy OK (lub ENTER), a na PCB pojawia się na zaznaczonym padzie nazwa urządzenia i numer przypisanego padu.

Podobnie postępujemy z kolejnymi padami - wskazujemy na kolejny PAD, wciskamy klawisz A, na liście urządzeń mamy zaznaczone ostatnio wybrane urządzenie, a na liście padów - pierwszy wolny pad. Jeżeli więc przypisujemy pady po kolei, wystarczy wcisnąć klawisz Enter i kolejny pad jest już przypisany.

Jeżeli chcemy teraz przypisać pady kolejnego elementu, znów wskazujemy na pierwszy jego pad, potem wciskamy klawisz A. Kliknięcie przycisku Add powoduje otwarcie okna dodawania nowego urządzenia, ale z domyślnie zaznaczonym urządzeniem takiego samego typu jak to, które było wybrane na liście na poprzednim ekranie. Bardzo przyspiesza to pracę, gdy np. mamy na PCB kilkanaście rezystorów, kondensatorów lub takich samych scalaków - nie trzeba go szukać za każdym razem od początku.


Po przypisaniu wszystkich padów:

Praca z programem - generowanie schematu
Praca z programem w zasadzie dobiegła ku końcowi i możemy wygenerować gotowy plik SCH, zawierający odtworzony schemat PCB, gotowy do otwarcia w programie Eagle. W tym celu w głównym oknie programu klikamy przycisk Eagle, a następnie program zapyta nas o lokalizację, gdzie wygenerować schemat.

Wygenerowany plik otwieramy w programie Eagle i widzimy odtworzony schemat:

Poddając schemat analizie ERC nie ma nawet żadnych błędów, co świadczy o poprawnym odtworzeniu:

Program umieszcza elementy jeden po drugim, obok siebie, nie łącząc ich wyprowadzeń ze sobą, lecz etykietując. Wygenerowany schemat oczywiście warto ręcznie poprawić, zmieniając chociażby położenia elementów, odwzorowując kierunek przepływu sygnałów, ale jest to już dużo krótsza czynność, niż tworzenie schematu od zera samodzielnie i dodatkowo - niewymagająca zbyt dużego wysiłku intelektualnego. Podświetlanie danego sygnału w Eagle także koloruje wszystkie połączenia o tej samej nazwie, co ułatwia obserwację, które wyprowadzenia łączą się z którymi:

Praca z programem - nazewnictwo sygnałów
Jak zapewne bystry czytelnik zauważył, na schemacie wygenerowanym dla programu Eagle, nazwy sygnałów są niezbyt przyjazne (SIG+kolejny numer):

Oczywiście możemy (i pewnie dla niektórych sygnałów będziemy musieli) zmienić te nazwy dopiero w programie Eagle, ale czy nie dałoby się prościej? Oczywiście, że tak.
W programie KrzysioPCB istnieje możliwość ręcznego ustawiania nazw pewnych sygnałów - wskazujemy w tym celu na jakimś elemencie danego sygnału (pad lub ścieżka) i wciskamy klawisz N (name). Pojawia się okno, w którym możemy wpisać nazwę sygnału.

Jeśli w programie wskażemy ten sygnał, będzie on od teraz określany nowoustawioną nazwą:

Jednak nazywanie w ten sposób wielu sygnałów wciąż jest męczące. Czy nie dałoby się jeszcze prościej?
Wiele elementów na PCB możemy uważać za tzw. elementy główne, których nazwy końcówek mogą jednocześnie ustawiać nazwy sygnałów, które do tych końcówek są podłączone - np. jeśli mamy mikroprocesor, który posiada np. szynę adresową A0..A15, szynę danych D0..D7, itp, to logicznym jest, aby nazwa sygnału dochodząca do tych końcówek była właśnie taka.
Podobnie dla naszego projektu - sygnały dochodzące do złącze kardridża mogą dziedziczyć nazwy po jego końcówkach. Podczas dodawania nowego elementu, wspominałem o opcji ustawienia ważności elementu przy ustalaniu nazw sygnału.

Algorytm nadawania nazwy sygnału jest następujący: najpierw program sprawdza, czy użytkownik ręcznie nie nadał mu jakiejś nazwy. Jeśli tak - będzie on miał właśnie taką nazwę.
Jeśli nie - program sprawdza wszystkie elementy, które łączą się z tym sygnałem. Jeśli choć jeden ma ważność większą od zera, to nazwa dla tego sygnału będzie taka, jak nazwa końcówki z elementem o największej ważności.
Jeśli nie - program nadaję nazwę według wzorca: SIG + kolejny numer.
Jeśli więc ustawimy ważność dla złącza kardridży na 1 i wygenerujemy ponownie schemat, tym razem będziemy mieli czytelniejsze nazwy sygnałów:

Ostatnim krokiem jest ręczne uporządkowanie schematu:
* przesunięcie elementów, aby nie nachodziły na siebie oraz odwzorowywały logiczny kierunek przepływu sygnałów,
* usunięcie etykiet i połączenie sygnałów, dla których będzie to czytelniejszy sposób określenia przepływu informacji (zwłaszcza, gdy dany sygnał łączy tylko dwa elementy - np. wyjście jednej bramki połączone z wejściem kolejnej)
* nadanie nazw sygnałom, które wcześniej nie zostały nazwane
Schemat po uporządkowaniu:

Od razu widać, ze sposób działania mappera został rozpracowany:
zapis bajtu --PPCCCC przez CPU pod adres $8000-$FFFF ustawia bank programu (pod adresem $8000-$FFFF) na PP oraz bank grafiki (pod adresem $0000-$1FFFF) na CCCC.
Skomplikowany, na pierwszy rzut oka, układ, składający się z czterech bramek NAND na górze to nic innego, jak multiplekser, ustalający mirroring:
gdy PRG_A16=0 to CIRAM-A10
Cool? Ranking DIY