ana sayfa > ARM, STM32, Yazılım > STM32 PelcoD Protokolü ve PTZ kamera kontrolü

STM32 PelcoD Protokolü ve PTZ kamera kontrolü

Cuma, 15 Oca 2016 yorum ekle yorumlara git
STM32 PelcoD Protokolü ve PTZ kamera kontrolü

Merhaba arkadaşlar,

Bu yazımda kısaca PelcoD protokolünü anlatıp aynı zamanda STM32 PTZ kameraların kontrolü üzerine bir uygulama yapacağız.

Aslında bu uygulamayı yapalı bayağı olmuştu ama yeni yeni yeni yazıyı toparlayabildim.

Kamera benim elime tamir için gelmişti. Kısa bir süreliğine bende kaldı. Bende fırsattan istifade kamerayı tamir eder etmez kamera ile neler yapabileceğimi araştırdım. Sonunda böyle bir uygulama yapmaya karar verdim.

Kameraları mutlaka görmüşsünüzdür. Artık  neredeyse her köşede buna benzer bir kamera ortamı gözetliyor.

Evet kontrol etmeye çalıştığımız kameralar buna benziyor :)

 

Öncelikle PelcoD Protokolünü açıklayalım. PelcoD protokolü güvenlik sistemlerinde kullanılan, SpeedDome denilen Pan Tilt Zoom(PTZ) özellikli kameraların kontrolü için tasarlanmış bir yazılım standardıdır.  Neredeyse bütün PTZ kameralar bu protokolü desteklemektedir. Oldukça sık kullanılıyor.

Bu protokolü anlatırken kamera ile ilgili bütün kontrolleri anlatmayacağım. Sadece Pan, tilt, zoom, focus gibi temel kontrolleri anlatacağım. Diğer kontroller kameradan kameraya değişken olabiliyor. Yani her kamera PelcoD protokolü ile yapılabilecek bütün kontrolleri desteklemeye biliyor. Bu yüzden temel hareketlerin nasıl yapıldığını anlatıp örnek uygulamaya geçeceğim.

Şimdide kamera ile donanım arasındaki iletişimine bakalım.

Şuanda piyasadaki bütün PTZ kameralarda RS485 standart olarak desteklenmektedir. RS485 haberleşmesinin en büyük özelliği yüksek mesafelerde haberleşme olanağı sağlaması ve gürültülü ortamlarda çalışabilmesi diyebiliriz sanırım. Uygun bir kablo ile 1.2Km mesafeye kadar haberleşilebildiğini biliyorum. Özellikle güvenlik maeralarındaki yüksek kablo mesafesinden dolayı RS485 haberleşmede önemini hissettiriyor. Bunun dışında IP destekli kameralar için ethernet üzerinden haberleşme desteği var. Bu kameralarda oldukça sık kullanılmaya başladı. Çünkü video sinyali ile birlikte kamerayı hareket ettirmek için gönderilen komutların hepsi ethernet üzerinden paketlenmiş bir şekilde kameraya yollanıyor. Video dijital formatta gitttiği için analog kameralarda iletime bağlı bozulmalar yaşanmıyor.

Biz şimdilik RS485 kullanacağız.

RS485 haberleşmesi için donanım tarafında Uart birimine sahip bir MCU ve Uart biriminden çıkan RX ile TX sinyallerini RS485 formatına çevirmek için birde RS485 transreciever’e ihtiyacımız var.

Ben yaptığım uygulamayı STM32F103 Firebull deney kartında çalıştırdım.

Bu kart üzerinde RS485 dönüşümü için SP3485E çipi bulunmakta. MCU ile RS485 hattı arasında bir tampon özelliği göstermekte. Bu kartı nedense çok seviyorum :)

PelcoD protokolüne dönersek, Temelinde aslında çok basit ve sade bir yapıya sahip. Veri yapısı aşağıdaki gibi.

Veri yapısı toplam 7 Byte’dan oluşmakta. İlk byte olan Sync Byte sürekli 0xFF olmak zorundadır.

2. Byte ise Adres bilgisidir. Burada kontrol edilecek kameranın fiziksel adresi gönderilmesi gerekir. Adresleme 8 bit olduğu için tek bir hattan 255 ayrı cihaz kontrolü yapılabilir.

Byte 3 ve Byte 4 ise komut bölümüdür. Kameraya gönderilecek komutlar bu kısımda yer alır. Komut yapısı aşağıdaki gibidir.

Yukarıdaki Tabloda “PelcoD Standart Command Set” görülmektedir. Bunun yanı sıra birde “Extended Commands” varki bu komut seti ile kameraya birçok hareket yaptırılabiliyor. Fakat bu komut setini bütün kameralar desteklemiyor genellikle. Ama Standart Komut setini PelcoD ile haberleşen bütün kameralar destekler. Bende çalışmalarımı Standart komut seti üzerinden yaptım. Aslında Extended komutlarıda incelemeyi isterdim ama kamera benim elimde çok kısıtlı bir süre kaldı. Ancak bu kadarını çıkarabildim :)

Her neyse veri yapısına devam edersek Byte 5, Standart komut setinde Pan Speed olarak kullanılır. Eğer Pan hareketi yaptırılacaksa eğer Uygun komutla birlikte 5. Byte ile birlikte Pan Speed verisi gönderilmelidir. $00 Stop, $3F High speed ve $FF Turbo speed olarak geçer.

Aynı şekilde 6. Byte ise Tilt Hareketinde Speed verisidir. Hız konusu Pan hareketinde olduğu gibi ayarlanır.

Hız konusunda şuna değinmek istiyorum. Şimdiki kullanılan kameraların birçok özelliği var. Ben kendi çalıştığım kamerada gördüğüm için değinmek istedim. Pan Speed ve Tilt Speed değerlerinin $00 ile $FF arası değiştiğinden bahsetmiştim. Normalde böyle fakat kamera her zaman bu hızlarda hareket etmenize müsaade etmiyor. Sebebi ise şöyle;

Normalde kameralardaki zoom değeri çok yüksek oluyor. Örneğin benim üzerinde çalıştığım kamera 30x optik zoom değerine sahip. Normalde eğer zoom değeri çok açık  ise kamera sizin hızınızı otomatikmen sınırlıyor çünkü eğer 30x zoom yaptığızda Pan ve tilt hareketini aynı hızda yaparsanız hedef tutturmanız imkansız hale gelebilir. Bu yüzden kamera yüksek zoom değerinde hızı otomatikmen sınırlıyor.

Muhtemelen bunun bir ayarı vardır ama kamera elimde sınırlı bir süre kaldığı için fazla uğraşamadım.

Şimdi son olarak 7. byte var. Burada ise CRC verisi gönderilmesi gerekiyor. CRC hesaplama konusuna ufaktan değineyim.

CRC basit olarak güvenliği sağlar. Gönderilen paketlerin karşı tarafa doğru gidip gitmediğini sistem CRC sayesinde denetler. CRC hesaplaması kısaca şöyle. Ufaktanda bir örnek verelim. Diyelimki High Speed’de pan motorunu sola doğru dönmesini istiyoruz. Kameranın adresi $E8 olsun.

Göndereceğimiz komutlar sırasıyla $FF, $E8, $00, $04, $1F, $0B olacaktır.

Kırmızı ile renklendirdiğim kısım CRC değeri olacaktır.

Peki CRC nasıl hesaplanıyor. Aslında son derece basit bir konu, birçok yerde fazlaca döküman bulunmakta. Kısaca anlatmam gerekirse Gönderilen paketteki bütün elemanların 256 ya modu alınarak toplanır. En sonki toplama ve mod alma işlemi sonucunda CRC hesaplanmış olur.

Yukarıdaki örnek için CRC hesaplayacak olursak eğer yapacağımız işlemler şöyle olur.

$FF işlemini Hesaplamaya katmaya gerek yok tur çünkü sonucu değiştirmez. $E8 ile başlayalım

$E8              11101000
$00              00000000
+++++++++++++++++++++++++
Ara toplam $E8   11101000 //Sonuç 255'den büyük değil mod almaya gerek yok. Toplamaya devam
$04              00000100
+++++++++++++++++++++++++
Ara Toplam $EC   11101100 //Sonuç 255'den büyük değil mod almaya gerek yok. Toplamaya devam
$1F              00011111
+++++++++++++++++++++++++
Ara Toplam $10B 
100001011 //Sonuç 255'den büyük 256'ya mod alıyoruz

Sonuç $0B Olacaktır.

Evet göndereceğimiz paketin en sonuna CRC verisini eklememiz gerekmektedir. Bunuda Ekledikten sonra USART ile verimiz gönderiyoruz. Tabi bu veri RS485 formatına çevrilip karta o şekilde yollanması gerekiyor. Baudrate değeri ise kamera üzerindeki minik anahtarlar ile ayarlanıyor. Benim uğraştığım kamera default olarak 9600 baudrate ye sahipti. O şekilde kullandım.

Yaptığım uygulamada Dokunmatik LCD’yi kullandım. Kendime bir arayüz hazırlamam gerekti.

Butonların tasarımını ButtonShop isimli bir programda yaptım basitçe. Güzelde oldu aslında. Her bir butonun Press ve Unpress halini hazırlayıp Resim olarak hafızaya kaydettim. Sonra basitçe ekrana resimleri bastım. Sonuç yukarıdaki gibi oldu. Böyle basit uygulamalar için yeterli görselliğe sahip ama büyük uygulamarda kullanılabilecek bir yöntem değil. GUI tarzı sistemler olmazsa olmaz gibi. GUI lerde ise böyle renkli tasarımlar nasıl yapılır emin değilim. Çünkü mikroişlemciler için GUI tasarımı çok da esnek değil. Aslında açıkçası fazla uğraşmak istemedim. Bu şekilde en azında dokunmatik ekranın kullanımına örnek olur.
Kodlarımız işe bu şekilde

PelcoD veri paketi için bir Struct oluşturdum.

typedef struct
{
uint8_t SyncByte;
uint8_t Adress;
uint8_t Command1;
uint8_t Command2;
uint8_t Data1;
uint8_t Data2;
} PelcoD_TypeDef;

PelcoD ile ilgili bütün parametreleri bu struct içerisine yazılıp Write_PelcoD fonksiyonuna göndermek gerekiyor. CRC hesaplama vs gibi olaylar bu fonksiyon içerisinde yapılıyor.

Videoda yaptığım uygulamayı izleyebilirsiniz.

PelcoD ile ilgili yazacaklarım bu kadar. Herhangi bir sorunuz olursa yorumda bulunabilirsiniz

İyi çalışmalar.

  1. şimdilik yorum yok.
  1. şimdilik geri bağlantı yok