[PROJEKT] Programowy koder JPG dla STM32
W systemach mikroprocesorowych wyposażonych w kolorowe kamery są generowane pliki danych o sporych objętościach. W przypadku zdjęć, które mają być wykorzystane poza systemem najlepiej dane obrazu zapisać w formie pliku w powszechnie akceptowalnym formacie graficznym. Jeżeli w związku z dalszym wykorzystaniem obrazu dopuszczalna jest kompresja stratna najwygodniejszym formatem zapisu jest format JPG. Przy nieznacznym pogorszeniu jakości obrazu wielkość pliku JPG jest wielokrotnie mniejsza od rozmiaru danych wejściowych, co w systemach z mikrokontrolerami jest pożądane.
O ile łatwo znaleźć pliki źródłowe procedur koderów JPG dla dużych komputerów, to trudniej o podobny przykład dla małego systemu z ograniczonymi zasobami pamięci RAM i Flash. Z tego powodu kilka lat temu samodzielnie dostosowałem bibliotekę kodera JPG tak, aby możliwe było jej uruchomienie w urządzeniu z mikrokontrolerem z rodziny STM32F2xx. Jako podstawę wykorzystałem dostępny w sieci koder JPG dla komputera PC, opracowany w 1999 roku przez Cristi Cuturicu. Koder zapewnia 10…12-krotne zmniejszenie objętości danych wejściowych przy zadawalającej jakości obrazu po kompresji. Zużycie pamięci RAM zależy od rozmiarów zdjęć i sposobu użycia biblioteki kodera. W przypadku zdjęcia o wymiarach 160×120 pikseli w formacie RGB565 (2 bajty na piksel) i użyciu dwóch buforów w pamięci RAM dla danych obrazu i wyjściowego pliku JPG, potrzeba łącznie około 45…50 kB RAM-u. Zapotrzebowanie na pamięć można zmniejszyć jeżeli system posiada pamięć masową, z której można pobierać dane do konwersji a samą konwersję przeprowadzać kolejnymi krokami.
Opracowany przykład oprogramowania pokazuje sposób użycia biblioteki kodera JPG. Sposób działania programu jest następujący:
- oczekiwanie w pętli na sygnał do wykonania zdjęcia,
- ustawienie modułu kamery do wykonania zdjęcia o formacie 160×120 RGB565,
- wykonanie zdjęcia i przy pomocy mechanizmu DMA mikrokontrolera przesłanie danych obrazu z modułu do buforu w pamięci RAM,
- wywołanie procedury encode_image która koduje dane obrazu a wynikowy plik JPG zapisuje w buforze wyjściowym,
- przepisanie pliku JPG z buforu wyjściowego do katalogu na karcie microSD.
Procedura encode_image wywoływana jest z następującymi parametrami:
- parametr char określający typ kodowania i położenie buforu danych wejściowych. Ponieważ w tym przykładzie domyślnym buforem danych jest globalny bufor_RAM_pliku_obrazka_format[] utworzony w pamięci RAM mikrokontrolera parametr zawsze powinien mieć wartość KODOWANIE_JPG_Z_INT_RAM (0x02),
- parametr char * wskaźnik do początku buforu danych wyjściowych dla pliku JPG,
- parametr int rozmiar w bajtach buforu danych wyjściowych,
- parametr char czynnik którego wartość określa stopień kompresji. Zwykle 50, dla 80 kompresja jest większa ale spada jakość zdjęcia kodowanego w formacie JPG,
- parametr int szerokość w pikselach obrazu poddawanego kompresji,
- parametr int wysokość w liniach obrazu poddawanego kompresji,
- parametr char * w tym przykładzie nie wykorzystywany.
Po konwersji plik JPG zapisywany jest na karcie microSD. Do komunikacji pomiędzy mikrokontrolerem a kartą wykorzystywana jest magistrala SPI. Zdjęcia zapisywane są w katalogu odpowiadającemu aktualnemu dniu tygodnia. Katalogi dni tygodnia tworzone są na karcie automatycznie przez oprogramowanie. Za pracę z katalogami odpowiada darmowy FatFs – FAT file system przystosowany dla mikrokontrolera STM32F2xx.
Oprogramowanie na potrzeby niniejszego przykładu powstało z dostosowania większego projektu. Dla zwiększenia przejrzystości usunięto wszelkie procedury typu: obsługa UART-a, zmiana parametrów zdjęcia, ustawianie zegara RTC. Procedury te w rzeczywistym urządzeniu muszą być oczywiście dopisane i obsługiwane.
Rys. 1. Schemat elektryczny testowego „aparatu fotograficznego”
Oprogramowanie przystosowane jest do układu, którego schemat ideowy pokazany został na rysunku 1. W minimalnej konfiguracji do działania układu potrzebne są oprócz standardowych peryferii mikrokontrolera następujące komponenty:
- X2, C31, C32 układ rezonatora zegara czasu rzeczywistego RTC,
- BT1 bateria +3V do podtrzymania w czasie wyłączenia zasilania zawartości rejestrów zegara RTC i rejestrów pamięci BKP mikrokontrolera,
- złącze JP9 do dołączenia modułu kamery ze sterownikiem MT9D111 firmy APTINA,
- SD1 gniazdo dla karty microSD,
- D1, D2 diody sygnalizacyjne,
- S1 przycisk astabilny inicjujący wykonanie kolejnego zdjęcia.
Stabilizator U1 (2,5V) i rezystor R10 służą do wytworzenia napięcia +2,8V dla modułu kamery. W przypadku zastosowania stabilizatora o napięciu pracy 2,8V opornik nie jest potrzebny.
W celu przejrzenia zdjęć zapisanych na karcie należy kartę wyjąc z gniazda i użyć zewnętrznego czytnika. Oprogramowanie może zapisać do 999 zdjęć w jednym podkatalogu dnia tygodnia.
Projekt przykładowego oprogramowania przeznaczony jest do pracy w środowisku uVision KEIL/ARM. Dla prawidłowej kompilacji potrzebny jest dostęp do STM32F2xx Standard Peripherals Library.
Ryszard Szymaniak