কিভাবে Arduino IDE ব্যবহার করে ESP32 এ I2C ঠিকানা স্ক্যান করবেন

Kibhabe Arduino Ide Byabahara Kare Esp32 E I2c Thikana Skyana Karabena



ESP32 হল একটি মাইক্রোকন্ট্রোলার-ভিত্তিক প্ল্যাটফর্ম যা ইনপুট অনুযায়ী বিভিন্ন আউটপুট নিয়ন্ত্রণ করতে বিভিন্ন ডিভাইসের সাথে ইন্টারফেস করতে পারে। সকল যোগাযোগ প্রোটোকল যেমন UART, SPI এবং I2C ESP32 যোগাযোগে গুরুত্বপূর্ণ ভূমিকা পালন করে। আমরা এই নির্দেশিকায় ইন্টার ইন্টিগ্রেটেড সার্কিট বা I2C কমিউনিকেশন প্রোটোকল এবং কীভাবে একটি ডিভাইসের ঠিকানা স্ক্যান করতে হয় তা নিয়ে আলোচনা করব।

I2C কমিউনিকেশনের ভূমিকা

I2C বিকল্পভাবে I2C বা IIC নামে পরিচিত একটি সিঙ্ক্রোনাস মাস্টার-স্লেভ যোগাযোগ প্রোটোকল যেখানে একটি সিগন্যাল মাস্টার ডিভাইস একটি একক তারের (এসডিএ লাইন) উপর একাধিক সংখ্যক স্লেভ ডিভাইস নিয়ন্ত্রণ করতে পারে।

I2C UART এবং SPI প্রোটোকলের কাজকে একত্রিত করে উদাহরণস্বরূপ SPI একটি একক মাস্টারের উপর একাধিক স্লেভ ডিভাইস নিয়ন্ত্রণ সমর্থন করে, I2C এছাড়াও এটিকে সমর্থন করে অন্যদিকে যোগাযোগের জন্য UART দুই-লাইন TX এবং Rx ব্যবহার করে I2C এছাড়াও দুই-লাইন SDA এবং SCL ব্যবহার করে। যোগাযোগ









এখানে আমরা দেখতে পাচ্ছি যে আমরা SDA, SCL লাইন উভয়ের সাথেই পুল আপ প্রতিরোধক ব্যবহার করেছি। এর কারণ হল ডিফল্টরূপে I2C শুধুমাত্র LOW বা খোলা সার্কিটের দুটি স্তর আউটপুট করে। ডিফল্টরূপে, সমস্ত চিপগুলিতে I2C ওপেন সার্কিট মোডে থাকে তাই তাদের উচ্চ টানতে আমরা একটি পুল-আপ প্রতিরোধক ব্যবহার করি।



নিম্নলিখিত দুটি লাইন I2C ব্যবহার করে:





  • SDA (সিরিয়াল ডেটা) : মাস্টার থেকে স্লেভ এবং তদ্বিপরীত তথ্য প্রেরণ এবং গ্রহণ করার লাইন
  • SCL (ক্রমিক ঘড়ি) : একটি নির্দিষ্ট স্লেভ ডিভাইস নির্বাচন করতে ঘড়ি সংকেত লাইন

ESP32 I2C বাস ইন্টারফেস

ESP32-এ দুটি I2C বাস ইন্টারফেস রয়েছে যা ব্যবহার করে I2C যোগাযোগ হয় মাস্টার বা স্লেভ হিসাবে করা হয় যা ESP32 এর সাথে ইন্টারফেস করা ডিভাইসের উপর নির্ভর করে। ESP32 ডেটাশীট অনুসারে ESP32 বোর্ড I2C ইন্টারফেস নিম্নলিখিত কনফিগারেশন সমর্থন করে:

  • 100 Kbit/s হারে স্ট্যান্ডার্ড মোড I2C যোগাযোগ
  • 400 Kbit/s গতিতে দ্রুত বা উন্নত মোড I2C যোগাযোগ
  • ডুয়াল অ্যাড্রেসিং মোড 7-বিট এবং 10-বিট
  • ব্যবহারকারীরা কমান্ড রেজিস্টার প্রোগ্রামিং দ্বারা I2C ইন্টারফেস নিয়ন্ত্রণ করতে পারেন
  • ESP32 I2C বাস ইন্টারফেস নিয়ন্ত্রণে আরও নমনীয়

ESP32 এর সাথে I2C ডিভাইস সংযুক্ত করা হচ্ছে

I2C প্রোটোকল ব্যবহার করে ESP32 এর সাথে ডিভাইসগুলিকে ইন্টারফেস করা খুবই সহজ ঠিক UART-এর মতোই SDA এবং SCL ক্লক লাইনের সাথে সংযোগ করার জন্য আমাদের শুধুমাত্র দুটি লাইনের প্রয়োজন।



ESP32 মাস্টার এবং স্লেভ উভয় মোডে কনফিগার করা যেতে পারে।

ESP32 I2C মাস্টার মোড

এই মোডে ESP32 একটি ঘড়ি সংকেত তৈরি করে যা সংযুক্ত স্লেভ ডিভাইসগুলির সাথে যোগাযোগ শুরু করে।

ESP32-এ দুটি GPIO পিন যা I2C যোগাযোগের জন্য পূর্ব-নির্ধারিত:

  • এসডিএ : GPIO পিন 21
  • SCL : GPIO পিন 22

ESP32 I2C স্লেভ মোড

স্লেভ মোডে ঘড়িটি মাস্টার ডিভাইস দ্বারা তৈরি করা হয়। মাস্টার হল একমাত্র ডিভাইস যা I2C যোগাযোগে SCL লাইন চালনা করে। স্লেভ হল এমন ডিভাইস যা মাস্টারকে সাড়া দেয় কিন্তু ডেটা স্থানান্তর শুরু করতে পারে না। ESP32 I2C বাসে শুধুমাত্র মাস্টার ডিভাইসের মধ্যে ডেটা স্থানান্তর শুরু করতে পারে।

চিত্রটি মাস্টার-স্লেভ কনফিগারেশনে দুটি ESP32 বোর্ড দেখায়।

এখন পর্যন্ত আমরা ESP32-এ I2C মোডের কাজ বুঝতে পেরেছি এখন আমরা প্রদত্ত কোড আপলোড করে যেকোনো ডিভাইসের I2C ঠিকানা সহজেই খুঁজে পেতে পারি।

কিভাবে Arduino IDE ব্যবহার করে ESP32 এ I2C ঠিকানা স্ক্যান করবেন

ESP32 এর সাথে সংযুক্ত ডিভাইসগুলির I2C ঠিকানা খুঁজে পাওয়া গুরুত্বপূর্ণ কারণ আমরা যদি একই I2C ঠিকানা সহ ডিভাইসগুলি ব্যবহার করি তবে আমরা একটি একক বাস লাইনে তাদের সাথে যোগাযোগ করতে পারি না।

প্রতিটি I2C ডিভাইসে অবশ্যই একটি অনন্য ঠিকানা এবং HEX-এ 0 থেকে 127 বা (0 থেকে 0X7F) ঠিকানার পরিসর থাকতে হবে। উদাহরণস্বরূপ, যদি আমরা একই মডেল নম্বর বা পণ্যের দুটি OLED ডিসপ্লে ব্যবহার করি তবে উভয়েরই একই I2C ঠিকানা থাকবে তাই আমরা ESP32-এ একই I2C লাইনে উভয়ই ব্যবহার করতে পারি না।

একটি আইসি ঠিকানা খুঁজতে আসুন একটি উদাহরণ নেওয়া যাক।

পরিকল্পিত

নীচের চিত্রটি I2C যোগাযোগ প্রোটোকল ব্যবহার করে ESP32 বোর্ডের সাথে OLED ডিসপ্লে ইন্টারফেসিংয়ের পরিকল্পিত চিত্র দেখায়।

OLED এর সাথে ESP32 এর সংযোগের মধ্যে রয়েছে:

OLED ডিসপ্লে ESP32 পিন
ভিসিসি 3V3/VIN
জিএনডি জিএনডি
SCL GPIO 22
এসডিএ GPIO 21

কোড
Arduino সম্পাদক খুলুন এবং প্রদত্ত I2C স্ক্যানিং কোডটি ESP32 বোর্ডে আপলোড করুন। নিশ্চিত করুন যে ESP32 সংযুক্ত আছে, এবং COM পোর্ট নির্বাচন করা হয়েছে।

/****************
****************
linuxhint.com
****************
******************/

#include  /*ওয়্যার লাইব্রেরি অন্তর্ভুক্ত*/

অকার্যকর সেটআপ ( ) {
তারের।শুরু ( ) ; /* I2C যোগাযোগ শুরু হয় */
সিরিয়াল.শুরু ( 115200 ) ; /* Baud হার সংজ্ঞায়িত জন্য সিরিয়াল যোগাযোগ */
Serial.println ( ' \n I2C স্ক্যানার' ) ; /* সিরিয়াল মনিটরে প্রিন্ট স্ক্যানার */
}

অকার্যকর লুপ ( ) {
বাইট ত্রুটি, ঠিকানা;
int n ডিভাইস;
Serial.println ( 'স্ক্যান করা হচ্ছে...' ) ; /* ESP32 উপলব্ধ I2C ডিভাইস স্ক্যান করা শুরু করে */
nডিভাইস = 0 ;
জন্য ( ঠিকানা = 1 ; ঠিকানা < 127 ; ঠিকানা++ ) { /* জন্য ডিভাইসের সংখ্যা পরীক্ষা করতে লুপ করুন 127 ঠিকানা */
Wire.beginTransmission ( ঠিকানা ) ;
ত্রুটি = Wire.endTransmission ( ) ;
যদি ( ত্রুটি == 0 ) { /* যদি I2C ডিভাইস পাওয়া গেছে */
সিরিয়াল.প্রিন্ট ( 'I2C ডিভাইস 0x ঠিকানায় পাওয়া গেছে' ) ; /* এই লাইনটি মুদ্রণ করুন যদি I2C ডিভাইস পাওয়া গেছে */
যদি ( ঠিকানা < 16 ) {
সিরিয়াল.প্রিন্ট ( '0' ) ;
}
Serial.println ( ঠিকানা, হেক্স ) ; /* I2C ঠিকানার HEX মান প্রিন্ট করে */
nডিভাইস++;
}
অন্য যদি ( ত্রুটি == 4 ) {
সিরিয়াল.প্রিন্ট ( 'ঠিকানা 0x এ অজানা ত্রুটি' ) ;
যদি ( ঠিকানা < 16 ) {
সিরিয়াল.প্রিন্ট ( '0' ) ;
}
Serial.println ( ঠিকানা, হেক্স ) ;
}
}
যদি ( nডিভাইস == 0 ) {
Serial.println ( 'কোনও I2C ডিভাইস পাওয়া যায়নি৷ \n ' ) ; /* কোন I2C ডিভাইস সংযুক্ত না থাকলে এই বার্তাটি প্রিন্ট করুন */
}
অন্য {
Serial.println ( 'সম্পন্ন \n ' ) ;
}
বিলম্ব ( 5000 ) ; /* বিলম্ব দেওয়া হয়েছে জন্য প্রতিবার I2C বাস চেক করা হচ্ছে 5 সেকেন্ড */
}

উপরের কোডটি উপলব্ধ I2C ডিভাইসগুলির জন্য স্ক্যান করবে। I2C যোগাযোগের জন্য ওয়্যার লাইব্রেরিতে কল করে কোড শুরু হয়েছে। বউড রেট ব্যবহার করে পরবর্তী সিরিয়াল যোগাযোগ শুরু হয়।

I2C স্ক্যানিং কোডের লুপ অংশে দুটি পরিবর্তনশীল নাম, ত্রুটি এবং ঠিকানা সংজ্ঞায়িত করা হয়. এই দুটি ভেরিয়েবল ডিভাইসের I2C ঠিকানা সংরক্ষণ করে। পরবর্তী একটি লুপ শুরু করা হয়েছে যা 0 থেকে 127 ডিভাইসের মধ্যে শুরু হওয়া I2C ঠিকানার জন্য স্ক্যান করবে।

I2C ঠিকানা পড়ার পর আউটপুটটি HEX ফরম্যাটে সিরিয়াল মনিটরে প্রিন্ট করা হয়।

হার্ডওয়্যার

এখানে আমরা দেখতে পাচ্ছি OLED 0.96-ইঞ্চি I2C ডিসপ্লে GPIO পিন 21 এবং 22 এ ESP32 বোর্ডের সাথে সংযুক্ত রয়েছে। ডিসপ্লের Vcc এবং GND ESP32 3V3 এবং GND পিনের সাথে সংযুক্ত রয়েছে।

আউটপুট
আউটপুটে আমরা ESP32 বোর্ডের সাথে সংযুক্ত OLED ডিসপ্লের I2C ঠিকানা দেখতে পাচ্ছি। এখানে I2C ঠিকানাটি 0X3C তাই আমরা একই ঠিকানার সাথে অন্য কোন I2C ডিভাইস ব্যবহার করতে পারি না তার জন্য আমাদের প্রথমে সেই ডিভাইসের I2C ঠিকানা পরিবর্তন করতে হবে।

আমরা সফলভাবে ESP32 বোর্ডের সাথে সংযুক্ত OLED ডিসপ্লের I2C ঠিকানা পেয়েছি।

উপসংহার

ESP32 এর সাথে একাধিক ডিভাইস সংযোগ করার সময় একটি I2C ঠিকানা খুঁজে পাওয়া গুরুত্বপূর্ণ কারণ একই I2C ঠিকানা শেয়ার করা ডিভাইসগুলিকে একটি I2C বাসে সংযুক্ত করা যায় না। উপরের কোডটি ব্যবহার করে একজন I2C ঠিকানা সনাক্ত করতে পারে এবং যদি দুটি ডিভাইসের ঠিকানা মেলে তবে ডিভাইসের বৈশিষ্ট্যের উপর নির্ভর করে সেই অনুযায়ী পরিবর্তন করা যেতে পারে।