cpc464+kamera+laptopW oczekiwaniu na nowy programator (który pewnie przyjdzie "pod koniec tygodnia") stwierdziłem że przydałoby się przerzucić zrzut RAM'u z Amstradzika na PCta. Powstało pytanie - jak to zrobić nie mając żadnych kabelków, dyskietek, etc? Okazuje się że jest pewien (pewnie nie jeden), bardzo zabawny moim zdaniem, sposób ;D

Na początek w skrócie - pomysł opiera się na tym że CPC 464 wyświetla dane na monitorze, a PC za pomocą kamerki "internetowej" podpiętej pod USB je odczytuje. Proste, nie?

Pojawia się jednak kilka pytań - np. jak dane powinny być prezentowane? Ile ich powinno być? Jak szybko powinny się zmieniać? Jak poinformować PCta o tym że się zmieniły? Czy Amstrad nadąży wyświetlać? Czy kamerka nadąży "łapać" klatki? A co jeśli kamera "złapie" obraz w połowie przerysowywania? I tak dalej.

A więc po kolei. To jak dane powinny być prezentowane zależy od tego jak dobrą kamerką dysponujemy, i ile kodu chcemy napisać po stronie PCta. Pomysły są w sumie dwa:
- Prezentujemy dużo danych pokazanych w hexa, a po stronie PC mamy jakiś OCR (sieci neuronowe idealnie do tego się nadają imho) który te dane ładnie odczytuje (oczywiście literka po literce) - to wymaga dobrej jakości obrazu na kamerze, dużej rozdzielczości, oraz kapkę większej ilości kodu po stronie PC,
- Prezentujemy dane jako plamki/punkty (kwadraty, nie koniecznie wielkości 1 pixel) na ekranie, bit po bicie, a na PCcie sprawdzamy czy punkt jest jasny czy ciemny - ilość danych do przesłania zależy od rozdzielczości uzyskiwanego obrazu, rozdzielczości CPC 464, oraz jakości obrazu, wymaga to mniejszej ilości kodu na PC.

W moim przypadku skorzystałem z małej kamerki internetowej, w której dość trudno ustawić ostrość, etc, więc w końcu musiałem użyć drugiego sposobu (z kwadracikami). Uznałem że przesyłał będę naraz 8 bitów (mało, ale do celów doświadczalnych wystarczy w zupełności) co pół sekundy (jak dość łatwo wyliczyć, przesłanie całego RAMu CPC 464 - którego jest 64kb - zajęłoby około 10 godzin).

program na PCKolejną sprawą jest "jak poinformować PC że jest nowy zestaw danych", czyli problem synchronizacji. Akurat to dość znany problem (patrz ethernet, USB, etc), który został już na różnorakie sposoby rozwiązany. W moim przypadku użyłem dodatkowego bitu jako flagi oznaczającej dane - flaga jest zapalona jeśli adres pokazywanego bajtu jest parzysty, oraz zgaszona jeśli jest nieparzysty (czyli na przemian ma wartości 101010101...). Wystarczy więc że PC zobaczy że flaga się zmieniła, i już wie że są nowe dane.

Co z problemem klatki złapanej w czasie przerysowywania danych? W moim przypadku zastosowałem prosty trik - flagę synchronizacji wyświetlam dwa razy - na początku oraz na końcu danych. Dzięki czemu jeśli zdarzy się że na klatce danych dane są do połowy przerysowane, to flagi synchronizacji będą różne, więc wiadomo że takie dane trzeba odrzucić. Na szczęście kamerka wyrabia około 3-5 klatek na porcję danych, więc dane takie nie są gubione, po prostu są odczytane w następnej klatce.

Podczas implementacji pojawił się jeszcze jeden problem, związany z tym że (niepotrzebnie zresztą) robiłem CLS między klatkami danych, i czasem kamera łapała pusty ekran, i uznawała że flagi synchronizacji są równie (obie na 0), a dane są równe 00000000. Aby to rozwiązać, zapamiętuje wszystkie warianty danych dla danej porcji (tzn dane z wszystkich klatek dla danego stanu flag synchronizujących), po czym gdy flagi się zmienią, to zapisuje środkowe dane. Nie było to może konieczne (wystarczyło to CLS wywalić), ale okazało się niezłym rozwiązaniem.

Jeżeli chodzi o PCta, to do obsługi kamerki posłużyłem się Windowsem, oraz WinAPI (musiałem updatenąć headerki/liby z WinAPI do MinGW'a, w starszych wersjach nie było tam wszystkich funkcji od kamerek), a konkretniej funkcjami i makrami z rodu cap* (capCreateCaptureWindow, capDriverConnect, etc, z vfw.h). Programik był dość prosty - okno z podglądem kamerki, oraz możliwością wybrania miejsc gdzie są poszczególne punkty. Potem trochę kombinowania z kalibracją (w moim przypadku najlepszy okazał się "wzór" typu "bit jest ustawiony na 0 jeśli kolor plamki nie jest zbliżony do białego, gdzie "zbliżony" oznaczało około 8% dopuszczalnej różnicy), poprawy bugów, i działa.

Kod źródłowy programiku na PC można ściągnąć tutaj, przy czym od razu zaznaczam, że jest bardzo słabo napisany (miał działać, a nie być śliczny ;D).
Kod źródłowy programiku na CPC 464 przepiszę jak skończy się RAM przerzucać (jeszcze tylko 8 godzin ;D).

Jeżeli chodzi o sprawy do przemyślenia "na potem", to sądzę że warto by w jakąś kompresję danych zainwestować - najlepiej RLE. W pamięci jest masa zer które niepotrzebnie zajmują "transfer". Warto by również wyświetlać więcej niż 8 bitów naraz.

Podsumowując, całość działa jak światłowód - medium jest powietrze, nadajnikiem monitor zamiast LEDki, a odbiornikiem kamera. Po za tym reszta się zgadza. Ze zabawnych rzeczy - aby chronić ten "układ" przed zakłóceniami (nagłe błyski, zapalenia światła, odbłyski na monitorze, etc), przykryłem całość kocem, przez co całość wygląda prawie jak wór (światłowór ;p).

Nyom, i tyle dziwnych pomysłów na dzisiaj.

Comments:

2009-01-02 13:11:26 = Malcom
{
Mysle, ze ten 7-bitowy port Centronics dalby sie wykorzystac do zbudowania prostej rownloglej magistrali cpc -> pc ;)
}
2009-01-02 13:20:17 = Gynvael Coldwind
{
@Malcom
Prawdopodobnie tak ;> Natomiast problem wtedy pojawia się po stronie PC - nie mam ani portu COM, ani portu LPT (hmm chociaż może USB na tych dziwnych driverach by dało radę...). A porcik PCMCIA->LPT który zamówiłem dotarł do mnie dzisiaj po południu, jak już cała ta machineria przerzucała dane ;D
}
2009-01-02 13:35:10 = Malcom
{
No tak, te dzisiejsze laptopy, w sumie same USB prawie.
A wiesz, nie powino tez byc problemow ze zrobieniem portu USB do tego mikrokomputera, pewnie jest jakis scalak do sprzetowej obslugi, problemem tylko soft.
Albo inne cuda: http://www.elektroda.pl/rtvforum/topic786449.html ;)
}
2009-01-02 13:43:46 = Gynvael Coldwind
{
@Malcom
Ano ;<
Szczerze to jak tylko przyjdzie programatorek to chcę zrobić podpięcie do PC po porcie od stacji dyskietek, jako emulator dyskietek. Tak żeby CPC 464 widział to jak normalny FDD, a na PC można mu podać katalog który on "wystawi" jako FDD. Chciałem do tego dorzucić potem obsługę kart SD (tak jak w linku który podałeś ;>), żeby PC nie był potrzebny ;>

Mam w sumie jeszcze parę pomysłów na rozszerzenia. Pewnie jak cosik zmontuje to dam znać ;>
}
2009-01-02 14:19:02 = ce
{
Ooo... widze, ze rozszerzas mozliwosci CPC464... jak tak dalej pojdzie to moze jeszcze na nim viste odpalisz ;)

PS
A czemu nie ma angielskiej wersji...?
}
2009-01-02 14:25:10 = Gynvael Coldwind
{
@ce
Eng wersje wrzucam zazwyczaj z pewnym opóźnieniem spowodowanym lenistwem ;>
Hmm Viste mówisz... :DDD
}
2009-01-03 10:04:10 = Patrykuss
{
@Gynvael:
Trafił Ci się CPC bez dyskietki 3 cala lub kasety? Współczuję :).

Co do metody z kamerką. Muszę przyznać, że dosyć innowacyjny pomysł.
}
2009-01-03 10:33:04 = Gynvael Coldwind
{
@Patrykuss
Ano dyskietek brak. Ale magnetofon jest. Gorzej z kasetami ;D Pani w kiosku mnie oświeciła że kaset czystych nie sprzedaje od początku tego wieku, a oczywiście nie chciało mi się nigdzie dalej jechać w ich poszukiwaniu (w końcu jednak będę musiał... jakiś magnetofon też by się przydał) ;>

Co do pomysłu... hmm... imho "innowacyjny" to złe słowo... "zabawny" lepiej to określa ;D
Jeszcze bardziej zabawne jest to że znalazłem dzisiaj regulację ostrości na kamerze ;> Więc chyba jednak pokuszę się o ten OCR, tak for fun ;>
}
2009-01-04 12:13:22 = Dabroz
{
Awesome! Ja zawsze uważałem, że jakby programiści budowali domy, to zamiast drzwi byłyby teleporty. :)
}
2009-01-04 22:32:56 = Gynvael Coldwind
{
@Dabroz
Ha! Dobry teleport nie jest zły! ;>>
Z drugiej strony... hmm... zabrakło mi 66 bajtów danych... ciekawe co by zniknęło człowiekowi po przejściu przez skonstruowany przeze mnie teleport ^_-;
}
2009-01-14 11:54:53 = salv
{
przyrodzenie ;)
}
2009-01-14 12:30:53 = Gynvael Coldwind
{
@salv
Hi ;> Hehehe oby nie ;DDD
}
2010-07-10 14:00:56 = klatek
{
O LOL, pomijając ześwirowany pomysł...
"transfer"
"światłowód"

Te dwa porównania już całkiem mnie położyły na łopatki ;-]

>> ciekawe co by zniknęło człowiekowi po przejściu przez skonstruowany przeze mnie teleport ^_-;
> przyrodzenie ;)
A gdyby przechodzić miała reprezentantka płci pięknej? o.O
}

Add a comment:

Nick:
URL (optional):
Math captcha: 8 ∗ 2 + 2 =