সুচিপত্র:

ESP32, ESP8266, এবং Arduino এর জন্য IO Expander: 24 ধাপ
ESP32, ESP8266, এবং Arduino এর জন্য IO Expander: 24 ধাপ

ভিডিও: ESP32, ESP8266, এবং Arduino এর জন্য IO Expander: 24 ধাপ

ভিডিও: ESP32, ESP8266, এবং Arduino এর জন্য IO Expander: 24 ধাপ
ভিডিও: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, জুলাই
Anonim
Image
Image
ভূমিকা
ভূমিকা

আপনি কি আপনার ESP32, ESP8266, বা Arduino এর IO গুলি প্রসারিত করতে চান? এবং আপনি কি 16 টি নতুন GPIO- এর সম্ভাবনার কথা ভেবেছেন যা I2C বাস ব্যবহার করে নিয়ন্ত্রণ করা যায়? আচ্ছা আজ, আমি আপনাকে GPIO সম্প্রসারণকারী MCP23016 এর সাথে পরিচয় করিয়ে দেব। এছাড়াও, আমি আপনাকে MCP23016 এর সাথে একটি মাইক্রোকন্ট্রোলারের সাথে কীভাবে যোগাযোগ করব তা দেখাব। আমি একটি প্রোগ্রাম তৈরির কথাও বলব যেখানে আমরা এই মাইক্রোকন্ট্রোলারের মাত্র 2 টি পিন ব্যবহার করব সম্প্রসারণকারীর সাথে যোগাযোগের জন্য। আমরা এলইডি এবং বোতাম নিয়ন্ত্রণের জন্য এটি ব্যবহার করব।

ধাপ 1: ভূমিকা

MCP23016 ডিভাইসটি I2C বাস ব্যবহার করে GPIO সম্প্রসারণের জন্য 16 বিট সরবরাহ করে। প্রতিটি বিট পৃথকভাবে কনফিগার করা যেতে পারে (ইনপুট বা আউটপুট)।

MCP23016 ইনপুট, আউটপুট এবং পোলারিটি নির্বাচনের জন্য একাধিক 8-বিট সেটিংস নিয়ে গঠিত।

অন্যান্য উদাহরণের মধ্যে সুইচ, সেন্সর, বোতাম এবং এলইডির জন্য আইওগুলির প্রয়োজন হলে সম্প্রসারণকারীরা একটি সহজ সমাধান প্রদান করে।

ধাপ 2: বৈশিষ্ট্য

16 ইনপুট / আউটপুট পিন (16 ইনপুট মান)

দ্রুত I2C বাস ঘড়ির ফ্রিকোয়েন্সি (0-400 kbit/s)

তিনটি হার্ডওয়্যার অ্যাড্রেস পিন আটটি ডিভাইস পর্যন্ত ব্যবহারের অনুমতি দেয়

ইন্টারাপ্ট পোর্ট ক্যাপচার রেকর্ডার

ইনপুট পোর্ট ডেটার পোলারিটি সেট করার জন্য পোলারিটি রিভার্সিং রেজিস্টার

বেশিরভাগ মাইক্রোকন্ট্রোলারের সাথে সামঞ্জস্যপূর্ণ

ধাপ 3: ESP01 128 জিপিআইও থাকতে পারে

ESP01 128 জিপিআইও থাকতে পারে!
ESP01 128 জিপিআইও থাকতে পারে!

একটি উদাহরণ যা এই সম্প্রসারণকারীর মাত্রা দেখায় তা হল ESP01 এর সাথে এর ব্যবহার, যা মাত্র দুটি IOS দিয়ে আটটি সম্প্রসারণকারীর সাথে সংযুক্ত হতে পারে, 128 GPIO- তে পৌঁছতে পারে।

ধাপ 4: MCP23016

MCP23016
MCP23016

এখানে, আমাদের সম্প্রসারণকারীর পরিকল্পিত আছে, যার আটটি বিটের দুটি গ্রুপ রয়েছে। এটি মোট 16 টি পোর্টের জন্য তৈরি করে। একটি বিঘ্নিত পিন ছাড়াও, এটিতে CLK পিন রয়েছে, যা ক্যাপাসিটর এবং প্রতিরোধককে সংযুক্ত করে, যা একটি লজিক পোর্টে অভ্যন্তরীণভাবে সংযুক্ত থাকে। এটি একটি স্ফটিক অসিলেটরের ধারণা ব্যবহার করে ঘড়িটি তৈরি করা, যার জন্য 1MHz ঘড়ি প্রয়োজন। টিপি পিন ঘড়ি পরিমাপ করতে ব্যবহৃত হয়। পিন A0, A1, এবং A2 বাইনারি ঠিকানা।

ধাপ 5: ঘড়ি

ঘড়ি
ঘড়ি
ঘড়ি
ঘড়ি

MCP23016 অতএব অভ্যন্তরীণ ঘড়ির গতি নির্ধারণের জন্য একটি বাহ্যিক আরসি সার্কিট ব্যবহার করে। যথাযথভাবে কাজ করার জন্য 1 মেগাহার্টজের একটি অভ্যন্তরীণ ঘড়ি প্রয়োজন (সাধারণত)। অভ্যন্তরীণ ঘড়িটি টিপি পিনে পরিমাপ করা যায়। REXT এবং CEXT এর জন্য প্রস্তাবিত মান নিচে দেখানো হয়েছে।

ধাপ 6: ঠিকানা

MCP23016 এর ঠিকানা সংজ্ঞায়িত করার জন্য, আমরা তারপর পিন A0, A1, এবং A2 ব্যবহার করি। ঠিকানা পরিবর্তনের জন্য তাদের উচ্চ বা নিম্ন এ ছেড়ে দিন।

ঠিকানাটি নিম্নরূপ গঠিত হবে:

MCP_Address = 20 + (A0 A1 A2)

যেখানে A0 A1 A2 উচ্চ / নিম্ন মান নিতে পারে, এটি 0 থেকে 7 পর্যন্ত একটি বাইনারি সংখ্যা গঠন করে।

উদাহরণ স্বরূপ:

A0> GND, A1> GND, A2> GND (মানে 000, তারপর 20 + 0 = 20)

অথবা, A0> উচ্চ, A1> GND, A2> উচ্চ (মানে 101, তারপর 20 + 5 = 25)

ধাপ 7: কমান্ড

কমান্ড
কমান্ড

নীচে যোগাযোগের জন্য কমান্ড সহ একটি টেবিল রয়েছে। আসুন GP0 এবং GP1, সেইসাথে IODIR0 এবং IODIR1 ব্যবহার করি।

ধাপ 8: বিভাগ:

GP0 / GP1 - ডেটা পোর্ট রেজিস্টার

দুটি রেজিস্টার রয়েছে যা দুটি জিপিআইও পোর্টে অ্যাক্সেস প্রদান করে।

রেজিস্টার পড়া সেই বন্দরের পিনের অবস্থা প্রদান করে।

বিট = 1> উচ্চ বিট = 0> কম

OLAT0 / OLAT1 - আউটপুট LACTCH রেজিস্টার

দুটি পোর্টের আউটপুট পোর্টে প্রবেশের জন্য দুটি রেজিস্টার রয়েছে।

IPOL0 / IPOL1 - ইনপুট পোলারিটি রেজিস্টার

এই নিবন্ধগুলি ব্যবহারকারীকে ইনপুট পোর্ট ডেটার (GP0 এবং GP1) পোলারিটি কনফিগার করার অনুমতি দেয়।

IODIR0 / IODIR1

দুটি রেজিস্টার আছে যা পিন মোড নিয়ন্ত্রণ করে। (ইনপুট বা আউটপুট)

বিট = 1> ইনপুট বিট = 0> আউটপুট

INTCAP0 / INTCAP1 - ইন্টারাপ্ট ক্যাপচার রেজিস্টার

এগুলি এমন রেজিস্টার যা পোর্টের মান ধারণ করে যা বাধা সৃষ্টি করে।

IOCON0 / IOCON1 - I / O Expander Control Register

এটি MCP23016 এর কার্যকারিতা নিয়ন্ত্রণ করে।

বিট 0 সেট করা

Bit0 = 0> (ডিফল্ট) সর্বোচ্চ পোর্ট কার্যকলাপ সনাক্তকরণের সময় 32ms (কম বিদ্যুত ব্যবহার)

Bit0 = 1> বন্দরে সর্বাধিক কার্যকলাপ সনাক্তকরণের সময় 200usec (উচ্চ-শক্তি খরচ)

ধাপ 9: যোগাযোগের জন্য কাঠামো

যোগাযোগের জন্য কাঠামো
যোগাযোগের জন্য কাঠামো

আমি এখানে ওয়্যার ক্লাস দেখাই, যা আমাদের মূল আরডুইনোতে I2C যোগাযোগ, যা সম্প্রসারণকারীকে Arduino Uno এবং Mega এর সাথে কাজ করার অনুমতি দেয়। যাইহোক, পরবর্তীতে ইতিমধ্যে বেশ কয়েকটি আইও রয়েছে। আমরা এখানে চিপের ঠিকানা, অ্যাক্সেস কন্ট্রোল, যা রেজিস্টারের কোড, পাশাপাশি ডেটা নিয়ে কাজ করি।

ধাপ 10: প্রোগ্রাম

কার্যক্রম
কার্যক্রম

আমাদের প্রোগ্রামে আরও GPIO ব্যবহার করার জন্য MCP23016 এর সাথে ESP32 যোগাযোগ করা হয়। আমাদের তখন MCP23016 এর সাথে একটি বাটন এবং কিছু LED সংযুক্ত থাকবে। আমরা শুধুমাত্র I2C বাস ব্যবহার করে তাদের সবাইকে নিয়ন্ত্রণ করব। সুতরাং, শুধুমাত্র দুটি ESP32 পিন ব্যবহার করা হবে। আপনি ভিডিওতে নীচের ছবির সার্কিট দেখতে পারেন।

ধাপ 11: ESP01

ESP01
ESP01

এখানে, আমি ESP01 এর Pinout দেখাই।

ধাপ 12: ESP01 মাউন্ট করা

মাউন্ট করা ESP01
মাউন্ট করা ESP01

এই উদাহরণে, আমাদের SDI- তে GPIO0 সংযুক্ত আছে, এবং GPIO2 এসসিএলে সংযুক্ত আছে। আমাদের একটি রিলে বোর্ড, একটি বুজার এবং একটি LED রয়েছে। অন্য বন্দরে, GP1.0 এ, আমাদের একটি রোধক সহ আরো একটি LED আছে।

ধাপ 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

এখানে, আমাদের NodeMCU ESP-12E এর Pinout আছে।

ধাপ 14: NodeMCU ESP-12E মাউন্ট করা

NodeMCU ESP-12E মাউন্ট করা
NodeMCU ESP-12E মাউন্ট করা

এই ক্ষেত্রে, প্রথম উদাহরণ থেকে একমাত্র পার্থক্য হল যে আপনি যথাক্রমে SDA এবং SC- এ D1 এবং D2 সংযুক্ত করেছেন।

ধাপ 15: ওয়াইফাই নোড MCU-32S ESP-WROOM-32

ওয়াইফাই নোড MCU-32S ESP-WROOM-32
ওয়াইফাই নোড MCU-32S ESP-WROOM-32

এখানে WiFi NodeMCU-32S ESP-WROOM-32 এর পিনআউট।

ধাপ 16: ওয়াইফাই মাউন্টিং নোড MCU-32S ESP-WROOM-32

ওয়াইফাই মাউন্টিং নোড MCU-32S ESP-WROOM-32
ওয়াইফাই মাউন্টিং নোড MCU-32S ESP-WROOM-32

এই সময়, অন্য দুটি উদাহরণ থেকে প্রধান পার্থক্য হল বোতাম, এবং তিনটি জ্বলজ্বলে LEDs। এখানে, এসডিএ জিপিআইও 19 এর সাথে সংযুক্ত, যখন এসসিএল জিপিআইও 23 এর সাথে সংযুক্ত।

ধাপ 17: লাইব্রেরি এবং পরিবর্তনশীল

প্রথমত, আমরা Wire.h অন্তর্ভুক্ত করব, যা i2c যোগাযোগের জন্য দায়ী, সেইসাথে MCP23016 এর i2c ঠিকানা সেট করা। আমি বেশ কয়েকটি কমান্ড দেখাই, এমনকি কিছু যা আমরা এই প্রকল্পে ব্যবহার করি না।

#অন্তর্ভুক্ত // Wire.h লাইব্রেরির ব্যবহার নির্দিষ্ট করুন। // endereço I2C do MCP23016 #MCPAddress সংজ্ঞায়িত করুন 0x20 // রেজিস্টার রিলেশনশিপের জন্য কমান্ড বাইট: টেবিল: 1-3 মাইক্রোচিপ MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x0 // DATA PORT 0 পোর্ট রেজিস্টার 1 #ডিফাইন OLAT0 0x02 // আউটপুট লাচ রেজিস্টার 0 #ডিফাইন OLAT1 0x03 // আউটপুট ল্যাচ রেজিস্টার 1 #ডিফাইন আইপিএল 0 0x04 // ইনপুট পোলারিটি পোর্ট রেজিস্টার 0 #আইডাইন পোর্ট 0 #আইডাইন 0 0 /I/O দিকনির্দেশক নিবন্ধক 0 #IODIR1 0x07 // I/O নির্দেশ নিবন্ধনকারী 1 #সংজ্ঞায়িত করুন INTCAP0 0x08 // অন্তর্দৃষ্টি ক্যাপচার নিবন্ধক 0 #নির্ধারিত INTCAP1 0x09 // অন্তর্বর্তী ক্যাপচার I080/08 রেজিস্টার 0 #IOCON1 0x0B নির্ধারণ করুন // I/O এক্সপেন্ডার কন্ট্রোল রেজিস্টার 1

ধাপ 18: সেটআপ

এখানে আমাদের চারটি ভিন্ন ধরণের মাইক্রোকন্ট্রোলার শুরু করার কাজ রয়েছে। আমরা ফ্রিকোয়েন্সি পরীক্ষা করি, জিপিআইও সেট আপ করি এবং পিন সেট করি। লুপে, আমরা বোতামের অবস্থা পরীক্ষা করি।

অকার্যকর সেটআপ () {Serial.begin (9600); বিলম্ব (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // Frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // শেষ লুপ

ধাপ 19: কনফিগার পোর্ট

এই ধাপে, আমরা GPIO পিনের মোড কনফিগার করি এবং পোর্টগুলির মোড চিহ্নিত করি।

// configura o GPIO (GP0 ou GP1) // como parametro passamos: // port: GP0 ou GP1 // custom: INPUT para todos as portas do GP trabalharem como entrada // OUTPUT para todos as portas do GP trabalharem como saya/ / custom um valor de 0-255 indicando o modo das portas (1 = INPUT, 0 = OUTPUT) // ex: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saya void configurePort (uint8_t পোর্ট, uint8_t কাস্টম) {if (custom == INPUT) {writeBlockData (port, 0xFF); } অন্যথায় যদি (কাস্টম == আউটপুট) {writeBlockData (পোর্ট, 0x00); } অন্যথায় {writeBlockData (পোর্ট, কাস্টম); }}

ধাপ 20: WriteBlockData & CheckButton

এখানে, আমরা i2c বাসের মাধ্যমে MCP23016- এ ডেটা পাঠাই, বোতামের অবস্থা পরীক্ষা করি এবং চাপ দেওয়ার বা না থাকার শর্ত বিবেচনা করে পরবর্তী পদক্ষেপ নির্দেশ করি।

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrador) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (তথ্য); Wire.endTransmission (); বিলম্ব (10); }

// verifica se o botão foi pressionado // parametro GP: GP0 ou GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // se botão pressionado, seta para HIGH as portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

ধাপ 21: ReadPin এবং ValueFromPin

আমরা এখানে একটি নির্দিষ্ট পিন পড়া, এবং পছন্দসই অবস্থানে বিট মান ফেরত নিয়ে কাজ করি।

// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 ou GP1 // retorno: 0 ou 1 uint8_t readPin (uint8_t pin, uint8_t gp) {uint8_t statusGP = 0; Wire.beginTransmission (MCPAddress); Wire.write (জিপি); Wire.endTransmission (); Wire.requestFrom (MCPAddress, 1); // ler do chip 1 byte statusGP = Wire.read (); রিটার্ন মান ফ্রমপিন (পিন, স্ট্যাটাস জিপি); } // retorna o valor do bit na posição desejada // pin: posição do bit (0-7) // statusGP: valor lido do GP (0-255) uint8_t valueFromPin (uint8_t pin, uint8_t statusGP) {return (statusGP & (0x0001 << পিন)) == 0? 0: 1; }

ধাপ 22: ESP8266 প্রোগ্রাম

এখান থেকে, আমরা দেখব কিভাবে আমরা ESP-01 এবং NodeMCU ESP-12E এ যে প্রোগ্রামটি ব্যবহার করেছি তা তৈরি করা হয়েছে, যা আমাদের বুঝতে সাহায্য করে যে তাদের মধ্যে পার্থক্যগুলি কীভাবে ন্যূনতম।

আমরা শুধুমাত্র i2c কমিউনিকেশন কনস্ট্রাক্টরের লাইন পরিবর্তন করব, যা ওয়্যার অবজেক্টের শুরু পদ্ধতি।

আমরা যে প্লেটটি সংকলন করতে যাচ্ছি সে অনুযায়ী লাইনটিকে কেবল অসম্পূর্ণ করুন।

// Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ইএসপি -01

সেটআপ

লক্ষ্য করুন যে নির্মাতা এখনও মন্তব্য করেছেন। অতএব, আপনার বোর্ড অনুযায়ী অস্বস্তি (ESP-01 বা nodeMCU ESP12-E)।

অকার্যকর সেটআপ () {Serial.begin (9600); বিলম্ব (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // Frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000001); }

লুপ

লুপে, আমরা প্রতি 1 সেকেন্ডে পিনগুলি স্যুইচ করি। এইভাবে, যখন GP0 এর pin0 চালু থাকে, GP1 এর পিনগুলি বন্ধ থাকে। যখন GP1 এর pin0 চালু থাকে, GP0 পিন বন্ধ থাকে।

void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); বিলম্ব (1000); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); বিলম্ব (1000); } // শেষ লুপ

ধাপ 23: গুরুত্বপূর্ণ

ব্যবহৃত ভেরিয়েবল এবং লাইব্রেরি একইভাবে আমরা ESP32 এর জন্য যে প্রোগ্রামটি করেছি, সেইসাথে কনফিগারপোর্ট এবং রাইটব্লকডাটা পদ্ধতি।

ধাপ 24: ফাইল

ফাইল ডাউনলোড করুন:

পিডিএফ

INO (ESP8266)

INO (ESP32)

প্রস্তাবিত: