# অ্যানালগ থেকে ডিজিটাল রূপান্তর (ADC)

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

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

![alt text](http://i.imgur.com/y3KRTNl.jpg)

* Premium Jumper Wires \[22AWG Solid would work too]

![alt text](http://i.imgur.com/eqQ5rvL.jpg)

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

![alt text](http://i.imgur.com/mcdTAnS.jpg)

* IR Alternative LDR-LED Pair \[Light Dependent Resistor]

![alt text](http://i.imgur.com/Z97MEPS.jpg)

* Resistors \[1k, 330, 10k]

## ADC শুরুর আগে:

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

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

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

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

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

![alt text](http://i.imgur.com/Ucm5Tk0.png)

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

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

![alt text](http://i.imgur.com/uviFWmw.png)

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

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

![alt text](http://i.imgur.com/rCKTKkx.png)

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

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

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

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

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

![alt text](http://i.imgur.com/USAsTmb.png)

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

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

![alt text](http://i.imgur.com/OgrWbtl.png)

```
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 \[অ্যানালগ টু ডিজিটাল কনভার্সন]:

আর্ডুইনোতে সেন্সর রিডিং নেয়ার জন্য `UNO` ও `Mega` এর জন্য বোর্ডের বামপাশের `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](http://i.imgur.com/vxGQhFJ.png)

### প্রোগ্রাম:

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

```
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](http://i.imgur.com/dnHmxGD.gif)

## `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](http://i.imgur.com/v1gVcfg.gif) ![alt text](http://i.imgur.com/nktQ1kj.jpg)

## প্রোগ্রাম:

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

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

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

#### উত্তর:

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

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

### উত্তর:

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

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://arduino.howtocode.dev/basic_ideas/adc.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
