خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه اتصال دو برد آردوینو با استفاده از I2C

پروتکل محبوب I2C دو یا چند برد آردوینو را قادر می سازد تا با هم ارتباط برقرار کنند. نحوه اتصال و کدنویسی آنها را کشف کنید.

در حالی که یک آردوینو می تواند بسیاری از وظایف را انجام دهد، برخی از پروژه ها ممکن است نیاز به استفاده از بیش از یک برد برای مدیریت عملکردهای مختلف داشته باشند. بنابراین، برای فعال کردن انتقال داده بین دو میکروکنترلر، باید یک پروتکل ارتباطی مانند CAN، SPI، I2C یا UART تنظیم شود.

در این راهنما، ما اصول اولیه نحوه کار I2C، اتصالات سخت افزاری و پیاده سازی نرم افزار مورد نیاز برای راه اندازی دو برد آردوینو به عنوان دستگاه های اصلی و برده I2C را پوشش خواهیم داد.

I2C چیست؟

مدار یکپارچه (I2C) یک پروتکل ارتباطی پرکاربرد در سیستم های تعبیه شده و میکروکنترلرها برای فعال کردن انتقال داده بین دستگاه های الکترونیکی است. برخلاف SPI (رابط محیطی سریال)، I2C به شما اجازه می‌دهد تا بیش از یک دستگاه اصلی را به یک گذرگاه با دستگاه‌های تکی یا چندگانه متصل کنید. این اولین بار توسط فیلیپس استفاده شد و همچنین به عنوان پروتکل ارتباطی دو سیم (TWI) شناخته می شود.

ارتباط I2C چگونه کار می کند؟

I2C از دو خط دو طرفه استفاده می کند: داده های سریال (SDA) و ساعت سریال (SCL) برای انتقال داده ها و همگام سازی ارتباطات بین دستگاه ها. هر دستگاه متصل به گذرگاه I2C دارای یک آدرس منحصر به فرد است که در حین ارتباط آن را شناسایی می کند. پروتکل I2C به چندین دستگاه اجازه می دهد تا از یک گذرگاه مشترک استفاده کنند و هر دستگاه می تواند به عنوان یک Master یا Slave عمل کند.

نمایش ارتباطات I2C

ارتباط توسط دستگاه اصلی آغاز می شود و آدرس دهی نادرست دستگاه های برده می تواند باعث ایجاد خطا در انتقال شود. راهنمای عمیق ما را در مورد نحوه عملکرد ارتباطات سریال UART، SPI و I2C بررسی کنید تا زمینه را به شما ارائه دهد.

یکی از مزیت‌های مهم ارتباطات I2C، انعطاف‌پذیری آن در هنگام مدیریت انرژی است. دستگاه هایی که در سطوح مختلف ولتاژ کار می کنند همچنان می توانند با کمک شیفترهای ولتاژ ارتباط موثری برقرار کنند. این بدان معناست که دستگاه‌هایی که با ولتاژ 3.3 ولت کار می‌کنند، برای اتصال به باس 5 ولت I2C به شیفترهای ولتاژ نیاز دارند.

کتابخانه سیم

کتابخانه Wire یک کتابخانه داخلی آردوینو است که عملکردهایی را برای برقراری ارتباط از طریق I2C فراهم می کند. از دو پایه SDA و SCL روی برد آردوینو برای ارتباط I2C استفاده می کند.

مطلب مرتبط:   Raspberry Pi Pico در مقابل Arduino: کدام میکروکنترلر را باید استفاده کنید؟

پین های I2C در آردوینو Uno:

پین های آردوینو I2C Uno

پین های Arduino Nano I2C:

پین اوت آردوینو نانو I2C

برای استفاده از کتابخانه، باید فایل هدر Wire.h را در ابتدای طرح آردوینو خود قرار دهید.

#include <Wire.h>

کتابخانه Wire عملکردهایی را برای شروع ارتباط با دستگاه I2C، ارسال داده و دریافت داده ارائه می کند. برخی از عملکردهای مهمی که باید بدانید عبارتند از:

  • Wire.begin(): برای پیوستن به گذرگاه I2C و شروع ارتباط استفاده می شود.
  • Wire.beginTransmission (): برای تعیین آدرس برده و شروع یک انتقال استفاده می شود.
  • Wire.write(): برای ارسال داده به دستگاه I2C استفاده می شود.
  • Wire.endTransmission(): برای پایان دادن به انتقال و بررسی خطاها استفاده می شود.
  • Wire.requestFrom(): برای درخواست داده از دستگاه I2C استفاده می شود.
  • Wire.available(): برای بررسی اینکه آیا داده ها برای خواندن از دستگاه I2C در دسترس هستند یا خیر استفاده می شود.
  • Wire.read(): برای خواندن داده ها از دستگاه I2C استفاده می شود.

از تابع Wire.beginTransmission() برای تنظیم آدرس سنسور استفاده کنید که به عنوان آرگومان درج می شود. به عنوان مثال، اگر آدرس سنسور 0x68 باشد، از:

Wire.beginTransmission(0x68);

راه اندازی سخت افزار Arduino I2C

برای اتصال دو برد آردوینو با استفاده از I2C، به قطعات سخت افزاری زیر نیاز دارید:

  • دو برد آردوینو (Master و Slave)
  • تخته نان
  • سیم های جامپر
  • دو مقاومت pull-up 4.7kΩ

پایه های SDA و SCL هر دو برد آردوینو را به برد برد وصل کنید. مقاومت های pull-up را بین پایه های SDA و SCL و ریل برق 5 ولت روی تخته نان وصل کنید. در نهایت، دو تخته نان را با استفاده از سیم های جامپر به هم وصل کنید.

مدار آردوینو Uno

اتصال Arduino_I2C روی برد برد

مدار نانو آردوینو

nano33BS_06_illustration برای پروتکل ارتباطی I2C

راه‌اندازی بردهای آردوینو به‌عنوان دستگاه‌های I2C Master و Slave

از تابع Wire.requestFrom() برای تعیین آدرس دستگاه برده ای که می خواهیم با آن ارتباط برقرار کنیم استفاده کنید. سپس از تابع Wire.read() برای دریافت اطلاعات از دستگاه برده استفاده کنید.

کد اصلی دستگاه:

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

تابع Wire.onReceive() برای تعیین اینکه چه کاری باید انجام شود زمانی که Slave داده ها را از دستگاه اصلی دریافت می کند استفاده می شود. در کد بالا، تابع Wire.available() بررسی می کند که آیا داده در دسترس است یا خیر، و تابع Wire.read() داده های ارسال شده توسط دستگاه اصلی را می خواند.

مطلب مرتبط:   منبع تغذیه: نکات ایمنی برای باتری های DIY و سایر منابع برق

کد دستگاه برده:

#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

در این مثال، اجازه دهید دما را از یک سنسور دمای DHT11 که با آردوینو برده رابط دارد بخوانیم و آن را روی مانیتور سریال آردوینو اصلی چاپ کنیم.

نمونه DHT11 I2C با 2 برد آردوینو

بیایید کدی را که قبلا نوشتیم تغییر دهیم تا شامل اندازه گیری دما باشد که سپس از طریق گذرگاه I2C به برد اصلی ارسال می کنیم. سپس برد اصلی می تواند مقداری را که ما ارسال کرده ایم بخواند، سپس آن را روی نمایشگر سریال نمایش دهد.

کد اصلی دستگاه:

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

کد دستگاه برده:

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

شما می توانید این کد را مطابق با سنسورهایی که در پروژه خود دارید سفارشی کنید، یا حتی مقادیر سنسور را روی یک ماژول نمایشگر نمایش دهید تا دماسنج و رطوبت سنج اتاق خود را بسازید.

آدرس دهی Slave با I2C در آردوینو

برای خواندن مقادیر از اجزای اضافه شده به یک گذرگاه I2C در چنین پروژه ای، مهم است که هنگام کدنویسی آدرس برده صحیح را وارد کنید. خوشبختانه، آردوینو یک کتابخانه اسکنر ارائه می دهد که فرآیند شناسایی آدرس های برده را ساده می کند، نیاز به غربال کردن برگه های داده حسگر طولانی و اسناد آنلاین گیج کننده را از بین می برد.

از کد زیر برای شناسایی آدرس هر دستگاه برده موجود در گذرگاه 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
}

پروژه خود را امروز گسترش دهید

رابط دو برد آردوینو با استفاده از پروتکل ارتباطی I2C یک راه انعطاف پذیر و کارآمد برای دستیابی به وظایف پیچیده ای را ارائه می دهد که توسط یک برد نمی توان انجام داد. با کمک کتابخانه Wire، ارتباط بین دو برد با استفاده از I2C آسان می شود و به شما امکان می دهد اجزای بیشتری را به پروژه خود اضافه کنید.

مطلب مرتبط:   دریافت صدای HDMI در حال کار بر روی اوبونتو برای Raspberry Pi