DCMI w STM32F: sprzętowy interfejs modułu kamery CCD

Możliwość podłączenia modułu kamery do mikrokontrolera otwiera całkiem nowe możliwości aplikacyjne. W porównaniu z użyciem kamerki w telefonie komórkowym czy laptopie zyskuje się pełną kontrolę nad modułem i możliwość dostępu do danych obrazu. Takie urządzenie zyskuje możliwość automatycznego wykonywania zdjęć jak i przetwarzania danych obrazu traktując modułu jak czujnik optyczny o poszerzonych możliwościach.

 

Przeznaczenie i zastosowania projektu interfejsu

Do niedawna wykorzystanie modułu kamery w systemie mikroprocesorowym stanowiło spore wyzwanie. Trudności wynikają ze sporej objętości danych obrazu, które trzeba zagospodarować jak i znacznej szybkości ich przesyłu. Jednak teraz małe mikrokontrolery zyskały spore moce obliczeniowe a niektóre jak te z rodziny STM32F2xx i STM32F4xx zostały wyposażone w specjalny interfejs do współpracy z dołączanymi zewnętrznymi kamerkami.

Ponieważ w dostępnych źródłach nie natknąłem się na wyczerpujący praktyczny opis podłączenia modułu kamery narodził się pomysł na wykonanie omawianego interfejsu. Jest to płytka z mikrokontrolerem do którego poprzez złącze można dołączyć większość spotykanych typów modułów kamer. Płytka interfejsu może służyć do testowania modułów i oprogramowania do ich sterowania. Może także pełnić funkcje pełnosprawnego urządzenia do wykonywania pojedynczych zdjęć o parametrach kontrolowanych przez użytkownika. Wystarczy skorzystać z przykładowego oprogramowania. Oprócz opisu części sprzętowej w następnych częściach krok po kroku zostaną omówione najważniejsze procedury obsługi modułu jakie powinien zawierać program sterujący.

Dla zwiększenia przejrzystości opisu przedstawiany interfejs jest niezwykle prosty. W planach autora leży rozwijanie układu i dodanie nowych możliwości i jeśli czytelnicy wykażą zainteresowanie tematem będzie on kontynuowany.

 

Ogólna budowa modułów kamer

Ponieważ projekt poświęcony jest praktycznemu wykorzystaniu modułu kamery o jego budowie należy powiedzieć absolutne minimum potrzebne do zrozumienia sposobu działania interfejsu. Głównym elementem każdego modułu jest sensor obrazu. Angielskie określenie tego elementu spotykane w sieci to System-On-A-Chip (SOC) Digital Image Sensor . Sensory mogą być produkowane przez różnych producentów, często spotykane są elementy takich firm jak Micron i Aptina . Producent modułu montuje sensor na płytce drukowanej dodając niezbędne do jego działania elementy takie jak stabilizatory, elementy bierne czasami optykę w postaci prostego obiektywu. Dostęp do sterowania modułem a w gruncie rzeczy sensorem zapewnia złącze z wyprowadzonymi wszystkimi sygnałami w tym także liniami zasilającymi. Na ogół różne moduły mają bardzo podobny zestaw sygnałów wyprowadzonych na złączu i mogą być podłączane do naszego interfejsu. Największe różnice nawet w obrębie sensorów tego samego producenta dotyczą budowy wewnętrznej i adresów rejestrów sterujących co jest istotne przy tworzeniu oprogramowania sterującego. Natomiast opisany w dalszej części artykułu mechanizm transferu danych obrazka pomiędzy modułem a mikrokontrolerem pozostanie taki sam dla różnych typów modułów.

Przy opisie projektu interfejsu oparłem się na obecnie najłatwiej dostępnych i typowych modułach z czujnikami obrazu MT9D111/MT9D131. Na rysunku 1 przestawiony został schemat blokowy czujnika i jego sygnałów.

 

Rys. 1. Schemat blokowy modułu kamery z przetwornikiem CCD

Rys. 1. Schemat blokowy modułu kamery z przetwornikiem CCD

 

Sygnały można podzielić pod względem funkcji na cztery grupy: magistralę danych obrazu Data Out, dwustronną magistralę do przesyłu danych do rejestrów wewnętrznych Serial I/O, linie sterujące Sync Signals, oraz zasilanie zegar taktujący i pozostałe linie sterujące które nie są tak istotnie dla standardowego użycia modułu.

Magistralą danych przesyłany jest strumień danych odpowiadający kolejnym pikselom obrazu. W niektórych modułach szerokość magistrali może być programowana. Opisywany interfejs jest przystosowany do współpracy z magistralą równoległą o standardowej ilości 8 linii danych.

Dwustronna szeregowa magistrala I/O daje dostęp do wewnętrznych rejestrów sensora. Za jej pośrednictwem przesyłane są nowe wartości konfigurujące parametry modułu takie np. jak rozmiar obrazka, jaskrawość, nasycenie itp. Także tą magistralą przesyłane są rozkazy inicjujące wykonanie zdjęcia i jego przesyłania. Interfejs jest przystosowany do obsługi 2-przewodowej magistrali, w której jedna linia pełni rolę zegara taktującego a druga linii danych. W przypadku sensorów  MT9D111/MT9D131 dane są przesyłane magistralą w formacie I2C.

Linie sterujące dostarczają do mikrokontrolera sygnały synchronizujące przesył danych obrazu. Bez względu na typ stosowanego modułu powinny być dostępne 4 sygnały sterujące:

  • PIXCLK którego zbocze służy do odczytu przez mikrokontroler, danych kolejnego piksela obrazu,
  • HSYNC którego aktywny poziom sygnału oznacza, że trwa przesyłanie danych kolejnej linii obrazu,
  • VSYNC którego aktywny poziom sygnału oznacza, że magistralą są przesyłane dane kolejnych linii ramki obrazu (określenie „ramka” oznacza zbiór kompletnych danych jednego obrazu).

Do linii sterujących można także zaliczyć sygnał zegara taktującego podawanego z zewnątrz do modułu.

Wszystkie wymienione sygnały znajdują się na złączu do którego dołącza się moduł. Dodatkowo poprzez złącze podawane jest zasilanie modułu.

 

Wewnętrzny interfejs DCMI mikrokontrolera

Na płytce interfejsu modułu kamery jest zamontowany mikrokontroler STM32F217VGT. Posiada on wewnętrzny sprzętowy interfejs DCMI ułatwiający transfer danych obrazu z modułu kamery do mikrokontrolera. Interfejs współpracuje z magistralą danych modułu oraz z liniami sterującymi. Ten wewnętrzny interfejs jest w stanie obsłużyć transfer danych obrazu o szybkości co najmniej 20 MB/s a jego działanie w niewielkim stopniu obciąża oprogramowanie użytkownika. Oprogramowanie w tym inicjacja i użycie interfejsu zostaną opisane w dalszej części tekstu.

 

Rys. 2. Schemat elektryczny systemu wideo z mikrokontrolerem STM32F2

Rys. 2. Schemat elektryczny systemu wideo z mikrokontrolerem STM32F2

 

Schemat ideowy przykładowego systemu z kamerą CCD pokazano na rysunku 2. Elementy obrysowane przerywaną linią nie muszą być montowane w najprostszej opisywanej w tym artykule wersji interfejsu. Mikrokontroler STM32F217VG działa z zewnętrznym rezonatorem kwarcowym 25 MHz. Na 18-stykowym złączu JP9 wyprowadzone są opisane wcześniej magistrale i sygnały sterujące. Oporniki R7-10 mają za zadanie stłumić szkodliwe oscylacje na liniach sygnałów sterujących. Sygnały w złączu są tak rozmieszczone, żeby móc je połączyć bezpośrednio ze złączem modułu przy pomocy 20-żyłowej taśmy z zaciskanymi na obu końcach złączami.

Głównym napięciem zasilającym układy interfejsu jest +3,3 V dostarczane przez stabilizator U3. Natomiast do zasilania modułu wykorzystywane jest napięcie stabilizowane przez układ U1. Zazwyczaj moduły kamer są zasilane napięciem +2,8 V. Ponieważ stabilizatory o takiej wartości znamionowej napięcia są trudniej dostępne można wykorzystać stabilizator +2,5 V a dzięki opornikowi R10 napięcie wyjściowe zostanie podwyższone do oczekiwanego poziomu. Stosując oryginalny stabilizator +2,8 V w miejsce opornika R10 należy wlutować zworę,

Pamięć EEPROM U6 może służyć do przechowywania parametrów konfiguracyjnych interfejsu. Powinna być zdolna do pracy z zasilaniem 3,3 V. Złącze JP6 służy do podłączenia dwukolorowej diody sygnalizacyjnej. Jej świecenie może służyć użytkownikowi do zorientowania się jaki jest aktualny tryb pracy interfejsu. Oprócz typowych elementów biernych jak oporniki i kondensatory odsprzęgające na płytce interfejsu powinny jeszcze zostać zamontowane dwa złącza JP2 i JP4. Złącze JP2 służy interfejsowi do komunikacji ze światem zewnętrznym. Przede wszystkim do styków JP2-1,3 należy podłączyć napięcie zasilania.

Możliwe są dwie konfiguracje:

  • Interfejs jest zasilany napięciem stałym z zakresu 5-9 V. W tym przypadku na płytce interfejsu powinny zostać zamontowane zwory Z3, Z4 a niepodłączona powinna pozostać zwora Z2.
  • Interfejs jest zasilany zewnętrznym napięciem stabilizowanym o wartości 3,3 V.  W tym przypadku na płytce interfejsu powinna zostać zamontowana zwora Z2 a niepodłączone pozostaną zwory Z3, Z4.  Jest to przypadek gdy stabilizator U3 nie pracuje i  można go nie montować na płytce.

Oprócz tego na styki 7 i 8 złącza wyprowadzone są linie RxD i TxD szeregowego portu mikrokontrolera. Za pośrednictwem portu możliwe będzie sterowanie interfejsem i odczyt plików wykonanych zdjęć. Pozostałe linie złącza przewidziane są do wykorzystania w późniejszych rozszerzeniach interfejsu. Jako złącze JP2 przewidziane jest gniazdo IDC10 (Z-FC10). Do takiego gniazda łatwo można podłączyć 10-żyłową taśmę z zaciskanym wtykiem.

Na złączu JP4 zostały wyprowadzone sygnały portu JTAG mikrokontrolera. Korzystając ze sprzętowego programatora np. ST-Link można poprzez port JTAG zapisać do pamięci FLASH mikrokontrolera oprogramowanie sterujące oraz pracować w trybie debugera. Na płytce jako gniazdo JTAG-a zastosowane zostało miniaturowe złącze o rastrze 1,5 mm. Nie jest to popularny standard toteż w przypadku korzystania z JTAGA możliwe są dwa rozwiązania. Przy pomocy przewodów dolutować na stałe do otworów złącza JP4 standardowe gniazdo IDC20 do którego można będzie podłączać programator. Drugie rozwiązanie polega na wykonaniu 9-przewodowej łączówki pomiędzy miniaturowym gniazdem a programatorem ST-Link. Autor z powodzeniem od kilku lat używa takiej łączówki, która okazała się trwałym i pewnym złączem pomimo wielokrotnego dołączania i odłączania programatora. A miniaturowe 9 stykowe złącze zajmuje na płytce drukowanej bardzo mało miejsca w porównaniu ze standardowym 20 stykowym grzebieniem JTAG-a w rastrze 2,54 mm.

Wszystkie elementy potrzebne do zmontowania miniaturowej łączówki portu JTAG można kupić przynajmniej w dwu miejscach w kraju. Podaję nazwy handlowe poszczególnych elementów:

    • gniazdo męskie proste lub kątowe do wlutowania do płytki jako złącze JP4 może nazywać się Pico Blade 9 Pin lub WN09R,
    • wtyk przejściówki składa się z obudowy Pico Blade 9 Pin może także nosić nazwę korpus złącza żeńskiego HN09,
    • korpus uzupełniany jest kupowanymi oddzielnie stykami Pico Blade lub stykami żeńskimi do korpusu HN.

Od strony programatora potrzebne będzie 20-stykowe złącze IDC. W wersji zaciskanej o symbolu IDE20-LF lub IDM20-LF.

Styki do korpusu żeńskiego przeznaczone są do zaciskania na przewodzie AWG28 o zewnętrznej średnicy izolacji 0,8…1,2 mm. Dla uniknięcia konieczności kupowania zaciskarki można posłużyć się domowym sposobem montażu. W środkowej części styku, która normalnie jest zaciskana należy przylutować żyłę przewodu stosując minimalną ilość cyny. Natomiast małe „łapki” styku przy pomocy pensety należy możliwie najciaśniej zacisnąć na izolacji przewodu tuż powyżej miejsca lutowania. Tak przygotowane 9 przewodów należy wsunąć w kolejne otwory korpusu wtyku aby się zatrzasnęły. Z drugiej strony przewody należy połączyć ze stykami gniazda IDC20, do którego będzie podłączany programator.

 

Tab. 1. Numery łączonych ze sobą styków

Miniaturowy wtyk 9 pin Złącze IDC20 Typ sygnału JTAG

1

1 3,3 V zasilanie JTAG
2 3 TRST
3 5 TDI
4 7 TMS
5 9 TCK
6 11 Można pozostawić nie podłączone
7 13 TDO
8 15 RESET mikrokontrolera
9 20 GND

 

Możliwości przykładowego oprogramowania ARS3 sterującego interfejsem

Po zmontowaniu interfejsu można zaprogramować mikrokontroler na płytce przykładowym oprogramowaniem sterującym ARS3. Po podłączeniu modułu powstanie prosta kamera-aparat cyfrowy o następujących możliwościach:

  • wykonanie zdjęcia na rozkaz użytkownika,
  • przesłanie pliku zdjęcia do komputera użytkownika,
  • wybór rozdzielczości obrazka i formatu BMP/JPG,
  • zmiana takich parametrów jak jaskrawość, kontrast, nasycenie,
  • zmiany szybkości transmisji portu szeregowego interfejsu.

Interfejs stanowi także platformę sprzętową do eksperymentowania z własnymi wersjami oprogramowania sterującego modułem kamery. Płytka interfejsu została zaprojektowana w taki sposób, żeby wraz z modułem można ją było zamontować w obudowie G410 o wymiarach 120x60x40 mm.

Do sterowania interfejsem z oprogramowaniem sterującym ARS3 można wykorzystać program narzędziowy miniARSET (do pobrania na dole strony). Po zasileniu interfejsu i połączeniu z portem komputera na pierwszej zakładce programu miniARSET należy wybrać opcję automatycznego wykrywania podłączonego urządzenia. Gdy to się stanie i zostaną wyświetlone informacje o urządzeniu można będzie przejść do zakładki „test Kamery”. Na zakładce dostępne są opcje wyboru i ustawienia nowych parametrów zdjęcia. Po ich zmianie można wykonać zdjęcie a następnie wybrać katalog na dysku w którym wykonane zdjęcie ma zostać zapisane. Po dokonaniu wyboru plik zdjęcia zostanie automatycznie przesłany i zapisany w wybranym katalogu.

 

ARS3 rozkazy sterujące

Do sterowanie interfejsem z oprogramowaniem ARS3 nie jest konieczne użycie programu miniARSET. Wystarczy znajomość paru tekstowych rozkazów i komend które można wysyłać z dowolnego programu typu terminal. Krótko opiszę podstawowe rozkazy i polecenia ARS3 sterujące interfejsem modułu kamery.

Rozkazy serwisowe używane są do przesłania nowych ustawień, które zostają zapisane w pamięci EEPROM interfejsu. Takimi ustawieniami są np. poziomy jaskrawości, nasycenia, kontrastu czy wybór szybkości transmisji portu szeregowego interfejsu. Ich wartości są pamiętane nawet po wyłączeniu zasilania.

Inicjacja trybu serwisowego następuje przez wysłanie do interfejsu trzech znaków „+++”. Przed i po transmisji na złączu szeregowym powinna panować cisza o czasie odpowiadającym przesłaniu 2 znaków. Jeżeli interfejs odpowie komunikatem „OK” oznacza to, że w ciągu najbliższych 10s pozostanie w trybie serwisowym i będzie reagował na kolejne rozkazy. Czas się automatycznie wydłuża po każdej prawidłowej transmisji. Tryb serwisowy można zakończyć w dowolnym momencie wysyłając rozkaz „ATO”.

Sekwencja rozkazu kończona jest kodem powrotu karetki CR (13 dziesiętnie). Po rozpoznaniu i wykonaniu rozkazu urządzenie wysyła potwierdzenie „OK”. W przypadku błędu odsyłany jest komunikat „ERROR” z numerem błędu.

Prawie wszystkie rozkazy serwisowe występują w trzech wariantach. Gdy do interfejsu przesyłana jest nowa wartość po kodzie rozkazu występuje znak „=”. Gdy chcemy odczytać aktualną wartość parametru po kodzie rozkazu wystąpi znak „>”. W trzecim wariancie gdy po kodzie rozkazu umieszczony zostanie znak „?” urządzenie w odpowiedzi powinno przesłać zwięzłą informację o przeznaczeniu ustawianego parametru i zakresie. W ten sposób bez konieczności wertowania dokumentacji urządzenie samo się przedstawia użytkownikowi.

 

Tab. 2. Przykład użycia trzech wariantów rozkazu ATS400 odpowiadającego za regulację jaskrawości kamery

Pytanie o zakres parametru

 

Odpowiedź interfejsu

 

+++

 

OK(CR)

 

ATS400?(CR)

 

AT$S400=0-100 jaskrawość
ATO(CR) OK(CR)
Przesłanie nowego parametru Odpowiedź interfejsu
+++ OK(CR)
ATS400=39(CR) OK(CR)
ATO(CR) OK(CR)
Odczyt ustawionej wartości Odpowiedź interfejsu
+++ OK(CR)
ATS400>(CR) ATS400<39(CR)
ATO(CR) OK(CR)

Listę wszystkich obsługiwanych przez system ARS3 rozkazów serwisowych interfejsu można obejrzeć po uruchomieniu zakładki Rejestry programu miniARSET .

 

Polecenia sterujące

Polecenia sterujące wymuszają na interfejsie wykonanie określonego działania np. wykonania zdjęcia, przesłania pliku. Interfejs reaguje na dwa polecenia: wykonanie zdjęcia „P” i przesłanie pliku zdjęcia „D”. W odpowiedzi przesyłane jest potwierdzenie wykonania rozkazu i kolejne porcje danych pliku zdjęcia. Składnia każdego polecenia jest następująca:

gdzie:

$ znak oznaczający początek polecenia;
i znak ASCII z przedziału ‘1’ – ‘7’ identyfikatora kolejnej transmisji;
    identyfikator kolejnej transmisji powinien być inny od identyfikatora poprzedniej transmisji;
    w przypadku powtórnego wysłania tej samej transmisji identyfikator powinien być taki sam;
Z znak ASCII określający rodzaj polecenia;
xx cyfry dziesiętne określające ilość przesyłanych danych (0 -brak danych);
r znak CR rozdzielający ostatnią cyfrę ilości danych od pierwszego bajtu danych;
ddd bajty danych.

 

Tab. 3. Przykłady sekwencji poleceń wykonania zdjęcia i przesłania jego pliku z interfejsu do komputera

Transmisja do interfejsu Odpowiedź interfejsu Opis
$1P1(CR)2 $A1P/ozo.jpg(CR) Polecenie: wykonaj zdjęcie formatu 2 Odpowiedź: wykonane zdjęcie zostanie umieszczone w wirtualnym katalogu ‘/’ interfejsu pod tymczasową nazwą  ‘ozo.jpg’
$2D8(CR)/ozo.jpg $B24(CR)1000(CR) Polecenie: inicjacja odczytu pliku ‘/ozo.jpg’ Odpowiedź: interfejs nie jest gotów i prosi o pauzę 1000ms
$3D8(CR)/ozo.jpg $A3Ds:7543 p:512 d:0 t:0(CR) Polecenie: inicjacja odczytu pliku ‘/ozo.jpg’ Odpowiedź: rozmiar przesyłanego pliku  7543 bajtów w paczkach o rozmiarze 512 bajtów (parametry data i godzina utworzenia pliku zdjęcia nie używane)
$4D0(CR) $A4d xxxxxxxxxxx… x Polecenie: odczyt pierwszej paczki pliku Odpowiedź: przesłanie 512 bajtów danych xxxxxxxxxxx… x
$5D0(CR) $A5d xxxxxxxxxxx… x Polecenie: odczyt kolejnej paczki pliku Odpowiedź: przesłanie 512 kolejnych bajtów danych xxxxxxxxxxx… x
$2D0(CR) $A2d xxx… x Polecenie: odczyt kolejnej paczki pliku Odpowiedź: przesłanie ostatniej paczki bajtów danych xxx… x
$3D0(CR) $A3(CR) Polecenie: odczyt kolejnej paczki pliku Odpowiedź: wszystkie dane zostały przesłane

 

Ryszard Szymaniak

Do pobrania

Autor: