Камера от мобильного телефона попала ко мне довольно давно, но только сейчас дошли руки поделать с ней какие-нибудь эксперименты.
В результате прочесывания интернета выяснилось, что это камера от SIEMENS CX65, и на нее есть хороший даташит (
Для подключения ее к плате Марсоход, во-первых, потребовалась доработка самой платы - допавание нескольких разьемчиков:
и перерезание дорожек:
Все это нужно для увеличения количества свободных пинов платы Марсоход.
Во-вторых, был изготовлен шилд для камеры:
и с обратной стороны:
Его этой платки вот такая:
Вот так все выглядит в сборе:
К сожалению разъемчик для камеры оказался припаянным неправильно, изображение получилось "вверх ногами", но это мы программно "починили".
Немного о самой камере.
Для подключения она имеет два интерфейса. Один управляющий, реализован на основе шины I2C ( используются сигналы SCL и SDA ) . Камера имеет большое количество внутренних регистров, которые доступны через этот интерфейс. После подачи питания все эти регистры устанавливаются в состояния "по умолчанию", описанные в даташите.
Второй интерфейс - для передачи видеоданных. Он похож на интерфейс VGA - есть сигналы строчной (HD) и кадровой (VD) синхронизации, только данные передаются не в аналоговом, а в цифровом виде по параллельной 8-битной
шине ( DOUT0..DOUT7, тактируемые DCLK ). Кроме того, для работы камеры нужна внешняя тактовая частота ( EXTCLK ).
О проекте и как все работает.
Я сделал проект в среде Altera Quartus II для платы Марсоход, его можно взять здесь:
После подачи питания на камеру, она , "по умолчанию" , находится в состоянии "OFF", и все сигналы интерфейса видеоданных отсутствуют.
Для включения камеры нужно через интерфейс I2C во внутреннем регистре по адресу "03", сбросить старший бит.
После этого камера начинает выдавать данные в режиме "YUV". Это значит, что на каждый пиксель изображения будет представлен двумя байтами, первый - цветоразностные сигналы, второй - яркость ( собственно он нам и нужен ).
Чтобы увидеть изображение от камеры, мы будем передовать данные на компьютер, в программку ethcam.exe через ethernet 10baseT. Когда-то мы уже передавали ethernet пакеты с платы Марсоход, у нас был такой проект.
В нашем проекте по каждому строчному синхроимпульсу будет инициироваться передача пакета ( один пакет - одна строка ). Поскольку скорость передачи через ethernet намного меньше скорости данных от камеры, разрешающая способность по
горизонтали получилась небольшой. Кроме того, в заголовке самого пакета много служебных данных и между пакетами должен быть какой-то промежуток, поэтому некоторым количеством пикселов в начале и конце строки пришлось пожертвовать. В итоге получилось черно-белое изображение с разрешением 124х480 точек.
Программа для компьютера была написана в среде Visual Studio 2010 на С++. Ее исходник находится там же, вместе с проектом для платы Марсоход (
Программа создает диалоговое окно, создает сокет UDP и поток (thread) который читает из сокета принимаемые данные. Когда принимается пакет UDP он анализируется - если он пустой, значит это кадровый импульс и начинается новый кадр с которого начинаем отсчет строк. Каждый новый пакет приносит нам новую строку. Как только их наберется 479, то кадр принят и его можно рисовать в диалоговом окне.
Кроме этого, программа имеет возможность записывать принятые кадры в AVI файл. Для этого в ней есть кнопка "Rec/Stop".
Вот так выглядит программа:
Ну а вот и фрагмент видео, записанного с помощью этой программы и камеры, и платы Марсоход:
Ну а вот как я записывал это видео:
Как видите проект вполне работоспособный!
Подробнее...