2 Arduino Arası Kablolu İletişim
Bu eğitimde, 2 Arduino Arası Koblolu İletişim nasıl kurulur bunu öğreneceğiz. Bir Arduino’ya bağlı olan LM35 sıcaklık sensöründen aldığımız verileri biraz uzaktaki ikinci bir Arduino’ya iletmek için 3 kablolu bir bağlantı (iletim, alma ve ortak topraklama) kullanacağız. Bu mesafe 10m’den fazla ise teller bükülmelidir.
LM35 Sıcaklık Sensörü Kullanımı
LM35, 3 pimli bir sıcaklık sensörüdür. 1 nolu pin, 4V ila 20V arasında herhangi bir yerde bir besleme voltajına bağlanır. 2 nolu pin Çıkış pini, Santigrat derece başına 10mV veren bir voltaj kaynağıdır. Başka bir deyişle, 25 derece C, Out pininde 250mV üretecektir. Bu bir analog voltajdır ve bu nedenle Arduino’daki bir analog pinine bağlanmalıdır. 3 nolu pini ise topraklama pinidir. Sıcaklık aralığı -55 ila +150 derece C’dir. Arduino bunu derece C cinsinden aşağıdaki gibi bir sıcaklığa dönüştürebilir:
float tempC = analogRead(LM35_pin)
tempC = (tempC*500)/1023
LM35 sensörünün kullanımını daha detaylı öğrenmek için aşağıdaki yazımızı okuyailirsiniz.
İki Arduinonun Bağlanması
Arduinos’un iki seri portunu birbirine bağlamak bariz görünebilir (veri pinleri 0 ve 1). Ancak, bunu yapacaksanız, sinyaliniz Arduino’yu USB bağlantı noktasından ve varsayılan olarak bu pinleri kullanan seri pencereden programlamaya çalışmakla çakışacaktır. Bunun yerine, Arduino IDE ile varsayılan olarak gelen SoftwareSerial kütüphanesini kullanacağız ve kullanmamız için tamamen bağımsız bir seri port seti oluşturacağız. LM35’i uzak üniteye ve bir pile ve 3 telli bağlantıya bağlayacağız.
Yerel Arduino için sadece bir güç kaynağı veya pil veya USB bağlantı noktasından gelen güç yeterlidir. Sonuç seri monitörde gösterilecektir ama siz bir LCD ekran kullanabilirsiniz.
LM35 Sensörü ve Arduinoların Bağlantı Şeması
İki Arduino’yu ve LM35 sıcaklık sensörünü bağlamak için ihtiyaç duyacağınız parçalar şunlardır:
Bir Arduino’nun TX’inin diğerinin RX’ine gittiğini ve bunun tersini unutmayın.
SoftwareSerial Kütüphanesini Yükleme
LM35 için gerekli kütüphane yok ve SoftwareSerial kütüphanesi varsayılan olarak Arduino IDE ile kurulu olarak zaten mevcuttur.
Dikkat edilmesi gereken bir şey, standart kütüphanede arabellek boyutu oldukça küçüktür (64 bayt) ve uzun metinleri iletmek isterseniz, bunların kesildiğini (uçların kesildiğini) görürsünüz. Bu, SoftwareSerial.h dosyasını C:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src konumunda düzenleyerek düzeltilebilir, ancak ne yaptığınızı bilmiyorsanız bunu yapmayın. (Önce dosyanın bir kopyasını oluşturun!)
Seri İletişim Hakkında Not: Seri bağlantı noktalarının (UARTS) eşzamansız olarak iletişim kuracağını unutmak genellikle kolaydır. Bu, alıcıya gelen verilerin Arduino döngüsü ile zamanında değil, kendi zamanında olacağı anlamına gelir.
Master(Yönetici) İçin Arduino Kodu
//Transmitter Code
#include <SoftwareSerial.h>
SoftwareSerial link(2, 3); // Rx, Tx
byte lm35Pin = A0;
float lm35V = 0;
float tempC = 0;
byte greenLED = 12;
char text[20] ;
char charVal[6];
void setup()
{
link.begin(9600);
Serial.begin(9600);
pinMode(greenLED, OUTPUT);
}
void loop()
{
strcat(text, "Temp is: "); //append to empty string
digitalWrite(greenLED, HIGH);
delay(10);
digitalWrite(greenLED, LOW);
lm35V = analogRead(lm35Pin);
tempC = (lm35V/1023) * 500;
//this is a float we want it as a c-string:
dtostrf(tempC, 5, 1, charVal);
//5 is min width, 1 is precision; float value is copied to charVal
strcat(text, charVal); //append the value
text[16] = 0; //terminate the cstring
strcat(text, "C"); //append a C
Serial.println(text); //print to local screen for debug
link.println(text);
delay(200);
}
Slave(Köle) İçin Arduino Kodu
Loop() içerisindeki yorum yapılmış 4 satırı bağlantıda hatanın olup olmadığını anlamak için kullanmaktayız. Eğer bağlantıda hata var ise bu 4 satırı yorum olmaktan çıkarın ve loop içerisindeki diğer kodları yorum yapın.
//Receiver code
#include <SoftwareSerial.h>
SoftwareSerial link(2, 3); // Rx, Tx
byte greenLED = 12;
char cString[20];
byte chPos = 0;
byte ch = 0;
char dataStr[6];
void setup()
{
link.begin(9600); //setup software serial
Serial.begin(9600); //setup serial monitor
pinMode(greenLED, OUTPUT);
}
void loop()
{
// if (link.available())
// Serial.write(link.read());
// if (Serial.available())
// link.write(Serial.read());
while(link.available())
{
//read incoming char by char:
ch = link.read();
cString[chPos] = ch;
chPos++;
digitalWrite(greenLED, HIGH); //flash led to show data is arriving
delay(10);
digitalWrite(greenLED, LOW);
}
cString[chPos] = 0; //terminate cString
chPos = 0;
Serial.print(cString);
}
Projenin Test Çıktısı
Her şey doğru şekilde bağlandıysa, sıcaklığı değiştirmek için LM35’i parmaklarınızla sıkıştırın. Slave arduinoyu bilgisayara bağlayın ve seri haberleşme mönitörünü açın ve Seri monitörde aşağıdaki gibi göstermelidir:
Umarım bu, iki Arduino arasında nasıl iletişim kuracağınızı anlamanıza yardımcı olur! Herhangi bir sorunuz varsa aşağıya bir yorum bırakmaktan çekinmeyin!
atmega 328 den Nano’ya gönderdiğim veriler birbirine karışıyor örneğin 23 değerini 2 ve 3 olarak ayırıp önce 2 yi sonra 3 ü gönderecek şekilde sıralıyorum ama Nano’dan değeri bi 23 bi 32 olarak okuyorum. sebebi ne olabilir yardımcı olursanız sevinirim
GND’leri birleşik mi?