[Из песочницы] Time-lapse камера на STM32L
Согласно википедии Time-lapse или замедленная киносъёмка — это киносъёмка с частотой, меньшей стандартной частоты съемки и проекции в 24 кадра в секунду.
Гифка time-lapse Начав изучать микроконтроллеры STM32 и написав «HellowWorld» с миганием светодиодом, я понял, что для лучшего понимания работы STM32 мне необходимо реализовать что-то более сложное с использованием большего количества периферии микроконтроллера. Так возникла идея создания Time-lapse камеры.Разработанная мной камера будет делать фотографии примерно раз в 5 секунд и сохранять их на SD карту в формате jpeg. Далее их необходимо объединить на компьютере в видео файл.Для создания камеры я использовал следующие компоненты:
1) Отладочная плата STM32L-DISCOVERY. На ней установлен микроконтроллер STM32L152RBT6 специально разработанный для реализации устройств с низким энергопотреблением, что пригодилось бы для реализации питания камеры от аккумулятора.
2) Модуль LinkSprite JPEG Color Camera, работающий по интерфейсу UART. Данный модуль представляет собой уже готовую камеру, выдающую фотографии в формате JPEG по UART. Настройка и управление также осуществляются по этому интерфейсу.
Характеристики модуля LinkSprite:
Поддерживаемое разрешение фото: VGA/QVGA/160×120; Скорость от 9600 до 115200 (по умолчанию 38400); Питание 5V; Размер 32mm X 32mm; Потребляемый ток 80–100mA. 3) Модуль подключения SD карт от LC STUDIO, микроконтроллер будет взаимодействовать с ним по интерфейсу SPI.
4) Также может пригодиться любой «usb to uart» переходник для первоначального изучения модуля камеры LinkSprite (Для этого необходима программа LS-Y201) и для вывода отладочной информации с микроконтроллера на компьютер. (Не нашел красивые фотографии своего переходника в интернете, поэтому сфотографировал сам):
Как говорится, будем брать интеграл по частям:
Во-первых, разберемся с тем, как работает камера LinkSprite:
1) Соберем схему согласно рисунку (У модуля камеры нет обозначения проводов, но есть описание в мануале LinkSprite, так что если в моем рисунке не удалось разобраться, то обратитесь к нему).
Вот такая конструкция должна получиться (Для себя я пометил все провода идущие от модуля камеры). Один провод остается неподключенным, если верить информации на сайте, то это аналоговый видеовыход.
2) Теперь подключаем адаптер к компьютеру и запускаем программу LS-Y201. В ней необходимо выбрать Com порт адаптера (Особенность заключается в том, что можно выбрать только от 1 до 4, так что если адаптер у вас будет иметь большее значение, то придется его перенастроить). Далее нажимаем кнопку Open. После этого Com порт откроется и можно получать фотографии с камеры. Для этого используются кнопки Single Shot (Делает одиночное фото), Continues Shot (Делает фото, пока не будет нажата кнопка Stop Shot), Save Pictures (Сохраняет сделанное фото на диск компьютера), Reset (Сброс камеры к первоначальным настройкам), Exit (Выход из программы).
В настройках программы можно выбрать разрешение снимка 320×240 или 640×480 (Image Style), режим передачи по 512 байт или целиком кадр (Transfer Mode), скорость передачи (Rate, задается от 9600 до 115200, при этом будет необходимо изменить и скорость Com порта), коэффициент сжатия фото (Compress Rate), папку для сохранения фото (Path).
Обмен между компьютером и камерой осуществляется по протоколу, который описан в «LinkSprite JPEG Color CameraSerial UART Interface».
Существуют следующие команды:
Reset — осуществляет сброс камеры к первоначальным настройкам; Take picture — дает команду камере сформировать фото; Read JPEG file size — запрашивает размер сформированного фото; Read JPEG file content — считывает из камеры фото; Stop takink pictures — отправляется камере после считывания фото: Compression Ratio — задает степень сжатия фотографии; Image size — задает размер фотографии; Power Saving — переводит камеру в энергосберегающий режим (или выводит из него); Changing Baud Rate — задает скорость обмена с камерой по UART. С модулем камеры более менее разобрались, теперь соберем STM32 камеру.
Должна получиться такая конструкция из кучи проводов.
Для работы достаточно, но можно запихать все в какой-нибудь корпус. Я использовал картонную коробку от аккумулятора.
Рассмотрим теперь программу микроконтроллера.
Микроконтроллер настроен на максимальную частоту 32 Мгц от встроенного генератора 16 Мгц с помощью PLL. Для работы с модулем камеры используется UART1. Для вывода в отладочный порт используется UART2 (Для работы по UART используются прерывания и кольцевые буферы, подробно как все это настраивается описано в этой статье UART (USART) на STM32L (STM32)). SD карта подключена по SPI2. Также я использую RTC таймер для сохранения фотографий с привязкой ко времени и дате.Для работы с периферией я использовал библиотеку STM32L1xx_StdPeriph. Ее описание лежит в папке StLib.Все функции взаимодействия микроконтроллера с модулем камеры, SD картой и USB to UART переходником описаны в MyLib.
Для работы с Fat используется библиотека FatFs, ее файлы расположены в папке fatfs.Файл main.h содержит в себе все основные настройки проекта, такие как описание используемых ножек микроконтроллера, описание параметров используемой периферии.
Я бы хотел акцентировать внимание на этих строчках:
#define DEBUG // Выводит отладочную информацию в UART2 #define ENABLE_POWER_SAVING // Переводит камеру в энергосберегающий режим //#define JPEG_TO_UART // Выводит кадр jpg в UART2 Они могут помочь при отладке и проверке работоспособности камеры.Рассмотрим алгоритм взаимодействия микроконтроллера с модулем камеры.
Для настройки модуля камеры используются следующие функции:1. ResetCameraAtDifferentSpeeds () — первоначально необходимо перезапустить модуль камеры. Для этого ему отправляется команда сброса, так как неизвестно на какую скорость перед этим была настроена камера, пробуем сбросить на всех доступных (от 19200 до 115200). В случае успешного сброса, камера при загрузке выдает последовательность оканчивающуюся «init end». После этого необходимо выдержать интервал 2–3 секунды и можно продолжить настраивать камеру.2. Camera_ChBaudRate (4) — для более быстрой передачи кадров можно увеличить скорость обмена по UART или наоборот уменьшить, чтобы исключить ошибки передачи. По умолчанию камера настроена на 38400. (4 — это скорость 115200)3. Camera_ChPictureSize (2) — далее задается разрешение фотографий формируемых камерой. Оно может быть 160×120, 320×240 или 640×480. (2- разрешение 640×480)4. Camera_ChCompression (0×36) — задает коэффициент сжатия фотографий (от 0×00 до 0xFF), чем он больше, тем меньший размер они будут иметь.5. Camera_PowerSaving (1) — ну и в конце можно перевести камеру в энергосберегающий режим для уменьшения энергопотребления. (1- перевод в энергосберегающий режим)
Все эти действия описаны в файлах init_JPEGCamera.h и init_JPEGCamera.c расположенные в папке проекта MyLib.
После настройки камеры можно получать с нее фотографии, для этого необходимо выполнить следующую последовательность:1. Camera_PowerSaving (0) — если камера была в энергосберегающем режиме, вывести её из этого режима. (0- вывод из энергосберегающего режима)2. Camera_TakePicture () — отправить команду на формирование фото.3. Camera_ReadData () — считать сформированное фото из камеры.4. Camera_StopPictures () — отправить команду на окончание формирования фото.5. Camera_PowerSaving (1) — если необходимо, перевести камеру в энергосберегающий режим.
Описание этих функций находится в файлах functions_JPEGCamera.h и functions_JPEGCamera.c, расположенных в папке проекта MyLib.
Теперь рассмотрим алгоритм взаимодействия с SD картой.Я использую библиотеку FatFS, согласно этой статье Подключение SD карты по SPI к STM32F4xx и FatFS
Подключение карты проводится с помощью двух функций:1. С помощью функции disk_initialize карта инициализируется.2. Далее необходимо ее примонтировать f_mount.
После успешного выполнения этих действий можно осуществлять различные операции с картой, такие как:1. f_open — открытие файла,2. f_close — закрытие файла;3. f_mkdir — создание директории;4. f_chdir — выбор директории;5. f_write — запись в файл;6. f_read — чтение из фала.
Работу с камерой и SD картой я описал, теперь рассмотрим работу программы в целом:1. Инициализируем карту SD;2. Инициализируем модуль камеры;3. Открываем файл time.txt (в файле должна быть одна строчка формата 01.01.2014_12:00), в котором хранится время для отсчета таймера RTC;4. Считываем время и дату из файла и настраиваем RTC;5. Закрываем файл time.txt;6. Создаем директорию для хранения фотографий «LinkSpritePhoto»;7. При нажатии кнопки PA0 на плате делаем фото и сохраняем на карточку (Пока делается фотография, горит синий светодиод);8. В случае невыполнения какой либо из функций, сваливаемся в бесконечный цикл и мигаем зеленым светодиодом.
Для запуска камеры в непрерывном режиме необходимо раскомментировать в main.c следующие строчки:
//EnabledButtonStart = 101; // Для запуска в цикле раскомментировать эту строку //Delay (300); // Задержка для запуска в цикле И закомментировать эту строку: EnabledButtonStart = 0; // Для запуска в цикле закомментировать эту строку Тогда при включении, камера начнет писать фотографии непрерывно.В целом, описание того как работает данная камера я составил, теперь можно и показать результат работы.
[embedded content]
Гифка для тех у кого не проигрывается видео Почему-то все кадры уходят в желтизну, возможно объектив без ик-коррекции.Камера выдает информацию по UART в компьютер.
Cохраняет кадры на SD карту.
Ну и вывод из всего, что я натворил:
Библиотека STM32L1xx_StdPeriph снижает порог вхождения для изучения STM32l, но без изучения даташита все равно не обойтись. В дальнейшем, я думаю разобраться с режимами энергопотребления stm32l для того чтобы можно было запитать камеру от батареи. Список ссылок, необходимых, чтобы повторить все что я сделал:
А также ссылка для скачивания проекта STM32Camera.rar