I2C Kullanarak İki Arduino Kartı Nasıl Bağlanır

I2C Kullanarak İki Arduino Kartı Nasıl Bağlanır
Sizin gibi okuyucular MUO'yu desteklemeye yardımcı oluyor. Sitemizdeki bağlantıları kullanarak bir satın alma işlemi gerçekleştirdiğinizde, bir ortaklık komisyonu kazanabiliriz. Devamını oku.

Tek bir Arduino birçok görevi yerine getirebilirken, bazı projeler farklı işlevleri yerine getirmek için birden fazla kartın kullanılmasını gerektirebilir. Bu nedenle, iki mikrodenetleyici arasında veri aktarımını sağlamak için CAN, SPI, I2C veya UART gibi bir iletişim protokolü kurulmalıdır.





Bu kılavuzda, I2C'nin nasıl çalıştığının temellerini, donanım bağlantılarını ve iki Arduino kartını I2C master ve slave cihazları olarak ayarlamak için gereken yazılım uygulamasını ele alacağız.





GÜNÜN MAKALE VİDEOSU İÇERİKLE DEVAM ETMEK İÇİN KAYDIRIN

I2C Nedir?

Inter-Integrated Circuit (I2C), elektronik cihazlar arasında veri aktarımını sağlamak için gömülü sistemlerde ve mikrodenetleyicilerde yaygın olarak kullanılan bir iletişim protokolüdür. SPI'den (Serial Peripheral Interface) farklı olarak I2C, birden fazla ana cihazı tek veya birden fazla bağımlı cihazla bir veri yoluna bağlamanıza izin verir. İlk olarak Philips tarafından kullanılmıştır ve İki Telli Arayüz (TWI) iletişim protokolü olarak da bilinir.





I2C İletişimi Nasıl Çalışır?

I2C iki yönlü hat kullanır: Seri Veri (SDA) ve Seri Saat (SCL), verileri aktarmak ve cihazlar arasındaki iletişimi senkronize etmek için. I2C veriyoluna bağlı her cihazın, iletişim sırasında onu tanımlayan benzersiz bir adresi vardır. I2C protokolü, birden fazla cihazın aynı veri yolunu paylaşmasına izin verir ve her cihaz bir ana veya bağımlı olarak hareket edebilir.

  I2C iletişim gösterimi

Haberleşme ana cihaz tarafından başlatılır ve bağımlı cihazların yanlış adreslenmesi aktarımda hatalara neden olabilir. Şu konudaki ayrıntılı kılavuzumuza göz atın: UART, SPI ve I2C seri iletişimleri nasıl çalışır? size biraz bağlam vermek için.



I2C iletişiminin önemli bir avantajı, güç yönetimi söz konusu olduğunda sunduğu esnekliktir. Farklı voltaj seviyelerinde çalışan cihazlar, voltaj kaydırıcılar yardımıyla etkili bir şekilde iletişim kurabilir. Bu, 3,3 V'ta çalışan cihazların 5 V I2C veriyoluna bağlanmak için voltaj kaydırıcılara ihtiyaç duyduğu anlamına gelir.

Tel Kitaplığı

Wire kitaplığı, I2C üzerinden iletişim kurmak için işlevler sağlayan yerleşik bir Arduino kitaplığıdır. I2C iletişimi için Arduino kartında iki pin (SDA ve SCL) kullanır.





Arduino Uno'daki I2C pinleri:

  Arduino I2C Uno pinleri

Arduino Nano I2C pinleri:





en çok hangi teslimat hizmeti ödüyor
  Arduino nano I2C pin çıkışı

Kütüphaneyi kullanmak için, Wire.h Arduino taslağınızın başındaki başlık dosyası.

instagram fotoğrafları bilgisayara nasıl indirilir
 #include <Wire.h>

Wire kitaplığı, bir I2C cihazıyla iletişim başlatmak, veri göndermek ve veri almak için işlevler sağlar. Bilmeniz gereken bazı önemli işlevler şunları içerir:

  • Wire.begin() : I2C veriyoluna katılmak ve iletişimi başlatmak için kullanılır.
  • Wire.beginTransmission() : bağımlı adresi belirlemek ve bir iletimi başlatmak için kullanılır.
  • Wire.write() : I2C cihazına veri göndermek için kullanılır.
  • Wire.endTransmission() : iletimi sonlandırmak ve hataları kontrol etmek için kullanılır.
  • Wire.requestFrom() : I2C cihazından veri talep etmek için kullanılır.
  • Wire.available() : verilerin I2C cihazından okunabilir olup olmadığını kontrol etmek için kullanılır.
  • tel.oku() : I2C cihazından veri okumak için kullanılır.

Kullan Wire.beginTransmission() argüman olarak eklenen sensörün adresini ayarlamak için işlev. Örneğin, sensörün adresi ise 0x68 , şunları kullanırsınız:

 Wire.beginTransmission(0x68);

Arduino I2C Donanım Kurulumu

I2C kullanarak iki Arduino kartını bağlamak için aşağıdaki donanım bileşenlerine ihtiyacınız olacak:

  • İki Arduino kartı (ana ve bağımlı)
  • Breadboard
  • jumper telleri
  • İki adet 4,7kΩ çekme direnci

Bağlan SDA Ve SCL her iki Arduino kartının pimlerini bir devre tahtasına. Çekme dirençlerini aralarına bağlayın. SDA Ve SCL pimler ve 5V Breadboard üzerindeki güç rayı. Son olarak, iki devre tahtasını atlama kablolarını kullanarak birbirine bağlayın.

Arduino Uno devresi

  Breadboard üzerinde Arduino_I2C bağlantısı

Arduino Nano Devre

  I2C iletişim protokolü için nano33BS_06_illustration
Resim Kredisi: Arduino I2C belgeleri

Arduino Kartlarını I2C Master ve Slave Cihazları Olarak Ayarlama

Kullan Wire.requestFrom() iletişim kurmak istediğimiz bağımlı cihazın adresini belirtmek için işlev. Daha sonra tel.oku() bağımlı cihazdan veri alma işlevi.

Ana cihaz kodu:

 #include <Wire.h> 
void setup() {
Wire.begin(); // join i2c bus
Serial.begin(9600); // start serial for output
}
void receiveData() {
int address = 8;
int bytesToRead = 6;
Wire.requestFrom(address, bytesToRead);
while (Wire.available()) {
char data = Wire.read();
Serial.print(data);
}
delay(500);
}
void loop() {
receiveData();
}

bu Wire.onReceive() işlevi, köle ana cihazdan veri aldığında ne yapılacağını belirtmek için kullanılır. Yukarıdaki kodda, Wire.available() işlev, verilerin mevcut olup olmadığını kontrol eder ve tel.oku() işlevi, ana cihaz tarafından gönderilen verileri okur.

Bağımlı cihaz kodu:

 #include <Wire.h> 
void setup() {
Wire.begin(8); // join the I2C bus with address 8
Wire.onReceive(receiveEvent); // call receiveEvent when data is received
}
void loop() {
delay(100);
}
void receiveEvent(int bytes) {
Wire.write("hello "); // respond with message of 6 bytes as expected by master
}

I2C Kullanarak Veri Gönderme ve Alma

Bu örnekte, bağımlı Arduino ile arayüzlenen bir DHT11 sıcaklık sensöründen sıcaklığı okuyalım ve ana Arduino'nun seri monitörüne yazdıralım.

  2 Arduino kartı ile DHT11 I2C örneği

Daha önce yazdığımız kodu, daha sonra I2C bus üzerinden ana karta göndereceğimiz sıcaklık ölçümünü içerecek şekilde değiştirelim. Ana kart daha sonra gönderdiğimiz değeri okuyabilir ve seri monitörde görüntüleyebilir.

Ana cihaz kodu:

 #include <Wire.h> 
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Master Initialized!");
}
void loop() {
Wire.requestFrom(8, 1); // Request temperature data from slave
if (Wire.available()) {
byte temperature = Wire.read(); // Read temperature data from slave
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" &deg;C");
}
delay(2000); // Wait for 2 seconds before requesting temperature again
}

Bağımlı cihaz kodu:

kindle kitabı nasıl pdf olarak indirilir
 #include <Wire.h> 
#include <DHT.h>

#define DHTPIN 4 // Pin connected to DHT sensor
#define DHTTYPE DHT11 // DHT sensor type
DHT dht(DHTPIN, DHTTYPE);
byte temperature;

void setup() {
Wire.begin(8); // Slave address is 8
Wire.onRequest(requestEvent);
dht.begin();
}

void loop() {
delay(2000); // Wait for 2 seconds for DHT to stabilize
temperature = dht.readTemperature(); // Read temperature from DHT sensor
}

void requestEvent() {
Wire.write(temperature); // Send temperature data to master
}

Bu kodu, projenizde sahip olabileceğiniz sensörlere uyacak şekilde özelleştirebilir veya hatta sensör değerlerini bir ekran modülünde görüntüleyebilirsiniz. kendi oda termometrenizi ve nem ölçerinizi yapın .

Arduino'da I2C ile Slave Adresleme

Böyle bir projede I2C veriyoluna eklenen bileşenlerden değerleri okumak için, kodlama sırasında doğru bağımlı adresi eklemeniz önemlidir. Şans eseri, Arduino, bağımlı adresleri tanımlama sürecini basitleştiren, uzun sensör veri sayfalarını gözden geçirme ihtiyacını ve kafa karıştırıcı çevrimiçi belgeleri ortadan kaldıran bir tarayıcı kitaplığı sunar.

I2C veriyolunda bulunan herhangi bir bağımlı aygıtın adresini belirlemek için aşağıdaki kodu kullanın.

 #include <Wire.h> // Include the Wire library for I2C communication 

void setup() {
Wire.begin(); // Initialize the I2C communication
Serial.begin(9600); // Initialize the serial communication with a baud rate of 9600
while (!Serial); // Wait for the serial connection to establish
Serial.println("\nI2C Scanner"); // Print a message indicating the start of I2C scanning
}

void loop() {
byte error, address; // Declare variables to store errors and device addresses
int nDevices; // Declare a variable to store the number of devices found

Serial.println("Scanning..."); // Print a message indicating the start of I2C scanning

nDevices = 0; // Set the number of devices found to 0
for (address = 1; address < 127; address++) { // Iterate over all possible I2C addresses
Wire.beginTransmission(address); // Start a transmission to the current address
error = Wire.endTransmission(); // End the transmission and store any errors

if (error == 0) { // If no errors were found
Serial.print("I2C device found at address 0x"); // Print a message indicating a device was found
if (address < 16) Serial.print("0"); // If the address is less than 16, add a leading 0 for formatting purposes
Serial.print(address, HEX); // Print the address in hexadecimal format
Serial.println(" !"); // Print a message indicating a device was found

nDevices++; // Increment the number of devices found
}
else if (error == 4) { // If an error was found
Serial.print("Unknown error at address 0x"); // Print a message indicating an error was found
if (address < 16) Serial.print("0"); // If the address is less than 16, add a leading 0 for formatting purposes
Serial.println(address, HEX); // Print the address in hexadecimal format
}
}
if (nDevices == 0) { // If no devices were found
Serial.println("No I2C devices found\n"); // Print a message indicating no devices were found
}
else { // If devices were found
Serial.println("done\n"); // Print a message indicating the end of I2C scanning
}
delay(5000); // Delay for 5 seconds before starting the next scan
}

Projenizi Bugün Genişletin

I2C iletişim protokolünü kullanarak iki Arduino kartını birbirine bağlamak, tek bir kart tarafından gerçekleştirilemeyen karmaşık görevleri gerçekleştirmenin esnek ve verimli bir yolunu sunar. Wire kitaplığının yardımıyla, I2C kullanan iki pano arasındaki iletişim kolaylaştırılarak projenize daha fazla bileşen eklemenize olanak sağlanır.