গত আমরা মোটামুটিভাবে বেসিক জিনিসগুলো প্রায় শেষ করে ফেলেছি। সব বেসিকগুলোর মধ্যে, আজকেরটাও অনেক গুরুত্বপূর্ণ। লাইন ফলোয়ার, মেজ সল্ভার ইত্যাদি রোবট বানাতে তো বটেই, Environment Interaction বা পরিবেশের পরিস্থিতির তারতম্যর সাথে যেকোন কাজ করার জন্য ADC মাস্ট। তাহলে দেরি না করে আজকের জন্য দরকারি জিনিসপত্র যোগাড় করে ফেলুন। যা যা লাগবে:

  • 10K / 20K Potentiometer (AKA Variable Resistor)

alt text
  • Premium Jumper Wires [22AWG Solid would work too]

alt text
  • IR Sensor pair [RX/TX] [যেকোন অ্যানালগ IR হলেই হবে, সাধারণত যেসকল জোড়ায় ২-২ পা থাকে সেগুলোই অ্যানালগ IR এবং এরা অ্যানালগ ভ্যালু দিয়ে থাকে। যদি আপনার IR এর যেকোন একটির দুইটির বেশি লেগ বা পা থাকে তাহলে বুঝতে হবে আপনার IR টি অ্যানালগ না, ডিজিটাল। ৩ লেগবিশিষ্ট IR পাওয়া যায় টিভিতে। ডিজিটাল IR থেকে শুধু ০ বা ১ আউটপুট পাওয়া যায়।]

alt text
  • IR Alternative LDR-LED Pair [Light Dependent Resistor]

alt text
  • Resistors [1k, 330, 10k]

ADC শুরুর আগে:

অ্যানালগ কি জিনিস আর ডিজিটাল কি জিনিস? তার আগে আরেকটি ব্যাপার সম্পর্কে ধারণা নেয়া যাক। মাইক্রোপ্রসেসর কিংবা মাইক্রোন্ট্রোলার আপনার মত মোটেই বুদ্ধিমান না। সে শুধু বুঝতে পারে ভোল্টেজ আছে কি নাই। ০ নাকি ১? শুধু এটাই সে বুঝতে পারে। ০ এবং ১ ছাড়াও অসংখ্য State আমরা প্রকৃতিতে তাকালেই দেখতে পাই। প্রকৃতির দরকার কী? একটু ভাবলেই তো হয়। যেমন, ১ থেকে ১০ পর্যন্ত গণনা করার কথাই চিন্তা করা যাক। এভাবে আমরা গুণতে পারি, ১, ২, ৩ …. অথবা ১, ৩, ৫, ৭ …. অথবা ১, ১.১, ১.২, ১.৩, ১.৪ …. .. এইভাবেও গণনা করতে পারি।

হয়ত ভাবছেন এখানে লক্ষ্য করার কী আছে? অবশ্যই আছে, ১ থেকে ১০ এর দূরত্ব নির্দিষ্ট! কিন্তু এটাকে বিভিন্ন ভাবে আমরা মাপতে পারি। সেটা হল, ১ থেকে ১০ এর মধ্যকার দূরত্বকে কতগুলো ভাগে ভাগ করে। আচ্ছা এবার ভাবুন তো, গণনার ক্ষেত্রে কোনটি বেশি এফিশিয়েন্ট? ১, ২, ৩ নাকি ১.১, ১.২, ১.৩?আসলে জিনিসটা নির্ভর করে আমি আসলে আমার গন্তব্যস্থলে যাওয়ার জন্য কতগুলো স্টেপস চাচ্ছি? একটি করে স্টেপস নিয়েও সিড়ি দিয়ে উঠা যায় আবার ডাবল স্টেপ একবারে নিয়েও উঠা যায়। আমাদের যখন যেমন দরকার আমরা তখন তেমন স্টেপস নিয়ে থাকি।

আমরা এখন ADC এর সাথে এই গণনা জিনিসটার ভাগের সাথে একটা সম্পর্ক তৈরি করব। কিন্তু তার আগে একটু আঁতলামি করা প্রয়োজন।

ধরুন, আপনাকে sin(theta) এর কার্ভ আঁকতে দেওয়া হল vs theta। মানে কোণের সাথে sin(কোণ) এর সম্পর্ক দেখানোর জন্য। আরও ধরুন, আপনাকে প্রতি 90 ডিগ্রি গ্যাপে গ্যাপে বিন্দু বসাতে হবে। একবার 0 ডিগ্রির বিপক্ষে বসালেন sin(0) ঠিক পরের স্টেপে 90 ডিগ্রির জন্য বসাতে হবে এবং অনুরূপভাবে প্রতি 90 ডিগ্রি অন্তর অন্তর sin(theta) এর মান প্লট করতে হবে। তাহলে গ্রাফটি হবে এমন (ধরুন আপনি সাইন কার্ভ সম্পর্কে কিছুই জানেন না তাই পয়েন্টগুলো সরলরেখা দিয়ে যোগ করে দিলেন)

সাইন ওয়েভ (৯০ ডিগ্রি পর পর প্লট করা হয়েছে)

alt text
x = 0:90:720;
plot(x, sind(x));

আমরা এই গ্রাফের জন্য স্টেপ ৯০ কে একক হিসেবে নিয়েছি। যেহেতু ৯০*৪ = ৩৬০ তাই একটি সাইকেলের গ্রাফ আঁকতে আমার নেওয়া স্থানাংকের পরিমাণ ! এখন প্রতি ৯০ ডিগ্রি পর পর না করে এক কাজ করা যাক, প্রতি ডিগ্রি কে একক ধরে আমরা গ্রাফটি আবার আঁকি।

alt text

ইয়েস, আগের মত Sawtooth গ্রাফ নয় বরং বেশ স্মুথ একটি গ্রাফ পাওয়া গেল! এটা পিউর সাইন ওয়েভ না কিন্তু কাজ করার মত যথেষ্ট। সাইন ওয়েভ অ্যানালগ সিগনালের উৎকৃষ্ট উদাহরণ।

এবার চলুন একটি ডিজিটাল সিগনাল দেখা যাক:

alt text

অ্যানালগ সিগনাল ও ডিজিটাল সিগনালের মধ্যে কিছু তফাৎ:

অ্যানালগ সিগনাল সময়ের ক্ষুদ্রাতিক্ষুদ্র পরিবর্তনের সাথে পরিবর্তিত হয়, তাই এর বিভিন্ন সময়ে মান বিভিন্ন হয় আর আলাদা করা কঠিন; কিন্তু ডিজিটাল সিগনাল একটা নির্দিষ্ট সময় পর্যন্ত নির্দিষ্ট মান দেয় তাই আমরা সহজেই বলতে পারি (ছবি থেকে) ০-১ সেকেন্ড পর্যন্ত ভোল্টেজ ০ আর ১-২ সেকেন্ড ভোল্টেজ

ওই কারণেই আমরা অ্যানালগ সিগনালের ক্ষেত্রে বলতে পারি এর মান একটি নির্দিষ্ট রেঞ্জে পরিবর্তিত হয় কিন্তু ডিজিটালে যেহেতু পরিবর্তনটাও নির্দিষ্ট তাই ডিজিটালের ক্ষেত্রে 0V কে OFF বা 0 এবং 5V বা Reference Voltage কে ON ধরা হয়।

সবই বুঝলাম, কিন্তু ADC আসলে কী?

আমরা অ্যানালগ সিগনাল দেখলাম আর ডিজিটাল সিগনাল দেখলাম, ADC এর কাজ হল অ্যানালগ সিগনাল থেকে ডিজিটাল সিগনালে রূপান্তরিত করা। ডিজিটাল সিগনাল থেকে আমরা নির্দিষ্ট কিছু মান পাই সেটা আগেই দেখানো হয়েছে। ডিজিটাল সিগনালে কনভার্ট করার মাধ্যমে আমরা সেন্সরের পাঠানো অ্যানালগ সিগনাল থেকে অ্যাকচুয়াল রিডিং নিতে পারি। আবারও আমরা একটি অ্যানালগ সিগনাল দেখি:

alt text
theta = 0:.1:90;
plot (theta, sind(theta));
axis([0 90 0 1]);

উপরের গ্রাফটি হল বিখ্যাত sine এর। যেটা ০-৯০ ডিগ্রি এর বিপরীতে মান বের করে প্লট করা হয়েছে। উপরের সিগনালটি যদি আমি 3-bit ADC Channel এর মাধ্যমে Pass করি তাহলে আউটপুট আসবে নিচেরটা:

alt text
syms x;
sqr = floor(x);
ezplot(sqr, [0, 8]);

ছবি থেকে দেখা যাচ্ছে সিগনালটিকে 8 ভাগ করা হয়েছে! তারমানে 3-bit ADC Channel = 2^3 = 8 ভাগ বা স্টেপস।

আরেকটু ক্যালকুলেশন করা যাক, যদি আমরা Peak Value বা অ্যানালগ সিগনালের সর্বোচ্চ ভ্যালু 5V ধরি তাহলে প্রতিটি ভাগ 5/8 = 0.625V নির্দেশ করে। তারমানে 2.5V ভোল্টেজ মাপা গেলে ADC Value হবে 4 এবং 5V রিডিং পাওয়া গেলে ADC Value হবে 8

এই ADC Value এর Accuracy নির্ভর করে ADC এর Resolution এর উপর। আমরা আগেই দেখেছি, অ্যানালগ সিগনালকে যত ভাগ করতে পারব ততটাই নিখুঁত কাজ আমরা করতে পারব। আর্ডুইনো আমাদের কতটা ফ্লেক্সিবিলিটি দেয় ADC এর জন্য? – আর্ডুইনোর ADC এর রেজোল্যুশন 1024 তার মানে এটি 5V এর জন্য 1023 রিডিং দেবে (ইনডেক্সিং ০ থেকে শুরু হয় তাই ১০২৩)। 2.5V এর জন্য রিডিং পাবেন 512.. ইত্যাদি। Arduino এর ADC Channel কে তাই 10-bit বলা হয় [2^10 = 1024]

আর্ডুইনোতে ADC [অ্যানালগ টু ডিজিটাল কনভার্সন]:

আর্ডুইনোতে সেন্সর রিডিং নেয়ার জন্য UNOMega এর জন্য বোর্ডের বামপাশের A0-A5 (UNO)A0-A15(Mega) পিনগুলো ব্যবহার করা হয়। সেন্সর কানেক্ট করে আমরা সিরিয়াল মনিটরে সেন্সর রিডিং চেক করতে পারব।

ADC এর জন্য ব্যবহৃত Arduino Function:

int sensorValue = analogRead(int sensorPin);

analogRead ফাংশনটির আর্গুমেন্ট ও রিটার্ন টাইপ ইন্টিজার। আর্গুমেন্ট হিসেবে এটি পিন নাম্বার নেয় এবং ভ্যালুর রিটার্ন করে।

আর্ডুইনো ও পটেনশিওমিটার:

পটেনশিওমিটার একটি ভ্যারিয়েবল রেজিস্ট্যান্স ছাড়া কিছুই না। আমরা এর একপাশে 5V ও আরেকপাশে GND দিয়ে যদি স্ক্রু ড্রাইভার দিয়ে ঘুরাই তাহলে মাঝের পিনটি যে অংশে যুক্ত থাকবে সেটার ভোল্টেজ সেখানে থাকা জাম্পারের মধ্য দিয়ে আর্ডুইনোতে রিড হবে। রেসিস্টিভিটি সেন্সরের একটি গুরুত্বপূর্ণ অংশ, টাচস্ক্রিন কিংবা জয়স্টিক মূলনীতি এই ভ্যারিয়েবল রেজিস্ট্যান্স। IR, LDR এগুলো Photosensitive / Photo reflective sensor তারমানে আলোর উপর নির্ভর করে এইসব সেন্সর কাজ করে থাকে।

সার্কিট ডায়াগ্রাম:

খুবই সহজ কাজ, একটি পটেনশিওমিটার নিন আর তিনটা জাম্পার নিন। ছবির মত করে কানেক্ট দিন ও আর্ডুইনো কোড আপ্লোড করুন: alt text

প্রোগ্রাম:

ওয়াকথ্রু-র কিছু নেই আপাতত, আর্ডুইনো সম্পর্কিত আগের পরিচ্ছদগুলোতে ব্যাখ্যা দেওয়া আছে।

const int potPin = 14; //Change 14 to 53 If you use Arduino Mega
void setup()
{
Serial.begin(9600);
pinMode(potPin, INPUT); //Sensors are always set as INPUT
}
void loop()
{
int value = analogRead(potPin);
Serial.println(value);
delay(200);
}

আউটপুট:

সিরিয়াল মনিটর ওপেন করুন ও একটি স্ক্রু ড্রাইভার দিয়ে পটেনশিওমিটারটিকে ঘুরিয়ে দেখুন

alt text

IR Sensor ও আর্ডুইনো:

IR সেন্সর চেকিং: সেন্সর কানেক্ট করে মোবাইল বা যেকোন ক্যামেরা দিয়ে দেখুন IR Led টা জ্বলছে কিনা। IR Led এর কাজ হল IR Ray পাঠানো তাই একে IR TX বলা হয় আর IR RX এর কাজ হল IR গ্রহণ করে ভোল্টেজ দেওয়া। আমরা তাই আর্ডুইনো পিন IR RX এর সাথে কানেক্ট করে রিডিং চেক করে থাকি। লাইন ফলোয়ার কিংবা লাইন মেজ সল্ভার বানাতে গেলে অবশ্যই আপনাকে IR সম্পর্কে ভাল করে জানতে হবে।

সার্কিট ডায়াগ্রাম:

330 Ohm রেজিস্ট্যান্স ব্যবহার করতে হবে IR TX এর সাথে এবং 10K ব্যবহার করতে হবে IR RX এর সাথে। IR Pair না থাকলে একই কাজটি আপনি LDR দিয়েও করতে পারেন। দুটির কানেকশন ডায়াগ্রাম ও প্রোগ্রাম একই। যেখানে IR LED এর বদলে ব্যবহার করবেন সাধারণ LED।

alt text alt text

প্রোগ্রাম:

পটেনশিওমিটারের ক্ষেত্রে যে প্রোগ্রাম ব্যবহার করা হয়েছে সেটাতেই কাজ হবে। পরবর্তীতে সেন্সর রিডিং চেক করার জন্য নতুন লাইব্রেরির ব্যবহার দেখানো হবে।

সচরাচর জিজ্ঞাস্য প্রশ্ন:

ADC কী অনেকটা PWM এর মত?

উত্তর:

হ্যাঁ অনেকটা, পার্থক্য হল ভোল্টেজ দেওয়ার সময় আমরা 0-255 ভাগে ভাগ করতে পারি কিন্তু রিড করার সময় আমরা 0-1023 ভাগে ভাগ করতে পারি।

IR এ ম্যাক্সিমাম কত ভোল্টেজ দেওয়া যাবে?

উত্তর:

৫ ভোল্টের বেশি দিলে পুড়ে যাওয়ার সম্ভাবনা অত্যাধিক। IR Led এর সাথে 330Ohm আর Receiver এর সাথে 1/10K ব্যবহার করতে ভুলবেন না।

গ্রাফগুলো কীভাবে জেনারেট করেছেন? প্রতিটি গ্রাফের শেষের কোডগুলি কিসের?

গ্রাফগুলো MATLAB দিয়ে জেনারেট করা হয়েছে, গ্রাফগুলো জেনারেট করার জন্য যে কোড ব্যবহার করেছি সেটা।