Evgenii Legotckoi
12 квітня 2016 р. 17:26

Керування PTZ-камерою. Протокол Pelco-P

У попередній статті було розглянуто варіант роботи з протоколом Pelco-D, а тепер розглянемо роботу з протоколом Pelco-P – це доопрацьована варіація попереднього протоколу управління PTZ-камерами , який також розроблено однойменною компанією Pelco. Також використовують поверх інтерфейсу RS482/485 для зв'язку з відеокамерами, обладнаними сервоприводами.

Протокол Pelco-P також має набір стандартних команд управління та розширений комплект команд. Розглянемо як можемо працювати зі стандартними командами. Протокол Pelco-P розберемо з прикладу абстрактного джерела команд і абстрактного SDK, яке приймає повідомлення подальшої передачі їх у інтерфейс RS485.

Таким чином є протокол, через який передаються дані, дані розбираються і далі передаються SDK, який вже відсилає повідомлення в тракт передачі RS485. Нижче наведено малюнок, на якому є жовтий квадрат. Саме в цій функції буде формуватися необхідне нам повідомлення, яке потрібно буде передати в SDK.


Структура повідомлення

Контрольна сума є сумою по виключає АБО, тобто XOR, за байтами з 1-го по 7-й. Як бачите в цьому протоколі використовується 8 байт для передачі повідомлення, а не 7, як Pelco-D.

Варто зазначити, що в протоколі Pelco-P адресація починається не з 1, а 0. Тобто перша адреса передаватиметься як #00, але найцікавіше те, що в налаштуваннях PTZ камери ця адреса буде вказана як 01, варто враховувати цей момент при розробка прошарку для роботи з цим протоколом.

PAN та TILT команди

Приклади команд

Поворот ліворуч: A0 00 00 04 20 00 AF 2B
Поворот праворуч: A0 00 00 02 20 00 AF 2D
Нахил вгору: A0 00 00 08 00 20 AF 27
Нахил вниз: A0 00 00 10 00 20 AF 3F
Зупинка всіх дій: A0 00 00 00 00 00 AF 0F

Приклад коду

У нашому абстрактному коді у вакуумі створилася така ситуація, що у функцію потрапляють такі значення:

  • адреса - адреса;
  • PanSpeed - швидкість з напрямком повороту, від - 100 до +100;
  • TiltSpeed - швидкість із напрямком нахилу, від -100 до +100;
  • ZoomSpeed - швидкість із напрямком Зуму, від -100 до +100. Навіщо так подавалися дані для Зума – це для мене питання, враховуючи, що у Pelco немає установки швидкості, але що є, тобто.

А ось SDK вже приймає сформовану команду у вигляді покажчика на масив даних та вказівкою довжини цього масиву. В результаті вийшов наступний код.

  1. void ptzCmd(int addressPTZ, int panSpeed, int tiltSpeed, int zoomSpeed)
  2. {
  3. unsigned char *dataPelco;
  4. unsigned char address, data1, data2, data3, data4, checkSum;
  5. address = data1 = data2 = data3 = data4 = checkSum = 0x00;
  6.  
  7. dataPelco = (unsigned char*) malloc(8);
  8. memset(dataPelco,0,8);
  9.  
  10. address = (unsigned char)addressPTZ;
  11. --address;
  12. if(pan < 0) {
  13. data2 |= 0x04;
  14. pan *= (-1);
  15. } else if(pan > 0) {
  16. data2 |= 0x02;
  17. }
  18. data3 = pan*63/100;
  19.  
  20. if(tilt < 0) {
  21. data2 |= 0x10;
  22. tilt *= (-1);
  23. } else if(tilt > 0) {
  24. data2 |= 0x08;
  25. }
  26. data4 = tilt*63/100;
  27.  
  28. if(zoom < 0) {
  29. data2 |= 0x40;
  30. } else if(zoom > 0) {
  31. data2 |= 0x20;
  32. }
  33.  
  34. checkSum ^= 0xA0;
  35. checkSum ^= address;
  36. checkSum ^= data1;
  37. checkSum ^= data2;
  38. checkSum ^= data3;
  39. checkSum ^= data4;
  40. checkSum ^= 0xAF;
  41.  
  42. dataPelco[0] = 0xA0;
  43. dataPelco[1] = address;
  44. dataPelco[2] = data1;
  45. dataPelco[3] = data2;
  46. dataPelco[4] = data3;
  47. dataPelco[5] = data4;
  48. dataPelco[6] = 0xAF;
  49. dataPelco[7] = checkSum;
  50.  
  51. sdk_write_pelco_cmd(8, dataPelco); // 8 - это длина сообщения
  52. free(dataPelco);
  53. }

Рекомендовані статті на цю тему

По статті запитували1питання

0

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…