- STM32F103C8 I2C'ye Genel Bakış
- STM32F103C8'deki I2C pimleri
- Arduino'da I2C pinleri
- Gerekli Bileşenler
- Devre Şeması ve Bağlantılar
- STM32'de I2C Programlama
- Master STM32 Programlama Açıklaması
- Slave Arduino Programlama Açıklaması
Önceki eğitimlerimizde, iki Arduino kartı arasındaki SPI ve I2C iletişimini öğrendik. Bu eğitimde, bir Arduino kartını STM32F103C8 olan Blue Pill kartı ile değiştireceğiz ve I2C veri yolu kullanarak Arduino kartı ile iletişim kuracağız.
STM32, Arduino kartından daha fazla özelliğe sahiptir. Bu nedenle, SPI & I2C veri yolu kullanarak STM32 ve Arduino arasındaki iletişimi öğrenmek harika olurdu. Bu eğitimde, Arduino ve STM32F103C8 arasındaki iletişim için I2C veriyolunu kullanacağız ve bir sonraki derste SPI veriyolu hakkında bilgi edineceğiz. STM32 kartı hakkında daha fazla bilgi edinmek için diğer STM32 projelerine bakın.
STM32F103C8 I2C'ye Genel Bakış
STM32F103C8 Blue Pill kartındaki I2C (Inter Integrated Circuits) 'i Arduino Uno ile karşılaştırdığımızda, Arduino'nun içinde ATMEGA328 mikrodenetleyici olduğunu ve STM32F103C8'in içinde ARM Cortex-M3 olduğunu göreceğiz. STM32'de İki I2C veri yolu bulunurken, Arduino Uno'da yalnızca bir I2C veri yolu vardır ve STM32, Arduino'dan daha hızlıdır.
I2C iletişimi hakkında daha fazla bilgi edinmek için önceki makalelerimize bakın
- Arduino'da I2C nasıl kullanılır: İki Arduino Kartı arasında iletişim
- PIC Mikrodenetleyici PIC16F877 ile I2C İletişimi
- I2C kullanarak 16X2 LCD'yi ESP32 ile arayüzleme
- MSP430 Launchpad ile I2C iletişimi
- LCD'yi I2C kullanmadan NodeMCU ile arayüzleme
- Tek bir arduino programında çoklu iletişim (I2C SPI UART) nasıl yapılır
STM32F103C8'deki I2C pimleri
SDA: PB7 veya PB9, PB11.
SCL: PB6 veya PB8, PB10.
Arduino'da I2C pinleri
SDA: A4 pimi
SCL: A5 pimi
Gerekli Bileşenler
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- Basma Düğmesi (2-Nos)
- Dirençler (4-Nos)
- Breadboard
- Kabloların Bağlanması
Devre Şeması ve Bağlantılar
Aşağıdaki tablo, I2C veriyolunu kullanmak için STM32 Mavi Hap ve Arduino Uno arasındaki bağlantıyı gösterir. Yalnızca iki kablo gerektirir.
STM32F103C8 |
Arduino |
Pin Açıklaması |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Zemin |
Önemli
- Arduino GND ve STM32F103C8 GND'yi birbirine bağlamayı unutmayın.
- Sonra her iki kartın basma düğmesi pimlerine ayrı ayrı 10k'lık bir Aşağı Çekme direnci bağlayın.
Bu STM32 I2C eğitiminde STM32F103C8'i Master ve Arduino'yu Slave olarak yapılandıracağız. Her iki kart da bir LED ve bir basma düğmesiyle ayrı olarak takılır.
STM32'de I2C iletişimini göstermek için, ana STM32 LED'i slave Arduino buton değerini kullanarak ve slave Arduino LED'i master STM32F103C8 buton değerini kullanarak kontrol ediyoruz. Bu değerler I2C iletişim veriyolu aracılığıyla gönderilir.
STM32'de I2C Programlama
Programlama, Arduino koduna benzer. Aynısı
Bu eğitimde biri ana STM32 için diğeri bağımlı Arduino için olmak üzere iki program vardır. Her iki taraf için eksiksiz programlar bu projenin sonunda bir tanıtım videosu ile verilmiştir.
Master STM32 Programlama Açıklaması
Master STM32'de neler olduğunu görelim:
1. Öncelikle, STM32F103C8'de I2C iletişim fonksiyonlarını kullanmak için Wire kütüphanesini ve yazılım kütüphanesini eklememiz gerekir.
#Dahil etmek
2. Geçersiz kurulumda ()
- Baud Rate 9600'de Seri İletişimi Başlatıyoruz.
Serial.begin (9600);
- Sonra I2C iletişimini pin (B6, B7)
Wire.begin ();
3. Boş döngüde ()
- Öncelikle Slave Arduino'dan verileri alıyoruz, bu yüzden slave adresi 8 ile requestFrom () kullanıyoruz ve bir bayt istiyoruz.
Wire.requestFrom (8,1);
Alınan değer Wire.read () kullanılarak okunur
bayt a = Wire.read ();
- Slave'den alınan değere bağlı olarak, PA1 pininde digitalwrite kullanılarak Master LED ON veya OFF olur ve ayrıca seri monitörde değer yazdırmak için seri baskı kullanılır.
eğer (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Ana LED AÇIK"); } else { digitalWrite (LED, DÜŞÜK); Serial.println ("Ana LED KAPALI"); }
- Daha sonra ana STM32 basma düğmesi olan PA0 pininin durumunu okumamız gerekir.
int pinvalue = digitalRead (düğme pini);
- Daha sonra mantığa göre pin değerini gönderelim, bu yüzden if koşulunu kullanıyoruz ve ardından adres olarak 8 ile slave arduino ile iletime başlıyoruz ve ardından değeri buton giriş değerine göre yazıyoruz.
eğer (pinvalue == HIGH) { x = 1; } başka { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Slave Arduino Programlama Açıklaması
1. Her şeyden önce, I2C iletişim işlevlerini kullanmak için Wire kütüphanesini eklememiz gerekir.
#Dahil etmek
2. Geçersiz kurulumda ()
- Baud Rate 9600'de Seri İletişimi Başlatıyoruz.
Serial.begin (9600);
- Daha sonra slave adresi 8 olacak şekilde pin (A4, A5) ile I2C iletişimini başlatın. Burada slave adresini belirlemek önemlidir.
Wire.begin (8);
Daha sonra Slave, master'dan değer aldığında Wire.onReceive fonksiyonunu ve Slave'den Master istek değeri aldığında Wire.onRequest fonksiyon çağrısını çağırmamız gerekir.
Wire.onReceive (takeEvent); Wire.onRequest (requestEvent);
3. Daha sonra, biri istek olayı ve diğeri olay alma için iki işlevimiz var
Olay talebi için
Master STM32 slave'den değer talep ettiğinde bu fonksiyon çalışacaktır. Bu fonksiyon Slave Arduino butonundan giriş değerini alır ve Wire.write () kullanarak buton değerine göre Master STM32'ye bir bayt (1 veya 0) gönderir.
void requestEvent () { int value = digitalRead (buttonpin); eğer (değer == YÜKSEK) { x = 1; } başka { x = 0; } Wire.write (x); }
Olay Almak İçin
Master, slave adresli (8) verileri slave'e gönderdiğinde, bu fonksiyon çalışacaktır. Bu işlev, ana birimden alınan değeri okur ve bir bayt türü değişkeninde depolar ve ardından alınan değere bağlı olarak ikincil LED'i AÇIK veya KAPALI konuma getirmek için eğer mantığını kullanır. Alınan değer 1 ise LED yanar ve 0 için LED söner.
void ReceEvent (int howMany) { bayt a = Wire.read (); eğer (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Bağımlı LED AÇIK"); } else { digitalWrite (LED, DÜŞÜK); Serial.println ("Bağımlı LED KAPALI"); } gecikme (500); }
Çıktı
1. Master STM32'deki butona bastığımızda, Slave Ardiono'ya bağlı olan LED yanar (Beyaz).
2. Şimdi Slave tarafındaki butona bastığımızda Master'a bağlı olan led yanar (kırmızı) ve buton bırakıldığında led kapanır.
3. Her iki düğmeye de aynı anda basıldığında, her iki LED de aynı anda yanar ve düğmelere basılana kadar AÇIK kalır.
İşte I2C iletişimi STM32'de bu şekilde gerçekleşir. Artık herhangi bir I2C sensörünü STM32 kartıyla arayüzleyebilirsiniz.
Master STM32 ve Slave Arduino için tam kodlama aşağıda bir tanıtım videosu ile verilmiştir.