লাইব্রেরি তৈরি করা ও ইনহেরিট্যান্স এর মাধ্যমে লাইব্রেরি মডিফাই করা
আর্ডুইনো লাইব্রেরি তৈরি ও ইনহেরিট্যান্স প্রয়োগের মাধ্যমে লাইব্রেরি মডিফাই করা
এই পর্বের জন্য যা যা প্রয়োজন:
১। একটি ভাল C/C++ IDE [Code::blocks, Codelite, Qt Creator, Visual Studio..]
অথবা Text Editor [Notepad++, Sublime Text Editor, Atom, Brackets ...]
২। লাইব্রেরি টেস্ট করার জন্য Official Arduino IDE
৩। যেকোন আর্ডুইনো বোর্ড
৪। বোর্ড না থাকলে সিম্যুলেশনের জন্য প্রোটিয়াস (Proteus)
৫। LCD Module (যেকোন ডাইমেনশনের)
লাইব্রেরি তৈরি করার যৌক্তিকতা:
আর্ডুইনোতে যে এত সহজে কোড করতে পারছেন, শুধু digitalWrite(size_t, MODE)
কিংবা analogRead(size_t)
ফাংশনগুলো ব্যবহার করলেই LED
ইচ্ছামত জ্বলানেভা করা অথবা সেন্সর থেকে রিডিং নেওয়া্। Serial.read()
ব্যবহার করে সহজেই সিরিয়াল কম্যুনিকেশন এস্টাব্লিশ করে ডিবাগিং করা ইত্যাদি কাজগুলো সহজ হয়েছে মূলত Arduino
লাইব্রেরির কারণে। Arduino
আসলে একটি Avr
চিপ ছাড়া কিছুই না। এতে Communication এর জন্য Atmega8U2 / Atmega16U2
চিপ ব্যবহার করা হয়েছে এবং ব্যাটারি জনিত সমস্যা এড়ানোর জন্য বিল্ট-ইন ভোল্টেজ রেগুলেটর* বসানো হয়েছে। এ সব কিছু বাদ দিলে শুধু Atmega328p-PU
চিপটাই থেকে যায়। আর আমরা সবাই জেনে গেছি এটা মূলত একটি AVR
চিপ। AVR-C
তে করা প্রোগ্রামগুলোকে সহজ করার জন্য Arduino Library
ব্যবহার করা হয়েছে্। কারণ সবাই বিটওয়াইজ অপারেশনকে শুরুর দিকে বেশ ঝামেলার কাজ বলে মনে করে, আর তাই তাদের হার্ডওয়্যারের প্রতি আগ্রহ উবে যায়। তাই এটাকে সহজ ও আনন্দদায়ক করার জন্য হাজারখানেক লাইনের কোড লিখে আর্ডুইনো অফিশিয়াল লাইব্রেরি তৈরি করা হয়।
প্রোগ্রামগুলো এত সহজ হওয়ার কারণ মূলত ওই লাইব্রেরি। ওপেন-সোর্সের মজা মূলত এখানেই, নিজের ইচ্ছামত সবকিছু ভেঙ্গে গুঁড়িয়ে আবার নতুন করে শুরু করা যায়। Code Reusability এর ক্ষেত্রে লাইব্রেরির জুড়ি নেই।
যেমন, PIC এর জন্য MikroC এর তৈরি লাইব্রেরি আপনি ইচ্ছা করলেই ব্যবহার করতে পারবেন না। এই লাইব্রেরি ব্যবহার করার জন্য আপনাকে Pay করতে হবে। সেখানে আর্ডুইনো লাইব্রেরি ব্যবহার করা/ মডিফাই করা কিংবা মডিফাই করে রিডিস্ট্রিবিউট করার ক্ষেত্রে কোন বাঁধা নেই।
লাইব্রেরি তৈরি ও ব্যবহার
লাইব্রেরি তৈরি করতে ও এর সঠিক ব্যবহার করতে দক্ষতার প্রয়োজন হয়। লাইব্রেরি শুধু লিখলেই হয় না, সহজবোধ্য ভ্যারিয়েবল তৈরি, সুন্দর সিনট্যাক্স ও কমেন্টিংয়ের মাধ্যমে বোঝা যায় কোন লাইব্রেরি কতটা ভাল।
ধরা যাক, আপনি মেমরি এফিশিয়েন্ট একটি লাইব্রেরি তৈরি করলেন, কিন্তু আপনার ডকুমেন্টেশনটা যুতসই হল না, সেক্ষেত্রে যিনি আপনার লাইব্রেরি ব্যবহার করবে সে অনেক সমস্যার সম্মুখীন হতে পারে। কিন্তু আরেকজনের লাইব্রেরি তেমন মেমরি এফিশিয়েন্ট হলনা কিন্তু তার লাইব্রেরির ডকুমেন্টেশন, সিনট্যাক্স ও কমেন্টিংয়ের কারণে তার লাইব্রেরি ব্যবহার করা খুবই আরামদায়ক হলে সেই লাইব্রেরিটাই সবার কাছে গ্রহণযোগ্য হবে। তাই লাইব্রেরি তৈরি করার সময় আপনাকে এসব কিছু খেয়াল রাখতে হবে।
লাইব্রেরি ব্যবহার করার জন্য লাইব্রেরি লেখকের ডকুমেন্টেশন ভালভাবে বুঝার চেষ্টা করতে হবে। তিনি কোন কোন মেথড তৈরি করেছেন, কোনটা দিয়ে কি করে; কোনটার কী লিমিটেশন অথবা আপনার যদি মনে হয় আপনি সেটাকে মডিফাই করে আরও ভাল কিছু তৈরি করতে পারবেন, সেক্ষেত্রে আপনি সে লাইব্রেরি আপডেট দিয়ে তাকে জানিয়ে দিতে পারেন।
আর্ডুইনোর কিছু ডিফল্ট ও গুরুত্বপূর্ণ লাইব্রেরির লিস্ট
আমরা আর্ডুইনোর এই কোর্সে যেসব লাইব্রেরি ব্যবহার করব
আর্ডুইনো লাইব্রেরির গঠন
ধরি আমার আর্ডুইনো লাইব্রেরির নাম MyLibrary
তাহলে,
MyLibrary
ফোল্ডার: এই ফোল্ডারে আপনার লাইব্রেরির প্রয়োজনীয় ফাইলগুলো থাকবেexamples
ফোল্ডার[MyLibrary/examples/MyExample/MyExample.ino]
: এই ফোল্ডারে আপনার তৈরিকৃত লাইব্রেরি ব্যবহার করে কোন একটি প্রোগ্রাম থাকবে, সেটা অবশ্যই.ino
এক্সটেনশনবিশিষ্ট আর্ডুইনো ফাইল হতে হবে। এবং সেই ফাইলটি আরেকটি ফোল্ডারে রাখতে হবে যার নাম একই।changelog.txt [MyLibrary/changelog.txt]
: লাইব্রেরির ভার্সন আপডেট, নতুন ফিচার অ্যাড ইত্যাদি তথ্য এই টেক্সট ফাইলে অ্যাড করতে হবে। (optional)keywords.txt [MyLibrary/keywords.txt]
: আপনার লাইব্রেরির Class, method, properties এ যদি Syntax Highlighting প্রয়োগ করতে চান, অথবা যদি চান আপনার তৈরিকৃত Class, method ইত্যাদি IDE রঙিন করে দিক তাহলে এই ফাইলে সেই Keyword গুলো লিখতে হবে। (optional)MyLibrary.h [MyLibrary/MyLibrary.h]
: এটা হল আপনার লাইব্রেরির হেডার ফাইল, হেডার ফাইলকে আমরা মেন্যুও বলতে পারি। আপনার তৈরি ক্লাসের যাবতীয় সব তথ্য এইখানে রাখলে একনজরে দেখতে সুবিধা হয়। লাইব্রেরি ও ক্লাসের নাম একই হতে হবে এমন কোন কথা নেই, কিন্তু এক রাখাটা সুবিধাজনক। স্ট্রাকচার্ড ও স্প্লিট ফাইল বেজড প্রোগ্রামিংয়ে Header ফাইল ব্যবহার করা ভাল প্রোগ্রামিং প্র্যাক্টিস।MyLibrary.cpp [MyLibrary/MyLibrary.cpp]
: এটা হল আপনার তৈরি করা Header ফাইলের সোর্স ফাইল। নাম একই হতে হবে এমন কোন কথা নাই, নাম এক হলে চিনতে সুবিধা হয়।অন্যান্য .h ও .cpp ফাইল [MyLibrary/Others.h, MyLibrary/Others.cpp]: আপনার তৈরি লাইব্রেরি যদি অন্য কোন লাইব্রেরি / ক্লাস বা মেথড নির্ভরশীল হয় তাহলে সে ফাইলগুলো আপনার লাইব্রেরির ফোল্ডারে রেখে দেবেন।
এই পর্বের লাইব্রেরির উদাহরণ:
আমরা LiquidCrystal
লাইব্রেরিকে মডিফাই করব, তাহলে আমাদের লাইব্রেরির জন্য যে ফাইল/ ফোল্ডারগুলো লাগবে, একনজরে দেখা যাক:
আমি যে নামে লাইব্রেরি তৈরি করতে চাই সে নামের একটা ফোল্ডার তৈরি করলাম (লাইব্রেরি তৈরি শেষে আর্ডুইনোতে ইম্পোর্ট করব)
ফোল্ডারে স্কেলিটন ফাইলগুলো তৈরি করে ফেললাম
MyLiquidCrystal.h
MyLiquidCrystal.cpp
keywords.txt
changelog.txt
examples\ScrollText\ScrollText.ino
MyLiquidCrystal
লাইব্রেরিটা আর্ডুইনো অফিশিয়ালLiquidCrystal
ওArduino.h
এর উপর নির্ভরশীল। তাইLiquidCrystal
লাইব্রেরির সোর্স (LiquidCrystal.h
ওLiquidCrystal.cpp
) ডাউনলোড করে ওArduino.h
ডাউনলোড করে আমার লাইব্রেরির ডিরেক্টরিতে রাখলাম
লাইব্রেরি লজিক
আগেই বলে নেই, যে লজিকটা এখানে আমি ইম্প্লিমেন্ট করব সেটা Buggy এবং অনেক সমস্যা আছে। এই সমস্যাগুলোর কয়েকটা আমি উল্লেখ করে দেব এবং সল্ভ করার কিছু হিন্টস দেব, তবে সমস্যাটা আপনাকেই সল্ভ করতে হবে। যদি এর সমাধান চেয়ে অনেক রেসপন্স আসে তাহলে তার সমাধান দেওয়ার চেষ্টা করব।
যা করতে চাই:
LiquidCrystal লাইব্রেরিকে মডিফাই করে আমরা একটা মেথড অ্যাড করতে চাই, যার কাজ হবে একটা নির্দিষ্ট স্ট্রিং বা শব্দকে LCD তে স্ক্রল করানো। LiquidCrystal এ অলরেডি এই মেথড তৈরি করা আছে কিন্তু সেই মেথড পুরো ডিস্প্লে স্ক্রল করতে থাকে। এইখানে আমি একটি Buggy code লিখব যেটা পরবর্তীতে আপনাকে ঠিক করতে হবে।
অ্যালগরিদম
চলবে:
যদি স্ট্রিংয়ের প্রথম বর্ণ থেকে LCD এর বাউন্ডারি (maxCol) এর দূরত্ব শব্দের দৈর্ঘ্যের চেয়ে বেশি বা সমান হলে হয়:
যে স্ট্রিংকে স্ক্রল করাতে হবে সেটাকে (x,y) তে প্লেস করে প্রিন্ট করব
del সময় অপেক্ষা করব
LCD ক্লিয়ার করব
x এর মান ১ বাড়াব
যদি দূরত্ব শব্দের দৈর্ঘ্যের সমান হয়:
y এর মান ১ বাড়াব
x এ ০ বসাব
যদি y এর মান LCD এর maxRow এর সংখ্যার সমান হয়:
x এর মান ০ বসাব
y এর মান ০ বসাব
ছবিতে:
কাজের ধারা:
যেভাবে কাজটি করব
MyLiquidCrystal.h ফাইলে MyLiquidCrystal ক্লাস তৈরি করে LiquidCrystal ইনহেরিট করা
১। Header ফাইল লেখার নিয়ম
হেডার ফাইল লেখার জন্য যে নাম দিয়ে হেডার ফাইলটি তৈরি করতে চান,
#ifndef
প্রিপ্রসেসর ব্যবহার করে সে নামটি সবার প্রথমে লিখতে হবে। যেমন এখানে:#ifndef MyLiquidCrystal_h
তারপরে সেটাকে
#define
প্রিপ্রসেসর দিয়ে ডিফাইন করতে হবে। এখানে:#define MyLiquidCrystal_h
সবার শেষে
#endif
ব্যবহার করতে হবে
একনজরে একটি হেডার ফাইল
২। প্রয়োজনীয় ফাইল #include করা
যেহেতু আমি LiquidCrystal
লাইব্রেরিটি ও Arduino.h
ব্যবহার করছি তাহলে সেটা #include
করতে হবে।
সুতরাং,
৩। প্রয়োজনীয় ক্লাস, প্রোপার্টি ও মেথড তৈরি:
i) Inheritance প্রয়োগ
যেহেতু আমরা একটি ক্লাস তৈরি করে LiquidCrystal কে ইনহেরিট করব সেকারণে Header ফাইলের নাম দিয়ে একটি ক্লাস তৈরি করে কোলন :
চিহ্ন দিয়ে আমরা LiquidCrystal ক্লাসটিকে ইনহেরিট করব যাতে LiquidCrystal
এর সকল মেথড, প্রোপার্টি আমরা ব্যবহার করতে পারি।
ii) প্রয়োজনীয় Properties অ্যাড করা
আমার এই লাইব্রেরির জন্য বেশকিছু প্রোপার্টি অ্যাড করব। প্রোপার্টি ও মেথড প্রোগ্রামারভেদে পরিবর্তিত হয়। অনেকে সাধারণ কাজের জন্য অনেক মেথড ও প্রোপার্টি ব্যবহার করতে পারে (যেমন আমি) আর এক্সপেরিয়েন্সড প্রোগ্রামারদের অনেক কম প্রোপার্টি ও মেথড হলেই চলে যায়। প্রোপার্টিগুলোকে সাধারণত private
রাখা বেটার ও এই প্রোপার্টি ভ্যালু পরিবর্তন করার জন্য আমরা public get set
মেথড ব্যবহার করতে পারি।
ক্লাসের ভিতরের অংশ যদি বিবেচনায় আনি তাহলে,
iii) প্রয়োজনীয় Method অ্যাড করা
আমার কাজের প্রয়োজনীয় প্রোপার্টি অ্যাড করে ফেললাম, এবার মেথড অ্যাড করা বাকি। মেথডের জন্য আমরা Access Modifier হিসেবে public
ব্যবহার করব।
দ্রষ্টব্য: MyLiquidCrystal এ আমরা LiquidCrystal এর কনস্ট্রাক্টর ব্যবহার করতে চাই। আর সুপার ক্লাসের কনস্ট্রাক্টর ব্যবহার করার ফরম্যাট হল এটা derived_class(int arg1, int arg2) : base_class(arg1, arg2) {}
। এইভাবে কনস্ট্রাক্টর তৈরি করলে বেজ ক্লাসের কনস্ট্রাক্টর কল হয়। এই কাজটা করার কারণ সবার শেষে বলা হবে।
৪। সোর্স ফাইল লেখা [MyLiquidCrystal.cpp]
হেডার ফাইল তৈরি করার পরে সোর্স ফাইলে সেই ফাংশনগুলোর লজিক বসাতে হয়। এখানে আমরা যেসব মেথড ইম্প্লিমেন্ট করব, প্রত্যেকটি MyLiquidCrystal ক্লাসের। OOP এর স্ট্রাকচার অনুযায়ী, কোন ক্লাসের মেথড যদি Out of Class ইম্প্লিমেন্ট করতে হয় তাহলে তাকে এভাবে লিখতে হয়: return_type className :: (scope_resolution_operator) functionName(argument)
ঠিক সেভাবে আমরা যদি সম্পূর্ণ কোড লিখি তাহলে,
৫। Syntax Highlighting অ্যাড করার জন্য keywords.txt ফাইল এডিট করা
যদি আপনি চান Arduino IDE তে আপনার লাইব্রেরি অ্যাড করলে এটি অন্যসব লাইব্রেরির মত আপনার লাইব্রেরির ক্লাস, মেথড হাইলাইট করে দেবে তাহলে আপনার একটি ছোট্ট কাজ করতে হবে। লাইব্রেরির ডিরেক্টরিতে keywords.txt ফাইল তৈরি করে সেখানে আপনার ক্লাস নেম লিখে ট্যাব (TAB) দিয়ে [অবশ্যই TAB দিতে হবে, স্পেস দিলে হবে না; ক্লাস/মেথড লিখে ট্যাব দিয়েছেন কিনা সেটা লক্ষ্য রাখলেই হবে, কয় স্পেসের ট্যাব হতে হবে সেটা গুরুত্বপূর্ণ বিষয় নয়]।
সাধারণত Class
এর জন্য KEYWORD1
এবং Method
এর জন্য KEYWORD2
ব্যবহার করা হয়। নিচে আমার তৈরি keywords.txt ফাইলটা দেওয়া হল।
মোটামুটি প্রায় সবকাজ শেষ, বাকি থাকল শুধু একটা Example লেখা।
৬। examples অ্যাড করা
আপনার লাইব্রেরি কীভাবে ব্যবহার করতে হয় সেটা যদি একটু দেখিয়ে দেন তাহলে যারা আপনার লাইব্রেরি ব্যবহার করবে তাদের জন্য সুবিধাজনক। examples অ্যাড করার জন্য আপনার লাইব্রেরির ডিরেক্টরিতে examples ফোল্ডারের ভিতর একটি ফোল্ডার তৈরি করুন। আমার ক্ষেত্রে ScrollText।
এই ফোল্ডারের ভিতরে হুবহু এই ফোল্ডারের নাম দিয়ে একটা .ino ফাইল তৈরি করুন। আমি ScrollText.ino নামক ফাইল তৈরি করলাম।
ScrollText.ino ফাইলের ভিতরে আমি MyLiquidCrystal লাইব্রেরি ব্যবহার করে দেখাব।
এভাবে আপনার একটি পরিপূর্ণ লাইব্রেরি তৈরি হয়ে গেল। এবার যদি লাইব্রেরিটি ব্যবহার বা ডিবাগ করতে চান তাহলে নিচের কাজগুলো করতে হব।
তৈরিকৃত লাইব্রেরি ব্যবহার ও ডিবাগিং
আপনার তৈরি করা লাইব্রেরি Arduino IDE তে দুইভাবে অ্যাড করে ব্যবহার করতে পারেন।
প্রথম পদ্ধতি: সরাসরি লাইব্রেরি Arduino IDE তে অ্যাড করে
তৈরি করা লাইব্রেরি ফোল্ডারটি কপি করুন ও C:\Users\user_name\Documents\Arduino\libraries\
এই ডিরেক্টরিতে পেস্ট করুন।
দ্বিতীয় পদ্ধতি: কম্প্রেসড (.zip) লাইব্রেরি অ্যাড করে
লাইব্রেরিটি জিপ করুন। তারপর Arduino IDE ওপেন করে Sketch > Import Library > your_library.zip সিলেক্ট করুন।
হাইলাইটিং না দেখতে পেলে Arduino IDE রিস্টার্ট করে দেখুন হাইলাইট করছে কিনা। তাও না করলে keywords.txt ফাইল চেক করে দেখুন ক্লাস, প্রোপার্টি বা মেথডের পরে TAB দিয়েছেন নাকি Space দিয়েছেন। Space দিলে হাইলাইটিং কাজ করবে না।
লাইব্রেরি ইন অ্যাকশন:
আপনি ইচ্ছা করলে আগের পর্বের প্রোটিয়াস ফাইলটা ব্যবহার করতে পারেন, কানেকশনের পরিবর্তন আনা হয় নি। আমি এখানে সিম্যুলেশনের বদলে বাস্তবে করে দেখালাম। এখানে আমি ScrollText.ino ফাইলটা আর্ডুইনোতে আপ্লোড করেছি।
বাড়ির কাজ:
আমার তৈরি করা লাইব্রেরিতে কয়েকটি সমস্যা আছে। তার মধ্যে দুইটি সল্ভ করতে হবে,
১। word_scroll মেথডটিতে আমি while(true) বা একটি Infinite loop ব্যবহার করেছি। আপনাকে এমনভাবে লাইব্রেরিকে মডিফাই করতে হবে যেন আমি word_scroll মেথড টা কন্ট্রোল করতে পারি। অর্থাৎ, infinite loop ব্যবহার না করে স্ক্রলিং কন্ট্রোল করতে হবে। আপনি ইচ্ছা করলে Button, Serial ইত্যাদি সবকিছু ব্যবহার করে এটা করতে পারেন। মানে আপনার সল্যুশনটা সফটওয়্যার বা হার্ডওয়্যার যেকোন ভিত্তিক হতে পারে।
২। একটা জিনিস খেয়াল করেছেন, word_scroll মেথডটা তখনই কাজ করবে যখন শব্দের দৈর্ঘ্য LCD এর কলামের দৈর্ঘ্যের চেয়ে ছোট। আপনাকে এটাকে এমনভাবে মডিফাই করতে হবে যেন এই ফাংশনটি সব আকারের স্ট্রিং বা শব্দের জন্য কাজ করে।
কোড ও সিম্যুলেশন প্রজেক্ট ফাইল
প্রজেক্ট কোড ও সিম্যুলেশনের ফাইলগুলো ডাউনলোড করুন এখান থেকে।
Last updated