Arduino ile Seri İletişim – 2


Önceki yazımızda Arduino ile seri iletişimin temellerini ve Arduino ile verileri nasıl göndereceğimizi görmüştük. Şimdi de Arduino’ya nasıl veri gönderebileceğimize bakacağız. Bunun için yine Serial Monitor’ü kullanacağız. Ancak Arduino’ya veri göndermek için elimizdeki tek araç bu değil. Bilgisayarımızda USB üzerinden oluşturulan ve ismi COMx şeklindeki seriporta erişebilen bütün programları Arduino’ya veri göndermek için kullanabiliriz. Seri iletişimdeki temel nokta verilerin baytlar serisi halinde gönderilmesidir. Baytlara bölebildiğiniz bütün verileri Arduino’ya rahatlıkla gönderebilirsiniz.

Serial Monitor ile Arduino’ya Veri Gönderme

Serial Monitor ile Arduino arasında veri alışverişi yapmak için Arduino geliştirme ortamından Serial Monitor butonuna basalım:

 Seria Monitor’ün üst bölümünde bir kutucuk ve sağ tarafta da “Send” butonu bulunuyor. Kutucuğa yazdığımız karakterler Send butonuna basıldığında sağ alt köşede seçilmiş olan hız değerinde Arduino’ya gönderilir. Arduino’dan bu verileri okumak için programımızda da aynı hız değerini kullanmalıyız.

 

Serial Monitor’den gönderdiğimiz veriler daha önce de bahsettiğimiz gibi baytlar halinde gönderilir. Yani kutucuğa “ARDUINO” yazdığımızda bunlar her bir karakterin ASCII karşılığı şeklinde gönderilecektir:

A 65
R  82
D  68
U 85
I  73
N 78
O 79

Bir karakterin ASCII tablosunda sayısal bir karşılığı olduğundan daha önce bahsetmiştik. Karakter dizilerinin desimal sayı karşılıklarını görüntülemek için http://easycalculation.com/ascii-hex.php adresindeki aracı kullanabilirsiniz.

Dolayısıyla Arduino’da

Serial.write(65);
Serial.write(‘A’);

komutları aynı işi yapacaktır. Tek fark birisinde karakterin sayısal karşılığını yazarken diğerinde kendisini yazıyoruz.

Seri iletişim yoluyla Arduino’ya gelen verileri okuma

Arduino’ya seri iletişim üzerinden gelen veriler belirli bir kapasitedeki bellekte (128 bayt) saklanır. Buna “tampon bellek” de denilebilir. Program içerisinde  okunana kadar veriler tampon bellekte tutulur. Bu belleğin kapasitesi sınırlı olduğundan veriler belirli bir süre içerisinde okunmazsa yeni gelen veriler eskisinin üzerine yazılabilir.

Belirli bir anda bellekte okunmayı bekleyen verilerin sayısını Serial.Avaliable() fonksiyonu ile öğrenebiliriz:

Serial.Avaliable() fonksiyonunun döndürdüğü değer sıfırdan farklı ise okunmayı bekleyen veriler var demektir.

Gelen verileri Serial.read() ile okuyabiliriz. Serial.read() fonksiyonu tampon bellekte bekleyen verilerden ilk gelmiş olanı bize verir. Yani tampon belleğe ilk gelen veri ilk okunur. Buna “ilk gelen ilk okunur – first in first out – FIFO) bellek” denilir.

Serial.read() fonksiyonu ile her seferinde bir bayt okunur ve bu bayt tampon bellekten silinir.

Şimdi örnek bir programda bu fonksiyonların kullanımını görelim:

int gelenVeri = 0;   // genel veriyi tutacak değişken
char gelenKarakter;
void setup() {
    // Seri haberleşmeyi başlatıyoruz (9600 bps hızında)
    Serial.begin(9600);
}

void loop() {

        // Veri gelmiş mi?
        if (Serial.available() > 0) {
                // gelen veriyi oku
                gelenVeri = Serial.read();
                gelenKarakter = gelenVeri;
                Serial.print("Gelen Veri: ");
                Serial.println(gelenVeri);
                Serial.print("Gelen Karakter: ");
                Serial.println(gelenKarakter);
        }
}

Programımızı Arduino’ya yükleyip ardından Serial Monitor’ü çalıştıralım. Üst bölümdeki kutucuğa “A” harfi yazıp “Send” butonuna tıkladığımızda Arduino bize aşağıdaki verileri yollayacaktır:

gelenVeri değişkeni int, gelenKarakter değişkeni ise char tipindedir. Serial.Print() ve Serial.Println() fonksiyonları kendilerine verilen parametrelerin cinsine göre çıktı üretmektedirler.

Yazıyla ilgili yorumlarını aşağıda yapabilirsiniz. Bir sonraki yazıda Arduino ile Seri haberleşme işlemlerini nasıl yapacağımızı görmeye devam edeceğiz…

Coşkun Taşdemir

Elektronik mühendisi, gömülü sistemler meraklısı, Arduino kitabı yazarı

56 comments

  1. Yalçın dedi ki:

    Meraba.Serial monitörden ne gönderirsem alttaki hatayı veriyor.Windows xp ve arduino leonardo kullanıyorum.Şimdiden yardımlarınız için teşekkür ediyorum.

    java.io.IOException: Input/output error in writeArray
    at gnu.io.RXTXPort.writeArray(Native Method)
    at gnu.io.RXTXPort$SerialOutputStream.write(RXTXPort.java:1124)
    at processing.app.Serial.write(Serial.java:517)
    at processing.app.Serial.write(Serial.java:540)
    at processing.app.SerialMonitor.send(SerialMonitor.java:200)
    at processing.app.SerialMonitor.access$100(SerialMonitor.java:32)
    at processing.app.SerialMonitor$3.actionPerformed(SerialMonitor.java:89)
    at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
    at javax.swing.JTextField.postActionEvent(JTextField.java:705)
    at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
    at java.awt.Component.processEvent(Component.java:6040)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:704)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:969)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:841)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:668)
    at java.awt.Component.dispatchEventImpl(Component.java:4502)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    java.io.IOException: Input/output error in writeArray
    at gnu.io.RXTXPort.writeArray(Native Method)
    at gnu.io.RXTXPort$SerialOutputStream.write(RXTXPort.java:1124)
    at processing.app.Serial.write(Serial.java:517)
    at processing.app.Serial.write(Serial.java:540)
    at processing.app.SerialMonitor.send(SerialMonitor.java:200)
    at processing.app.SerialMonitor.access$100(SerialMonitor.java:32)
    at processing.app.SerialMonitor$3.actionPerformed(SerialMonitor.java:89)
    at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
    at javax.swing.JTextField.postActionEvent(JTextField.java:705)
    at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
    at java.awt.Component.processEvent(Component.java:6040)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:704)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:969)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:841)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:668)
    at java.awt.Component.dispatchEventImpl(Component.java:4502)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

    • Ahmet Alpat dedi ki:

      Compiler hataları genellikle Arduino’yu tanıtamamak ve IDE problemlerinden kaynaklanır. Arduino driverını doğru kurduğunuza emin olun. Aygıt yöneticisinden kontrol edebilirsiniz.

  2. Yalçın dedi ki:

    Cevabınız için teşekkür ediyorum.Ne yaptıysam olmadı.Windows 7 kurdum artık serial monitör kullanabiliyorum.

  3. hamzaoztas dedi ki:

    merabalar ahmet hocam, konuyla biraz alakasız olacak ama bişey sormak istiyorum bi proje için çift taraflı double servo kullanmama gerekiyor, bana önerecebileceğiniz arduino mega ve motor sürücü ile kullanacabileceğim çift taraflı servo varmı acaba? şimdiden teşekkürler..

    • Coşkun Taşdemir dedi ki:

      Sorularınızı forum bölümümüzde sorarsanız daha hızlı cevap alabilirsiniz. Teşekkürler.

  4. Cem dedi ki:

    Çoşkun hocam kitabınız için çok çok teşekkürler, sevgi vede ilgi ile okuyorum. ufak bir sorunum var yukarıda yazdığınız prog u leonardoma yükledim.

    mesela 1 gönderiyorum

    Gelen Veri: 49
    Gelen Karakter: 1

    veya a gönderiyorum
    Gelen Veri: 97
    Gelen Karakter: a

    sonuçları geliyor lakin 65 gönderiyorum

    Gelen Veri: 54
    Gelen Karakter: 6
    Gelen Veri: 53
    Gelen Karakter: 5

    gibi bir sonuç geliyor yani 6 ve 5 i teker teker algılıyor sizce sorun nedir?

    birde yeri bura değil ama sormak istediğim bir konu daha var. serial ekranını arduino çalıştığında açık halde tutmanın bir yolu yokmu, ufak bi program yazdım i=0, delay 1000ms i++ print i gibi, serial ekranını açabildiğimde i çoktan 5 veya 6 olmuş oluyor, serial açıkken resete basıyorum hiçbirşey göstermiyor, yeniden serial ekranını açıp kapamak gerekiyor, void setup kısmına delay koydum 10 sn hani o beklerken ben ekranı açarım diye onuda yemedi varmı bir çözüm? teşekkürler

  5. murat öztürk dedi ki:

    merhabalar ;
    seri haberleşme yazılarınızı okuyarak denemeler yaptım bunun için öncelikli tesekkür ederiö.
    Ama konu ile ilgili bir soru sormak istedim.
    pc den arduinoya gönderdiğim verileri tampon belleğer yazıyor ben bunları pc den 5 tane farklı değer gönderdikten sonra tek satırda sırası ile aynı anda okuyabılırmıyım.

    örneğin a, b,c ,d,e hrflerini ssırası ile arduinoya göndermek ve sonrasında biilgiyi tek satırda a,b,c,d,e olarak görmeni bir yolu varmı

    şididen tesekkur eerım.

  6. Ömer Koman dedi ki:

    bilginin satır olarak gelmesinin seri iletişimle alakası yok seri iletişim programınız a b c d e bilgilerini yollarken arkasından CRLF yani hex 0x13 0x10 karakterlerini yolluyordur bu kodlar terminalde satırbaşıona dön ve bir satır alta geç demektir. yolladığınız komut println ise mutlaka sonuna bu işaretlerini koymuştur ondan satır satır satır görüyorsunuz print komutunda ise bu bilginin sonuna crlf karakterleri konmaz. okuma programınızda bu karakterleri ayıklarsanız satırlar oluşmaz… Serial.print(‘\r\n’); komutu satır atla komutu yollarken Serial.println(‘abc’); komutu abc den sonra otomatik olarak kendi kendine koyar.

  7. hasan şişik dedi ki:

    benimde bi sorum olacak forum da sıkıntı var sanırım giremedim sorum bu konu ile alakalı oldupundan bu konuya yazacam led küp yaptım sıkıntısız çalışıyor fakat bilgisayardan gireceğim bi yazıyı yazdırabilirmiyim yani arduinoya tek tek yüklemeyecem örnek olarak bilgisayardaki textbox’a hasan yazacam led küpte hasan yazacak yani sıkıntım arduino ile pc yi online bağlamak farklı bi yazılım dili ile olursa onuda söylerseniz sevinirim kolay gelsin.

    • Ömer Koman dedi ki:

      sitede c# yazıları var onlardan faydalanabilirsiniz. bilgisayar seri portundan arduinoya c# ile veri yollayıp veri okuyabilirsiniz.

  8. Yasin Arslan dedi ki:

    Kolay gelsin hocam. Arduino ile Raspberry arasında bilgi göndermek istiyorum string gönderemiyorum yardımcı olur musunuz ?

    • Ömer Koman dedi ki:

      foruma gelin. arduinodan bir stingi serialmonitore gondermeyi deneyin arduino içindeki hello orneğini yapın çıktıyı görürseniz arduino rx pini raspi tx pinine ve arduino tx pini raspi rx pinine ve gnd ler hızlar aynı olduktan sonra haberleştirmemenız için sebep kalmıyor.

  9. selman dedi ki:

    Merhabalar benim iki sorum olacak
    ilki ben sensörden aldığım verileri serial monitörüne nasıl yazdırabilirim
    ikincisi aldığım bu verileri farklı bir dosyada tutabilir miyim
    Şimdiden teşekkürler. . .

  10. Ozan ERBASAN dedi ki:

    Hocam iyi akşamlar. Seri port ekranından örneğin “:)” yazınca tetiklenen bir fonksiyonu herhagi bir pinden “hıgh” gelmesine nasıl koşullarız? Yardımlarınız için şimdiden teşekkürler.

    • Ömer Koman dedi ki:

      once bir pini high yapan kodu yazın, daha sonra seriportu okuyan kodu da ekleyin daha sonra bu kodu forumda paylaşın.

  11. Mustafa Şahin dedi ki:

    Merhabalar,
    Şöyle bir soru sormak istiyorum,Bir gsm modül kullanıyorum ve seri port ile iletişim yapıyor. AT komutları ile haberleşme yapılıyor.örn ben AT komutu gönderdiğimde gsm modül OK olarak cevap veriyor.. fakat ben bu OK okumutu arduino ile okumak istediğimde muhtemelen buffer dan dolayı AT OK olarak hem gönderdiğim komutu hemde cevabı aynı anda alıyorum.data 2 yada daha fazla defa yolladığımda ise buffer dolana kadar yazılan tüm dataları okumuş oluyorum. okuma yaparken buffer i temizleme veya farklı bir varmı acaba ?

    • Ömer Koman dedi ki:

      gms ayarlarınızda local echo kapalı/disable olması lazım bununla ılgılı bır komut vardır modemın datasheetıne ve AT komutlarına bır bakın.
      modemler yolladıgınız komutun yanı sıra kendı cevaplarını da döndürür ve “OK” ile sonlandırır bu gelen karakterleri bir dizide biriktirip dönmesi gereken yada beklediğiniz veriyi buffer ıcınde arayarak işlem yapmanızda fayda var.

  12. hakan dedi ki:

    Benim projemde 16 adet cihazdan seri port üzerinden bilgi okumam gerekiyor.
    UNO ile nasıl yaparız?

    • Ömer Koman dedi ki:

      rs485 modul kullanın aynı anda 32 cihaza kadar ve uzun mesafe haberleşebilirsiniz. rs485 protokolu tum cihazların dınlemede oldugu ve her cıhazın mantıkı bır adrese sahip oldugu bır protokoldur. haberleşirken mesajın kımden kıme gıttıgı + mesaj+ mesaj sonu işareti veya mesaj dogruluk sağlama toplamı gibi bır şekılde haberleşebılırsınız.
      ornek
      01 02 aaaaaaaaaaa xx

      01:kimden
      02:kime
      aaaaaaaaaa:mesaj içeriği
      xx: mesaj sonu işareti gibi bir haberleşme yaratabilirsin
      dinlemedeki olan her cihaz mesajın kime kısmını dinleyecek ve kendisi ile ilgili olan mesajı varsa işlem, yapacaktır.

  13. hakan dedi ki:

    Ömer Bey,

    öncelikle cevabınız için teşekkür ederim. rs485 çok mantıklı gözüküyor. Peki fiziksel olarak 16 cihazın arkasından aldığım kabloyu UNO’ya nasıl sonlandırıcam? Buraya nasıl bir devre koymalı?

    • Ömer Koman dedi ki:

      RS485 olarak arama yaparsanız çok kaynak gelecektir.
      rs485 modulu aldıgınızda rx tx kısmını arduınoya bağlayacaksınız modulun çıkışında
      A-B çıkışları olacak tüm A lar ile tüm B ler ortak olacak birde bu ağın en başında veya master olarak çalışan çihazla en uzak yerdeki modulun A-B uçları arasına 120 ohmluk bir sonlandırma direnci mutlaka olmalıdır. tüm ağda toplam 2 direnç olacaktır.

  14. […] MEGA ve Arduino DUE’de daha fazla port yer alıyor. Bu konuyla ilgili başka yazılarımıza buradan ve buradan […]

  15. ahmet dedi ki:

    بِسْــــــــــــــــــــــمِ اﷲِارَّحْمَنِ ارَّحِيم
    öncelikle paylaşımlarınızı için teşekkür ederim. şu anda apartman zil sistemleri de artık seri iletişimi kullanıyor bu cihazların gönderdikleri verileri bilgisayardan veya arduino seri monitörden okumak için bir devre yapmak istiyorum. bu data hattına bir transistör bağlayıp yükseltmem gerekir mi 2400 bauld hızında olduğunu tahmin ediyorum. örnek bir proğram gösterebilir misiniz
    if (Serial.available() > 0) { komutunu tam anlayamadım açabilir misiniz? ilk data biti geldiğinde demek mi oluyor bu.

    • Ömer Koman dedi ki:

      serial port kullanıldıgında ve setup kısmında tanımlandıgında, serıportta bır karakterlik bılgı geldiğinde demek oluyor. ilk data biti demek değil bir karakter.

  16. fuat dedi ki:

    Selamlar Ömer Bey ,
    Arduio nun Com2 sinden sürekli gelen sayısal veriyi okuyorum.
    {1230.12,9999.10,4587.20} gibi. Bu okunan veriyi farklı değişkenlere atayıp Com1 portuna da yazıp okumak istiyorum, {Ch1:1230.12}, {Ch2:9999.10}, {Ch3:4587.20} şeklinde.
    Okuduğum veriyi nasıl yazmalıyım ki, sonrasında pars edebileyim.
    bazı denemeler yaptımsa da olmadı, fikir verebilirsniz memnun olurum.
    iyi çalışmalar.

    • Ömer Koman dedi ki:

      pars için birden fazla veri varsa veriden sonra ayırıcı bir işaret koyun bunu kendiniz belirleyebilirsiniz , ; * gibi şeyler olabilir yani yolladığınız verilerin içinde olmayan bir karakter veya karakterler grubu olabilir, veri grubunun başını da belirlerseniz pars etmeniz ve saymanız daha kolay olur veri başlangıcı içinde $ # ! gibi işaretleri deneyebilirsiniz.
      $ch1,12345.56;ch2,432,10*$ch2,555,66* gibi bir diziyi pars etmeniz daha kolay anlaşılır olabilir.

  17. LALE dedi ki:

    merhaba, hc-05 kullanırken AT komutlarına ulaşmadık. ekrana hiç bir şey basmıyor. Ama rx yanıyor o an. Sizce nasıl bir hata olmuş olabilir?

  18. Aydın DAĞLAR dedi ki:

    Merhaba bir konuda bilginize danışmam gerekiyor.Raspberry den arduino leonardo’ya seri port üzerinden bilgi göndermem gerekiyor ancak veri gönderdiğimde örnegin port.write(“A”) dediğimde karşıma uzunca ve anlamsız bir sayı çıkıyor . raspberry’den usb ile çıkış alırken arduino ya tx rx gnd ve 5v olarak kablolar ile bağladım . konu ile ilgili yardımlarınızı bekliyorum

  19. bilisimgokhan dedi ki:

    Sayın hocam merhabalar bugün yapmış olduğum 2 arduino aradı haberleşmede söyle bir sıkıntı ile karşılaştım yardımlarınızı bekliyorum. 1.arduino da sayaç değişkenimin değerini 2. Arduino ya gönderdiğimde farklı değerler gösteriyor lcd ekranda yazdığım kod:
    1.arduino :
    Serial.write(sayac); // örneğin sayac değeri 6
    2. Arduino :
    if(avaiblable>0){
    Sayac2=serial.read();
    Led.print(sayac2); // ekranda farklı sayılar gösterıyor sebebi ASCII olması anlamadım öyle ise ne yapmalıyım saygılar
    }

    • Ömer Koman dedi ki:

      iletişimi ya asci olarak başlatın ve sonra sayıları str den int e donusturun yada hep byte olarak çalışın.
      binary iletişim için sayac değişkenininizi ne olarak tanımdadınız acaba byte olarak tanımlarsanız 0..255 arasında degerler yollayabilirsiniz ama int veya float tanımladıysanız çok farklı şekılde gıdecektir

      şu orneğe bir bakın

      int16_t sensorValue = analogRead(A0);
      Serial.write((int8_t)(sensorValue >> 8));
      Serial.write((int8_t)(sensorValue & 0xFF));

      okurkende tanımladığınız değişkene göre paketın ıcınde gerekli byte a gerekli yereine dogru konumlandırırsanız okumanız kolay olur.

      şu şekılde arama yapın guzel ornekler geliyor “arduino serial binary”

  20. rai-men dedi ki:

    İyi günler, modbus RTU iletişime örnek yazabilir miyiz? Arduino + max485 modul master olacak slave cihaza gönderilecek(reaktif role) veriler paket olarak hex (4d 03 00 01 06 12 42…) gönderilip aynı formatta cevap alınacak.

    • Ömer Koman dedi ki:

      merhaba hazır kodumuz olmuyor foruma sorun ancak genel yazdıgınız olmayan kodunuz varsa onu paylaşın neden olmadıgına bakalım. modbus ıcın baglanacagınız cıhazın datasheetınde ıletısım bılgılerı adreslerı bellıdır o adreslerı okumalısınız.

  21. Ahmet dedi ki:

    Merhabalar. Paylaşımlarinizi ilgi ile takip ediyorum. Sorum şu şekilde. Bir barkod okuyucudan yalnızca okumanın yapıldığı sinyalini alıp başka bir kablo ile de test cihazına göndermem gerekiyor. Hemen arkasından da bir switch kapatmamız gerekiyor. Gerisini test cihazı hallediyor. Test cihazından test bittiğinde “test bitti” verisi alıp switchi tekrar açmamız gerekiyor. Ne önerirsiniz bize?

    • Ömer Koman dedi ki:

      barkod okuyucunuzun rs232 serial çıkışı olabilir onu araştırın varsa eğer arduino ile okuyup geri kalan adımları yaparsınız.

      • Ahmet dedi ki:

        Usb çıkışı kullanacağız.Peki arduino için hangisini önerirsiniz?

        • Ömer Koman dedi ki:

          arduıno usb okumaz dırek ek kart almanız lazım ama sızın barkod okuyucuyu okurmu garantısı olmaz. bence barkod okuyucuyu pcden okuyun verecegınız komutu pcden arduınoya atın swıtchı roleyı arduıno kontrol etsın

  22. Murat cengiz dedi ki:

    Merhaba, labviewden seri haberleşme yoluyla arduinodan komut okuyorum, 1,2 ve 3 degeri(char) geldiginde if ile koşullanmış bir 3 ayrı döngüyü tetikliyorum. Ancak labviewden gönderilen sürekli 1 degeri yüzünden 1 ile koşullanan döngü 2 gönderildiğinde de devam ediyor. Seri monitorden 111 degere gonderdiğimde 3 tur,11 değerinde 2 tur,1 değerinde 1 tur dönmekte,yani ardarda char veri=Serial.read() komutu gelen verileri sıraya sokuyor,her döngü sonunda veri=’0′ yapmama rağmen döngü ,labviewden 2 değeri gelse bile 1 değerini dönderiyor,Örnegin 123 değerini girdiğimde de döngüleri sırayla 1 er kez yürütüp durması gerektiği gibi duruyor.Çözümü hakkında net bir bilgi bulamadım. İyi günler dilerim.

    • Ömer Koman dedi ki:

      forumda bir kaç labview konusu var ancak cevap hemen gelmeyebilir, ben labview denemedim kullanmayı ama yapıda iç içe çevrimler varsa seri iletişim kısmında bu loopları kontrol edecek bir mekanızma kurman lazım.

  23. Murat cengiz dedi ki:

    Hocam cevap için sağolun ancak problemim labviewde değil,arduinonun seri port okumasında değişiklik yapmam gerekiyor. sıkıntıyı daha net anlamanız açısından şöyle bir örnek vereyim. bluetooth moduülünden veri gönderirken eger if==’1′ koşuluyla bir döngü varsa, 11 sayısını göndersek de yine if==1 döngüsünü çalıştırması gibi bir problem.
    Her döngü sonunda veriyi sıfırlıyorum ancak önceki gönderilen verileri sırayla okumaya devam ediyor, anlık olarak okuma yapamıyor..

  24. Cebrail dedi ki:

    Benim sorunum, arduino ile yaptığım bir projede kullandığım modüllerin kodlarını ayrı ayrı yazıp denediğimde çalışıyor fakat entegrasyonda GPS’in kodunu ekleyince konum bilgisi gelmiyor. Bu konuda bir öneride bulunabilirsiniz sevinirim. Wifi modülü ile GPS modülünün kodlarını aşağıya yazdım (Bir çok kod denedim ama son denediğim bu).

    #include

    #define UBLOXGPS Serial1

    #define ag_ismi “VINNWiFi_E1BB”
    #define ag_sifresi “90701794”
    #define IP “184.106.153.149” //thingspeak.com IP adresi

    TinyGPSPlus gps;

    double konum;

    void initArduino()
    {
    Serial.begin(115200);
    UBLOXGPS.begin(9600);

    }

    void setup()
    {

    initArduino();

    Serial.println(“AT”); //ESP modülümüz ile bağlantı kurulup kurulmadığını kontrol ediyoruz.

    delay(3000); //ESP ile iletişim için 3 saniye bekliyoruz.
    //analogReference(INTERNAL);
    if(Serial.find(“OK”)){ //esp modülü ile bağlantıyı kurabilmişsek modül “AT” komutuna “OK” komutu ile geri dönüş yapıyor.
    Serial.println(“AT+CWMODE=1”); //esp modülümüzün WiFi modunu STA şekline getiriyoruz. Bu mod ile modülümüz başka ağlara bağlanabilecek.
    delay(2000);
    String baglantiKomutu=String(“AT+CWJAP=\””)+ag_ismi+”\”,\””+ag_sifresi+”\””;
    Serial.println(baglantiKomutu);

    delay(5000);
    }
    }

    void loop()
    {

    //******************** konum
    if(UBLOXGPS.available())
    { Serial.print(“*****”);
    char* gpsData = UBLOXGPS.read();
    if(gps.encode(gpsData))
    {

    if (gps.location.isValid())
    Serial.println(“lat “);
    Serial.println(gps.location.lat(), 6); // Latitude in degrees (double)
    Serial.println(“long “);
    Serial.println(gps.location.lng(), 6); // Longitude in degrees (double)
    Serial.println(“ddsfdsfdf”);
    Serial.print(gps.location.rawLat().negative ? “-” : “+”);
    Serial.println(gps.location.rawLat().deg); // Raw latitude in whole degrees
    Serial.println(gps.location.rawLat().billionths);// … and billionths (u16/u32)
    Serial.print(gps.location.rawLng().negative ? “-” : “+”);
    Serial.println(gps.location.rawLng().deg); // Raw longitude in whole degrees
    Serial.println(gps.location.rawLng().billionths);// … and billionths (u16/u32)
    Serial.println(gps.date.value()); // Raw date in DDMMYY format (u32)
    Serial.println(gps.date.year()); // Year (2000+) (u16)
    Serial.println(gps.date.month()); // Month (1-12) (u8)
    Serial.println(gps.date.day()); // Day (1-31) (u8)
    Serial.println(gps.time.value()); // Raw time in HHMMSSCC format (u32)
    Serial.println(gps.time.hour()); // Hour (0-23) (u8)
    Serial.println(gps.time.minute()); // Minute (0-59) (u8)
    Serial.println(gps.time.second()); // Second (0-59) (u8)
    Serial.println(gps.time.centisecond()); // 100ths of a second (0-99) (u8)
    Serial.println(gps.speed.value()); // Raw speed in 100ths of a knot (i32)
    Serial.println(gps.speed.knots()); // Speed in knots (double)
    Serial.println(gps.speed.mph()); // Speed in miles per hour (double)
    Serial.println(gps.speed.mps()); // Speed in meters per second (double)
    Serial.println(gps.speed.kmph()); // Speed in kilometers per hour (double)
    Serial.println(gps.course.value()); // Raw course in 100ths of a degree (i32)
    Serial.println(gps.course.deg()); // Course in degrees (double)
    Serial.println(gps.altitude.value()); // Raw altitude in centimeters (i32)
    Serial.println(gps.altitude.meters()); // Altitude in meters (double)
    Serial.println(gps.altitude.miles()); // Altitude in miles (double)
    Serial.println(gps.altitude.kilometers()); // Altitude in kilometers (double)
    Serial.println(gps.altitude.feet()); // Altitude in feet (double)
    Serial.println(gps.satellites.value()); // Number of satellites in use (u32)
    Serial.println(gps.hdop.value()); // Horizontal Dim. of Precision (100ths-i32)

    }
    }

    //bilgi(konum);

    delay(2000);
    }

    void bilgi(float konum){
    Serial.println(String(“AT+CIPSTART=\”TCP\”,\””) + IP + “\”,80″); //thingspeak sunucusuna bağlanmak için bu kodu kullanıyoruz.
    //AT+CIPSTART komutu ile sunucuya bağlanmak için sunucudan izin istiyoruz.
    //TCP burada yapacağımız bağlantı çeşidini gösteriyor. 80 ise bağlanacağımız portu gösteriyor
    delay(1000);
    if(Serial.find(“Error”)){ //sunucuya bağlanamazsak ESP modülü bize “Error” komutu ile dönüyor.
    Serial.println(“AT+CIPSTART Error”);
    return;
    }

    String yollanacakkomut = “GET /update?key=64T0OS3R1OEAYUML&field1=”; // Burada 64T0OS3R1OEAYUML yazan kısım bizim API Key den aldığımız Key. Siz buraya kendi keyinizi yazacaksınız.
    yollanacakkomut += (int(konum)); // Burada ise sıcaklığımızı float değişkenine atayarak yollanacakkomut değişkenine ekliyoruz.
    yollanacakkomut += “\r\n\r\n”; // ESP modülümüz ile seri iletişim kurarken yazdığımız komutların modüle iletilebilmesi için Enter komutu yani
    delay(3000); // /r/n komutu kullanmamız gerekiyor.

    Serial.print(“AT+CIPSEND=”); //veri yollayacağımız zaman bu komutu kullanıyoruz. Bu komut ile önce kaç tane karakter yollayacağımızı söylememiz gerekiyor.
    Serial.println(yollanacakkomut.length()+2); //yollanacakkomut değişkeninin kaç karakterden oluştuğunu .length() ile bulup yazırıyoruz.

    delay(1000);

    if(Serial.find(“>”)){ //eğer sunucu ile iletişim sağlayıp komut uzunluğunu gönderebilmişsek ESP modülü bize “>” işareti ile geri dönüyor.
    // arduino da “>” işaretini gördüğü anda sıcaklık verisini esp modülü ile thingspeak sunucusuna yolluyor.
    Serial.print(yollanacakkomut);
    Serial.print(“\r\n\r\n”);
    }
    else{
    Serial.println(“AT+CIPCLOSE”);
    }
    }

    • Ömer Koman dedi ki:

      donanımlar ayrı ayrı çalışıp beraberken çalıştırmak için ortak kullandıkları portlara dikkat etmeniz gerekir bunları bir kenara not edın ve setup kısmında ayrı ayrı gozden gecirın ve sonra kodları bırleştirin. kopyala yapıştır kod yazmak yerine ne yaptığınız anlamaya odaklanın.

  25. MUSTAFA dedi ki:

    pc ve klavye arasına ardunio kart takmak istiyorum klavyeden gelicek olan mesela “/” karakterini enter olarak pc ye vermesini istiyorum bu mümkün mü ?

    • Ömer Koman dedi ki:

      arduino leonardo pc tarafında pc keyboard ve mouse olarak tanınabiliyor bu konuda biraz araştırın güzel projeler bulacaksınız. arduino usb keyboard okumaz yalnız bunu çözmeniz lazım yada pc tarafında klavye kombinasyonlarını değiştiren configure eden driverlar olması lazım o şekilde de çözebilirsiniz.

      • MUSTAFA dedi ki:

        TEŞEKKÜRLER..
        UNO VE USB HOST SHIELD ile çözüm ürettim ama şimdi serial ekranına düşen veriyi pc ye direk alamıyorum. ne yapmam lazım.

  26. Ömer Koman dedi ki:

    serial ekran zaten seri port okumak için usb keyboard simulasyonunu test etmek için notepad veya herhangi bir text processor programı ile test etmen lazım. usb host zaten usb keyboard okumanı sağlıyor bir tanede leonardo al host shield in seriport çıkışını leonardoya bağla hosttan okuduğunu leonardodan yollarsın.
    ilk aklıma gelen bunlar belki saçma yanlış bir çözümdür ama yaparsan çalışır.

  27. mustafa dedi ki:

    malesef leonardo ilelede olmadı seriport ekranında uno gibi görünüuor ama notepat v.b. yerlere direk yazılmıyor bilgisi olan var mı? veya örnek bir kod var mı?

  28. doğukan dedi ki:

    merhaba elimde arduino uno var sırasıyla hem gps den gelen veriyi hemde pusula sensöründen gelen veriyi değerlendirip ona göre işlem yaptırmam gerekiyor uno ile bunu yapabilir miyim yoksa mega mı kullanmam lazım .
    şimdiden teşekkürler

    • Ömer Koman dedi ki:

      yapabilirsiniz. gps zaten seriden çalışır pusula sönsörü de i2c veya spi den çalışıyordur büyük ihtimal. ikisinden de veri okursunuz.

  29. Mikail dedi ki:

    Merhaba; iki bilgisayarı seri port ve RF modülü üzerinden haberleştireyeceğiz. Bu mesajlaşmada seri port ekranına yazdığımız yazıyı “enter tuşuna basmadan” seri porttan karşı tarafa gönderebiliyor muyuz. Eş zamanlı seri port ekranına yazılan yazıyı karşıya aktaracak ve hatta sildiğimizde de karşıdan silebiliyormuyuz.
    Bu yapılabiliyorsa nasıl bir yol izleyebiliriz.

    • Ömer Koman dedi ki:

      bir tuşa bastığınızda her karakterin karşı tarafa tek tek gitmesini istiyorsanız bunu yapabilirsiniz her karakteri okuduktan sonra yollayın gitsin karşı tarafta okuduğu her karakteri ekrana yazarsa istediğiniz olur.
      seri portta sorun çıkmaz, rfmodülde sorun çıkar, rf modüller veri paketi mantığı ile çalışır veriler rf modulde payload denılen bir mıktar verıyı aldıktan sonra yollamak ıster. siz 1 karakter de yollayabilirsiniz ama her ıletişim anında bir sürü zaman harcarsınız verimli olmaz. rf modul veri paketi oncesi 3-5 karakterlik senkronizasyon için başlıklar yollar siz bunu göremezsiniz alıcı bu ön verilerle kendi frekansını ve veri katarına göre kendını ayar eder verıyı aldıktan sonra size ayıklanmış verıyi gösterir ayrıca attığınız verının doğrulu ile ilgili verı de yollar. rf protollerini incelemenız lazım.

  30. Mehmet dedi ki:

    Sayın Taşdemir,
    Hobi olarak başladığım bir yapı şimdi proje bazına kadar geldi. Ardiuno nano’larla her bir fonksiyonu dağıtık yerlerden toplama istiyorum. RS485 ile master-slave çalışmalarından sonra bu çalışmama MODBUS yapısını koyarak bitirmek istiyorum. Her bir fonksiyonun yazılımları bitirdim. Şimdi hem konuyu(seri iletişim RS485 ve MODBUS) anlamak hemde projemei tamamlayıp denemek istiyorum. Bu konuda denenmiş örneklere ve lib’lere ihtiyacım var.
    Yardımınızı olabilir mi.
    Saygılarımla…

  31. hakan g dedi ki:

    merhaba,unoya hm10 bağladım.ios programı yazamıyorum ama hazır programlar “DSD TECH Bluetooth” hazır yazılım zaten var.
    Control instruction(Hexadecimal format):
    Channel 1 ON: A00101A2
    Channel 1 OFF: A00100A1
    ard.ide comport monitörü açıp gelen verileri alıyorum.örneğin hazır program bana hex A00101A2 gönderdiğinde comport monitöre ters soru işareti kare kare ters soru işareti olarak geliyor.ama burada bir yanlışlık var.gelen datayı böyle yanlış okuduğumdan işlem yapamıyorum.gelen bilgiyi A00101A2 olarak okumuş olsan her istediğimi yapabilirim.
    çok bilmiyorum bu kadar ilerletebildim.
    gelen veriyi doğru çözmem için gereken satır konusunda acil yardım rica ediyorum 🙂
    Şimdiden çok teşekkürler.
    hakan.gucyetmez@hotmail.com

    #include
    SoftwareSerial HM10(2, 3); // RX = 2, TX = 3
    char appData;
    String inData = “”;
    void setup()
    {
    Serial.begin(9600);
    Serial.println(“HM10 serial started at 9600”);
    HM10.begin(9600); // set HM10 serial at 9600 baud rate
    pinMode(13, OUTPUT); // onboard LED
    digitalWrite(13, LOW); // switch OFF LED
    }
    void loop()
    {
    HM10.listen(); // listen the HM10 port
    while (HM10.available() > 0) { // if HM10 sends something then read
    appData = HM10.read();
    inData = String(appData); // save the data in string format
    Serial.write(appData);
    }

    if (Serial.available()) { // Read user input if available.
    delay(10);
    HM10.write(Serial.read());
    }
    if ( inData == “0”) {
    Serial.println(“0 – LED OFF”);
    digitalWrite(13, LOW); // switch OFF LED
    delay(500);
    }
    if ( inData == “1”) {
    Serial.println(“1 – LED ON”);
    digitalWrite(13, HIGH); // switch On LED
    delay(500);
    digitalWrite(13, LOW); // switch OFF LED
    delay(500);

    }
    if ( inData == “2”) {
    Serial.println(“2 – LED ON”);
    digitalWrite(13, HIGH); // switch On LED
    delay(1000);
    digitalWrite(13, LOW); // switch OFF LED
    delay(500);
    appData = (99);

    }
    if ( inData == “A00101A2”) {
    Serial.println(“LED ON”);
    digitalWrite(13, HIGH); // switch On LED
    delay(500);
    digitalWrite(13, LOW); // switch OFF LED
    delay(500);

    }
    if ( inData == “A00100A1”) {
    Serial.println(“LED ON”);
    digitalWrite(13, HIGH); // switch On LED
    delay(500);
    digitalWrite(13, LOW); // switch OFF LED
    delay(500);
    }
    if ( inData == “⸮⸮”) {
    Serial.println(“LED ON ⸮⸮”);
    digitalWrite(13, HIGH); // switch On LED
    delay(500);
    }
    if ( inData == “01”) {
    Serial.println(“LED ON”);
    digitalWrite(13, HIGH); // switch On LED
    delay(500);
    digitalWrite(13, LOW); // switch OFF LED
    delay(500);
    }
    if ( inData == “⸮⸮”) {
    Serial.println(“LED ON ⸮⸮”);
    digitalWrite(13, HIGH); // switch On LED
    delay(500);
    }

    }

    • Ömer Koman dedi ki:

      ilk baştaki loop içindeki kodda gelen kodu HEX olarak basıp bir bakın gerekli yeri işaretledim yazdım

      HM10.listen(); // listen the HM10 port
      while (HM10.available() > 0) { // if HM10 sends something then read
      appData = HM10.read();
      inData = String(appData); // save the data in string format
      Serial.print(String(appData,HEX));<============================= bu şekilde deneyin geleni bir görelim }

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal Ağlar