Создание WiFi-мобиля на основе одноплатного компьютера из камеры видеонаблюдения: Часть I

Создание WiFi-мобиля на основе одноплатного компьютера из камеры видеонаблюдения: Часть I

Я уже рассказывал про то, как из телевизионной приставки можно сделать одноплатный компьютер (SBC — single board computer). Если же у вас завалялась ненужная или разбитая камера видеонаблюдения, не спешите её выбрасывать. Я покажу, как её можно использовать, даже если на ней не работают какие-либо функции вроде звука, изображения и т. п. Сегодня нас камера интересует только как SBC. Расскажу, как найти куда подпаять нагрузку, какую нагрузку можно подключить к камере и какими способами можно ею управлять.

Средняя камера видеонаблюдения — это ARM-система на процессоре 500-900Mhz с памятью 64-256Mb. Это гораздо серьёзнее, чем общепринятые контроллеры AVR Atmega и даже ARM STM32 с частотами в пределах нескольких сотен мегагерц. Такие ресурсы можно найти на плодово-ягодных одноплатниках вроде Raspberry, Orange, Banana. Но там и цена!

Покопавшись в коробочке, я для примера выбрал плату камеры. У этой камеры сгорела светочувствительная матрица. Но внутри остался винчестер SPI флэш на 8 мегабайт с рабочей системой Linux на базе OpenIPC, сетевой интерфейс, пины для подключения USB. А самое главное выходы для подключения динамика, микрофона, датчика освещения и IR CUT-фильтра, который должен переключаться в зависимости от дня и ночи. Это всё наши бесценные GPIO-контакты! GPIO — контакты общего назначения (general purpose input output). Через них мы можем управлять внешней нагрузкой. Очень желательно брать камеру, на которой всё ещё работает UART — контакты RX/TX для подключения консоли. Это может помочь во многих ситуациях. К примеру, без этого испорченные настройки сетевого интерфейса превратят камеру в кирпич, к которому не будет никакого доступа из внешнего мира. UART поможет нам настроить на Wi-Fi даже такую камеру, на которой не работает LAN-интерфейс, подпаяв беспроводной адаптер к USB.

Плата камеры вендора XiongMai 50H10L на процессоре Hisilicon HI3518EV200

Ну, хватит лирики, давайте к деталям. Подопытный образец — это плата 50H10L. Как выглядел корпус именно этой камеры, уже никто никогда не узнает, но почти на такой же плате десятилетие назад собирали камеры Escam QD300.

Распиновка 50H10L

▍ Железо подопытной камеры

На плате имеется процессор Hisilicon 3518EV200, под который я подобрал правильную прошивку OpenIPC. Использование OpenIPC нам нужно для управления GPIO через sysfs. В заводской прошивке обычно такой возможности нет. Кроме того, в этой ОС есть огромное количество полезных инструментов, и в отличие от прошивок производителей камер не создаются искусственные препятствия для доступа ко всем компонентам. На заводской прошивке придётся повозиться, чтобы включить telnet или SSH-доступ, найти пароль доступа и потом надеяться, что в системе доступны команды вроде mount.nfs и т. п. Очень удобно, что вся файловая система в OpenIPC доступна для записи через оверлей. Таким образом вы можете не только изменять, но и удалять любые файлы и даже отменять удаление файлов из прошивки. Все изменения сохраняются в директории /overlay. Вы, конечно, можете попробовать всё повторить на стоке, но в посте речь будет идти именно о системе Linux из проекта OpenIPC. Как устанавливать OpenIPC, я рассказывал.

Если хотите повторить опыт, то вам придётся установить эту ОС и оказаться у консоли системы через UART или через SSH. А пока мы перейдём к аппаратному вопросу: где находятся на плате камеры те контакты, которыми можно управлять из Linux.

▍ IRCUT и драйвер мотора 6208

IRCUT — это электромагнит управления IR-фильтром. Следует учитывать, что выходы IRCUT управляют электромагнитом, и потребляемый ток для GPIO слишком высок, поэтому всегда этот выход подключён не напрямую в процессор, а через микросхему драйвера мотора (по сути). Чаще всего это микросхема 6208, к ногам 5 и 8 которой ведут два GPIO от процессора. Именно тут к ним можно подпаяться. Но установленный драйвер мотора может для вас оказаться незаменимой штуковиной. Без такого усилителя не запитать что-либо кроме самого маломощного светодиода.

В первую очередь встроенная микросхема вам может послужить просто как усилитель тока, который позволит питать нагрузку до 500mA при напряжении питания камеры 12V. При потребности, если верить даташиту, микросхему можно запитать до 18V, но только если рассеиваемая мощность не будет превышать полватта. Таким образом к её двум выходам вместо IR CUT мы можем подключить две нагрузки, замкнув второй контакт каждой на землю.

Но самая интересная функция этой микросхемы в том, что подавая на два входа A и B нули и единицы в различной комбинации, мы можем заставить течь ток между выходами A и B в любом направлении. На камере это используется для того, чтобы электромагнит притянул (подаём 0 и 1) или оттолкнул (подаём 1 и 0) рамку IR-фильтра. Это происходит за небольшое мгновение, поэтому в камерах микросхема всё остальное время на оба входа получает два нуля, и ток между двумя выходами отсутствует. Но мы же можем подключить маломощный двигатель и крутить его в любом направлении и вперёд, и назад.

На практике такое использование этой микросхемы её нагревает. Поэтому в некоторых случаях выходы GPIO я брал с контактов 5 и 8 микросхемы 6208 и вывел на более мощную микросхему L293D. В теории она может усиливать 4 GPIO, а значит обслуживать сразу два мотора постоянного тока, чтобы вращать каждый в любом направлении.

Подключение мотора на коннектор IRCUT

▍ Контакт датчика освещения

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

Демонтирован транзистор и подключён провод, ведущий к светодиоду

Я думаю, на этом этапе моя мысль ясна: выбрасывая ненужную периферию камеры, можно подключиться к некоторому количеству выходов GPIO. Перечислю, что можно ещё задействовать с платы камеры, чтобы получить дополнительные GPIO:

  • ALARM IN,
  • ALARM OUT,
  • AUDIO IN,
  • AUDIO OUT,
  • UART TX,
  • UART RX,
  • светочувствительная матрица.

▍ Управление GPIO из Linux

Есть два способа управления GPIO: через файловую систему sysfs и напрямую через /dev/mem командой busybox devmem прямым доступом. Не припоминаю, чтобы первый способ был реализован в стоковых прошивках, но он очень удобен и доступен в OpenIPC. Если вы не программист и ваше знание Linux заканчивается на bash-скриптах, то это способ для вас. Кстати, приведённые ниже примеры вполне актуальны и для плодово-ягодных компьютеров с системами вроде Armbian или OpenELEC за той лишь разницей, что там GPIO выведены на симпатичные документированные гребёнки и не приходится возиться с их выискиванием на плате и пайкой. Скукота, да и только!

Смотрим задействованные системой GPIO:

root@openipc-hi3518ev200:~# ls -l /sys/class/gpio/
total 0
--w-------    1 root     root          4096 Oct 22 17:49 export
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip0 -> ../../devices/platform/soc/20140000.gpio_chip/gpio/gpiochip0
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip16 -> ../../devices/platform/soc/20160000.gpio_chip/gpio/gpiochip16
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip24 -> ../../devices/platform/soc/20170000.gpio_chip/gpio/gpiochip24
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip32 -> ../../devices/platform/soc/20180000.gpio_chip/gpio/gpiochip32
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip40 -> ../../devices/platform/soc/20190000.gpio_chip/gpio/gpiochip40
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip48 -> ../../devices/platform/soc/201a0000.gpio_chip/gpio/gpiochip48
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip56 -> ../../devices/platform/soc/201b0000.gpio_chip/gpio/gpiochip56
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip64 -> ../../devices/platform/soc/201c0000.gpio_chip/gpio/gpiochip64
lrwxrwxrwx    1 root     root             0 Oct 22 17:40 gpiochip8 -> ../../devices/platform/soc/20150000.gpio_chip/gpio/gpiochip8
--w-------    1 root     root          4096 Oct 22 17:48 unexport

Эти файлы не являются файлами на диске. Это лишь способ управления настройками, драйверами и устройствами через файловую систему sysfs. Всё, что начинается на gpiochipXX, нас не интересует — это контроллеры GPIO. Интересующих нас файлов gpioXX пока нет.

Но прежде чем мы их создадим, нужно выяснить, какой номер GPIO каким физическим контактом на плате управляет. Зная вендора платы камеры и процессор, здесь можно с некоторой вероятностью найти, какие номера GPIO задействованы и на каких компонентах: github.com/OpenIPC/wiki/blob/master/en/gpio-settings.md.

IRCUT1, IRCUT2 есть на всех камерах: как я уже говорил, к ним двумя проводками подключён через микросхему 6208 блок с IR-фильтром, к которому крепится объектив. IRSTATUS — это датчик освещённости. На старых камерах сам датчик находится на плате подсветки со светодиодами, но на многих новых может вообще отсутствовать. Состояние освещённости можно получить и без фоторезистора.

Выбираю по табличке, зная, что моя плата на процессоре 3518ev200 произведена вендором XiongMai. Обратите внимание, что вендор платы это не то же самое, что производитель камеры. Одна плата может использоваться огромным количеством производителей камер, таких как Azishn, Escam, Gadinan и т. п. Вижу, что IRCUT — это 33,34, IRSTATUS — это 24. Выводы ALM_IN и ALM_OUT на моей плате не разведены. Чтобы их найти, нужно открывать даташит на процессор и искать, как к ним можно подпаяться.

Подпаиваю для эксперимента самые, насколько возможно, маломощные светодиоды одной ногой (катод) на землю через резистор 1кОм. И другой стороной (анод) к входным ногам 5 и 8 микросхемы 6208 усиления сигнала для IRCUT, а также к коннектору, который ведёт на датчик освещения. Я использовал для ограничения тока один общий резистор на все светодиоды. Сегодня будем управлять GPIO-пином с номером 33.

Включаем доступ к нему. Для этого записываем номер 33 в файл export:

echo 33 > /sys/class/gpio/export

В результате этого действия у нас появляется в этой же директории ещё один симлинк на директорию, через файлы в которой можно управлять состоянием нашего светодиода:

lrwxrwxrwx    1 root     root             0 Oct 22 17:49 gpio33 -> ../../devices/platform/soc/20180000.gpio_chip/gpiochip4/gpio/gpio33

Чтобы не усложнять жизнь, не обращаем внимания, куда ведёт эта символическая ссылка. Мы будем работать с директорией gpio33. Но адреса из этой ссылки в будущем нам могут понадобиться для второго способа доступа к GPIO.

Теперь нужно указать назначение пина: ввод или вывод данных. Сейчас я хочу зажечь подпаяный светодиод, значит это будет вывод (out). Если бы мне нужно было считывать состояние какого-либо датчика, тогда следовало бы включать ввод (in). Записываем слово out в файл direction:

echo out > /sys/class/gpio/gpio33/direction

Эта настройка делается только один раз после загрузки ОС. Теперь записываем единицу в значение этого порта, зажигаем светодиод:

echo 1 > /sys/class/gpio/gpio33/value

Выключаем светодиод:

echo 0 > /sys/class/gpio/gpio33/value

Дальше можете подключать усилитель и управлять вместо светодиода хоть заводом через этот контакт. Ну нормально же, запустил скрипт по крону, и завод начал работать в 8:00, можно на работу не идти.

У управления GPIO через sysfs есть большой недостаток — очень медленная скорость. Есть ещё один способ через devmem, но способ достаточно сложный.

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

▍ IPCTool

А пока вернёмся к вопросу поиска GPIO. Если вы не знаете вендора платы камеры или не нашли её в табличке, то у вас проблема. Перейдём к следующему этапу с надеждой на везение.

Ребята из проекта OpenIPC создали чудесный незаменимый инструмент для исследования камер — утилиту ipctool.

Эта программа, будучи запущенной на заводской прошивке камеры, покажет ценнейшую информацию о камере, такую как процессор, сенсор, память, MAC, PHY, mtd блоки и, главное для нашего сегодняшнего эксперимента, возможные контакты IR CUT. Очень важно снять и сохранить эту информацию до смены прошивки на OpenIPC, потому что потом будет сложнее.

Welcome to HiLinux.
~ # mount -o nolock 192.168.1.100:/mnt/nfs /mnt/nfs/

~ # /mnt/nfs/ipctool
---
chip:
  vendor: HiSilicon
  model: 3516DV100
board:
  vendor: Hankvision
  model: V6202IR-OV4689
  possible-IR-cut-GPIO: 6,7,42,45,112
ethernet:
  mac: "00:2a:2a:33:88:52"
  phy-mode: rmii
rom:
- type: nor
  block: 64K
  partitions:
    - name: boot
      size: 0x50000
      sha1: 8e569ea5
      contains:
        - name: uboot-env
          offset: 0x40000
    - name: kernel
      size: 0x2b0000
      sha1: f848b1e2
    - name: rootfs
      size: 0x200000
      path: /,jffs2
      sha1: cf51c57c
    - name: data
      size: 0xb00000
      path: /mnt/flash,jffs2,rw
  size: 16M
  addr-mode: 3-byte
ram:
  total: 256M
  media: 160M
firmware:
  u-boot: "2010.06 (May 18 2015 - 09:40:27)"
  kernel: "3.4.35 (Sat Sep 12 11:02:20 CST 2015)"
  toolchain: gcc version 4.8.3 20131202 (prerelease) (Hisilicon_v300) 
  libc: uClibc 0.9.33.2
  sdk: "Hi3516A_MPP_V1.0.4.0 B040 Release (Jun 28 2015, 09:24:48)"
  main-app: /mnt/flash/Server/mediaserver/sdk_app
sensors:
- vendor: OmniVision
  model: OV4689
  control:
    bus: 0
    type: i2c
    addr: 0x6c
  data: {}
  clock: 24MHz

Чтобы точно выяснить на вашей камере GPIO, нам поможет ipctool, которая имеет отличный режим отслеживания изменений на контактах GPIO. Чтобы запустить на заводской прошивке, я подмонтирую NFS-директорию с предварительно скачанной программой по адресу 192.168.1.100:/mnt/nfs:

~ # mount -o nolock 192.168.1.100:/mnt/nfs /mnt/nfs/
~ # /mnt/nfs/ipctool gpio scan

Дальше нужно спровоцировать камеру переключить IRCUT. Например, затемнить датчик света. Как только камера переключится щелчком в ночной режим, ipctool покажет, на каких GPIO были изменения.

root@openipc-hi3518ev200:~# ipctool gpio scan
The ipctool installed as remote GitHub plugin
Gr: 0, Addr:0x2014033C, Data:0x00 = 0b00xx0000, Addr:0x20140400, Dir:0x00 = 0b00xx0000
Gr: 1, Addr:0x201501FC, Data:0x00 = 0bx0000000, Addr:0x20150400, Dir:0x00 = 0bx0000000
Gr: 2, Addr:0x20160000, Data:0x00 = 0bxxxxxxxx, Addr:0x20160400, Dir:0x00 = 0bxxxxxxxx
Gr: 3, Addr:0x201703E0, Data:0x98 = 0b10011xxx, Addr:0x20170400, Dir:0x00 = 0b00000xxx
Gr: 4, Addr:0x2018007C, Data:0x01 = 0bxxx00001, Addr:0x20180400, Dir:0x00 = 0bxxx00000
Gr: 5, Addr:0x20190200, Data:0x00 = 0b0xxxxxxx, Addr:0x20190400, Dir:0x00 = 0b0xxxxxxx
Gr: 6, Addr:0x201A03FC, Data:0x00 = 0b00000000, Addr:0x201A0400, Dir:0x00 = 0b00000000
Gr: 7, Addr:0x201B000C, Data:0x00 = 0bxxxxxx00, Addr:0x201B0400, Dir:0x00 = 0bxxxxxx00
Gr: 8, Addr:0x201C0000, Data:0x00 = 0bxxxxxxxx, Addr:0x201C0400, Dir:0x00 = 0bxxxxxxxx
======================================================================================
Waiting for while something changes...
======================================================================================
Gr:4, Addr:0x2018007C, Data:0x01 = 0bxxx00001 --> 0x05 = 0bxxx00101
Mask: "devmem 0x20180010 32 0x04", GPIO4_2, GPIO34, Dir:Output, Level:1
======================================================================================
Gr:4, Addr:0x2018007C, Data:0x05 = 0bxxx00101 --> 0x03 = 0bxxx00011
Mask: "devmem 0x20180010 32 0x00", GPIO4_2, GPIO34, Dir:Output, Level:0
Mask: "devmem 0x20180008 32 0x02", GPIO4_1, GPIO33, Dir:Output, Level:1
======================================================================================
Gr:4, Addr:0x2018007C, Data:0x03 = 0bxxx00011 --> 0x01 = 0bxxx00001
Mask: "devmem 0x20180008 32 0x00", GPIO4_1, GPIO33, Dir:Output, Level:0

Эти данные нужны будут вам и в том случае, если вы просто захотите использовать камеру по своему прямому назначению с прошивкой OpenIPC.

▍ Сканирование GPIO, к которым подпаяны светодиоды

Если не нашли в табличке свои GPIO, а сохранить данные с заводской прошивки не удалось до установки OpenIPC, это всё равно ещё не катастрофа. Можно отсканировать скриптом, перебрав все GPIO в системе. Подпаяйте LED, как я рассказал к микросхеме 6208, и запустите следующий скрипт, который переберёт все GPIO.

Имейте в виду, что GPIO могут быть использованы таким оборудованием, как сетевые PHY, и обращение к ним оставит камеру без сети. Поэтому сканирование GPIO крайне желательно делать через UART-консоль. Иногда камера может зависнуть при попытке использования некоторых GPIO, и таковые нужно будет просто пропустить при задании диапазона сканирования.

Подпаиваем светодиоды и запускаем сканирование, пока не увидим свет

В разных платах разное количество GPIO. Как-то раз я перебирал от 0 до номера 120, будучи увереным, что больше не бывает. Очень много времени убил, а оказалось в конце концов, что искомый пин висит на GPIO 121. Но на большинстве камер при попытке доступа выше 70 вы уже начнёте видеть ошибки.

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

▍ Ааааавтомобиль!

Микросхема 6208 вполне справляется с током, который потребляет двигатель детской машинки, если вы понимаете, о чём я говорю. Поэтому вполне законно вместо IR CUT подключить такой моторчик, и в консоли дать команды, которые прокрутят его в одном и в другом направлении.

А чтобы совсем было интересно, я запитал камеру от литиевой батареи 2S (8 вольт). Вообще, камеры, как правило, питаются либо от 5В, либо от 12В. Для моей двенадцативольтовой достаточно 7-8 вольт, так как это напряжение сразу на плате поступает на понижение через DC-DC преобразователь. Часто встречал камеры, которые понижают до 3.3В. «Высокое» же напряжение 12В нужно только для питания IR CUT и подсветки. Поэтому можно подавать любое в этом диапазоне, чтобы его было достаточно для мотора.

На моей камере были нераспаяные контакты USB, к которым я подпаял USB-хвост, в который воткнул WiFI адаптер на чипе MT7601U. Это один из самых распространённых чипов и его драйвер есть в OpenIPC. Чтобы этот драйвер загружался, при загрузке ОС нужно в файл /etc/modules добавить строку mt7601u.

Теперь Wi-Fi можно настроить либо через веб-интерфейс LAN, либо через UART, если позволяет скилл, отредактировать из консоли /etc/wpa_supplicant.conf и /etc/network/interfaces.d/wlan0.

Теперь моя камера не нуждается ни в кабельном подключении к LAN, ни в самом кабеле. Я подпаял коннектор питания напрямую к аккумулятору и всю конструкцию стяжками затянул на детскую машинку. Кстати, коннекторы, которые используются в подключениях на камерах, называются JST 1.2mm. Если вам по душе такие приключения, берите сразу горстями как минимум на 2, 4, 6, 8 контактов, если не знаете, какие пригодятся.

Плата камеры видеонаблюдения на прошивке OpenIPC управляет мотором F130 детской машинки

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

▍ Резюме

Я показал вам, что из бытовых устройств не только TV BOX может быть прекрасным достаточно производительным одноплатным компьютером, но и камера видеонаблюдения. Кроме запуска программных задач, я на практике показал, что через контакты GPIO можно не только считывать данные с датчиков, но и управлять нагрузкой, такой как двигатель постоянного тока через имеющийся на любой камере драйвер мотора 6208 без каких-либо аппаратных изменений в самой камере. После эксперимента, если камера была рабочей, её можно продолжить использовать по своему назначению. OpenIPC можно при этом оставить как основную прошивку.

Ещё раз обращу внимание, что основная сложность, заставляющая лезть паяльником в камеру, — это поиск достаточного количества GPIO. Если вам повезло и вы нашли по табличке из OpenIPC Wiki, то паять придётся только коннекторы. Если совсем не хочется прикасаться к паяльнику, можно всё сделать на скрутках и на синей изоленте, так будет ещё лучше.

Чтобы эксперимент не был скучным, плата камеры была установлена на платформу от игрушечной машинки, и это позволило через Wi-Fi управлять движением машины вперёд и назад.

В дальнейших планах добавить управление поворотом передними колёсами, установить веб-сервер прямо в камеру, написать фронтенд, захостить на VPS и всё это повторить уже на камере с работающим сенсором, которая позволит кататься на машине в режиме FPV прямо через веб-браузер.

Узнавайте о новых акциях и промокодах первыми из нашего Telegram-канала 💰


 

Источник

WiFiмобиля, видеонаблюдения, из, камеры, компьютера, на, одноплатного, основе, создание, часть

Читайте также