আর্ডুইনো বোর্ড ও কোড সম্পর্কে ধারণা

যা যা লাগবে:

  • একটি আর্ডুইনো বোর্ড [Arduino Uno / Mega 2560]

  • ব্রেডবোর্ড

  • কিছু প্রিমিয়াম জাম্পার / 22AWG Solid Wires

  • একটি LED

  • একটি রেজিস্ট্যান্স [220Ohm / 330 Ohm / 1k]

  • সিম্যুলেশনের জন্য Proteus 8.0 SP1 or Latest Version

আর্ডুইনো বোর্ড:

উপরের ছবিতে আর্ডুইনো উনো বোর্ডের [Top-View] বিভিন্ন জিনিস দেখানো হয়েছে। বামপাশের উপরের থেকে শুরু করা যাক।

  • USB Connector: বামপাশ-উপরে-কোণায় যে স্টিলের মত জিনিসটি দেখা যাচ্ছে সেটি হল USB Connector, আপনার USB A-B ক্যাবলের A প্রান্ত Arduinoর সাথে কানেক্ট করতে হবে। পিসির সাথে Arduino কানেক্ট করলে তার কাজের জন্য 5V সে পিসি থেকে নিয়ে নেয়।

  • External Power Connector: বামপাশ-নিচে-কোণায় কাল রংয়ের একটি কানেক্টর দেখবেন যেখানে DC 9-12V সাপ্লাই দিতে পারবেন। খবরদার AC সাপ্লাই দিবেন না :P ।

  • Digital Operation Pin-outs: বোর্ডের উপরে যে 17 টা পিন দেখতে পাচ্ছেন সেগুলোতে Digital Operation করা হয়। কিছু পিনের নিজস্ব বৈশিষ্ট আছে।

  • 0, 1 :এই পিন দুইটি Serial Communication এর জন্য। 0 পিনটি RX [Receive/ Receiver / Reception] এবং 1 পিনটি TX [Transmit/ Transmitter/ Transmission] [বিগিনারদের জন্য অনেক কথাই মাথার উপর দিয়ে যেতে পারে কিন্তু চিন্তার কিছু নেই এগুলো নিয়ে আলোচনা করা হবে]

  • 2-13 : এই পিনগুলো ডিজিটাল অপারেশনের জন্য। আউটপুট ভোল্টেজ 5V ইনপুটে 3V~5V পর্যন্ত। কিছু পিনের আগে ‘~’ চিহ্ন আছে, তারমানে ওই পিনগুলো দিয়ে PWM [Pulse Width Modulation] করা যাবে

  • GND : এটা হল Digital Ground, যারা ইলেক্ট্রনিক্স সম্পর্কে পড়ালেখা করেছেন তাঁরা নিশ্চয়ই Ground এবং Digital Ground এর মধ্যে তফাৎ জানেন।

  • AREF : Analog Reference Pin, Analog Signal ভালমত বিশ্লেষণের জন্য এই পিনটা লাগে। এই সিরিজে পিনটি ব্যবহৃত হবে না।

  • Reset Button: বোর্ড ও বোর্ডের ভার্সন [Revision] ভেদে এই বাটনটির অবস্থান বিভিন্ন হতে পারে, যেমন Mega তে মাঝখানে, UNO R2 এ মাঝখানে ও R3 তে কোণায়। এই বাটনটির কাজ প্রোগ্রাম রিস্টার্ট করা। যারা ভাবছেন বাটনটি MCU থেকে প্রোগ্রাম ডিলিট করে দেয় তাদের ধারণা ভুল :P

  • In-Circuit Serial Programmer বা ICSP Header Pin [মেইন চিপের আশেপাশে]: আপনি ইচ্ছা করলে একটি আর্ডুইনো বোর্ড দিয়ে অন্য আর্ডুইনো বোর্ড বা Atmega সিরিজের নির্দিষ্ট কিছু MCU প্রোগ্রাম করতে পারেন, অন্য MCU বা Board প্রোগ্রাম করার জন্য কিছু Specific পিন লাগে। পিনগুলো হল: MOSI {Master Out Slave In}, MISO {Master In Slave Out}, SCK {Serial Clock}, RESET, VCC {+5V}, GND {Ground}। কাজের সুবিধার্থে বোর্ডে পিনগুলো আলাদা করে দেওয়া আছে। আপনি ইচ্ছা করলে এই পিনগুলো ব্যবহার করতেও পারেন নাও পারেন।

  • Atmega 328P-PU MCU: এটাই মূলত আর্ডুইনোর প্রাণ। এটা হল Atmel Co. এর তৈরি AVR আর্কিটেকচারের ATmega সিরিজের মাইক্রোকন্ট্রোলার। এটাতেই মূলত আপনি আপনার কোডগুলো আপ্লোড করেন। এর যে Leg আছে সেগুলো আসলে বোর্ডের দুইপাশে যে পিনআউট আছে সেগুলো।

  • ATmega 16u2 / ATmega8u2 MCU: সাধারণত এই চিপটি থাকে USB পোর্টের পিছনে বা আশেপাশে, এটি মূলচিপের মত তো বড় নয় বটেই, অনেক ছোট। এর কাজ হল Arduino এর সাথে Computer এর Serial Communication এ সহযোগিতা করা বা পিসির সাথে কথা বলা।

  • ICSP Header for ATmega 16u2 MCU: আরেক সেট ICSP হেডার পিন দেখতে পাবেন ওই চিপের আশেপাশে। ATmega 16u2 বুটলোডার বার্ন অথবা অন্য চিপ ফ্ল্যাশ করার কাজে আপনি এই হেডার পিনগুলো ব্যবহার করতে পারবেন।

  • A0-A5 Analog In (pins): সহজ কথায় সেন্সর কানেক্ট করতে এই পিনগুলো ব্যবহৃত হয়। UNO তে একসাথে 6 টা অ্যানালগ সেন্সর ব্যবহার করতে পারবেন। মেগার ক্ষেত্রে সংখ্যাটা প্রায় ১৬ টি। ADC [Analog to Digital Conversion] এর কাজে পিনগুলো ব্যবহার করা হয়। পিনগুলো 14, 15 … 19 সংখ্যা দ্বারাও প্রকাশ করা হয়ে থাকে।

  • Voltage in (Vin): এই পিনে আপনি External Power সাপ্লাই করতে পারেন। এটিও 7-12V DC নিতে পারে।

  • GND: এটা হল Ground পিন

  • 3.3V: অনেক মডিউলে 5V দিলে সেটি পুড়ে যেতে পারে তাই আর্ডুইনো বোর্ড থেকে সেই সুবিধাও আপনি নিতে পারেন, এই পিন থেকে আপনি 3.3V DC আউটপুট পাবেন।

  • Reset: যেখানে Reset পিন লাগবে সেটার জন্য এটা ধার নিতে পারেন :P

এছাড়াও আর্ডুইনোতে ক্যাপাসিটর, 12V রেগুলেটর, রেজিস্ট্যান্স, 16Mhz ক্রিস্টাল, 3.3V রেগুলেটর, RX-TX Led, 13-pin LED, Power LED ইত্যাদি আছে।

আর্ডুইনো প্রোগ্রামিং:

আর্ডুইনো প্রোগ্রামিং সম্পর্কে ধারণার জন্য আমরা গতবারের করা Blink প্রোগ্রামটি আরেকবার দেখতে পারি। তার আগে বলে রাখা ভাল, আর্ডুইনোর প্রোগ্রাম ফাইলের নাম .ino পূর্বে .pde ছিল।

int ledPin = 13; // Putting integer value in a variable [A single line comment]

/* This is a Multiline
comment */

void setup()
{
   pinMode(ledPin, OUTPUT);
}

void loop()
{
   digitalWrite(ledPin, HIGH);
   delay(1000);
   digitalWrite(ledPin, LOW);
   delay(1000);
}

যাদের জাভা/ সি/ সি++ প্রোগ্রামিং ল্যাঙ্গুয়েজ সম্পর্কে ধারণা আছে তারা সহজেই কোডটি বুঝবেন। যাদের প্রোগ্রামিং এক্সপেরিয়েন্স নেই তারা দয়া করে পুরোটা পড়বেন এবং যাদের প্রোগ্রামিং এক্সপেরিয়েন্স আছে তাদের হাল্কা চোখ বুলিয়ে গেলেই হবে।

Line 1:

এখানে int ledPin = 13 লেখা আছে। int হল ডেটাটাইপ যার পূর্ণ প্রকাশ integer [পূর্ণসংখ্যা]। Variable হল এমন এক জিনিস যার মান পরিবর্তিত হতে পারে। এই লাইনটির মানে হল ledPin নামের একটা ভ্যারিয়েবল তৈরি কর আর তার ভেতর 13 সংখ্যাটি প্রবেশ করাও।

ভ্যারিয়েবল আমরা বক্স হিসেবে কল্পনা করতে পারি, ধরা যাক toy KhelnarBaksho = gari; এটা দ্বারা বুঝালাম toy হল একটা থিংটাইপ (thing) আর KhelnarBaksho একটি বাক্স আর ‘=’ চিহ্ন দিয়ে gari দিয়ে বুঝালাম আপনার খেলনার গাড়িটি এর মধ্যে রাখুন। (আবার toy কে সিরিয়াসলি কোন টাইপ ধরবেন না, এটা দ্বারা উদাহরণ দিলাম মাত্র :P )

নিচের কোডটি দেখা যাক:

toy khelnarBaksho = jeep;
khelnarBaksho = remoteControlledCar;

এই দুইলাইনের কোড আসলে কি বলতে চায়? প্রথমে আপনি একটি khelnarBaksho নামের বক্স তৈরি করলেন এবং তাতে আপনার খেলনা jeep রাখলেন। এবার ভাবুন আপনি আপনার জন্মদিনে একটি remote_Controlled_Car পেলেন এবং সেটা আপনি আগের বক্সে রাখতে চান।

এখন যদি আমি, khelnarBaksho = remoteControlledCar লিখি তাহলে কিন্তু একটা ছোট্ট সমস্যা আছে। সেটা হল এই কাজটি করার সাথে সাথে আপনার jeep টি replaced হয়ে যাবে এবং আপনি তাকে আর ফিরে পাবেন না। :P এখানে আরেকটি লক্ষণীয় বিষয় এই যে, আমি প্রথমবার toy কথাটা লিখেছি কিন্তু পরেরবার আর লিখিনি। আসলে প্রথমবার আমি যখন toy কথাটি লিখে বাক্স তৈরি করেছি তখন অটোমেটিক তার জন্য মেমরিতে জায়গা তৈরি হয়ে গেছে যেটি একটি toy type জিনিস গ্রহণ করবে।

যদি আমি আমার jeep এবং remoteControlledCar দুইটাই রাখতে চাই তাহলে নিচের কোডটি লিখব:

toy jeepBox, remoteControllledCarBox;
jeepBox = jeep;
remoteControlledCarBox = remoteControlledCar;

ডেটাটাইপ প্রথম ভ্যারিয়েবল, ২য় ভ্যারিয়েবল, ….. এভাবে ভ্যারিয়েবল তৈরি করা যায়। এবার দেখুন, জিপের জন্য এবং রিমোট কন্ট্রোল গাড়ির জন্য দুইটি বাক্স তৈরি করেছি এবং একটাও হারানো যায় নি :P

‘//’ দেওয়ার পরের কথাগুলোকে বলা হয় Comment, কমেন্ট করার কারণ হল, অনেক সময় যদি আপনি কোড লিখেন পরে বুঝতে পারবেন না কিসের জন্য লিখেছেন; সেটা বুঝার জন্য অথবা অন্যকে কোড বুঝানোর জন্য Comment অনেক সময় দরকার হয়। // দিয়ে সিঙ্গেল লাইন Comment করা হয়। কম্পাইলার যখন // দেখতে পায় তখন সে আর সেই লাইন কম্পাইল করার চেষ্টা করে না।

Line 3:

/ / এইটা দিয়ে মাল্টি লাইন কমেন্ট দেয়। কমেন্ট বিশাল আকৃতির হলে বারবার // দেওয়ার চেয়ে / / ব্যবহার করা ভাল। :P

Line 6:

void setup() , প্রতিটা আর্ডুইনো প্রোগ্রামে দুইটি ফাংশন থাকতেই হবে সেটা হল; void setup() {} এবং void loop() {}। ফাংশন হল সেই জিনিস যার মধ্যে কিছু স্টেটমেন্ট থাকবে। যেমন y = f(x) = x^2 একটি ফাংশন কারণ f(x) এ আর্গুমেন্টে* আমরা যা দিব x^2 স্টেটমেন্টটি কাজ করে আমাদের সেই সংখ্যার বর্গ আউটপুটে দিবে। সি/সি++, জাভা, আরর্ডুইনো ইত্যাদি প্রোগ্রামগুলোতে ফাংশনের শুরু শেষ বুঝাতে {} সেকেন্ড ব্র্যাকেট (Curly Braces) ব্যবহার করা হয়।

void setup() ফাংশনটি আর্ডুইনো পাওয়ার আপ করার সাথে সাথে রান হয় এবং কেবলমাত্র একবার রান হয়। এই ফাংশনটি আমরা ব্যবহার করি যেকোনকিছু ইনিশিয়ালাইজ করতে, কোন পিন আউটপুট হবে না ইনপুট হবে সেটা নির্ধারণ করতে বা এমন কোন কাজে যেটা একবার করলেই হয়। সেই স্টেটমেন্টগুলো আমরা সাধারণত void setup() ব্যবহার করি। void বলতে বুঝাচ্ছে ফাংশনটি কিছু রিটার্ন* করবে না।

Line 8:

pinMode(ledPin, OUTPUT); এই স্টেটমেন্টে একটা ফাংশন দেখা যাচ্ছে যার নাম pinMode(arg1, arg2)। এই ফাংশনটির ডেফিনিশিন বা কি কি কাজ, কীভাবে করবে সেটি আর্ডুইনো লাইব্রেরিতে দেওয়া আছে। আমরা এভাবে লিখে ফাংশনটিকে Call** করলাম মাত্র। ফাংশনটির কাজ হল আর্ডুইনো বোর্ডের কোন একটি পিনকে INPUT হিসেবে নিবে নাকি OUTPUT হিসেবে নিবে সেটা নির্ধারণ করা। INPUT বলতে সেন্সর, বাটন বা এইজাতীয় জিনিসপত্রকে বুঝায়, OUTPUT বলতে Led, Motor ইত্যাদি জিনিসগুলোকে বুঝায়।

pinMode ফাংশনটি দুইটা আর্গুমেন্ট নেয়। প্রথমটি int টাইপ বা আর পরেরটি mode টাইপ। pinMode(int, mode) বললে বুঝতে সুবিধা হবে। আর্ডুইনোতে আমার জানামতে mode দুইরকম দেওয়া আছে INPUT আর OUTPUT। যেহেতু Led একটি আউটপুট তাই আমরা এটাকে OUTPUT হিসেবে ডিফাইন করলাম ফাংশনটির মাধ্যমে। আর এই প্রোগ্রামে আমার পিনটাকে মাত্র একবার বললেই হচ্ছে সেটা ইনপুট না আউটপুট হবে তাই আমরা ফাংশনটি void setup() এর মধ্যে Call করলাম। Simple as that.

Line 11:

void loop() {}, এই ফাংশনটির ভিতরে যতগুলো স্টেটমেন্ট থাকবে সেটা বারংবার রান হতে থাকবে [পাওয়ার যতক্ষণ আছে ততক্ষণ]। এটাকে সাধারণ কথায় একটা infinity loop এর উদাহরণ হিসেবে বলা যায়। আগেই বলা হয়েছে যেকোন আর্ডুইনো প্রোগ্রামে আর কিছু থাকুক কি না থাকুক, void setup এবং void loop থাকতেই হবে। আপনি ইচ্ছা করলে void setup বা void loop এর ভিতরটা ফাকা রাখতে পারেন কিন্তু কোড কম্পাইল করার সময় আপনাকে এইদুইটা ফাংশন লিখতেই হবে।

Line 13:

digitalWrite(ledPin, HIGH); এইখানে আমরা আরেকটি ফাংশনকে Call করলাম যার নাম digitalWrite(int, bool)। এই ফাংশনটির কাজ হল একটি নির্দিষ্ট Pin এ 5V দেওয়া অথবা 0V দেওয়া। ফাংশনটির দুইটা আর্গুমেন্ট, একটি হল int আরেকটি হল boolean বা সংক্ষেপে bool। কম কথায়, boolean হল হ্যাঁ/ না জাতীয় লজিক। HIGH এর Synonym হিসেবে আমরা true, 1, yes ইত্যাদি ধরতে পারি এবং LOW এর Synonym হিসেবে false, 0, no হিসেবে ধরতে পারি।

ফাংশনটি আসলে যেটা করে সেটা হল, __ নাম্বার পিনে ভোল্টেজ দাও/নাও। এই ফাংশন কিছু রিটার্ন করে না।

Line 14:

delay(1000), ডিলে আবারও আর্ডুইনোর বিল্ট-ইন একটি ফাংশন। delay(int) ফাংশনটির আর্গুমেন্টে যে সংখ্যা আপনি পাস করবেন সেটার একক হল মিলিসেকেন্ড। তারমানে 1000 পাস করলে 1s বুঝায়। delay এর কাজ হল একটি নির্দিষ্ট সময় ধরে আর্ডুইনো বোর্ডকে পুরা হ্যাং করে রাখা। [থ্রেডিং এ অনেকটা thread.sleep(int) এর মত]

মনে রাখতে হবে delay তে যত সময় দেওয়া হবে সে ততক্ষণ পর্যন্ত পরবর্তী লাইন এক্সিকিউট করবে না এবং সেই কারণে তখন আর্ডুইনো কোন কাজ-ই করবে না। ইনপুটের সময় ডিলে ফাংশন যতটা এড়ানো যায় তত ভাল।

একনজরে পুরো প্রোগ্রাম:

*   একটি ভ্যারিয়েবল ledPin নাও এবং তাতে 13 সংখ্যাটি সংরক্ষণ কর
*   একবার চলবে { ledPin কে আউটপুট হিসেবে সেট করো  } [void setup এ]
*   চলতে থাকবে {
*   ledPin এ ভোল্টেজ দাও
*   ১০০০ মিলিসেকেন্ড অপেক্ষা করো
*   ledPin এ ভোল্টেজ দিও না
*    ১০০০ মিলিসেকেন্ড অপেক্ষা করো
}

এভাবে আপনার কানেক্ট করা led টি জ্বলবে ও নিভবে। আশা করি প্রোগ্রামটি সবাই বুঝেছেন। না বুঝলে কমেন্ট অপশন তো থাকলই।

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

প্রোটিয়াসে সার্কিট কানেকশন ও সিম্যুলেশন (gif)

ISIS এ ডায়াগ্রাম আঁকা:

ভার্চুয়াল আর্ডুইনোতে কোড আপ্লোড করা:

আপতত এই পর্যন্তই। পরবর্তী পোস্টে ডিজিটাল ইনপুট আউটপুট অপারেশন দেখানো হবে।

নোট:

প্রোগ্রামিংয়ের ফাংশন হুবহু গণিতের ফাংশনের মতই। y = f(x) যেকোন একটি ফাংশন হতে পারে কিন্তু y = f(x) = 2 x এ 2 * x স্টেটমেন্টটির কাজ হল f(x) এ আপনি যে ভ্যালুটা পাঠাবেন এই স্টেটমেন্টের দ্বারা সেটাকে দ্বিগুণ করা হবে।

**ধরা যাক, z = f(r, x) = r^2 + x^2, এখানে আমি আর্গুমেন্টে যদি দুটি সংখ্যা পাঠাই যেমন, z = f(2,3) = 2^2 + 3^2 = 4 + 9 = 13 হবে তার আউটপুট। ঠিক সেইভাবেই আমরা চিন্তা করতে পারি digitalWrite হল একটি ফাংশন যে আর্গুমেন্টে integer টাইপ ও bool টাইপ ডেটা নেয় আর একাধিক আর্গুমেন্ট থাকলে ‘,’ দ্বারা লেখা হয়।

* আপনি যখন একটি ফাংশন তৈরি করলেন তখন অবশ্যই আপনাকে তৈরি করার সময় বলে দিতে হবে যে সেটা কি ফেরত [return] দিবে। ধরা যাক, আপনার ওয়াশিংমেশিনটির মেথড washClothes, তাহলে আপনিই চিন্তা করুন; আপনার ওয়াশিংমেশিনয়ের মেথডের আর্গুমেন্ট কি এবং রিটার্ন টাইপ কি?

আপনি ওয়াশিংমেশিনয়ে কাপড় ইনপুট দেন এবং সেই কাপড়-ই আউটপুট পান (পরিষ্কার কাপড় অবশ্যই), তাহলে সেই হিসাবে ফাংশনটির ডেফিনিশন হবে cloth washClothes(cloth); ধরুন আপনি মস্তবড় ইলেক্ট্রিশিয়ান এবং আপনি আপনার ওয়াশিংমেশিন আপগ্রেড করতে গিয়ে তার মেথডটি পাল্টিয়ে void washClothes(cloth) করে দেন! এটা করার পরে দেখলেন ওয়াশিংমেশিনটি কাপড় কাঁচছে ঠিকি কিন্তু সেই কাপড় আর ফেরত দিচ্ছে না :P। এই ঘটনার মূল কারণ হল তার রিটার্ন টাইপ আপনি পাল্টে দিয়েছেন, void এর সমার্থক শব্দ null বা নাই, তাই কাপড় কাঁচার পর সে আর কাপড় ফেরত দেয় না।

** ফাংশন Call, ধরা যাক আপনি বিশাল অঙ্ক করছেন, কোন একজায়গায় আপনি দুইটা ফাংশন বানালেন, f(x) = 5x, g(y) = 10y। এখন আপনি যদি অঙ্ক করার সময় কোথাও f(2), g(2) ইত্যাদি লিখেন তার মানে হল আপনি ওই ফাংশনটিকে Call করছেন কাজটি করে আউটপুট দেওয়ার জন্য। আর্ডুইনো প্রোগ্রামিং আমরা কাজের সুবিধার্থে সব loop ফাংশনে না রেখে user defined function ব্যবহার করে ফাংশন তৈরি করে যখন দরকার তখন Call করি।

সচরাচর জিজ্ঞাস্য প্রশ্ন: (F. A. Q)

প্রশ্ন:

আপনি blinking প্রোগ্রামটিতে ledPin নামক ভ্যারিয়েবল নিলেন যেটার কোন দরকার দেখছি না, digitalWrite(13, HIGH) লিখলে কী কাজ করত না? আর আমার মনে হচ্ছে পিন নাম্বারকে ধ্রুবক হিসেবে ব্যবহার করা ভাল কারণ আমি তো আর পিন পাল্টাচ্ছি না।

উত্তর:

হ্যাঁ আপনার প্রতিটা কথাই ঠিক। digitalWrite(13, HIGH) লিখলেও কাজ করবে। মনে করুন, আপনার অনেকগুলো Led, Sensor ইত্যাদি দিয়ে একটি প্রজেক্ট বানালেন, এখন আমি যদি পিন নাম্বার দিয়ে কাজটি করতে যাই তাহলে আমার বারবার দেখতে হবে কত নাম্বার পিনে কোন জিনিসটি রেখেছি, সেই কাজটা সহজ করার জন্য আমরা ledPin = 13 লিখলাম, এতে আমার 13 নাম্বার পিন না 1 নাম্বার পিন সেটা নিয়ে মাথা ঘামাতে হচ্ছে না। শুধু ledPin ভ্যারিয়েবলটির কথা জানলেই হচ্ছে।

পরের অংশটাও ঠিক আমরা যেহেতু পিন নাম্বার পাল্টাচ্ছি না তাই কোন ভ্যারিয়েবল কে ধ্রুবক (constant) করার সিস্টেম হল ডাটাটাইপের আগে const শব্দটি লেখা। যেমন, const int ledPin = 13; এই স্টেটমেন্টের পর আমি যদি লিখি ledPin = 14 তাহলে কোড কম্পাইল হবে না, কারণ আমি আগেই বলেছি ledPin একটি ধ্রুবক আবার আমিই বলছি ledPin এর মান পরিবর্তন করতে যেটা কম্পাইলার মেনে নিবে না।

প্রশ্ন:

Proteus এ আপনি .ino ফাইল না দিয়ে blinking.cpp.hex ফাইলটি দিলেন কেন? আর .hex ফাইল তৈরি করলেন কীভাবে?

উত্তর:

প্রোটিয়াস সিম্যুলেশনের জন্য বোর্ড বা মাইক্রোকন্ট্রোলার এ .hex ফাইল লোড করতে হয়, এছাড়া অন্য কোন ফাইল ফরম্যাট গ্রহণযোগ্য না। .hex ফাইল হল .ino ফাইলের কম্পাইল্ড ভার্সন। তাই আমি যখন Arduino IDE তে Verify বাটনে ক্লিক করি তখন .hex ফাইল তৈরি হয়।

প্রশ্ন:

.hex ফাইলটা খুঁজে বের করলেন কোন সফটওয়্যার দিয়ে?

উত্তর:

Everything নামক সফটওয়্যার দিয়ে। ফাইল খোঁজার দারুণ সফটওয়্যার। ডাউনলোড করুন এখান থেকে।

Last updated