কিভাবে I2C ব্যবহার করে দুটি Arduino বোর্ড সংযুক্ত করবেন

কিভাবে I2C ব্যবহার করে দুটি Arduino বোর্ড সংযুক্ত করবেন
আপনার মত পাঠকরা MUO সমর্থন করতে সাহায্য করে। আপনি যখন আমাদের সাইটে লিঙ্ক ব্যবহার করে একটি ক্রয় করেন, আমরা একটি অনুমোদিত কমিশন উপার্জন করতে পারি। আরও পড়ুন

যদিও একটি একক Arduino অনেকগুলি কাজ সম্পাদন করতে পারে, কিছু প্রকল্প বিভিন্ন কার্যকারিতা পরিচালনা করার জন্য একাধিক বোর্ড ব্যবহারের জন্য কল করতে পারে। সুতরাং, দুটি মাইক্রোকন্ট্রোলারের মধ্যে ডেটা স্থানান্তর সক্ষম করতে, একটি যোগাযোগ প্রোটোকল যেমন CAN, SPI, I2C, বা UART সেট আপ করতে হবে।





এই নির্দেশিকায়, আমরা I2C কিভাবে কাজ করে, হার্ডওয়্যার সংযোগ, এবং I2C মাস্টার এবং স্লেভ ডিভাইস হিসাবে দুটি Arduino বোর্ড সেট আপ করার জন্য প্রয়োজনীয় সফ্টওয়্যার বাস্তবায়নের মৌলিক বিষয়গুলি কভার করব।





দিনের মেকইউজের ভিডিও কন্টেন্টের সাথে চালিয়ে যেতে স্ক্রোল করুন

I2C কি?

ইন্টার-ইন্টিগ্রেটেড সার্কিট (I2C) ইলেকট্রনিক ডিভাইসের মধ্যে ডেটা স্থানান্তর সক্ষম করার জন্য এমবেডেড সিস্টেম এবং মাইক্রোকন্ট্রোলারগুলিতে একটি বহুল ব্যবহৃত যোগাযোগ প্রোটোকল। SPI (সিরিয়াল পেরিফেরাল ইন্টারফেস) এর বিপরীতে, I2C আপনাকে একক বা একাধিক স্লেভ ডিভাইস সহ একটি বাসের সাথে একাধিক মাস্টার ডিভাইস সংযোগ করতে দেয়। এটি প্রথম ফিলিপস দ্বারা ব্যবহৃত হয়েছিল এবং এটি টু ওয়্যার ইন্টারফেস (TWI) যোগাযোগ প্রোটোকল নামেও পরিচিত।





কিভাবে I2C যোগাযোগ কাজ করে?

I2C দুটি দ্বিমুখী লাইন ব্যবহার করে: সিরিয়াল ডেটা (এসডিএ) এবং সিরিয়াল ক্লক (এসসিএল) ডেটা স্থানান্তর করতে এবং ডিভাইসগুলির মধ্যে যোগাযোগ সিঙ্ক্রোনাইজ করতে। I2C বাসের সাথে সংযুক্ত প্রতিটি ডিভাইসের একটি অনন্য ঠিকানা রয়েছে যা যোগাযোগের সময় এটি সনাক্ত করে। I2C প্রোটোকল একাধিক ডিভাইসকে একই বাস ভাগ করার অনুমতি দেয় এবং প্রতিটি ডিভাইস একটি প্রভু বা দাস হিসাবে কাজ করতে পারে।

  I2C যোগাযোগ প্রদর্শনী

যোগাযোগ মাস্টার ডিভাইস দ্বারা শুরু হয়, এবং স্লেভ ডিভাইসের ভুল ঠিকানা স্থানান্তরে ত্রুটির কারণ হতে পারে। আমাদের ইন-গভীর গাইড দেখুন কিভাবে UART, SPI, এবং I2C সিরিয়াল যোগাযোগ কাজ করে আপনাকে কিছু প্রসঙ্গ দিতে।



I2C কমিউনিকেশনের একটি বড় সুবিধা লক্ষ্য করার মতো নমনীয়তা যা পাওয়ার ম্যানেজমেন্টের ক্ষেত্রে এটি অফার করে। বিভিন্ন ভোল্টেজ স্তরে কাজ করে এমন ডিভাইসগুলি এখনও ভোল্টেজ শিফটারগুলির সাহায্যে কার্যকরভাবে যোগাযোগ করতে পারে। এর মানে হল যে ডিভাইসগুলি 3.3V এ কাজ করে তাদের 5V I2C বাসের সাথে সংযোগ করতে ভোল্টেজ শিফটারের প্রয়োজন হয়।

ওয়্যার লাইব্রেরি

ওয়্যার লাইব্রেরি হল একটি অন্তর্নির্মিত Arduino লাইব্রেরি যা I2C এর মাধ্যমে যোগাযোগ করার জন্য ফাংশন প্রদান করে। এটি I2C যোগাযোগের জন্য Arduino বোর্ডে দুটি পিন-SDA এবং SCL- ব্যবহার করে।





আরডুইনো ইউনোতে I2C পিন:

  Arduino I2C Uno পিন

Arduino Nano I2C পিন:





কেন আমার ডিস্ক ব্যবহার সবসময় 100 এ হয়?
  আরডুইনো ন্যানো I2C পিনআউট

লাইব্রেরি ব্যবহার করতে, আপনাকে অবশ্যই অন্তর্ভুক্ত করতে হবে ওয়্যার.এইচ আপনার Arduino স্কেচের শুরুতে হেডার ফাইল।

 #include <Wire.h>

ওয়্যার লাইব্রেরি একটি 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 ব্যবহার করে দুটি Arduino বোর্ড সংযোগ করতে, আপনার নিম্নলিখিত হার্ডওয়্যার উপাদানগুলির প্রয়োজন হবে:

  • দুটি আরডুইনো বোর্ড (প্রভু এবং দাস)
  • ব্রেডবোর্ড
  • জাম্পার তারের
  • দুটি 4.7kΩ পুল-আপ প্রতিরোধক

সংযোগ করুন এসডিএ এবং SCL একটি ব্রেডবোর্ডে উভয় Arduino বোর্ডের পিন। এর মধ্যে পুল-আপ প্রতিরোধক সংযুক্ত করুন এসডিএ এবং SCL পিন এবং 5V ব্রেডবোর্ডে পাওয়ার রেল। অবশেষে, জাম্পার তারগুলি ব্যবহার করে দুটি ব্রেডবোর্ড একসাথে সংযুক্ত করুন।

আরডুইনো ইউনো সার্কিট

  একটি ব্রেডবোর্ডে Arduino_I2C সংযোগ

আরডুইনো ন্যানো সার্কিট

ফোন দিয়ে পুলিশ ট্যাপ করেছে কিনা তা কিভাবে জানাবেন
  I2C যোগাযোগ প্রোটোকলের জন্য nano33BS_06_চিত্র
ইমেজ ক্রেডিট: Arduino I2C ডকুমেন্টেশন

I2C মাস্টার এবং স্লেভ ডিভাইস হিসাবে Arduino বোর্ড সেট আপ করা

ব্যবহার 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() স্লেভ যখন মাস্টার ডিভাইস থেকে ডেটা পায় তখন কী করতে হবে তা নির্দিষ্ট করতে ফাংশন ব্যবহার করা হয়। উপরের কোডে, the Wire.available() ফাংশন ডেটা উপলব্ধ কিনা তা পরীক্ষা করে এবং wire.read() ফাংশন মাস্টার ডিভাইস দ্বারা প্রেরিত ডেটা পড়ে।

কিন্ডল আনলিমিটেড সাবস্ক্রিপশন কিভাবে বাতিল করবেন

স্লেভ ডিভাইস কোড:

 #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 তাপমাত্রা সেন্সর থেকে তাপমাত্রা পড়ি এবং মাস্টার Arduino-এর সিরিয়াল মনিটরে প্রিন্ট করি।

  2টি Arduino বোর্ড সহ DHT11 I2C উদাহরণ

তাপমাত্রা পরিমাপ অন্তর্ভুক্ত করার জন্য আমরা আগে যে কোডটি লিখেছিলাম তা পরিবর্তন করা যাক যা আমরা তারপর 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
}

আপনার প্রোজেক্টে আপনার যে কোনো সেন্সর থাকতে পারে তার জন্য আপনি এই কোডটি কাস্টমাইজ করতে পারেন, অথবা এমনকি একটি ডিসপ্লে মডিউলে সেন্সরের মান প্রদর্শন করতে পারেন আপনার নিজের রুমের থার্মোমিটার এবং আর্দ্রতা মিটার তৈরি করুন .

আরডুইনোতে 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 কমিউনিকেশন প্রোটোকল ব্যবহার করে দুটি Arduino বোর্ডের ইন্টারফেস করা জটিল কাজগুলি অর্জনের একটি নমনীয় এবং দক্ষ উপায় প্রদান করে যা একটি একক বোর্ড দ্বারা পরিচালনা করা যায় না। ওয়্যার লাইব্রেরির সাহায্যে, I2C ব্যবহার করে দুটি বোর্ডের মধ্যে যোগাযোগ সহজ করা হয়েছে, যা আপনাকে আপনার প্রকল্পে আরও উপাদান যোগ করতে দেয়।

বিভাগ DIY