Arduino ile Seri İletişim – 2
Coşkun Taşdemir // 14 Nisan 2012 // 56 yorum // kategori: Arduinoya GirişÖ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…
Etiketler: Arduino UART > arduinoya giriş > Seri iletişim > UART
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)
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.
Cevabınız için teşekkür ediyorum.Ne yaptıysam olmadı.Windows 7 kurdum artık serial monitör kullanabiliyorum.
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..
Sorularınızı forum bölümümüzde sorarsanız daha hızlı cevap alabilirsiniz. Teşekkürler.
Ç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
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.
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.
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.
sitede c# yazıları var onlardan faydalanabilirsiniz. bilgisayar seri portundan arduinoya c# ile veri yollayıp veri okuyabilirsiniz.
Kolay gelsin hocam. Arduino ile Raspberry arasında bilgi göndermek istiyorum string gönderemiyorum yardımcı olur musunuz ?
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.
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. . .
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.
once bir pini high yapan kodu yazın, daha sonra seriportu okuyan kodu da ekleyin daha sonra bu kodu forumda paylaşın.
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 ?
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.
Benim projemde 16 adet cihazdan seri port üzerinden bilgi okumam gerekiyor.
UNO ile nasıl yaparız?
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.
Ö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ı?
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.
[…] MEGA ve Arduino DUE’de daha fazla port yer alıyor. Bu konuyla ilgili başka yazılarımıza buradan ve buradan […]
بِسْــــــــــــــــــــــمِ اﷲِارَّحْمَنِ ارَّحِيم
ö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.
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.
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.
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.
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?
foruma gelin bu modulle ilgili konular var muhtelemen size uygun bır çözum vardır
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
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
}
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”
İ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.
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.
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?
barkod okuyucunuzun rs232 serial çıkışı olabilir onu araştırın varsa eğer arduino ile okuyup geri kalan adımları yaparsınız.
Usb çıkışı kullanacağız.Peki arduino için hangisini önerirsiniz?
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
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.
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.
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..
serial read yerıne ReadString komutu kullanırsanız tek dijitten data uzun komutları işleyebilirsiniz
https://www.arduino.cc/en/Serial/ReadString
http://www.instructables.com/id/Arduino-Function-Serialread-And-SerialreadString/
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”);
}
}
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.
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ü ?
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.
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.
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.
teşekkürler
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ı?
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
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.
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.
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.
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…
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);
}
}
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 }