Cara Menyambung Dua Papan Arduino Menggunakan I2C

Cara Menyambung Dua Papan Arduino Menggunakan I2C
Pembaca seperti anda membantu menyokong MUO. Apabila anda membuat pembelian menggunakan pautan di tapak kami, kami mungkin mendapat komisen ahli gabungan. Baca Lagi.

Walaupun satu Arduino boleh mencapai banyak tugas, sesetengah projek mungkin memerlukan penggunaan lebih daripada satu papan untuk mengendalikan fungsi yang berbeza. Jadi, untuk membolehkan pemindahan data antara dua mikropengawal, protokol komunikasi seperti CAN, SPI, I2C, atau UART mesti disediakan.





Dalam panduan ini, kami akan merangkumi asas cara I2C berfungsi, sambungan perkakasan dan pelaksanaan perisian yang diperlukan untuk menyediakan dua papan Arduino sebagai peranti induk dan hamba I2C.





MAKEUSEOF VIDEO OF THE DAY SCROLL UNTUK MENERUSKAN KANDUNGAN

Apakah I2C?

Inter-Integrated Circuit (I2C) ialah protokol komunikasi yang digunakan secara meluas dalam sistem terbenam dan mikropengawal untuk membolehkan pemindahan data antara peranti elektronik. Tidak seperti SPI (Antara Muka Periferal Bersiri), I2C membolehkan anda menyambungkan lebih daripada satu peranti induk ke bas dengan peranti hamba tunggal atau berbilang. Ia pertama kali digunakan oleh Philips dan juga dikenali sebagai protokol komunikasi Two Wire Interface (TWI).





Bagaimanakah Komunikasi I2C Berfungsi?

I2C menggunakan dua talian dwiarah: Data Bersiri (SDA) dan Jam Bersiri (SCL) untuk memindahkan data dan menyegerakkan komunikasi antara peranti. Setiap peranti yang disambungkan ke bas I2C mempunyai alamat unik yang mengenal pastinya semasa komunikasi. Protokol I2C membenarkan berbilang peranti berkongsi bas yang sama, dan setiap peranti boleh bertindak sebagai tuan atau hamba.

  Demonstrasi komunikasi I2C

Komunikasi dimulakan oleh peranti induk, dan pengalamatan peranti hamba yang salah boleh menyebabkan ralat dalam pemindahan. Lihat panduan mendalam kami tentang cara komunikasi bersiri UART, SPI dan I2C berfungsi untuk memberi anda beberapa konteks.



Kelebihan utama komunikasi I2C yang perlu diberi perhatian ialah fleksibiliti yang ditawarkannya apabila ia berkaitan dengan pengurusan kuasa. Peranti yang beroperasi pada tahap voltan yang berbeza masih boleh berkomunikasi dengan berkesan dengan bantuan penukar voltan. Ini bermakna peranti yang beroperasi pada 3.3V memerlukan pengalih voltan untuk menyambung ke bas I2C 5V.

Perpustakaan Kawat

Pustaka Wire ialah perpustakaan Arduino terbina dalam yang menyediakan fungsi untuk berkomunikasi melalui I2C. Ia menggunakan dua pin—SDA dan SCL—pada papan Arduino untuk komunikasi I2C.





Pin I2C pada Arduino Uno:

  Pin Arduino I2C Uno

Pin Arduino Nano I2C:





  Pinout Arduino nano I2C

Untuk menggunakan perpustakaan, anda mesti memasukkan Kawat.h fail pengepala pada permulaan lakaran Arduino anda.

 #include <Wire.h>

Pustaka Wire menyediakan fungsi untuk memulakan komunikasi dengan peranti I2C, menghantar data dan menerima data. Beberapa fungsi penting yang perlu anda ketahui termasuk:

cara melihat mesej instagram di pc
  • Wire.begin() : digunakan untuk menyertai bas I2C dan memulakan komunikasi.
  • Wire.beginTransmission() : digunakan untuk menentukan alamat hamba dan memulakan penghantaran.
  • Wire.write() : digunakan untuk menghantar data ke peranti I2C.
  • Wire.endTransmission() : digunakan untuk menamatkan penghantaran dan menyemak ralat.
  • Wire.requestFrom() : digunakan untuk meminta data daripada peranti I2C.
  • Wire.available() : digunakan untuk menyemak sama ada data tersedia untuk dibaca daripada peranti I2C.
  • wire.read() : digunakan untuk membaca data daripada peranti I2C.

Menggunakan Wire.beginTransmission() berfungsi untuk menetapkan alamat penderia, yang dimasukkan sebagai hujah. Sebagai contoh, jika alamat penderia adalah 0x68 , anda akan menggunakan:

 Wire.beginTransmission(0x68);

Persediaan Perkakasan Arduino I2C

Untuk menyambungkan dua papan Arduino menggunakan I2C, anda memerlukan komponen perkakasan berikut:

  • Dua papan Arduino (tuan dan hamba)
  • Papan roti
  • Wayar pelompat
  • Dua perintang tarik 4.7kΩ

Sambungkan SDA dan SCL pin kedua-dua papan Arduino ke papan roti. Sambungkan perintang tarik naik antara SDA dan SCL pin dan 5V rel kuasa pada papan roti. Akhir sekali, sambungkan kedua-dua papan roti bersama-sama menggunakan wayar pelompat.

Litar Arduino Uno

  Sambungan Arduino_I2C pada papan roti

Litar Nano Arduino

  nano33BS_06_illustration untuk protokol komunikasi I2C
Kredit Imej: Dokumentasi Arduino I2C

Menyediakan Papan Arduino sebagai Peranti I2C Master dan Slave

Menggunakan Wire.requestFrom() berfungsi untuk menentukan alamat peranti hamba yang kita ingin berkomunikasi. Kemudian gunakan wire.read() berfungsi untuk mendapatkan data daripada peranti hamba.

Kod peranti induk:

 #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();
}

The Wire.onReceive() fungsi digunakan untuk menentukan apa yang perlu dilakukan apabila hamba menerima data daripada peranti induk. Dalam kod di atas, the Wire.available() fungsi menyemak sama ada data tersedia, dan wire.read() fungsi membaca data yang dihantar oleh peranti induk.

Kod peranti hamba:

 #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
}

Menghantar dan Menerima Data Menggunakan I2C

Dalam contoh ini, mari kita baca suhu daripada sensor suhu DHT11 yang disambungkan dengan hamba Arduino dan cetak pada monitor bersiri Arduino induk.

  Contoh DHT11 I2C dengan 2 papan Arduino

Mari kita ubah suai kod yang kami tulis sebelum ini untuk memasukkan ukuran suhu yang kemudiannya akan kami hantar ke papan induk melalui bas I2C. Papan induk kemudiannya boleh membaca nilai yang kami hantar, kemudian memaparkannya pada monitor bersiri.

Kod peranti induk:

 #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
}

Kod peranti hamba:

 #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
}

Anda boleh menyesuaikan kod ini agar sesuai dengan mana-mana penderia yang mungkin anda ada dalam projek anda, atau bahkan memaparkan nilai penderia pada modul paparan untuk buat termometer dan meter kelembapan bilik anda sendiri .

apa guna pecutan perkakasan apabila ada

Mengatasi Hamba Dengan I2C pada Arduino

Untuk membaca nilai daripada komponen yang ditambahkan pada bas I2C dalam projek sedemikian, adalah penting untuk anda memasukkan alamat hamba yang betul semasa mengekod. Nasib baik, Arduino menawarkan perpustakaan pengimbas yang memudahkan proses mengenal pasti alamat hamba, menghapuskan keperluan untuk menyaring helaian data sensor yang panjang dan dokumentasi dalam talian yang mengelirukan.

Gunakan kod berikut untuk mengenal pasti mana-mana alamat peranti hamba yang terdapat pada bas I2C.

 #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
}

Kembangkan Projek Anda Hari Ini

Mengantaramuka dua papan Arduino menggunakan protokol komunikasi I2C menawarkan cara yang fleksibel dan cekap untuk mencapai tugas kompleks yang tidak boleh dikendalikan oleh satu papan. Dengan bantuan perpustakaan Wire, komunikasi antara dua papan menggunakan I2C menjadi mudah, membolehkan anda menambah lebih banyak komponen pada projek anda.