Воспроизведение видео на ЖК от Nokia с помощью Atmega32

SD Card + ATmega32 + цветной ЖК-дисплей NOKIA = Видео плеер!

В этой статье описано создание видеоплеера с использованием микроконтроллера ATmega32 и цветного ЖК-дисплея Nokia. Я взял цветной ЖК-дисплей на 65 тысяч цветов из старого телефона  Nokia 6030. Припаял 10 тонких проводов прямо на тонкую гибкую печатную плату подключения ЖК-дисплея площадью 0.5 см и припаял эти провода на другую плату. Для меня это было самой сложной частью проекта, потому что у меня нет маленького жала для паяльника и ЖК-разъема 5×2.

После этого я связал ЖК с atmega32 по SPI. Далее я инициализировал дисплей и отобразил на нем некоторые цвета для проверки его работы.

Потом я попробовал отобразить на нем неподвижное изображение. Я использовал Image library (Библиотеку изображений) для python,  чтобы извлечь информацию о пикселях из любого графического файла (JPEG, PNG и т.д.). Эта информация передавалась на AVR микроконтроллер через UART и отображалась на ЖК-дисплее с глубиной цвета 16 бит.

После этого я использовал SD карту для хранения этой информации (132×132 * 2) байт/изображение. SD карта также соединена с ATmega32 по SPI. Использовалась  файловая система FAT16. Работа с SD картой не является проблемой для меня, потому что я уже делал несколько проектов на SD/MMC картах и в этом проекте я использовал свой предыдущий код.

Таким образом, после вывода неподвижного изображений, я решил сделать слайд-шоу. Для этого я написал скрипт на Python для конвертации всех изображений в папке на компьютере в файлы 132x132x2, а это не что иное, как информация о пикселях. Я скопировал преобразованные файлы на SD карту (file.lcd) и отображал их в режиме слайд шоу с паузой между кадрами 1 секунда.

Я успешно сделал слайд-шоу, и внезапно меня посетила идея сделать видео плеер. Видео это не что иное, как слайд-шоу с высокой частотой кадров.

Тогда я начал искать в Google, как конвертировать видео в кадры. Я узнал о программе FFmpeg. Я использую Linux в качестве операционной системы. Я скачал FFmpeg и преобразовал образец видео с частотой 15 кадров в секунду и разрешением 132×65. После, я использовал свой Python скрипт для конвертации каждого кадра в информацию о пикселях. Вместо того, чтобы использовать много небольших файлов, я просто собрал всю информацию обо всех кадрах в один файл my_video.lcd. Я скопировал этот файл на карту памяти и изменил программу AVR микроконтроллера для него. В этой программе реализован доступ к файловой системе FAT16, поиск *.lcd файлов, при нахождении которых возвращается начальный адрес кластера этого файла, а далее он воспроизводится на ЖК-дисплее. Сейчас видео воспроизводится (без звука). Половину проекта можно считать завершенной.

Микширование аудио

Я проигрывал видео с частотой 15 кадров в секунду и глубиной цвета 16 бит на ЖК-дисплее. Видео должно иметь звук. Я начал думать, как подключить звук. Я использовал FFmpeg для извлечения 8 битного моно звука в формате WAV из видео файлов. С несжатым звуком в WAV-формате  легко справляется микроконтроллер с аппаратным ШИМ. Тогда я изменил свой Python скрипт. Я просто открывал WAV файл и пропускал первые 44 байта (WAV header), а далее я считывал образец аудио байт за байтом и вводил его между видеоинформацией согласно некоторым расчетам (см. ниже), связанным с битрейтом аудио и видео.

Для идеальной синхронизации аудио и видео, я создал программу коррекции ошибок в преобразовании, которая следит за ошибками синхронизации при соединения аудио и видео, и когда количество ошибок достигает порогового значения, записывается копия аудио, а не исправляется оригинальный файл, что препятствует накоплению ошибок и, следовательно, качества синхронизации звука и видео достигается в течение нескольких часов непрерывного воспроизведения видео.

Сейчас я разработал свой формат видео «video_with_audio.vin». При помощи микроконтроллера AVR, мне нужно извлечь аудио и видео, отправить аудио в кольцевой буфер, который будет отправлять ШИМ сигнал с помощью прерывания таймера и видео непосредственно на ЖК-дисплее. Если есть несоответствие байтов видео и аудио, то всё рухнет.  Я изменил программу AVR микроконтроллера для работы по описанному выше принципу и получил видео со звуком!

 

Немного математики

Скорость видео = 9 кадров / сек = 9 * 132 * 65 * 2 = 154440 байт / сек
Скорость аудио = 11000 байт / сек
Дискретизация видео/аудио = 154440/11000 = 14,04
Это значит, что после каждых 14 байт видео, нужно вставить байт аудио.
Это хорошо, но есть небольшая проблема — 14,04. Из за 0,04 будут накапливаться ошибки, которые будут плохо влиять на качество синхронизации аудио и видео, и особенно это будет заметно в длинных видео. Чтобы предотвратить это, я должен пропустить добавление оригинального аудио после каждых (1/.04) * 14 = 350 байт видео и добавить аудио. Таким образом, звук не будет обгонять видео в связи с 0.04 и, следовательно, синхронизация аудио и видео достигнута!

Вот ссылка где есть хорошая документация о ЖК-дисплеях.

Контролер ЖК-дисплея

В ЖК-дисплее, который я взял из оригинального телефона Nokia в качестве контролера ЖК-дисплея используется Philips PCF8833. Я разрабатывал программу ориентируясь на его документацию. В некоторых примерах кода и документации написано, что необходимо инвертировать команды, но я не знаю почему, но мне этого делать не пришлось.

Примечание:
Скрипт на Python написан для ОС Linux в Python 2.x. Перед запуском должна быть установлена Python image library и FFmpeg.
AVR C код написан в AVR-GCC компиляторе для Linux.

Скачать исходник и скрипт Python вы можете ниже

Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

МК AVR 8-битATmega321

Конденсатор0.1 мкФ3

Конденсатор22 пФ1

Резистор330 Ом1

Резистор2.2 кОм7

Резистор3.3 кОм7

Резистор10 кОм1

Кварцевый резонатор16 МГц1

Тактовая кнопка3

LCD-дисплей132×132 nokia color LCD1
Дисплей с телефона NOKIA 6030
Слот для карты памяти SD/MMC1
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.