[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

www.arskam.com

Do pobrania

O autorze