- SPI nedir?
- SPI Çalışması
- Arduino UNO'daki SPI Pinleri
- Arduino'da SPI kullanma
- Arduino SPI iletişimi için gerekli bileşenler
- Arduino SPI İletişim Devre Şeması
- SPI İletişimi için Arduino Nasıl Programlanır:
- Arduino SPI Master Programlama Açıklaması
- Arduino SPI Slave Programlama Açıklaması
- SPI, Arduino'da nasıl çalışır? - Hadi deneyelim!
Bir Mikroişlemci, çeşitli sensörler ve modüller ile iletişim kurmak için birçok farklı protokol kullanır. Kablosuz ve kablolu iletişim için birçok farklı iletişim protokolü vardır ve en yaygın kullanılan iletişim tekniği Seri İletişimdir. Seri iletişim, verilerin bir iletişim kanalı veya veri yolu üzerinden sırayla bir bit olarak gönderilmesi işlemidir. UART, CAN, USB, I2C ve SPI iletişimi gibi birçok seri iletişim türü vardır.
Bu eğitimde, SPI protokolünü ve bunun Arduino'da nasıl kullanılacağını öğreneceğiz. Biz kullanacağız iki Arduinos arasındaki iletişim için SPI Protokolü. Burada bir Arduino Master olarak hareket edecek ve bir diğeri Slave olarak hareket edecek, iki LED ve butonlar her iki Arduino ya bağlanacaktır. SPI iletişimini göstermek için, SPI Seri iletişim protokolünü kullanarak ana taraftaki LED'i slave tarafındaki basma düğmesiyle kontrol edeceğiz.
SPI nedir?
SPI (Seri Çevre Birimi Arabirimi) bir seri iletişim protokolüdür. SPI arayüzü 1970 yılında Motorola tarafından bulundu. SPI tam çift yönlü bağlantıya sahiptir, bu da verilerin aynı anda gönderilip alındığı anlamına gelir. Yani bir master, bir slave'e veri gönderebilir ve bir slave, master'a aynı anda veri gönderebilir. SPI, senkron seri iletişimdir, saatin iletişim amaçları için gerekli olduğu anlamına gelir.
SPI iletişimi daha önce diğer mikro denetleyicilerde açıklanmıştır:
- PIC Mikrodenetleyici PIC16F877A ile SPI İletişimi
- Raspberry Pi ile 3,5 inç Dokunmatik Ekran TFT LCD'yi arayüzleme
- SPI pinli AVR mikro denetleyicisini programlama
- Nokia 5110 Grafik LCD ile Arduino arasında arayüz oluşturma
SPI Çalışması
Bir SPI, dört hat kullanarak bir ana / bağımlı iletişimine sahiptir. Bir SPI yalnızca bir ana makineye ve birden çok bağımlıya sahip olabilir. Master genellikle bir mikrodenetleyicidir ve slave'ler bir mikrodenetleyici, sensörler, ADC, DAC, LCD vb. Olabilir.
Aşağıda, SPI Master ve Tek Slave'in blok diyagramı gösterilmektedir.
SPI, aşağıdaki dört satıra sahiptir MISO, MOSI, SS ve CLK
- MISO (Master in Slave Out) - Master’a veri göndermek için Slave hattı.
- MOSI (Master Out Slave In) - Çevre birimlere veri göndermek için Ana hat.
- SCK (Seri Saat) - Master tarafından üretilen veri iletimini senkronize eden saat darbeleri.
- SS (Slave Select) –Master, belirli cihazları etkinleştirmek ve devre dışı bırakmak için bu pini kullanabilir.
Çoklu Bağımlı SPI Master
Master ve slave arasındaki iletişimi başlatmak için, gerekli cihazın Slave Select (SS) pinini LOW olarak ayarlamamız gerekir, böylece master ile iletişim kurabilir. Yüksek olduğunda ustayı görmezden gelir. Bu, aynı MISO, MOSI ve CLK ana hatlarını paylaşan birden fazla SPI cihazına sahip olmanızı sağlar. Yukarıdaki görüntüde görebileceğiniz gibi, SCLK, MISO, MOSI'nin ana bilgisayara ortak olarak bağlandığı ve her bir slave'in SS'sinin ayrı ayrı master'ın ayrı SS pinlerine (SS1, SS2, SS3) bağlandığı dört slave vardır. Gerekli SS pinini DÜŞÜK olarak ayarlayarak, bir master bu slave ile iletişim kurabilir.
Arduino UNO'daki SPI Pinleri
Aşağıdaki resim, Arduino UNO'yu (kırmızı kutuda) gösteren SPI pinlerini göstermektedir.
SPI Hattı |
Arduino'daki pin |
MOSI |
11 veya ICSP-4 |
MİSO |
12 veya ICSP-1 |
SCK |
13 veya ICSP-3 |
SS |
10 |
Arduino'da SPI kullanma
İki Arduino arasındaki SPI iletişimi için programlamaya başlamadan önce. Arduino IDE'de kullanılan Arduino SPI kütüphanesini öğrenmemiz gerekiyor.
Kütüphane
1. SPI.begin ()
KULLANIM: SCK, MOSI ve SS'yi çıkışlara ayarlayarak, SCK ve MOSI düşük ve SS yüksek çekerek SPI veriyolunu başlatmak için.
2. SPI.setClockDivider (bölücü)
KULLANIM: SPI saat bölücüsünü sistem saatine göre ayarlamak için. Mevcut ayırıcılar 2, 4, 8, 16, 32, 64 veya 128'dir.
Bölücüler:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (işleyici)
KULLANIM: Bu fonksiyon, bir bağımlı cihaz ana cihazdan veri aldığında çağrılır.
4. SPI.transfer (val)
KULLANIM: Bu işlev, ana ve bağımlı birim arasında eşzamanlı veri göndermek ve almak için kullanılır.
Şimdi Arduino'daki SPI protokolünün pratik gösterimi ile başlayalım. Bu eğitimde, biri master ve diğeri slave olarak iki arduino kullanacağız. Her iki Arduino da bir LED ve bir basma düğmesi ile ayrı olarak bağlanmıştır. Master LED, slave Arduino'nun butonu kullanılarak kontrol edilebilir ve slave Arduino'nun LED'i, arduino'da bulunan SPI haberleşme protokolü kullanılarak master Arduino'nun butonu ile kontrol edilebilir.
Arduino SPI iletişimi için gerekli bileşenler
- Arduino UNO (2)
- LED (2)
- Basmalı Düğme (2)
- Direnç 10k (2)
- Direnç 2.2k (2)
- Breadboard
- Kabloların Bağlanması
Arduino SPI İletişim Devre Şeması
Aşağıdaki devre şeması, Arduino UNO'da SPI'nin nasıl kullanılacağını gösterir, ancak Arduino Mega SPI İletişimi veya Arduino nano SPI iletişimi için aynı prosedürü takip edebilirsiniz. Pin numarası dışında hemen hemen her şey aynı kalacaktır. Arduino nano SPI pinlerini ve Arduino Mega pinlerini bulmak için Arduino nano veya mega pinlerini kontrol etmeniz gerekir, bir kez yaptıktan sonra her şey aynı olacaktır.
Yukarıda gösterilen devreyi bir breadboard üzerine kurdum, aşağıda test etmek için kullandığım devre kurulumunu görebilirsiniz.
SPI İletişimi için Arduino Nasıl Programlanır:
Bu eğitimde biri ana Arduino için diğeri köle Arduino için olmak üzere iki program vardır. Her iki taraf için eksiksiz programlar bu projenin sonunda verilmiştir.
Arduino SPI Master Programlama Açıklaması
1. Öncelikle, SPI iletişim işlevlerini kullanmak için SPI kitaplığını eklememiz gerekir.
#Dahil etmek
2. Geçersiz kurulumda ()
- Seri İletişimi 115200 Baud Hızında Başlatıyoruz.
Serial.begin (115200);
- LED'i pin 7'ye ve Push butonunu pin 2'ye bağlayın ve bu pinleri sırasıyla OUTPUT ve INPUT'a ayarlayın.
pinMode (ipbutton, INPUT); pinMode (LED, ÇIKIŞ);
- Sonra SPI iletişimine başlıyoruz
SPI.begin ();
- Ardından, SPI iletişimi için Clockdivider'ı ayarlıyoruz. Burada bölücü 8'i ayarladık.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Ardından, slave arduino'ya herhangi bir transfer başlatmadığımız için SS pinini HIGH olarak ayarlayın.
digitalWrite (SS, YÜKSEK);
3. Boş döngüde ():
- Bu değeri slave Arduino'ya göndermek için pin2'ye (Master Arduino) bağlı buton pininin durumunu okuyoruz.
buttonvalue = digitalRead (ipbutton);
- Pin 2'den gelen girişe bağlı olarak x değerini ayarlamak için Mantığı ayarlayın (Slave'e gönderilecek)
eğer (buttonvalue == HIGH) { x = 1; } başka { x = 0; }
- Değeri göndermeden önce, master'dan slave'e aktarımı başlatmak için slave seçim değerini DÜŞÜK yapmamız gerekir.
digitalWrite (SS, DÜŞÜK);
- İşte önemli adım geliyor, aşağıdaki ifadede Mastersend değişkeninde depolanan buton değerini slave arduino'ya gönderiyoruz ve ayrıca Mastereceive değişkeninde saklanacak slave'den değer alıyoruz .
Mastereceive = SPI.transfer (MasterSend);
- Bundan sonra Mastereceive değerine bağlı olarak Master Arduino LED'ini AÇIK veya KAPALI konuma getireceğiz.
eğer (Mastereceive == 1) { digitalWrite (LED, HIGH); // Pin 7'yi ayarlar HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, DÜŞÜK); // 7. pin LOW Serial.println ("Master LED OFF"); }
Not: Sonucu Arduino IDE'nin Seri Motorunda görüntülemek için serial.println () kullanıyoruz. Sonunda Videoyu kontrol edin.
Arduino SPI Slave Programlama Açıklaması
1. Öncelikle, SPI iletişim işlevlerini kullanmak için SPI kitaplığını eklememiz gerekir.
#Dahil etmek
2. Geçersiz kurulumda ()
- Seri İletişimi 115200 Baud Hızında Başlatıyoruz.
Serial.begin (115200);
- LED'i pin 7'ye ve Push butonunu pin2'ye bağlayın ve bu pinleri sırasıyla OUTPUT ve INPUT'a ayarlayın.
pinMode (ipbutton, INPUT); pinMode (LED, ÇIKIŞ);
- Buradaki önemli adım aşağıdaki ifadelerdir
pinMode (MISO, OUTPUT);
Yukarıdaki ifade, MISO'yu OUTPUT olarak ayarlar (Verileri Master IN'e Göndermek Zorunda). Böylece veriler, Slave Arduino'nun MISO'su aracılığıyla gönderilir.
- Şimdi SPI Kontrol Kaydını kullanarak Bağımlı Modda SPI'yı açın
SPCR - = _BV (SPE);
- Ardından SPI iletişimi için kesmeyi AÇIN. Ana birimden bir veri alınırsa, Kesme Yordamı çağrılır ve alınan değer SPDR'den (SPI veri Kaydı) alınır.
SPI.attachInterrupt ();
- Master'dan gelen değer SPDR'den alınır ve Slavereceived değişkeninde saklanır. Bu, aşağıdaki Interrupt Routine fonksiyonunda gerçekleşir.
ISR (SPI_STC_vect) { Slavereceived = SPDR; alındı = doğru; }
3. Ardından, boşluk döngüsünde () Slave arduino LED'ini, daha önce alınan değere bağlı olarak AÇIK veya KAPALI olacak şekilde ayarladık.
eğer (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Pin 7'yi HIGH LED ON Serial.println ("Slave LED ON") olarak ayarlar ; } else { digitalWrite (LEDpin, LOW); // Pin 7'yi LOW LED OFF olarak ayarlar Serial.println ("Slave LED OFF"); }
- Daha sonra Slave Arduino Push butonunun durumunu okuyoruz ve değeri, SPDR registerına değer vererek Master Arduino'ya göndermek için değeri Slavesend'e kaydediyoruz .
buttonvalue = digitalRead (buttonpin); eğer (buttonvalue == HIGH) {x = 1; } başka {x = 0; } Slavesend = x; SPDR = Slavesend;
Not: Sonucu Arduino IDE'nin Seri Motorunda görüntülemek için serial.println () kullanıyoruz. Sonunda Videoyu kontrol edin.
SPI, Arduino'da nasıl çalışır? - Hadi deneyelim!
İki Arduino Kartı arasındaki SPI iletişimi için son kurulumun resmi aşağıdadır .
Master tarafındaki butona basıldığında, slave tarafındaki beyaz LED yanar.
Ve Slave tarafındaki basma düğmesine basıldığında, Master tarafındaki Kırmızı LED yanar.
Arduino SPI iletişiminin tanıtımını görmek için aşağıdaki videoyu inceleyebilirsiniz. Herhangi bir sorunuz varsa, lütfen forumlarımızı kullanarak yorum bölümüne bırakın.