Декодер Pelco-d на ардуино
Добавлено: 21 мар 2017, 21:37
Подскажите куда и как копать
Есть ардуина, L298N и поворотная платформа для камеры с вращением в двух плоскостях, двигатели управляются постоянным навряжением 24В. Созрело зелание сделать PTZ камеру. С программированием, к сожалению... на уровне школьного Basic, но стараюсь))) С синтаксисом могут быть проблемы.
Суть задачи следующая: получение команд по протоколу Pelco-D через max485 на Rx UART ардуины, с последующим управление двигателями камеры через драйвер L298N. Все что после ардуины уже запустил, но как правильно получать и определять команды не совсем понимаю.
Допросив гугл понял что Посылка Pelco-d состоит из 7 байт:
1- байт синхронизации
2- адрес (естественно нужен, в случае нескольких камер)
3- байт команд 1 (фокус, диафрагма...-нам не интересен)
4- байт команд 2 (наклон, поворот... - то что нужно)
5- дата 1 (скорость поворота - нужная вещь, но при дальнейшей доработке)
6- дата 2 (скорость наклона - так же при дальнейшей доработке)
7- контрольная сумма (в моем случае мало важна)
Байт 6 "дата 2" состоит из бит:
7- фокус в даль
6- зум широкоугольный
5- зум теле
4- наклон вниз (то что нужно)
3- вверх
2- поворот влево
1- вправо
0- всегда 0
В некоторых источниках указана посылка FF 01 00 00 00 00 - STOP
Отсюда ПЕРВЫЙ ВОПРОС: камера выполняет наклон/поворот пока ей с определенной переодичность шлют команду наклоняться/поворачиваться либо до момента прихода посылки Stop?
В мой реализации достаточно вверх, вниз, влево, вправо без диагональных направлений и скорости.
Пример байта 6 (команда на поворот влево, остальные 0):
0b00000100 или 0x04
Соответственно посылка будет иметь следующие виды (адрес: 1, к.с. не важна, пусть будет 12, а скорость 3F):
FF 01 00 04 3F 00 12 - Влево
FF 01 00 02 3F 00 12 - Вправо
FF 01 00 08 00 3F 12 - Вверх
FF 01 00 10 00 3F 12 - Вниз
Поправьте если я что-то не так понял про реализацию протокола.
И самый главный вопрос как все это считать из UART и определить что делать? Ввести переменную ByteBuf[7], в теле цикла проверять поступление данных в UART командой if (Serial.available()), вносить байты данных в ByteBuf через for (int i=0; i<7; i++) {ByteBuf[i]= Serial.read();} и потом сравнивать адрес c ByteBuf[1] по средствам if (ByteBuf[1] == 0х01) {}, а команды c ByteBuf[3] и включать двигатель в том или ином направлении? Либо как-то через прерывание?
Есть ардуина, L298N и поворотная платформа для камеры с вращением в двух плоскостях, двигатели управляются постоянным навряжением 24В. Созрело зелание сделать PTZ камеру. С программированием, к сожалению... на уровне школьного Basic, но стараюсь))) С синтаксисом могут быть проблемы.
Суть задачи следующая: получение команд по протоколу Pelco-D через max485 на Rx UART ардуины, с последующим управление двигателями камеры через драйвер L298N. Все что после ардуины уже запустил, но как правильно получать и определять команды не совсем понимаю.
Допросив гугл понял что Посылка Pelco-d состоит из 7 байт:
1- байт синхронизации
2- адрес (естественно нужен, в случае нескольких камер)
3- байт команд 1 (фокус, диафрагма...-нам не интересен)
4- байт команд 2 (наклон, поворот... - то что нужно)
5- дата 1 (скорость поворота - нужная вещь, но при дальнейшей доработке)
6- дата 2 (скорость наклона - так же при дальнейшей доработке)
7- контрольная сумма (в моем случае мало важна)
Байт 6 "дата 2" состоит из бит:
7- фокус в даль
6- зум широкоугольный
5- зум теле
4- наклон вниз (то что нужно)
3- вверх
2- поворот влево
1- вправо
0- всегда 0
В некоторых источниках указана посылка FF 01 00 00 00 00 - STOP
Отсюда ПЕРВЫЙ ВОПРОС: камера выполняет наклон/поворот пока ей с определенной переодичность шлют команду наклоняться/поворачиваться либо до момента прихода посылки Stop?
В мой реализации достаточно вверх, вниз, влево, вправо без диагональных направлений и скорости.
Пример байта 6 (команда на поворот влево, остальные 0):
0b00000100 или 0x04
Соответственно посылка будет иметь следующие виды (адрес: 1, к.с. не важна, пусть будет 12, а скорость 3F):
FF 01 00 04 3F 00 12 - Влево
FF 01 00 02 3F 00 12 - Вправо
FF 01 00 08 00 3F 12 - Вверх
FF 01 00 10 00 3F 12 - Вниз
Поправьте если я что-то не так понял про реализацию протокола.
И самый главный вопрос как все это считать из UART и определить что делать? Ввести переменную ByteBuf[7], в теле цикла проверять поступление данных в UART командой if (Serial.available()), вносить байты данных в ByteBuf через for (int i=0; i<7; i++) {ByteBuf[i]= Serial.read();} и потом сравнивать адрес c ByteBuf[1] по средствам if (ByteBuf[1] == 0х01) {}, а команды c ByteBuf[3] и включать двигатель в том или ином направлении? Либо как-то через прерывание?