Запускаем камеру от телефона, или что делать, когда ничего не получается?


    Лет восемь назад работал я в одном… а в прочем, не важно где. Делали мы там всякие разные интересные вещи. В том числе занимались системами технического зрения для роботов. Роботы были немного маленькие. И если привод для них маленький сделать не было для нас особой проблемой, то вот сделать миниатюрную цифровую камеру, которая не была бы размером с половину робота, было трудно (когда же мы наконец похороним PAL в таких разработках и везде будет цифра?). Если вам любопытно узнать, чем же всё закончилось, прошу под кат!


    Небольшой дисклеймер. С описываемых событий прошло уже достаточно лет, результаты работы не представляют никакого коммерческого интереса (ведь так, товарищ майор?), поскольку повторить полностью сейчас всё это невозможно из-за устаревания элементной базы, теперь можно рассказать, как молодой инженер искал решение проблемы и к чему всё это привело.

    Изначально у нас был микропроцессор PXA300, в который втыкался SoC, от тогда еще Aptina, типа MT9D131 (JPEG сразу на параллельном выходе), но всё это потребляло много, а смысла в таком монстре было мало.


    Проблема звучала просто – робот привязан к компьютеру проводом на 100 мегабит. Оператор должен видеть цветную картинку хотя бы 640х480 в целых 15 FPS. Ставить в него камеру, которая гонит параллельный поток в XScale, в котором потом происходит тупое складывание картинки в буфер и передача кадра по сети, показалось слишком расточительным (ну серьезно, целый линукс на борту только чтобы перекладывать байты из одного интерфейса в другой?). Особенно учитывая целевое разрешение камеры. Нужно было решение проще. Плюс существенные ограничения по габаритам не позволяли поставить даже самый маленький объектив типа М12, он был просто конских размеров вместе с держателем.


    Поскольку к описываемому моменту я достаточно поднаторел в разработке систем миниатюрных приводов, необходимость заниматься какой-то камерой немного удручала. Но в то же время неизведанное интриговало. В любом случае, хотелось научиться чему-то новому, особенно учитывая то, что мои предшественники путь, описанный ниже, так и не осилили (правда, тут мог сыграть фактор времени, они занимались этой разработкой парой лет раньше).


    В результате творческого поиска меня заинтересовали камеры мобильных телефонов, которые были модульными, стоили как блохи (это выяснилось уже позднее) и теоретически закрывали все наши хотелки. Вопрос был только в том, как такую камеру подключить и получить с неё картинку. Я начал с изучения доступных на рынке мобильных телефонов и конкретно того, какие параметры обеспечивают камеры в них. Сразу стало понятно, что принципиально есть два типа таких камер – модули с линзами с гибко-жесткой частью, которые заточены под конкретный конструктив телефона:


    ,
    и модули, вставляющиеся в так называемые кроватки, которые выглядели наиболее перспективно:



    реальный модуль,



    кроватки на любой вкус.


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


    Name Length Width Height Option 1 Height Option 2
    SMIA65 6.5 mm 6.5 mm 4.6 mm 5.8 mm
    SMIA85 8.5 mm 8.5 mm 6.1 mm 7.1 mm
    SMIA95 9.5 mm 9.5 mm 7.6 mm 8.6 mm

    и по конструктиву нам подходит самый маленький – SMIA65.


    Поиск нормальных брендовых камер ни к чему адекватному не привел. Искать такую дичь у китайцев я еще не умел, а нормальные европейцы типа ST хоть и заявляли о том, что производят подобные модули (и даже документацию на которые можно было скачать без регистрации и смс), продавать свободно заинтересованной публике не желали. Обращение в наше представительство ST не помогло, и пришлось продолжать копать.


    Слава ремонтникам мобильников! Схемы, платы, фотки! У них есть всё. После изучения документации и сопоставления доступных для покупки телефонов и запчастей выбор пал на камеру от Nokia 5250.


    Сферическая нокия в вакууме.


    Симбиан, все дела. Я даже качал торрентом какие-то дикие исходники этой чудесной операционки, в попытке найти готовый драйвер для камеры. Но, увы, тогда моих способностей на это не хватило. Опять пришлось копать глубже.


    Ох, какой же наивный я был. Это сейчас, пройдя весь путь от и до, я понимаю, что можно было существенно сократить время разработки, заказывая нормальные платы на нормальном производстве (правда, с оплатой тогда потенциально были некоторые проблемы, а ручки чесались сделать здесь и сейчас). Когда там появился JLCPCB или PCBWay? А тогда только ЛУТ на фольге, хлорное железо и два дня на всё про всё.


    Signal Integrity? Вы делали гигабитные дифпары на двустороннем миллиметровом текстолите из платана лутом? А я делал. Даже импеданс считал.



    0.5\0.2.


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


    Экспериментировал с паяльной маской, даже сделал несколько плат. Одну успешно запорол, пропаяв её при помощи флюса ТАГС (ха-ха, какая ирония. Сейчас на сайте чипдипа написано про остаточное сопротивление. Эх, эту бы надпись тогда). На той плате ничего нормально не работало, даже источники питания. Между дорожками, которые ну никак не могли быть связаны, всегда присутствовало от десятков до сотен килоом.


    Причем плату после пайки мыл в семи водах. Поначалу я думал, что что-то успешно спалил. Начал отпаивать источники питания и всякую обвязку. Замыкания не проходили. Кончилось всё тем, что отпаял с платы вообще всё. Замыкания остались. Сделал вывод, что дело во флюсе, который затёк под маску и не вымылся вообще ничем. После этого я перестал делать платы с маской сам и паять их с флюсом ТАГС.


    Но камера — это еще полбеды. Надо же было чем-то принимать последовательный сигнал и разворачивать его в параллельный, чтобы запихнуть в STM32F217 (BlackFin? Не, не слышали. К моменту описываемых событий я прочно состоял в секте стм-оводов и конфигурил клоки через только появившийся экселевский файлик (кубоводы, привет!)). Да-да, четырехсотых стм-ок тогда еще не было (хорошо, хорошо, они только появились), и я успешно использовал кит от стартеркита на двухсотой серии. Опять же в результате длительного поиска и изучения рынка оказалось, что пути ровно два. Либо брать лэттисовскую плисину, для которой был апноут по преобразованию CSI в PCAM (так и не нашел его из 2012 года у себя в архиве, но точно помню, что был такой), либо покупать STSMIA832 (забавно, ST выпилили свою доку на преобразователь с сайта. У них теперь можно только апноутом разжиться.) и учиться паять BGA. Поскольку пайка была мне ближе и знакомство с потрохами плисов не входило в планы, да и сроки откровенно поджимали, я обзавелся несколькими микросхемами и купил готовые переходники с TFBGA25 в DIP (и да, макет был собран на беспаечной макетке и даже как-то работал).


    Собственно, схема десериализатора совершенно банальна (не переживайте, ГОСТом тут и не пахнет, с тех пор я научился рисовать схемы посимпатичнее).



    Схема, да.


    Видите красные площадки? Это площадки подключения переходника из TFBGA25 в DIP.



    Плата.


    Но вернемся к камере. Чем прекрасна SMIA? Да тем, что поначалу казалось, что всё просто.



    Красота же?


    Все регистры модулей описаны, как выбрать внутреннюю цепочку тактирования, со всеми необходимыми пре- и постскейлерами, тоже описано.



    Такие подробности да в каждый документ бы!


    Пока я занимался всем этим, SMIA_Functional_specification_1.0.pdf стал моей настольной брошюркой, зачитанной до дыр.


    Но, чу, колченогое подобие драйвера (ах, какое громкое слово для заголовочного файла с несколькими функциями записи-чтения регистров камеры) написано, а в память микроконтроллера почему-то никакие байтики не падают. Хотя модуль через I2C успешно читается и записывается. О, сколько раз я думал, что неправильно сконфигурировал клоки или пропустил какую-то команду. Результата не было. Тогда я подумал, что хватит биться головой об стенку, надо делать что-то адекватное тому тупику, в который я угодил. Откуда я взял камеру? Правильно, из телефона. Телефон умеет показывать видео и делать фотографии с модуля? Умеет. Значит нужно тело на опыты. Драматичная нет история покупки донора для опытов лежит здесь.


    Как бы там ни было, самым сложным было подпаяться к клоку и данным с модуля.



    Ножки у кроватки под стенками, понимаешь.


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


    Вы тоже заметили строки с вопросиками, которыми я пометил запись непонятно чего непонятно куда (пакеты 45-50)? Эти странные регистры, не описанные в, казалось, незыблемой документации (кто ж знал, что в Manufacturer Specific Registers — [0x3000 – 0x3FFF] тоже надо что-то писать). Ну а дальше всё было очевидно. Пишем это непонятно что в непонятно куда и вуа-ля!


    first_picture_ever.png


    К сожалению не помню, есть ли тут дебайеризация (хм, J = demosaic(I,'grbg'); подсказывает, что есть) и если есть, то всё ли сделано правильно. Как и на втором кадре:



    Камера лежала на боку.


    Если повернуть голову набок, то можно прочитать 95% чего-то, рассмотреть рёбра какого-то радиатора, лежавшего на столе, и даже попытаться прочитать пароли на листочках с магнитной доски.


    Почему всё такое зеленое? А пёс его знает. Этим вопросом уже занимался нормальный адекватный программист (Миша, привет!), который прикручивал эту систему к LwIP и проклинал меня за маленький объем SRAM и малую скорость 217-го (120МГц всего), который еле успевал перекладывать байты. По его словам, надо было просто правильно выставить усиление цветов каналов.


    А дальше было дело техники. Нарисовать нормальную схему:



    Ещё одна схема.


    И сделать нормальную плату, которая показана на КДПВ.



    Плата, да.


    В производство, собственно, ушел вариант транслятора на отдельной платке (пришлось дорожки по 75мкм делать), чтобы не удорожать производство материнки, куда это всё напаивалось.


    Времени было на всё угрохано больше года. Сейчас это кажется диким и ужасно непродуктивным. Наверняка, есть много людей, проделавших бы подобное за пару месяцев. Но я был один, в коллективе никто таким не занимался, интернеты упорно молчали, совета просить было не у кого. Но опыт есть опыт. Я ни сколько не жалею о потраченном времени. Полученные знания бесценны! Предполагаю, подобным образом можно раскурить многие другие модули, которые всё еще ставятся в телефоны, ведь, по сути, никакой особой магии в них нет. Знай себе записывай правильные байтики в правильные регистры да трассировку корректную делай.


    А вы как думаете?

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 47

      +5
      Тоже однажды пришлось заводить подобную камеру, только на значительно более мощном процессоре Intel Atom BayTrail и с интерфейсом MIPI CSI. Как вспомню эту прекрасную 32х-битную Fedora с патченным Intel ядром, эти отличные драйверы для v4l2, этот замечательный процессор и не менее восхитительную прошивку для него от AMI… Слава яйцам, больше этим заниматься не надо, потрахались — и хватит!
        0
        Чисто ради любопытства: а Raspberry Pi camera чем вам не подошла? Полностью документированная, легко подключаемая… Если не ошибаюсь, и запустили ее в продажу как раз 8 лет назад.

        P.S. Вы просто написали «8 лет назад» как «38 лет назад». А 8 лет назад электроника была уже весьма продвинутой, и камер подобных было (без необходимости курочить мобильники), я думаю, вполне достаточно.
          +1

          Ох, ладно, не хотел писать, но сформулирую так. На роботе таких камер должно было быть больше одной. И не две и не три (правда, не одновременно, они должны были переключаться). Сделаете такое на малине? И вы размер камеры получившейся с кдпв представляете?

            +3
            Я не предлагал «делать на малине», вопрос был про камеру.
            0
            1 камера малины появилась 7 лет назад.
            2 габарит камеры малины даже без квадратной платы слишком большой из за разъема
            3 csi интерфейса нету в контроллерах, используемых автором
            4 закладывать малину, ардуину, esp32 и прочую diy китайщину в коммерческие проекты — очень плохая идея. (если нужны пруфы по этому пункту, почитайте статью про девайс flipper zero на хабре)
              +1
              4 закладывать малину… в коммерческие проекты — очень плохая идея.

              На всякий случай отмечу, что для средне-серийных (сотни-тысячи) проектов есть же RPi Compute Module — с более длительными сроками производства (кстати, на бывшей фабрике Sony в UK) и некоторыми дополнительными выводами (в конструктиве SO DIMM DDR2) — тем же 2м интерфейсом CSI-MIPI (там, вроде, лишь 2 линии).

              Автору статьи, как я понял, ComputeMjdule не помог бы — но для проектов вроде StereoPI вполне.
                0
                Вы пробовали их купить в таких количествах?
                  0
                  Не было необходимости. Вы ожидаете какие-то сложности?

                  Upd: проверил возможность покупки 100 модулей(в waveshare) — она есть (хоть и очевидно, что оптовые партии закупать в розничных магазинах — плохая затея)
                  +1
                  я ведь и написал, прочитайте про flipper zero на хабре на хабре, там как раз и была проблема с покупкой большой партии этих модулей
                    0
                    Похоже, вы читали ту статью по диагонали — цитата оттуда
                    Невозможно купить в большом количестве. Заводы вроде Farnell предлагают покупать Compute Module.


                    Лишь подтверждает мои слова.

                    И это касается не только RPi, но и NVidia Jetson, Khadas Edge и некоторых других.
                +3
                По поводу Raspberry Pi камер мною и коллегами за последние три года было сказано много горьких слов на разных языках. Сенсоры для них, по нашему общему впечатлению, берутся из какой-то отбраковки — и вместо нормального клея или двустороннего скотча клеятся к плате какой-то обьемной «жвачкой». При этом (особенно после применения оригинального «гаечного ключа» для фокусировки) вы никогда не знаете куда точно направлена оптическая ось камеры — потому что модуль на этой «жвачке» болтается туда-сюда от вибрации, нагрева или просто так.
                Про «полностью документированная» — это хорошая шутка. Оба человека, пытавшиеся «раскрутить» и описать подробности ее работы — наняты Foundation и подписаны под NDA.
                +6

                Сколько камер в мусор уходит. Давно у меня печалит такое обращение с высококачествеными камерами, которые могли бы быть применены в любительских хобби вместо простейших камер для rpi/opi/esp. И часто выбрасывают телефоны с исправными экранами...

                  +16
                  Без документации это электрический мусор.
                    +3
                    Ну вот лежит камера (точнее сенсор KNC 201 39) от sony erricson K750. Даже с шлейфом. И дальше что? Ни схем, ни описания протоколов.
                      +6
                      Ха. У меня лежат lumia 1020 и 930. Обидно — куча отличных мегапикселей же…
                        0

                        Самоделкины всех стран объединяйтесь. Автор показал, что необходимо для того чтобы запустить эти камеры, теперь необходимо эти данные собирать и распространять.

                          +2
                          Эх, вот раньше всякие кружки были, клубы любителей.
                          А сейчас — куча коробок старой техники под разбор и девать некуда, а одному все самоделки в мире не переделать…
                      +1
                      и конфигурил клоки через только появившийся экселевский файлик

                      Ох, ностальгия… Такой классный был файлик, генерил код на регистрах! А с кубом для этого весь HAL тащить приходится.

                        0
                        а какая разница? HAL тоже обертка над кодом на регистрах
                          0

                          Ну так, для использования HAL'a нужно HAL тащить, а для регистров напрямую — не нужно :)
                          К тому же, когда он только появлялся, им пользоваться было решительно невозможно.

                        0
                        Эта задача решалась на официальной работе или это было хобби?
                          0

                          На официальной. Вас убивают сроки разработки? Я не только этим там занимался. Но всё равно времени было очень много потрачено, да.

                            0
                            Нет, не сроки. Организация процесса. Странно, что вам санкционировали работу в таком виде. Сроки — это уже следствие.
                              0
                              М… а как бы вы решали подобную задачу?
                                0
                                Изучил бы чужой опыт. Изучил достоинства и недостатки. Использовал бы соответствующие методы и инструменты, чтобы исключить «детские ошибки».
                                  +6
                                  Дык, в том и дело, что опыт был изучен вдоль и поперёк. Все делали камеры на аптиновских или омнивиженовских матрицах с внешней оптикой, которая у нас никуда не помещалась. Если бы можно было прикрутить MT9D131, я бы даже заморачиваться не стал. А камеры от мобильников — мне попадалась какая-то статья, в которой человек что-то подобное делал, но без подробностей.
                                  Ну а детские ошибки, куда же без них? :) Не сделав их, не станешь взрослым. Разве нет?
                          +2

                          Ух, вот спасибо за воспоминания.
                          То же самое, только на несколько лет пораньше, STM32 ещё не совсем вышли, камеры в телефонах камерами-то и не назвать.
                          в качестве первого прототипа MT9V022 в BGA на однослойной плате без маски — вот где слабоумие и отвага, но заработало. blackfin 532, потому что аппартный контроллер памяти и lqfp,
                          да ещё и на этом же параллельном видео порте вместе с матрицей какой-то аналоговый PAL энкодер для возможности переключения выхода "прямо на телевизор".

                            0
                            Очень интерестная тема. Всегда хотел купить камеру от айфона подключить её к ТВ Бокс Андроид. Но опыт мой нулевой. Есть интерестная тема но не смог найти подобных людей которым это тоже было бы интерестно да и времени заниматься небыло тогда.
                              0
                              Хорошая статья, было интересно
                                +2
                                Без документации это электрический головоломка.
                                  0

                                  Может, кто-то однажды сделает фотоаппарат-шасси со множеством кроваток под самые популярные мобильные камеры и крутым софтом, который мог бы методами вычислительной фотографии собирать одно качественное фото из множества от 1 до десятков) разных менее качественных.
                                  Типа — купил такое шасси тыщ за 5, прошёлся по ларькам с ремонтом мобильников, набрал пару десятков дохлых телефонов с приличными камерами, расставил в кроватки и получил крутой фотик.

                                    +1
                                    Думается мне, такое не пять тысяч будет стоить.
                                    +4
                                    Времени было на всё угрохано больше года. Сейчас это кажется диким и ужасно непродуктивным. Наверняка, есть много людей, проделавших бы подобное за пару месяцев. Но я был один, в коллективе никто таким не занимался, интернеты упорно молчали, совета просить было не у кого. Но опыт есть опыт. Я ни сколько не жалею о потраченном времени. Полученные знания бесценны!


                                    Это было прекрасное время! Не стоит жалеть, разве что очень завидую тому, что была у вас возможность этим заниматься!
                                      0
                                      А где вы брали даташит на камеру? А то у меня есть камера от nokia7610, которая SMIA95. Но не удалось найти на нее документацию.
                                        +5
                                        Ну как где. Нигде. В стандарте SMIA описаны все регистры кроме регистров производителей, в которых, как оказалось, и была вся засада. Вы же прочитали статью не по диагонали? ;)
                                        Вот вам названия файлов, думаю, вы их легко сейчас найдете:
                                        SMIA_Symbian_SMIA_Camera_device_driver_interface_1.0.pdf
                                        SMIA_Mechanical_Specification_1.0.pdf
                                        SMIA_Functional_specification_1.0.pdf
                                        SMIA_CCP2_specification_1.0.pdf
                                        SMIA_Software_and_application_specification_1.0.pdf
                                        SMIA_Introduction_and_overview_1.0.pdf
                                        SMIA_Reliability_Specification_1.0.pdf
                                        SMIA_Characterisation_Specification_1.0.pdf

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

                                          Вот логи с нее записать не получится… Той мобилы уже давно нет… Спасибо за файлы.

                                        0
                                        Как вам удалось запустить MT9D131? Работал с ней, это же адская дичь) и сама она глючная, и доки на неё глючные)
                                          0
                                          К счастью, я ею не занимался. Её сделали до меня. Не знаю, читает ли разработчик драйвера для линукса этот топик (Паша, ты читаешь?), но она работала. Даже видео показывала вполне адекватное. С точки зрения железа там всё прозаично, вроде бы. С точки зрения софта — не знаю.
                                            0
                                              0

                                              у микрона (aptina или кто там их нынче купил) документация — можно сказать просто образец для подражания, по сравнению с остальными.

                                                0
                                                Сейчас — наверное да, а вот лет 10 назад доку на MT9 пришлось добывать на подпольных китайских сайтах)
                                                  0
                                                  Хм. Я без проблем подписывал NDA с аптиной. Вот с ON Semi намного сложнее всё было. Когда делал камеру на MT9J003, описание регистров пришлось доставать через знакомых.
                                              0
                                              Очень интересная история, спасибо, что поделились!
                                                +2

                                                Интересная статья, спасибо.
                                                Не подскажите, каким образом получали вывод логического анализатора в текстовом виде?

                                                  +3
                                                  Спасибо! В салеа есть экспорт в csv.
                                                  0
                                                  Как обычно — при решении задачи полезно знать ответ (правильные регистры инициализации)
                                                    0
                                                    Подскажите, по моему ошпарка была уже 8 лет тому, кто в курсе, когда они начали?

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                    Самое читаемое