Камера от мобильного телефона попала ко мне довольно давно, но только сейчас дошли руки поделать с ней какие-нибудь эксперименты.
В результате прочесывания интернета выяснилось, что это камера от 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".
Вот так выглядит программа:

Ну а вот и фрагмент видео, записанного с помощью этой программы и камеры, и платы Марсоход:
Ну а вот как я записывал это видео:
Как видите проект вполне работоспособный!

Понял, спасибо
В камеру , для включения режима "YUT 15fps" нужно передать 78,03,00
а у меня все биты получились "подряд" -
4F103805
0100 1111 0001 0000 0011 1000 0000 0101
sss --7--- ---8- A---0-- ---3-- A --0-- --0-- App
("s"-старт, "A" - подтверждение, "p" - стоп)
Разбираюсь с i2c.
Я смотрю по схеме, вы передаете число 0хA01C08F2, в обратном порядке получается число 0х4F103805. Что это за числа, откуда они взялись? по даташиту первым надо передать 0х78(адрес камеры)
Теперь уточнения по проекту ( могу ошибаться,но , насколько смог вспомнить ) тактовая, 100м
делится на 5 и соответственно, 20м , поступет на led[5] и далее на входной пин камеры "EXTCLK"
В самой камере ( в соответствии с установками "по умолчанию" ) эта частота делится на 2 и выдается на
"DCLK" . С этой же частотой камера выдает свои данные, и , с этой-же частотой , далее в проекте,
они передаются через Ethernet. Если что непонятно, спршивайте , всегда рады
"доработка самой платы - **допавание** нескольких разьемчиков:"
вторая ошибка на рисунке №6(схема). На нем DCLK соединен с PT_LEFT. что неверно. В связи с этим у меня вопрос - с какой частотой тактируется DCLK? от 25MHz? Это у камеры по умолчанию стоит такая частота?
У меня те же проблемы. соединение устанавливается , но пакеты не приходят. Выполнил на EPM, но с другим внешним генератором.
От 50 мГц может не заработать. Езернет-блоку
нужно 10мГц - меандр, а из 50 его не сделать -
нужно 60 или 40.
Вместо делителя на 5 (inst16), нужно поставить делитель на 2, и подать его выход на c[1] и c[2]
А что в проекте нужно поменять, чтобы работать от 40 мГц?
От генератора 100мГц.
Больше всего времени , при реализации любого проекта, уходит на
поиск информации, ее анализ и постановку задачи - что, из того, что
мы имеем и знаем, можно сделать. Сам же процесс кодирования и
отладки занимает считанные часы.
Разъемчик выпаяли от старого телефона, только у него
попала ширина и шаг, а по длине пришлось обрезать.
один вопрос - где раземчик для камеры преобрели? и как он називатся?
Дело не в емкости чипа, в разнице в скорости потоков данных. Из камеры данные поступают со скоростью 10мбайт/сек , а отправлять в компьютер можно только
10мбит/сек, т.е. только каждый восьмой полученный байт.
Можно было-бы уменьшить тактовую частоту на камеру (например в два раза ) и увеличить таким образом количество точек по вертикали(в два раза), но в этом случае уменьшится количество кадров/сек (тоже в два раза). В общем, приходится выбирать...
Печатные платы мы сами не изготавливаем, обычно, заказываем где-нибудь на стороне. Конкретно для этого
шилда был использован кусочек какой-то старой платы,
на котором была группа дорожек с нужным шагом(0.5мм) и переходными отверстиями с двух сторон. Затем дорожки
разрезали и в этом месте впаяли разъем(это хорошо видно на фотографии).
Было бы QVGA хотя бы - 320x240 :roll: ..