Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ile Arduino & Raspberry PI gibi Cihazlarla İletişim Kurmak
#1
Merhaba,
Delphi IDE'si ile COM port'una bağlı herhangi bir cihazla iletişime geçmek için harici bileşenler kullanıyoruz. (Tuğrul Hocamızın yeni oluşturacağı Low Level bölümünde İnşaallah iletişim kodlarını kendimiz yazarız)
Burada ücretli ve ücretsiz olmak üzere 2 farklı alternatifimiz var. Ben her ikisini de kullanıyorum. Ücretli olanlardan Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, ücretsiz olanlardan ise Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'yu kullanıyorum.
Her ikisini de anlatabilirim. Fakat bu tip bileşenlerin kullanım ve çalışma prensibi üç aşağı beş yukarı aynıdır.
Burada örnek olması açısından Delphi IDE'sinde Turbo Power AsyncPro componet  seti ile nasıl kullanacağımızı anlatmak istiyorum. (Talep olursa Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol kullanımını da ayrı bir makale de anlatabilirim)

yhackup, Arduino programlama kodları ile Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol paylaşmış. Bu konuda benim de bir katkım olsun. Ben de Delphi ile nasıl yapabileceğimizi anlatayım. 
Bir örnekle; Edit ile yazılan komutu, buton aracılığıyla cihaza iletme, cihazımızdan gelen geri dönüşü ise Memo'ya yansıtacağımız örnek bir uygulama yapalım.

Uygulama ara yüzü için;
Yeni bir VCL Form Application uygulaması oluşturalım.
Ana form üzerinde birer adet Button, Edit ve Memo nesnesi yerleştirelim.

Cihazdan gelen bilgileri alıp, mevcut formda kullanılmak üzere aktaracağımız bir değişken  tanımlayalım. 

private
  FCevap: string;

Tool Palette penceresinde, APRO sekmesinden bir adet ApdComPort nesnesini forma yerleştirelim.
(Component'i kurmamış olanlar yukarıda indirme linkini paylaşmıştım, indirip kurulum yapabilirler. Delphi 10 Seattle, Delphi 10.1 Berlin kullananlar ise
doğrudan GetIt Manager ile doğrudan kurabilirler)

İlk olarak formun OnCrete olayında, COM port bağlantısını yapacak olan, ApdComPort nesnesinin temel özelliklerini
belirleyelim. 

procedure TForm1.FormCreate(Sender: TObject);
begin
  memBilgi.Clear;
  FCevap := '';
  With ApdComPort1 do
  begin
    ComNumber := 2; { Cihazın USB ile bağlı olduğu sanal port numarası }
    Baud := 115200;    { Cihaz iletişim saniyedeki iletişim hızı, cihaza göre değişir }
    DataBits := 8;
    Parity := pNone;
    StopBits := 1;
    BufferFull := 0;
    BufferResume := 0;
    AutoOpen := True; {Diğer AsyncPro bileşenleri tarafından kullanıldığında otomatik olarak bağlantı kurmasını sağlar}
    Open := true; {COM portunu iletişime açar}
  end;
end;

Yukarıdaki kod blokları arasında hangi özelliğin ne amaçla kullanıldığını yazdım. Açıklama yapmadığım özellikler ise veri iletişiminde kullanılan temel ve varsayılan özelliklerdir. 
Dolayısıyla bu özelliklerin varsayılan değerlerde kalması veri iletişim hızınızı optimize edecektir.

Bu tip uygulamalarda cihaz ile uygulamamız arasındaki tüm hareketlerin algılanması ve bir log benzeri panele yansıtılması son derece önemlidir. 
Bunun için uygulamamızda bir Memo nesnesi kullandık. 

Şimdi cihazın bağlı olduğu COM portu ile bağlantı durumunu kontrol ederek, Memo nesnesine yansıtalım.
ApdComPort nesnesinin OnPortOpen olayı, başarılı bir bağlantıda çalışmaktadır. 
Bu olaya aşağıdaki kodu yazalım.

procedure TForm1.ApdComPort1PortOpen(Sender: TObject);
begin
  memBilgi.Lines.Add('COM' + ApdComPort1.ComNumber.ToString + ' Portu ile bağlantı sağlandı.');
end;

ApdComPort nesnesinin OnPortClose olayı ise, COM port bağlantısının kesildiği anda çalışmaktadır. 
Bu olaya da aşağıdaki kodu yazalım.

procedure TForm1.ApdComPort1PortClose(Sender: TObject);
begin
  memBilgi.Lines.Add('COM' + ApdComPort1.ComNumber.ToString + ' Portu ile bağlantı kesildi.');
end;

İletişim kurduğumuz cihazdan gelen tüm verilerin yakalanabildiği ApdComPort olayı ise OnTriggerAvail'dir. 
Bu olaya da aşağıdaki kodu yazalım.

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
const
  idxBeklemeSuresi: SmallInt = 50;
var
  I: Word;
  C: AnsiChar;
begin
  for I := 1 to Count do
  begin
    C := ApdComPort1.GetChar;
    FCevap := FCevap + C;
  end;
  if FCevap.Trim <> '' then
  begin
    TThread.CreateAnonymousThread(
      procedure()
      begin
        Sleep(idxBeklemeSuresi);
        memBilgi.Lines.Add('Gelen Cevap: ' + FCevap);
        FCevap := '';
      end).Start();
  end;
end;

Son olarak Cihazımıza bir komut göndermek için Button nesnesinin OnClick olayına aşağıdaki kodu yazalım.

procedure TForm1.btnKomutGonderClick(Sender: TObject);
begin
  ApdComPort1.PutString(edtKomutGonder.Text);
end;

Bu kod içerisinde yer alan ApdComPort'un, PutString metodu, metinsel veriyi cihaza iletmeyi sağlamaktadır.


Not: Nesne isimlendirmeleri; Edit: edtKomutGonder, Buton: btnKomutGonder, Memo: memBilgi

Uygulama ekran görüntüleri

wgoo7c.jpg




2wclmpx.jpg

İyi çalışmalar...


Bu arada göndermiş olduğum komutlar bendeki Arduino cihaza özgü komutlardır. CMD komut başlangıcı, 15 ise 15 nolu cihazımın Id'si, B ise yaptırmak istediğim iştir (Led yak, alarm çal, kapıyı aç/kapat gibi). Geriye ise 15 B 1 dönüyor. 15. Cihazın B komutu yerine getirildi (1 ile) diyor.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#2
Ellerine sağlık güzel kardeşim.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
Haberleşmesi kolay ve delphi benzeri bir free Scada
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#4
elinize sağlık hocam.. Müthiş yol gösterici bi uyguluama olmuş.
WWW
Cevapla
#5
(23-03-2017, Saat: 09:40)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olelinize sağlık hocam.. Müthiş yol gösterici bi uyguluama olmuş.

Merhaba,
Bu konu içerisinde, doğrudan PC'ye USB ile bağlı olan bir ana cihazın client/terminal bir cihaz ile haberleşmesini anlattım.
Akıllı otomasyon denince; Mobil bir uygulama ile bir sistemin yönetilmesi akla geliyor. 
Olması gereken de budur. Bu kapsamda, İlerleyen süreçte;
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol ile Web Server (DHCP) yayını yapma ve bir Mobil Uygulama ile bu ağa bağlanma, NodeMCU ile kablolu veya kablosuz entegreli bir cihazı uzaktan çalıştırma,
Yine aynı işlemleri Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol ile de test edip, buradan makaleler ile örneklendirmek istiyorum.

Tabi tüm bunları işten güçten vakit bulabildiğim zamanlarda peyder pey yapmayı planlıyorum.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#6
Elinize sağlık güzel paylaşım olmuş.
Cevapla
#7
(10-07-2017, Saat: 21:13)TDeveloper Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlElinize sağlık güzel paylaşım olmuş.

Rica ederim, faydalı olması dileğiyle...
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Raspberry Pi3 Lunix Server Tarzı kullanma nguzeller 12 449 29-03-2018, Saat: 22:44
Son Yorum: nguzeller
  Raspberry Pi Genel Sorular pro_imaj 11 817 02-01-2018, Saat: 10:01
Son Yorum: pro_imaj
  Delphi ve PLC Haberleşmesi hk. Abdullah ILGAZ 11 706 06-12-2017, Saat: 22:26
Son Yorum: Abdullah ILGAZ
  Şu Arduino nedir? Ne değildir bir bakalım. esistem 29 10.836 21-07-2017, Saat: 15:03
Son Yorum: SimaWB
  Arduino simülator sadettinpolat 1 635 13-02-2017, Saat: 09:25
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi