Найти тему
БоряЭлектрик

Самодельная wifi камера на микроконтроллере STM32.

самодельная wifi камера на микроконтроллере STM32
самодельная wifi камера на микроконтроллере STM32

Камера выдает jpeg картинку, 10FPS в разрешении 800x600 либо 5 fps 1280*1024. Для сравнения ESP32 cam которую я тестировал выдает 8 FPS 800x600. Для захвата изображения можно использовать python.Также есть возможность захвата браузером firefox 64 бит как поток MJPEG.

Содержание ролика: Самодельная wi-fi камера, точнее ее прототип на базе STM32F4, ESP8266 и камеры ov2640,не уступающая аналогу на базе ESP32 , думаю ее легко можно запихнуть в размеры 3x6 сантиметров, я не стал это делать, а уделил больше внимания прошивке . Есть примеры как для HAL так и для SPL.Все материалы для повторения с подробными инструкциями как обычно доступны под видео. Что имеем на данный момент? Для захвата изображения теперь можно применить Firefox, его 64 битную версию, но лучше использовать python т.к. там все работает корректно и можно сделать дальнейшую обработку картинки с записью в файл только тех картинок, на которых есть движение. Двукратное увеличение по FPS, на данный момент, это 10 FPS при разрешении 800x600. Либо 5 FPS при высоких разрешений. Качество картинки изменилось в лучшую строну. Я перенес настойки с ESP32 камеры и адаптировал под STM32 .Теперь при одинаковых настройках ESP32CAM, проигрывает STM32. Какие изменения в прошивке? По мимо основных буферов для захвата изображения , задействован буфер FIFO. Сюда попадают данные из фрейм буфера. Зачем ом нужен? Дело в том, что во время передачи TCP пакетов неизбежно возникают ошибки, тогда ТСP пакет отправляется повторно. Если ошибок нет или их очень мало все нормально. Если их становится слишком много, внутренний буфер ESP8266 будет заполнен не отправленными пакетами. Как только он будет полон на пине RTS, ESP8266 установится высокий логический уровень. После этого данные esp8266 отправлять нельзя т.к. они будут потеряны. Потому нам остаётся ждать низкого логического уровня на CTS пине микроконтроллера. Дабы не потерять данные с камеры они накапливаются в буфере FIFO.Чтобы задействовать контроль потока, нужно его активировать в альтернативной прошивке . Тут есть огромное поле для улучшений. Но реализация остается под вопросом? Например будут вопросы про применения DMA копирование из памяти в память, но как копировать в кольцевой буфер с помощью DMA? У UART есть пин CTS, его можно было бы наверно правильно применить в паре с DMA но как копировать из кольцевого буфера в периферию c помощью DMA? Тут скорее всего придётся отказаться от fifo буфера и использовать динамическое выделение памяти, тогда можно будет задействовать DMA по полной.

Быстрый тест камеры без монтажа доступен по ссылке https://www.youtube.com/watch?v=4y396Ll7wO8&feature=youtu.be

Так давайте расскажу о том как работает реализация просмотра камеры в браузере. Когда мы попытаемся зайти через браузер по ip. Будет установлено TCP соединение и браузер отправит GET запрос, обнаружив его микроконтроллер, отправляет ответ: (видео!!!) Где в HTTP заголовке в параметре «Content-Type:» указано ,что передается документ из нескольких частей, где каждая часть заменяет предыдущую. «X» в начале означает, что тип документа является экспериментальным. Здесь есть обязательная часть, «boundary=», в которой указывается разделитель между документами в нашем случае это слово, «frame». Затем перед каждым Jpeg изображением отправляется разделитель и в «Content-Type» уже указывается JPEG. Далее отправляется один кадр с JPEG и все повторяется. Так работает esp32 камера, к сожалению правильную работу с браузером до конца организовать не удалось. Так например при повторном запросе браузера у нас нет возможности повлиять на не отправленные данные в буфере ESP8266, поэтому сначала вылетят данные оставшиеся в буфере, а потом наш ответ браузеру, поэтому камера браузером может и не подхватится. Но как правило после перезагрузки с первого или со второго раза она подхватывается браузером нормально. Такой вариант не работает с 32 битными версиями firefox ,также как и esp32cam, причиной скорее является отсутствие передачи временных меток и длинны содержимого. Это можно было попробовать легко исправить, но не сегодня. Дальнейшая работа над проектом, т.е. попробовать разгрузить ядро, задействовав по полной DMA, переделать работу с firefox, зависит только от ВАС.