সিগন্যাল কন্ডিশনিং ও ক্যালিব্রেশন
এই পাঠে যা শিখবেন
- সিগন্যাল কন্ডিশনিং কী এবং কেন প্রয়োজন হয়
- ২-পয়েন্ট লিনিয়ার ক্যালিব্রেশনের গাণিতিক ভিত্তি (slope-intercept ফর্মুলা)
- কীভাবে ক্যালিব্রেশন ফিট প্রয়োগ করে নতুন raw রিডিং-কে সঠিক ইউনিটে রূপান্তর করতে হয়
- ফিটের সঠিকতা যাচাইয়ের একটি জেনুইন sanity check (মূল পয়েন্টগুলো ফিরে আসা)
১ · সিগন্যাল কন্ডিশনিং কী
একটি সেন্সরের কাঁচা আউটপুট প্রায়ই মাইক্রোকন্ট্রোলারের ADC ইনপুট রেঞ্জের (সাধারণত 0 থেকে VREF) সাথে সরাসরি মেলে না — সিগন্যাল হয়তো অনেক ছোট (মাইক্রোভোল্ট পর্যায়ে, অ্যামপ্লিফিকেশন দরকার), অথবা রেঞ্জের বাইরে (লেভেল-শিফট দরকার), অথবা নয়েজি (ফিল্টারিং দরকার — L36 দেখুন)। এই প্রি-প্রসেসিং ধাপগুলোকে একসাথে সিগন্যাল কন্ডিশনিংSignal Conditioningএকটি কাঁচা সেন্সর সিগন্যালকে ADC-এর জন্য উপযুক্ত রেঞ্জে/রূপে প্রস্তুতকরণ প্রক্রিয়া — অ্যামপ্লিফিকেশন, ফিল্টারিং, লেভেল-শিফটিং। বলা হয়। এই কোর্স যেহেতু বাস্তব অ্যানালগ সার্কিট চালায় না (CLAUDE.md-এর সীমাবদ্ধতা অনুযায়ী), তাই আমরা এখানে কন্ডিশনিং-এর ধারণাগত দিকটা কভার করে সরাসরি ক্যালিব্রেশনের গাণিতিক অংশে যাচ্ছি, যেটা আমরা সত্যিই কোড দিয়ে যাচাই করতে পারি।
২ · কেন ক্যালিব্রেশন দরকার
একই মডেলের দুটো সেন্সরও সামান্য ভিন্ন আচরণ করতে পারে (ম্যানুফ্যাকচারিং ভ্যারিয়েশনের কারণে) — তাই একটি সেন্সরের জন্য "raw ADC কোড ৫০০ মানে ঠিক ২৫°C" এই ধরনের ধরে নেওয়া ঝুঁকিপূর্ণ। এর বদলে, প্রতিটি সেন্সরকে দুটো জানা রেফারেন্স পয়েন্টে (যেমন বরফ-পানির মিশ্রণে ০°C, ফুটন্ত পানিতে ১০০°C) পরীক্ষা করে সেই নির্দিষ্ট সেন্সরের জন্য একটি লিনিয়ার সূত্র বের করা হয় — এটাই ২-পয়েন্ট ক্যালিব্রেশন।
৩ · ২-পয়েন্ট লিনিয়ার ক্যালিব্রেশনের সূত্র
ধরা যাক দুটো ক্যালিব্রেশন পয়েন্ট আছে: $(x_1, y_1)$ ও $(x_2, y_2)$ — যেখানে $x$ হলো raw ADC রিডিং আর $y$ হলো তার সাথে মিলিত প্রকৃত রেফারেন্স মান। একটি সরলরেখা $y = mx + b$ এই দুটো পয়েন্ট দিয়ে যাওয়ার জন্য:
$$ m = \frac{y_2 - y_1}{x_2 - x_1} $$ $$ b = y_1 - m \cdot x_1 $$এখানে $m$ হলো স্লোপ (প্রতি ইউনিট raw পরিবর্তনে প্রকৃত মান কতটা বদলায়) এবং $b$ হলো ইন্টারসেপ্ট (raw = 0 হলে প্রকৃত মান কী হতো, বাস্তবে এই বিন্দু হয়তো সেন্সরের কার্যকর রেঞ্জের বাইরে, কিন্তু গাণিতিকভাবে দরকারি)। একবার $m$ ও $b$ পাওয়া গেলে, যেকোনো নতুন raw রিডিং $x$-কে $y = mx + b$ দিয়ে প্রকৃত ইউনিটে রূপান্তর করা যায়।
৪ · সম্পূর্ণ Python সিমুলেশন — ফিট, প্রয়োগ, ও sanity check
নিচের কোড সেলে দুটো ক্যালিব্রেশন পয়েন্ট ধরা হয়েছে: raw = 100 হলে প্রকৃত মান 0.0 (যেমন 0°C-এ), এবং raw = 800 হলে প্রকৃত মান 100.0 (যেমন 100°C-এ)। এখান থেকে $m$ ও $b$ গণনা করে কয়েকটি নতুন raw রিডিং রূপান্তর করা হয়েছে, এবং সবচেয়ে গুরুত্বপূর্ণ অংশ — মূল দুটো ক্যালিব্রেশন পয়েন্টকেই ফিট সূত্রে ফিরিয়ে দিয়ে যাচাই করা হয়েছে সেগুলো হুবহু আসল মান ফেরত দেয় কিনা।
# দুটো জানা ক্যালিব্রেশন পয়েন্ট: (raw ADC রিডিং, প্রকৃত রেফারেন্স মান)
raw1, true1 = 100, 0.0 # যেমন: বরফ-পানির মিশ্রণে (0°C) raw ADC কোড 100
raw2, true2 = 800, 100.0 # যেমন: ফুটন্ত পানিতে (100°C) raw ADC কোড 800
# ২-পয়েন্ট লিনিয়ার ফিট: y = m*x + b
m = (true2 - true1) / (raw2 - raw1)
b = true1 - m * raw1
print(f"গণনাকৃত slope (m) = {m:.6f}")
print(f"গণনাকৃত intercept (b) = {b:.6f}")
def calibrate(raw):
return m * raw + b
# --- sanity check: মূল দুটো ক্যালিব্রেশন পয়েন্ট ফিট সূত্রে ফিরিয়ে দিলে হুবহু আসল মান ফেরত আসা উচিত ---
check1 = calibrate(raw1)
check2 = calibrate(raw2)
print(f"\nsanity check -- calibrate({raw1}) = {check1} (আসল: {true1})")
print(f"sanity check -- calibrate({raw2}) = {check2} (আসল: {true2})")
assert abs(check1 - true1) < 1e-9, "sanity check ব্যর্থ: প্রথম ক্যালিব্রেশন পয়েন্ট মেলেনি!"
assert abs(check2 - true2) < 1e-9, "sanity check ব্যর্থ: দ্বিতীয় ক্যালিব্রেশন পয়েন্ট মেলেনি!"
print("sanity check পাস -- দুটো মূল ক্যালিব্রেশন পয়েন্টই হুবহু ফিরে এসেছে।")
# এখন নতুন raw রিডিং-গুলোকে ক্যালিব্রেটেড ইঞ্জিনিয়ারিং ইউনিটে রূপান্তর করা হলো
new_raw_readings = [250, 400, 600, 950]
print("\nনতুন raw রিডিং -> ক্যালিব্রেটেড মান:")
for r in new_raw_readings:
print(f" raw = {r}\t-> ক্যালিব্রেটেড = {calibrate(r):.2f}")
২-পয়েন্ট ক্যালিব্রেশন একটি সাধারণ কিন্তু শক্তিশালী কৌশল — দুটো জানা রেফারেন্স পয়েন্ট দিয়ে যেকোনো লিনিয়ার সেন্সরের জন্য একটি নির্ভুল রূপান্তর সূত্র বের করা যায়, এবং মূল পয়েন্টগুলো ফিরিয়ে দিয়ে ফিটের সঠিকতা যাচাই করা একটি ভালো ইঞ্জিনিয়ারিং অভ্যাস। পরের পাঠ (L38) এই একই "raw ইনপুট -> সূত্র -> ব্যবহারযোগ্য আউটপুট" ধরনের গণনা মোটর কন্ট্রোলে (PWM ডিউটি সাইকেল, সার্ভো পালস-উইথ) প্রয়োগ করবে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
উপরের কোড সেলে assert লাইনগুলো কেন == true1-এর বদলে
abs(check1 - true1) < 1e-9 ব্যবহার করেছে?
কারণ ফ্লোটিং-পয়েন্ট গণনায় (বিশেষ করে ভাগ জড়িত থাকলে) সামান্য রাউন্ডিং ত্রুটি হতে পারে — তাই সরাসরি
== দিয়ে তুলনা করা ঝুঁকিপূর্ণ। এর বদলে একটি খুব ছোট টলারেন্স (এখানে $10^{-9}$) এর মধ্যে
পার্থক্য আছে কিনা তা যাচাই করা হয় — এটি সংখ্যাসূচক (numerical) কোডে একটি প্রমাণিত ভালো অভ্যাস।
প্র ০২
যদি দুটো ক্যালিব্রেশন পয়েন্টের raw1 == raw2 হয়ে যায় (একই raw মান দুইবার মাপা), তাহলে
উপরের কোড সেলে কী সমস্যা হবে?
m = (true2 - true1) / (raw2 - raw1) লাইনে হর শূন্য হয়ে যাবে, ফলে
ZeroDivisionError ঘটবে। এটাই কারণ যে বাস্তবে ক্যালিব্রেশনের সময় দুটো পয়েন্ট অবশ্যই স্পষ্টভাবে
ভিন্ন raw মানে (এবং সাধারণত সেন্সরের কার্যকর রেঞ্জের দুই প্রান্তের কাছাকাছি) নেওয়া হয়।
প্র ০৩ raw = 950 রিডিং-এর ক্যালিব্রেটেড মান ১০০-এর বেশি (এক্সট্রাপোলেশন) কেন সবসময় নির্ভরযোগ্য নয়?
ক্যালিব্রেশন শুধু দুটো পয়েন্টের মধ্যে (raw 100 থেকে 800) সেন্সরের আচরণ লিনিয়ার বলে ধরে নেয়। সেই রেঞ্জের বাইরে (raw = 950) সেন্সর হয়তো স্যাচুরেট করে যায় বা তার প্রতিক্রিয়া বাঁকা (নন-লিনিয়ার) হয়ে যায় — তাই এক্সট্রাপোলেটেড মান বাস্তব মানের থেকে দূরে সরে যেতে পারে। নির্ভরযোগ্য পরিমাপের জন্য সবসময় ইনপুটকে ক্যালিব্রেশন রেঞ্জের ভেতরে রাখা উচিত, অথবা বেশি পয়েন্ট দিয়ে একটি নন-লিনিয়ার ফিট ব্যবহার করা উচিত।
অনুশীলন
-
চিন্তা করুন: যদি
raw1, true1 = 0, 0.0এবংraw2, true2 = 1023, 100.0হয় (১০-বিট ADC-এর পূর্ণ রেঞ্জ), তাহলে $m$-এর মান কত হবে বলে আপনার ধারণা?$m = (100.0 - 0.0) / (1023 - 0) \approx 0.0978$ — অর্থাৎ প্রতি ADC কোডে প্রায় ০.০৯৭৮ ইউনিট পরিবর্তন, আর যেহেতু
raw1 = 0, তাই $b = 0$ হবে (সূত্র সরাসরি origin দিয়ে যাবে)। -
পরীক্ষা করুন: উপরের কোড সেলে
new_raw_readingsলিস্টে100ও800যোগ করে Run চেপে দেখুন আউটপুট মূলtrue1/true2-এর সাথে মেলে কিনা।হ্যাঁ মিলবে — raw = 100-এর ক্যালিব্রেটেড মান 0.00 এবং raw = 800-এর ক্যালিব্রেটেড মান 100.00 আসবে, কারণ এই দুটো ঠিক সেই মূল ক্যালিব্রেশন পয়েন্ট যেগুলোর উপর ভিত্তি করে $m$ ও $b$ গণনা করা হয়েছে — কোড সেলের sanity check অংশটিই মূলত এই একই যাচাই আগে থেকে করে রেখেছে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ মাইক্রোপ্রসেসর আর্কিটেকচার, এমবেডেড C, GPIO, টাইমার/PWM/ADC, সিরিয়াল প্রোটোকল, RTOS, সেন্সর/অ্যাকচুয়েটর, IoT আর্কিটেকচার, ওয়্যারলেস প্রোটোকল, MQTT/CoAP ও IoT সিকিউরিটি — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
- Computer Architecture & Digital Logic কোর্স সহোদর কোর্স ADC-এর সাধারণ ডিজিটাল-লজিক ও কোয়ান্টাইজেশন ভিত্তি সেই কোর্সের সাথে সম্পর্কিত এই কোর্সের L20-এ কভার করা হয়েছে।
- সব 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 ও আরও অনেক কোর্স — সব এক জায়গায়।