Реализация протокола PELCO-D на Arduino

Когда-то давно передо мной стояла интересная задача. Необходимо было реализовать управление PTZ-камерой PTD-208z по протоколу PELCO-D причем сделать это надо было именно на Arduino. Коротко зачем все это нужно: камера крепится на специального робота, который катается внутри большой трубы и рассматривает дефекты, пишется все видео на DVR и плюс есть оператор, который управляет роботом (управление роботом, механика и драйверы двигателей тоже были сделаны, но это тема для другой статьи). С этого проекта, который я закончил буквально на днях и началось мое знакомство с Arduino.

Небольшое описание самого протокола и зачем он нужен.

Pelco-D очень популярный PTZ (Pan/Tilt/Zoom) протокол? используемый в CCTV индустрии. Собственно он используется для управления поворотными камерами, т.е. поворотов и зуммирования. В качестве среды передачи для протокола наиболее часто выступает 485-й интерфейс, т.к. в основном его поддерживают все производимые аналоговые камеры.

Формат Pelco-D посылки выглядит следующим образом:

Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7
Sync Camera Address Command 1 Command 2 Data 1 Data 2 Checksum

 

  • Byte 1 (Sync) — байт синхронизации, по умолчанию имеет значение 0xFF, не изменяем;
  • Byte 2 (Camera Address) — логический адрес управляемой камеры (например камера 1 имеет адрес 0x01);
  • Byte 3 и 4 (Command 1 и 2) — описаны ниже;
  • Byte 5 (Data 1) — байт задает скорость поворота камеры влево/вправо, 0x00 — скорость равна 0, 0x3F — максимально возможная скорость поворота. Некоторые камеры поддерживают «турбо» скорость 0xFF;
  • Byte 6 (Data 2) — байт задает скорость движения камеры вниз/вверх, со скоростями все аналогично байту 5;
  • Byte 7 (Checksum) — байт контрольной суммы, байт синхронизации не учитывается в контрольной сумме.

Разберем байты 3 и 4 (Command 1 и 2)

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Command 1 Sense Reserved Reserved Auto / Manual Scan Camera On/Off Iris Close Iris Open Focus Near
Command 2 Focus Far Zoom Wide Zoom Tele Tilt Down Tilt Up Pan Left Pan Right Fixed to 0

НАПРИМЕР:
Pan Left (поворот налево) — 0b00000100 или 0x04 в шестнадцатиричном представлении записываем в байт 4 (Command 2).

Так с протоколом разобрались, едем дальше.

Как же все это сделано на Arduino.

Для начала мы определились с органом управления, он достался нам от другой аналогичной машинки и управляет не только камерой, но и движением робота, а также светом:

Пульт управления роботом Arduino

Джойстики на пульте управления подключены к плате Arduino UNO к аналоговым входам от A0 до A2. Далее для передачи посылки камере реализовано программное последовательное соединение с помощью библиотеки SoftwareSerial.h, это единственная библиотека, которая используется в этом проекте. Использование ее обусловлено тем, что необходимо иметь связь с ПК и одновременно передавать данные камере.

Для реализации интерфейса RS-485 использовалась микросхема SP485EE. Накидаю небольшую схемку ее расключения:

SP485EE

SP485EE схема подключения

Далее приведу листинг программы:

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

Испытания системы управления камерой прошли успешно) Полностью робот в сборе уже бегает по трубам и снимает камерой все дефекты)))

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *