Arduinoları Kablolu Haberleştirme

Merhabalar, okul projem için bir proje yapacağım fakat büyük bir proje olduğu için tek arduinonun yetmeyeceğini düşünüyorum. Acaba kaç adet arduinoyu kablolu şekilde birbirine bağlayabilirim? (Kablolu derken birinin işlediği veriyi diğerine aktarma)
Bu arada elimdeki arduinolar şu şekilde:
1 adet klon leonardo
3 adet ch340 çipli uno
1 adet ch340 çipli nano

Merhabalar,
Bunun bir kaç yolu var.

Birden fazla Arduinolar arası RX/ TX ile Haberleşme

1.arduinonun RX’ini 2. arduinonun TX’ine; 1.arduinonun TX’ini 2.arduinonun RX’ine bağlayıp seri monitörden yazma/okuma yapabilirsiniz.

Birden fazla Arduinolar arası i2c üzerinden Haberleşme

İki veya birden fazla arduinonun SCL ve SDA pinini birleştiriyoruz. Arduino uno da bu A4 ile A5’tir. Bunu google amcaya arduino modeli + pin yazarak sonucu elde edebilirsiniz. Biz arduino uno kullanıyoruz diyelim. İki arduinonun A4 pinlerini birbirine, A5 pinlerini birbirine bağlıyoruz. Bunu erkek-erkek jumper kablo ile de yapabilirsiniz ancak temazsizlığa dikkat edin. Çünkü en ufak temazsızlıkta i2c haberleşme protokülü durar ve arduinolara reset atmanız gerekir.
Bu haberleşmede iki mod vardır. Master(Usta) ve Slave(Köle). Adından da anlaşılacağı gibi usta emir verir köle yapar. Köleye 13.pine bir led taktık diyelim. Led takmamıza da gerek yok aslında L ledi 13.pine bağlıdır.

Master kodu

#include <Wire.h> // i2c için Wire kütüphanesi ekliyoruz

void setup() {
Wire.begin(); // i2c haberleşmesini başlattık
Serial.begin(9600); // seri haberleşmemizin baude hızını belirledik
}
void loop() {
Wire.beginTransmission(1); // 1 adresine sahip(slave) arduinoya veri göndereceğiz
Wire.write("x"); // i2c den x harfini gönderiyoruz
Wire.endTransmission(); // yollanacak veri bitti
delay(1000); // 1 saniye bekle az dinleneyim

Wire.beginTransmission(1);
Wire.write("y");
Wire.endTransmission();
delay(1000);

Wire.requestFrom(1, 13); // 1 adresine sahip arduino(slave) 13byte'lik veri bekliyor bu göndereceğiniz şeye göre byte değişir. Her harf ve boşluk bir byte'dir
char gelen;
while(Wire.available()){
gelen = Wire.read();
Serial.println(gelen);
}
delay(1000);
}

Slave Kodumuz

#include <Wire.h>
const int led = 13; //led pinizmizi tanımladık
void setup()
{
pinMode(led, OUTPUT); //ledimiz haliyle çıkış olarak ayarlandı
Wire.begin(1); // arduinomuzu 1(Slave) yaptık
Wire.onRequest(istekGel); //Master kartımız veri istediği zaman
Wire.onReceive(veriGel); // Master kartımızdan veri geldiği zaman
}
void loop()
{
  delay(1); // void loopta bişey yapmıyacaz
}

void veriGel(int veri)
{
  char gelen;
  while(Wire.available()){
    gelen = Wire.read();
  }
  if(gelen == 'x') // eğer gelen x ise
    digitalWrite(led, HIGH); //led yak
  else if(gelen == 'y') //eğer gelen y ise
    digitalWrite(led, LOW); //led söndür
}
void istekGel()
{
  Wire.write("Nasipte Varsa"); //işte istediğimiz kodları yazıyoruz çok uzatmayacağım
}

Birden fazla Arduinolar arası SPI üzerinden haberleşme

Burda da aynı şekilde master ve slave var detaya girmeyeceğim. Sadece aynı mantık farklı protokol.

Devre Şeması

Master Kodu

#include <SPI.h>// SPI kütüphanemizi ekledik
const int SS = 8;//SS pinini 8.pin olarak ayarladık
void setup()
{
pinMode(SS, OUTPUT); // SS pinini çıkış olarak ayarladık
digitalWrite(SS, HIGH);//veri göndereceğimiz için SS pinini tetikledik
SPI.begin();//SPI haberleşmesi başlatıldı
}
void loop()
{
veriGel('x',  SS);//x komutu yollandı
delay(1000); //1 saniye gardeşim
veriGel('y', SS);//b komutu yollandı
}
void veriGel(char veri, int SS)
{
digitalWrite(SS, LOW); // veri alacağımız için SS pinini 0'a çektik
delay(1);
char ledDurum;
ledDurum = SPI.transfer(veri);
Serial.println(ledDurum); //led durumumuzu seriale yazdırdık
}

Slave Kodu

char i = 0;
const int led = 7; //ledi 7.pine ayarladık
void setup()
{
pinMode(MISO, OUTPUT); //MISO pinini çıkış olarak ayarladık
  pinMode(SS, INPUT); //SS pinini giriş olarak ayarladık.
pinMode(led, OUTPUT);//ledi çıkış olarak ayarladık

  SPCR  |= 0b11000000;
  SPSR  |= 0b00000000; //Slave modu için şnterupt ayarlamaları
sei(); interuplar çalıştı
}
void loop()
{
delay(100); // vala nefesim kesildi bi dur
}

ISR(SPI_STC_vect)
{
  cli();
  while(!digitalRead(SS))
  {
      SPDR = i;
      i ++;
      if ( i > 255) 
        i = 0;
      while(!(SPSR & (1 << SPIF)));
      char gelen;
      gelen = SPDR;
      if(gelen == 'x'){
        digitalWrite(led, HIGH);
      }else if(gelen == 'y'){
        digitalWrite(led, LOW); 
      }
  }
  sei();
}

Şuanlık en basit iletişimler bunlar geldi. Tabiki canbus gibi modüller de kullanabilirsiniz. Kolay gelsin. :slightly_smiling_face:

Merhaba, acaba kaç adet arduinoyu bu yöntemlerle haberleştirebilirim? Bir de her arduino modeli birbiri ile haberleşebilir mi?

Aslında sonsuz arduino ile haberleşebilirler. Sonuçta haberleşmeyi başlatıp tekrar durduruyorsun. İki arduinoda haberleşme başlatıp veri aktarımı bittiği zaman haberleşmeyi sonlandırırsın ve diğer arduinolarda haberleşmeyi başlatabilirsin.

Yardım ettiğiniz için çok teşekkür ederim. İyi günler.

1 Beğeni