Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

28 Nisan 2021 Çarşamba

İki Arduino Kartı Arasında SPI İletişimi

 

İki Arduino Kartı Arasında SPI İletişimi

Bu eğitimde, sen SPI iletişim portunu kullanmak öğrenecektir Arduino . Örnek olarak, iki Arduino kartı arasında SPI iletişimini göreceğiz. 4 kablolu bir seri iletişim protokolüdür. Tek ana ve çok bağımlı iletişimi destekler. Bu nedenle, bu eğitimde, bir Arduino'yu ana cihaz olarak ve diğer kartı bir slave cihaz olarak yapılandıracağız.










SPI Tanıtımı

SPI protokolünün ve iletişim hatlarının temel tanıtımıyla başlayalım. Bu seri iletişim arabirimi, Seri Çevre Birimi Arabirimi olarak da bilinir. Tam çift yönlü iletişim modu sağlar. Bu, verilerin aynı anda alınıp gönderilebileceği anlamına gelir. Master, slave'lere veri gönderebilir ve slave'ler aynı anda master'a veri gönderebilir. Veri iletmek ve almak için, bir saat sinyali gereklidir, bu da bunun senkronize bir iletişim kanalı olduğu anlamına gelir.

SPI iletişim protokolü hakkında derinlemesine bir ayrıntı istiyorsanız, bu eğiticiyi okuyabilirsiniz:

SPI İletişimi

Bu iletişim protokolü SCK, MOSI, MISO ve SS gibi dört hat kullanır. Bir sonraki bölümde bu satırların detaylarını açıklayacağız. Ana tartışmaya geri dönersek, SPI veri yolu tek bir ana cihaza ve birden fazla bağımlı cihaza sahip olabilir. Ana cihaz bir mikro denetleyicidir, köleler ise bir mikro denetleyici, ADC , DAC vb. Olabilir .

Master Slave konfigürasyonu Örneği

 Aşağıda verilen şekil, Bir Master ve Dört Slave cihazdan oluşan iletişim kanalını göstermektedir.

SPI Haberleşmesi Arduino

SPI iletişiminde aşağıdaki dört hat kullanılmaktadır.

  • SCK = Seri Saat = Bu hat, Ana cihazlardan veri iletimini senkronize etmek için saat darbeleri için kullanılır.
  • MOSI = Master Out Slave In = Bu hat, Master cihazdan Slave cihazlara veri göndermek için kullanılır.
  • MISO = Master In Slave Out = Bu hat, Slave cihazlardan Master cihaza veri göndermek için kullanılır.
  • SS = Slave Select = Bu pin Ana cihaz tarafından belirli cihazların tüm cihazlardan sadece bazılarıyla iletişim kurmasını etkinleştirmek ve devre dışı bırakmak için kullanılır.

Arduino SPI Pinleri

Aşağıdaki şekil, Arduino UNO'daki SPI iletişimi için kullanılan pinleri göstermektedir. Bu iğneler sarı renkle vurgulanmıştır.

Arduino SPI Haberleşme Pimleri

Bu pimler tarafından gerçekleştirilen işlev aşağıdadır.

  • Pin11 = MOSI
  • Pin12 = MISO
  • Toplu iğne13 = SCK
  • Pin10 = SS

Arduino UNO'da SPI İletişimi

Şimdi iki Arduino kartı arasındaki SPI iletişiminin bir örneğini görelim. Ancak bundan önce, Arduino IDE'de bulunan SPI iletişim kütüphanesi işlevlerini anlayalım.

Arduino SPI Kütüphanesi

 SPI kullanan iki Arduino arasında iletişim kurmak için, bu amaçla kullanılan önceden oluşturulmuş bir Arduino kütüphanesi vardır.

  • <SPI.h> : SPI haberleşme fonksiyonunu kullanmak için programdaki kütüphaneyi içerir.
  • SPI.begin (): SPI veriyolunu başlatır ve SCK ve MOSI pinini LOW ve SS pinini HIGH olarak ayarlar.
  • SPI.transfer (val) : Bu, Master ve Slave cihazlar arasında eşzamanlı iletişim için kullanılır.
  • SPI.attachInterrupt (handler) : Slave cihazdaki bir master cihazdan veri almak için kullanılır ve bir slave cihazda çağrılır.
  • SPI.setClockDivider (bölücü) : SPI saat bölücüsünü sistem saatine göre ayarlar.

Aşağıdaki bölücü türleri burada mevcuttur:

  • SPI_CLOCK_DIV2
  • SPI_CLOCK_DIV4
  • SPI_CLOCK_DIV8
  • SPI_CLOCK_DIV16
  • SPI_CLOCK_DIV32
  • SPI_CLOCK_DIV64
  • SPI_CLOCK_DIV128

Bu bölücüler, 2, 4, 8, 16, 32, 64, 128 değerlerine sahip bölmeye karşılık gelir.

İki Arduino Arasındaki SPI İletişimi

Şimdi iki Arduino kartı arasında SPI iletişiminin nasıl gerçekleştirileceğini görelim. Bir Arduino'yu master cihaz olarak ve başka bir Arduino kartını slave cihaz olarak yapılandıracağız. Kullanıcı, Arduino'nun D2'sine bağlı olan basma düğmesine basarsa, bir ana cihaz 1 iletecektir. SPI Slave Arduino bu verileri alır ve alınan verilere dayanarak Arduino'nun D4 pinine bağlı olan LED'i açma veya kapatma kararı verir.

İlk önce Ana cihazın kodunu anlayın.

Arduino SPI Master Cihaz Kodu

Kod 3 bölüme ayrılabilir:

Beyannameler

Bu bölümde SPI kütüphanesini ekledik ve farklı değişkenler tanımladık. İtme değişkenleri, basma düğmesinin bağlanacağı Arduino dijital I / O pinidir ve durumuna bağlı olarak Veriler slave cihaza iletilecektir. LED değişkeni, slave cihaz çıkış durumundan alınan verilere göre gösterilecek olan Arduino pinidir.

#include<SPI.h>                        
#define push 2
#define LED 4           
int x;
int value;

Cihazı Kurma

              Burada cihaz program ve iletişim için kuruluyor. İlk baud hızı ayarlandı. Push ve LED pinleri giriş ve çıkış pinleri olarak ilan edilmiştir. Ardından, SPI iletişimi yukarıda açıklanan işlevler kullanılarak ayarlanmıştır ve bağımlı seçim, zaten gerçekleştiriliyorsa iletişimi kesecek şekilde yüksek olarak ayarlanmıştır.

Serial.begin(115200);                 
pinMode(push,INPUT);              
pinMode(LED,OUTPUT);                  
SPI.begin();                            
SPI.setClockDivider(SPI_CLOCK_DIV8); 
digitalWrite(SS,HIGH);   

Gerçekleştirilen işlev

Bu bölümde, talimat gönderme ve alma ile ilgili fiili işlemi gerçekleştirdik.

byte m_send,m_receive;          

  value = digitalRead(push); 

  if(value == HIGH)                
  {
    x = 1;
  }
  else
  {
    x = 0;
  }
  
  digitalWrite(SS, LOW);                  
  
  m_send = x;                            
  m_receive=SPI.transfer(m_send); 
  
  if(m_receive == 1)                 
  {
    digitalWrite(LED,HIGH);             
  }
  else
  {
   digitalWrite(LED,LOW);              
  }
  delay(1000);
}




İki değişken m_send ve m_receive olarak tanımlanmıştır. Pim 2'ye takılı olan butonun durumu okunur. YÜKSEK veya DÜŞÜK durumuna bağlı olarak, komut 1 veya 0, yukarıda açıklanan SPI aktarım işlevi kullanılarak ikincil öğeye gönderilir.

Sonraki bölüm verilerin alınmasıyla ilgilidir. Veriler, aynı SPI.transfer işlevi kullanılarak da alınır. Alınan veri 0 ise, pim 4'teki LED DÜŞÜK olarak ayarlanır ve alınan veriler 1 ise, pim 4'teki LED YÜKSEK olarak ayarlanır.

Ana Cihaz Kodunu Tamamlayın

#include<SPI.h>                        
#define push 2
#define LED 4           

int x;
int value;

void setup (void)

{
  Serial.begin(115200);               
  
  pinMode(push,INPUT);              
  pinMode(LED,OUTPUT);                  
  
  SPI.begin();                            
  SPI.setClockDivider(SPI_CLOCK_DIV8); 
  digitalWrite(SS,HIGH);                  
}

void loop(void)
{
  byte m_send,m_receive;          

  value = digitalRead(push); 

  if(value == HIGH)                
  {
    x = 1;
  }
  else
  {
    x = 0;
  }
  
  digitalWrite(SS, LOW);                  
  
  m_send = x;                            
  m_receive=SPI.transfer(m_send); 
  
  if(m_receive == 1)                 
  {
    digitalWrite(LED,HIGH);             
  }
  else
  {
   digitalWrite(LED,LOW);              
  }
  delay(1000);
}

Arduino SPI Master Cihaz Kodu

Kod 3 bölüme ayrılabilir:

Bu bölümde SPI kütüphanesini ekledik ve farklı değişkenler tanımladık. Inputbutton değişkeni, butonun bağlanacağı ve durumuna bağlı olarak Veri ana cihaza iletilecek olan Arduino dijital I / O pinidir. outputLED değişkeni, ana cihaz çıkış durumundan alınan verilere göre gösterilecek olan Arduino pinidir. Alınan bağımlı birim, Ana cihazdan alınan değeri saklayacaktır.

#include<SPI.h>
#define inputbutton 2
#define outputLED 4

volatile boolean received;
volatile byte Slavereceived,Slavesend;
int buttonvalue;
int x;

Cihazı Kurma

Burada cihaz program ve iletişim için kuruluyor. İlk baud hızı ayarlandı. Push ve LED ve MISO pinleri giriş ve çıkış pinleri olarak ilan edilmiştir. Daha sonra cihaz bağımlı moda ayarlandı ve kesinti SPI iletişimi için ayarlandı.

Serial.begin(115200);
  
  pinMode(inputbutton,INPUT); 
  pinMode(outputLED,OUTPUT);               
  pinMode(MISO,OUTPUT);                  

  SPCR |= _BV(SPE);                  
  received = false;

  SPI.attachInterrupt();    





SPI alıcı pini nedeniyle bir kesinti meydana geldiğinde, bu kesinti servis rutini yürütülür.

ISR (SPI_STC_vect)                        
{
  Slavereceived = SPDR;         
  received = true;                        
}

Gerçekleştirilen işlev

Bu bölümde, talimat gönderme ve alma ile ilgili fiili işlemleri gerçekleştirdik.

if(received)                           
   {
      if (Slavereceived==1) 
      {
        digitalWrite(outputLED,HIGH);       
      }else
      {
        digitalWrite(outputLED,LOW);          
      }
      
      buttonvalue = digitalRead(inputbutton);  
      
      if (buttonvalue == HIGH)           
      {
        x=1;
        
      }else
      {
        x=0;
      }
      
  Slavesend=x;                             
  SPDR = Slavesend;                       
  delay(1000);

Burada ilk veri alımı, veri alınırsa onaylanır, ardından 0 veya 1 olduğu kontrol edilir. 0 alınırsa, çıkış pini 4'teki LED DÜŞÜK olarak ayarlanır ve 1 alınırsa, çıkış pini 4'teki LED YÜKSEK olarak ayarlanır. .

Sonraki bölüm, durum kimliği YÜKSEK, 1 Ana'ya gönderilirse ve durum DÜŞÜK ise, Ana cihaza 0 gönderilirse pus düğmesi pimi 2'nin durum kontrolü ile ilgilidir.

Eksiksiz Bağımlı Cihaz Kodu

#include<SPI.h>
#define inputbutton 2
#define outputLED 4

volatile boolean received;
volatile byte Slavereceived,Slavesend;
int buttonvalue;
int x;

void setup()

{
  Serial.begin(115200);
  
  pinMode(inputbutton,INPUT); 
  pinMode(outputLED,OUTPUT);               
  pinMode(MISO,OUTPUT);                  

  SPCR |= _BV(SPE);                  
  received = false;

  SPI.attachInterrupt();                  
  
}

ISR (SPI_STC_vect)                        
{
  Slavereceived = SPDR;         
  received = true;                        
}

void loop()
{  
 if(received)                           
   {
      if (Slavereceived==1) 
      {
        digitalWrite(outputLED,HIGH);       
      }else
      {
        digitalWrite(outputLED,LOW);          
      }
      
      buttonvalue = digitalRead(inputbutton);  
      
      if (buttonvalue == HIGH)           
      {
        x=1;
        
      }else
      {
        x=0;
      }
      
  Slavesend=x;                             
  SPDR = Slavesend;                       
  delay(1000);
}
}

Proteus Simülasyonları

Aşağıdaki şekil hiçbir düğmeye basılmadığında normal iletişim durumunu göstermektedir.

iki arduino kartı arasındaki spi iletişimi proteus simülasyonu 1

Arduino 1'de butona basıldığında bir süre sonra (bir süre bekleyin) Arduino 2'deki led yanar. Bu gecikme, Proteus ve PC simülasyon kaynaklarının sınırlamalarından kaynaklanmaktadır.

iki arduino kartı arasındaki spi iletişimi proteus simülasyonu 2

Arduino 2'de butona basıldığında bir süre sonra (Sonucu görmek için sabırlı olun) Arduino 1'deki led yanar. Bu gecikme, Proteus ve PC simülasyon kaynaklarının sınırlamalarından kaynaklanmaktadır.

iki arduino kartı arasındaki spi iletişimi proteus simülasyonu 3

Arduino Projelerinde SPI Uygulamaları

  • SPI iletişimi, bir flaş, hafıza kartı ve EEPROM ile mikro denetleyiciler arasında arayüz oluşturmak için kullanılır
  • OLED ve LCD ekran, gömülü cihazlarla iletişim için bu yöntemi kullanır. Sıcaklık, basınç ve DAC gibi farklı sensörler bu iletişim modunu kullanır.

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.

Hiç yorum yok:

Yorum Gönder

Yorum yazdığınız ve üye olduğunuz için Size teşekkür ederim.Burada olduğunuza göre hepimizin ilgi alanı Elektronik ve Programlama sonsuz bir dünyadayız.Hepimize Başarılar...

Not: Yalnızca bu blogun üyesi yorum gönderebilir.