ডিজিটাল আউটপুট — LED ও লোড ড্রাইভ করা
এই পাঠে যা শিখবেন
- GPIO পিনের কারেন্ট সীমা কেন থাকে, এবং এটি পার হলে কী হতে পারে
- ওহমের সূত্র দিয়ে LED-এর কারেন্ট-লিমিটিং রেজিস্টর কীভাবে গণনা করতে হয়
- বড় লোড কেন সরাসরি GPIO দিয়ে চালানো যায় না — আসল কারেন্ট/ভোল্টেজ-সীমা কারণ
- ট্রানজিস্টর/MOSFET/রিলে কীভাবে GPIO ও বড় লোডের মাঝে একটি নিরাপদ "সুইচ" হিসেবে কাজ করে
১ · GPIO-র কারেন্ট সীমা
একটি GPIO পিন একটি খুব ছোট, চিপের ভেতরের ট্রানজিস্টর সুইচের মাধ্যমে HIGH/LOW ড্রাইভ করে। এই অভ্যন্তরীণ সুইচটি নিরাপদে সর্বোচ্চ একটি নির্দিষ্ট পরিমাণ কারেন্ট সোর্স (VCC থেকে পিন দিয়ে বাইরে পাঠানো) বা সিংক (বাইরে থেকে পিন দিয়ে GND-এ টানা) করতে পারে — প্রায়ই প্রতি পিনে ~২০mA এর কাছাকাছি (বহু জনপ্রিয় মাইক্রোকন্ট্রোলারে সাধারণভাবে উল্লেখিত ইলাস্ট্রেটিভ পরিসীমা, প্রতিটি চিপের নির্দিষ্ট ডেটাশিটে প্রকৃত মান থাকে), এবং পুরো চিপেরও একটি সম্মিলিত সর্বোচ্চ কারেন্ট বাজেট থাকে। এই সীমা পার হলে পিনের ভেতরের ট্রানজিস্টর অতিরিক্ত গরম হয়ে স্থায়ীভাবে নষ্ট হয়ে যেতে পারে।
২ · LED-এর জন্য কারেন্ট-লিমিটিং রেজিস্টর
একটি LED-এর নিজস্ব একটি ফরওয়ার্ড ভোল্টেজ ($V_f$, LED-এর রঙ ও উপাদানের ওপর নির্ভরশীল, সাধারণত ~১.৮V থেকে ~৩.৪V-এর মধ্যে) থাকে। যদি LED-কে সরাসরি সাপ্লাই ভোল্টেজের সাথে যুক্ত করা হয় (কোনো রেজিস্টর ছাড়া), LED কার্যত কোনো কারেন্ট সীমাবদ্ধতা ছাড়াই যত কারেন্ট টানতে পারে তত টানবে — যা প্রায় সবসময় LED ও GPIO পিন উভয়কেই তাৎক্ষণিকভাবে নষ্ট করে দেয়। তাই একটি সিরিজ রেজিস্টর যোগ করে টার্গেট কারেন্টে সীমাবদ্ধ রাখা হয়। ওহমের সূত্র থেকে:
$$ R = \frac{V_{supply} - V_f}{I_{target}} $$
এখানে $V_{supply}$ হলো সাপ্লাই ভোল্টেজ, $V_f$ LED-এর ফরওয়ার্ড ভোল্টেজ, এবং $I_{target}$ কাঙ্ক্ষিত কারেন্ট (সাধারণত GPIO-র নিরাপদ সীমার মধ্যে একটি মান, যেমন ~১০-২০mA)।
# বহু জনপ্রিয় মাইক্রোকন্ট্রোলারে সাধারণভাবে উল্লেখিত ইলাস্ট্রেটিভ প্রতি-পিন কারেন্ট সীমা
GPIO_MAX_SOURCE_CURRENT_MA = 20
leds = [
{"name": "লাল (Red) LED", "vf": 2.0, "target_ma": 10, "vsupply": 3.3},
{"name": "সবুজ (Green) LED", "vf": 2.1, "target_ma": 20, "vsupply": 5.0},
{"name": "নীল/সাদা (Blue/White) LED", "vf": 3.2, "target_ma": 15, "vsupply": 5.0},
]
print(f"{'LED':30} {'Vsupply':>8} {'Vf':>6} {'I target':>10} {'R (ohm)':>10} {'GPIO-safe?':>12}")
for led in leds:
i_amps = led["target_ma"] / 1000
r_ohms = (led["vsupply"] - led["vf"]) / i_amps
within_limit = led["target_ma"] <= GPIO_MAX_SOURCE_CURRENT_MA
print(f"{led['name']:30} {led['vsupply']:>7.1f}V {led['vf']:>5.1f}V "
f"{led['target_ma']:>8}mA {r_ohms:>9.1f} {str(within_limit):>12}")
print()
print("গণনার সূত্র প্রতিটির জন্য: R = (Vsupply - Vf) / I_target")
for led in leds:
i_amps = led["target_ma"] / 1000
r_ohms = (led["vsupply"] - led["vf"]) / i_amps
print(f" {led['name']}: R = ({led['vsupply']} - {led['vf']}) / {i_amps} = {r_ohms:.1f} ohm")
within_limit = True)।
লক্ষ্য করুন — একই টার্গেট কারেন্টে উচ্চতর $V_f$-এর LED (যেমন নীল/সাদা)-এর জন্য কম রেজিস্ট্যান্স লাগে, কারণ
রেজিস্টরকে সাপ্লাই ভোল্টেজের কম অংশ "শোষণ" করতে হয়।
৩ · বড় লোডের জন্য কেন ট্রানজিস্টর/MOSFET/রিলে লাগে
একটি DC মোটর, রিলে কয়েল, বা সোলেনয়েডের সাধারণত শত শত মিলিঅ্যাম্পিয়ার থেকে কয়েক অ্যাম্পিয়ার পর্যন্ত কারেন্ট দরকার হয় — GPIO-র নিরাপদ ~২০mA সীমার তুলনায় অনেক অনেক বেশি। GPIO পিন দিয়ে সরাসরি এমন লোড চালানোর চেষ্টা করলে পিনের ভেতরের ছোট ট্রানজিস্টর তার সহনসীমার বাইরে কারেন্ট টানতে বাধ্য হবে এবং তাৎক্ষণিকভাবে পুড়ে যাবে। এছাড়াও, একটি মোটর বা রিলে প্রায়ই GPIO-র ৩.৩V/৫V লজিক-লেভেল সাপ্লাই থেকে সম্পূর্ণ ভিন্ন, উচ্চতর ভোল্টেজের একটি পাওয়ার সাপ্লাই থেকে চলে — যা GPIO সরাসরি সরবরাহই করতে পারে না।
সমাধান হলো GPIO পিনকে লোড সরাসরি চালাতে না দিয়ে, শুধু একটি ট্রানজিস্টর/MOSFET-এর বেস/গেটকে "সুইচ অন/অফ" করতে ব্যবহার করা — এই ট্রানজিস্টরই তখন লোডের বড় কারেন্ট আলাদা, উপযুক্ত পাওয়ার সাপ্লাই থেকে বহন করে। রিলে ব্যবহার করলে GPIO শুধু রিলের ছোট কয়েলকে (যা নিজেই একটি ছোট ইন্ডাক্টিভ লোড, প্রায়ই একটি ট্রানজিস্টরের মাধ্যমেই চালানো হয়) এনার্জাইজ করে, আর রিলের ফিজিক্যাল কন্টাক্ট সম্পূর্ণ আলাদা, উচ্চ-কারেন্ট/ উচ্চ-ভোল্টেজ সার্কিট সুইচ করে — GPIO আর বড় লোডের মধ্যে সম্পূর্ণ বৈদ্যুতিক বিচ্ছিন্নতা (isolation) থাকে।
GPIO পিনের কারেন্ট-সোর্সিং/সিংকিং ক্ষমতা সীমিত (ইলাস্ট্রেটিভভাবে ~২০mA)। একটি LED-এর জন্য ওহমের সূত্র $R = (V_{supply}-V_f)/I$ দিয়ে সঠিক কারেন্ট-লিমিটিং রেজিস্টর গণনা করে সরাসরি চালানো যায়। কিন্তু মোটর/রিলের মতো বড় লোডের কারেন্ট/ভোল্টেজ চাহিদা GPIO-র সীমার বাইরে — তাই একটি ট্রানজিস্টর/MOSFET/রিলে GPIO ও লোডের মাঝে একটি নিরাপদ, বিচ্ছিন্ন সুইচ হিসেবে কাজ করে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি একটি LED-কে ভুলবশত কোনো সিরিজ রেজিস্টর ছাড়াই সরাসরি ৫V সাপ্লাইয়ের সাথে যুক্ত করা হয়, ওহমের সূত্র অনুযায়ী কারেন্ট আনুমানিক কত হবে বলে আপনার ধারণা?
রেজিস্টর না থাকলে সার্কিটে কার্যত কোনো সীমাবদ্ধতা থাকে না — LED-এর নিজস্ব রেজিস্ট্যান্স খুবই কম হওয়ায় $I = (V_{supply}-V_f)/R$-এর $R$ প্রায় শূন্যের কাছাকাছি হয়ে যায়, ফলে গাণিতিকভাবে কারেন্ট অত্যন্ত বড় (কার্যত সীমাহীন, শুধু বাহ্যিক তার/উৎসের সীমা দিয়ে সীমাবদ্ধ) হয়ে যায়। বাস্তবে এই বিশাল কারেন্ট LED-এর সেমিকন্ডাক্টর জাংশনকে তাৎক্ষণিকভাবে ধ্বংস করে দেয় — তাই প্রায় সবসময় LED সিরিজ রেজিস্টর ছাড়া সরাসরি সাপ্লাইয়ে যুক্ত করলে সাথে সাথে নষ্ট হয়ে যায়।
প্র ০২ একটি রিলে ব্যবহার করলেও তার কয়েলকে প্রায়ই GPIO সরাসরি না চালিয়ে একটি ট্রানজিস্টরের মাধ্যমে চালানো হয় কেন — রিলের কয়েল তো LED-এর মতোই তুলনামূলক ছোট একটি লোড?
রিলে কয়েল একটি ইন্ডাক্টিভ লোড — এটি প্রায়ই GPIO-র নিরাপদ কারেন্ট সীমার কাছাকাছি বা তার বেশি কারেন্ট টানে, এবং তার চেয়েও গুরুত্বপূর্ণ, কয়েল বন্ধ (turn-off) করার মুহূর্তে একটি হঠাৎ উচ্চ-ভোল্টেজ "ব্যাক-EMF স্পাইক" তৈরি করে যা সংরক্ষণহীন অবস্থায় GPIO পিনকে ক্ষতিগ্রস্ত করতে পারে। তাই একটি ট্রানজিস্টর (প্রায়ই একটি ফ্লাইব্যাক ডায়োডসহ) ব্যবহার করে GPIO-কে এই কারেন্ট ও স্পাইক উভয় থেকেই সুরক্ষিত রাখা হয়।
প্র ০৩
উপরের কোড সেলে within_limit মান False হতো এমন একটি উদাহরণ LED/টার্গেট-
কারেন্ট আপনি নিজে বলতে পারবেন কি?
হ্যাঁ — উদাহরণস্বরূপ যদি target_ma-এর মান 25 বা তার বেশি রাখা হতো (ইলাস্ট্রেটিভ
GPIO_MAX_SOURCE_CURRENT_MA = 20-এর চেয়ে বেশি), তাহলে within_limit =
led["target_ma"] <= GPIO_MAX_SOURCE_CURRENT_MA শর্তটি False হয়ে যেত — এটি সংকেত
দেয় যে সেই টার্গেট কারেন্টে GPIO সরাসরি LED চালানো নিরাপদ নয়, রেজিস্টর মান যা-ই হোক না কেন।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে সবুজ LED-এর জন্য
vsupply৫.০V থেকে বদলে ৩.৩V করলে নতুন $R$-এর মান কি বাড়বে নাকি কমবে?কমবে। $R = (V_{supply}-V_f)/I$ সূত্রে $V_{supply}$ কমলে (Vf ও I অপরিবর্তিত থাকলে) লব ছোট হয়ে যায়, ফলে $R$-ও ছোট হয়। এখানে $(3.3-2.1)/0.02 = 60$ ohm — মূল $145$ ohm-এর চেয়ে অনেক কম।
-
পরীক্ষা করুন: উপরের কোড সেলে
ledsলিস্টে একটি নতুন এন্ট্রি যোগ করুন —{"name": "ইনফ্রারেড (IR) LED", "vf": 1.4, "target_ma": 30, "vsupply": 3.3}— এবং Run চেপে দেখুন এই এন্ট্রিরwithin_limitকলামে কী মান আসে।এই এন্ট্রির
target_ma = 30, যা ইলাস্ট্রেটিভGPIO_MAX_SOURCE_CURRENT_MA = 20-এর চেয়ে বেশি — তাইwithin_limitকলামেFalseপ্রিন্ট হবে, যদিও $R = (3.3-1.4)/0.03 \approx 63.3$ ohm একটি স্বাভাবিক, গণনাযোগ্য মান। এটি দেখায় রেজিস্টর মান গণনা করা যাওয়া মানেই এই নয় যে টার্গেট কারেন্টটা GPIO-র জন্য নিরাপদ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ মাইক্রোপ্রসেসর আর্কিটেকচার, এমবেডেড C, GPIO, টাইমার/PWM/ADC, সিরিয়াল প্রোটোকল, RTOS, সেন্সর/অ্যাকচুয়েটর, IoT আর্কিটেকচার, ওয়্যারলেস প্রোটোকল, MQTT/CoAP ও IoT সিকিউরিটি — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
- ডিজিটাল ইনপুট ডিবাউন্সিং আগের পাঠ GPIO ইনপুট পিনকে নির্ভরযোগ্য করার কৌশল — এই পাঠে GPIO আউটপুট পিন থেকে বাস্তব লোড নিরাপদে চালানো নিয়ে আলোচনা হলো।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Design and Analysis of Algorithms ও আরও অনেক কোর্স — সব এক জায়গায়।