বাড়ি ব্লগ পৃষ্ঠা 15

মাইক্রোকন্ট্রলারের সহজ পাঠ (১ম কিস্তি)

17

Microcontroller Header

ডিসক্লেইমারঃ এটি মাইক্রোকন্ট্রনার নিয়ে বেসিক আলোচনা। যারা নবীশ বা মাক্রোকন্ট্রলার নিয়ে শুরুর প্রক্রিয়ায় আছেন তাদের কৌতুহোলই এই আলোচনার উপজিব্য। কোন একাডেমিক / প্রফেশনাল বা ক্রিটিকাল আলোচনা বা প্রশ্নোত্তরের প্রত্যাশা সঠিক হবেনা। এখানকার অধিকাংশ আলোচনাই ধার করা (adopted) কোন মৌলিক বা নতুন কোন আলোচনা এখানে নেই। তথ্যগত / ধারনাগত অসংগতি থাকতেই পারে তাই এই আলোচনার ভিত্তিতে কোন প্রজেক্ট দাড়া করানো হলে তার লাভ বা ক্ষতির দায় দায়িত্ব লেখকের নয়। সঠিকতার ভিত্তিতে ধারনা/তথ্য দ্রুততম সময়ে সংশোধন করা হবে।

 

পূর্বাভিজ্ঞতাঃ

এই লেখার পাঠকদের নিচের বিষয়ে পূর্বাভিজ্ঞতা আছে বলে ধরে নেয়া হয়েছে। এই সকল বিষয়ে বিস্তারিত আলোচনা এই লেখার আওতা বহির্ভূত তবে প্রয়োজনে কিছু বিষয়ে আলোচনা করা হবে।

১। ডিজিটাল ইলেকট্রনিক্স সম্পর্কে ধারনা।

২। গনিত,বাইনারি গনিত, BCD। এছাড়া অক্টাল ও হেক্সাডেসিমেল গনিত সম্পর্কে ধারনা থাকা ভাল।

৩। কম্পিউটারের আর্কিটেকচার সম্পর্কে ধারনা।

৪। প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন, C/C++ সম্পর্কে ধারনা

ভূমিকা ও প্রারম্ভিক আলোচনা

কিছু FAQ টাইপ প্রশ্ন উত্তর

মাইক্রোকন্ট্রলারের সংঙ্গা, নামকরন, ইতিহাস, আর্কিটেকচার ইত্যাদি বিষয় ইচ্ছা করলে অবতারনা করা যায় কিন্তু ঐদিকে না গিয়ে প্রাসংগিক কিছু জিনিস যা না জানলেই নয় তা এখানে আলোচনা করা হলো

১। মাইক্রো কন্ট্রলার (MCU= Micro Controller Unit) কিঃ

সিঙ্গেল আই সি বেজড কম্পিউটার সিস্টেম (প্রায়)

২। CPU (=Central Processing Unit, যাকে আমরা শুধু প্রসেসরও বলি) আর MCU এর পার্থক্য কি? কোনটি ভাল ?

CPU হলো কম্পিউটারের সাব সিস্টেম (অংশ বিশেষ) যার শুধু প্রসেসিং পাওয়ার আছে (ব্রেন ) কিন্তু ইনপুট (ইন্দ্রিয়) আওটপুট (সাড়া)-এর জন্য অন্য সাব সিস্টেমের উপর নির্ভর করে। কিন্ত MCU নিজেই একটি সম্পুর্ন সিস্টেম যার ভিতরে CPU ও অন্যান্য ইনপুট আউটপুট সিস্টেম বিল্টইন থাকে।

যার যার ক্ষেত্রে সেই রাজা। সাধারন (Generic) সমস্যায় যে খানে প্রচুর রিসোর্স (পাওয়ার, মেমরী, দ্রুততা) লাগে সেখানে CPU বেসড ফুল কম্পিউটার আর যেখানে সুনির্দিষ্ট কাজে অল্প রিসোর্স লাগে সেখানে MCU-ই যথেষ্ঠ।

৩। কিকি MCU আছে? এদের পার্থক্য কি?

প্রচুর MCU আছে। এখানে বিস্তারিত আছেঃ https://en.wikipedia.org/wiki/List_of_common_microcontrollers। তবে ৮ বিট বিশিষ্ট Microchip

এর PIC, Atmel এর AVR মাইক্রো কন্ট্রোলারগুলি হবিষ্টদের মধ্যে বেশী জনপ্রিয়। ৩২ বিট ARM এর ডিজাইন বেজড মাইক্রোকন্ট্রলারও জনপ্রিয়।

আভ্যন্তরিন গঠন বা আর্কিটেকচারে পার্থক্য হয় উদ্দ্যেশের উপর ভিত্তি করে। কোনটির মেমরী কম/বেশী, CPU কোর ভিন্ন ও গতি (MHz) কম বেশী, রেজিষ্টার কম বেশী।

৪। কোন মাইক্রোকন্ট্রলার ব্যাবহার সহজ/ভালো/সুবিধা

এটা অনেকটা PC না Mac। Android না IPhone টাইপের প্রশ্ন। এর ক্লিয়ার কাট উত্তর নাই। যে যেটায় স্বাচ্ছন্দ বোধ করে। কারন আভ্যন্তরিন আর্কিটেকচার ভিন্ন হলেও একই রকম আউটপুট তৈরী করতে পারে।

৫। ৮ বিট, ১৬ বিট, ৩২ বিট (বা ৬৪ বিট) ইত্যাদি কি?

এর সংক্ষিপ্ত উত্তর এভাবে দেয়া যায় যে, বিট হচ্ছে রেজিষ্ট্রারের পরিমাপক। বিট যত বেশী রেজিষ্টার তত বড় তাতে এবং তত বেশী মেমোরী সংযুক্ত করা যায়। ক্লক স্পিডে বেশী ইনস্ট্রাকশন সম্পন্ন করা যায় ফলে প্রসেসিং দ্রুততর হয়। কিন্তু পাওয়ার খরচ বাড়ে সার্কিটের জটিলতা বৃদ্ধি পায় ফলত খরচও বাড়ে। ছোট খাট কাজে যেমন, এল ই ডি জ্বালানো নিভানো, মটরের স্পিড কন্ট্রলে বা ডিজিটাল ঘড়িতে খুব বেশি স্পিড না হলেউ চলে তাই ৮ বিট প্রসেসরই যথেষ্ঠ। কিন্তু হেভি গ্রাফিক্স ম্যানিপুলেশন বা গেম খেলার ক্ষেত্রে প্রচুর স্পিডের ও অনেক প্রসেসিং পাওয়ার দরকার হয়। সেক্ষেত্রে ৩২ বা ৬৪ বিট মাইক্রোকন্ট্রলার বিশেষ প্রয়োজন।

৬। Arduino কি ধরনের মাইক্রোকন্ট্রলার?

Arduino আসলে নিজে কোন মাইক্রো কন্ট্রলার না। Arduino আসলে একটা ডেভেলপমেন্ট বোর্ড (বা মাদার বোর্ড) যাতে AVR বেসড মাইক্রোকন্ট্রলার ব্যাবহার করা হয়। যেমনঃ ATmega328

৭। রাসবেরি পাই/ব্যানানা ইত্যাদি কি মাইক্রোকন্ট্রলারঃ

না। এই গুলি মাইক্রোপ্রসেসর বেসড কম্পিউটার সিস্টেম। যারা পিসি/ম্যক-এর মতো অপারেটিং সিস্টেম দ্বারা পরিচালিত হয়  ও প্রোগ্রাম এক্সিকিউট করে।

২য় কিস্তি এখানে>>

এলইডি বনাম এলসিডি ডিসপ্লে

1
এলইডি ও এলসিডি ডিসপ্লে - মূল পার্থক্য কী??

lcd-vs-oled-diagram-470x314

ছবি: নেট থেকে

বাজারে এখন এলইডি নামে নতুন টিভি ও মনিটর এসেছে। পুরাতন এলসিডির সাথে এর পার্থক্য আসলে কোথায় ?বাহির থেকে দেখতে ত তেমন পার্থক্য চোখে পড়ে না !!! আসুন দেখি মুল পার্থক্য কোথায় –

এলসিডি বা লিকুইড ক্রিষ্টাল ডিসপ্লে – 

এটা মুলত একটি সমান ধরণের ডিসপ্লে (Flat Type) যার ভিতর দিয়ে আলো প্রবাহিত হতে পারে বা আলোকে বাধা প্রদান করতে পারে। এই আলো প্রবেশ বা বাধা প্রদানের বিষয়টি কাজে লাগিয়ে এটি তৈরী করা হয়। এর মাধ্যমে যে ছবি হয় তা উজ্জ্বল করতে পিছনে সাধারণত আলোর ব্যবস্থা থাকে এবং অধিকাংশ ক্ষেত্রে তা এল ই ডি।

এল ই ডি বা লাইট ইমিটিং ডায়োড

এটি একধরণের বাতি যা বিদ্যুত শক্তিকে কাজে লাগিয়ে আলো তৈরী করতে পারে। এল ই ডি সম্পর্কে জানতে আমাদের এল ই ডি বিষয়ক এই পোষ্টটি পড়তে পারেন।

 

তাহলে উপরের বিষয় থেকে আমরা জানলাম যে মুল পার্থক্যটা কোথায়। এর বাইরে আরও বিষয় আছে আর তা হলো –

১. এল ই ডি ডিসপ্লের থেকে এল সি ডি ডিসপ্লের উজ্জ্বলতা কম

২. নির্মাণগত কৌশলের উৎকর্ষতার জন্য এল ই ডি ডিসপ্লের এল সি ডি ডিসপ্লের তুলনায় হালকা ও পাতলা

৩. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় বেশী কৌনিক অবস্থান থেকে দৃশ্যমান

৪. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় দামে বেশী

৫. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় স্থায়ীত্বকাল হিসাবে গড়ে বেশী

৬. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় বেশী কনট্রাষ্ট তৈরী করতে সক্ষম

৭. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় অধিক রঙ তৈরী করতে সক্ষম

৮. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় অধিক রিফ্রেশ রেটের (চলমান বস্তুর দৃশ্যমানতা অধিক সাবলীল)

৯. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় অধিক বিদ্যুত সাশ্রয়ী

১০. এল ই ডি ডিসপ্লে এল সি ডি ডিসপ্লের তুলনায় সাইজে বড় করে তৈরী করা সম্ভব

উপরে আমরা যা বললাম তা থেকে কি মনে হয়েছে আপনাদের? এল ই ডি  ও এল সি ডি দুটো আলাদা জিনিস? মজাটা আসলে এখানেই – আসলে হলো এলসিডি এর পিছনে আলো দিতে যখন এল ই ডি ব্যবহার করা হয় তখন তা এল ই ডি ডিসপ্লেই হয় আর যখন আলো দিতে অন্য আলোক উৎস (সাধারণত এনার্জী বাল্ব টাইপ) ব্যবহার করা হয় তখন তা এল সি ডি নামে থাকে।

বাজারে গিয়ে আর বিভ্রান্ত না হয়ে তাই আসুন স্ক্রীনের রেজুলেশনের দিকে মনোযোগ দেই। রেজুলেশন যত বেশী হবে ততবেশী উজ্জ্বল ছবি পাবেন কারণ এখনকার সব ডিসপ্লেতেই আসলে এল ই ডি টেকনোলজী ব্যবহার করা হয়।সেই সাথে এল ই ডি ফুল এ্যরে না সাইড এ্যরে সেটা জেনে নিন – ফুল এ্যরে টিতে বেশী উজ্জ্বল ছবি পাবেন। আর কোন প্রশ্ন থাকলে কমেন্ট অংশ খোলা আছে।

লেড ফ্লাশার (প্রজেক্ট ৭)

3

পূর্বজ্ঞানঃ RC টাইমিং সম্পর্কে জ্ঞান

তাত্ত্বিক পাঠঃ RC টাইমিং

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

 

মূল সার্কিট বুঝার আগে আমরা একটু RC টাইমিং নিয়ে আলোকপাত করব। আবার RC টাইমিং বুঝতে ক্যাপাসিটরের ধর্ম নিয়ে হালকা আলোচনা করব।
ক্যাপাসিটর এক অর্থে একটি টাইমিং ডিভাইস হিসাবে কাজ করে। ক্যাপাসিটরে ভোল্টেজ দিলে ক্যাপাসিটরের ক্ষমতা অনুযায়ী (ক্যাপাসিটেন্স, ফ্যারাডে এই ক্ষমতা মাপা হয়, যত বেশি ফ্যারাড তত বেশী ক্ষমতা আর চার্জ হতে তত বেশী সময় নেয়) পরিপূর্ন চার্জ হবার আগ পর্যন্ত সার্কিট থেকে চার্জ গ্রহন করে এবং ক্ষমতা অনুযায়ী কিছু সময় পর চার্জ পূর্ন হয়ে গেলে তার দুই প্রান্তের ভোল্টেজ সাপ্লাই ভোল্টেজের সমান হয় এবং সে নিষ্ক্রিয় হয়ে যায়। কিন্তু যদি সার্কিটে ভোল্টেজ ড্রপ করে (রেজিষ্ট্যান্স বা এসির প্রভাবে) তবে সে তার চার্জ ছাড়তে শুরু করে যতক্ষননা তার দুই প্রান্তের ভোল্টেজ সার্কিটের ভোল্টেজ ড্রপের সমান হয়। এই চার্জ ছাড়তেও কিছু সময় নেয়। এই চার্জ হতে যে সময় লাগে আর ছাড়তে যে সময় লাগে এটিই টাইমিং পালস তৈরী করে।

নিচের সার্কিটটি লক্ষ্য কর। ধরা যাক ১.৫ ভোল্টের একটা একটা ব্যাটারি একটা ক্যাপাসিটর আর বাল্বের সাথে চিত্রের মতো লাগানো হয়েছে। এই অবস্থায় একদিকে বাল্ব জ্বলতে শুরু করবে আর ক্যাপাসিটর চার্জ হতে শুরু করবে। ক্যাপাসিটর যত চার্জ হতে শুরু করবে তার + প্লেটের পজেটিভ চার্জ আর – প্লেটে নেগেটিভ চার্জ জমা হতে থাকে। এই চার্জই আবার নতুন করে সমজাতীয় চার্জকে প্লেটে আসতে বাধা দিতে থাকে কিন্তু ব্যাটারির ভোল্টেজের কারনে সেই বাধা পর্যদুস্ত হয়। কিন্ত চার্জ জমতে জমতে ক্যাপাসিটরের ভোল্টেজও বাড়তে থাকে এক পর্যায়ে তা ব্যাটারীর সমান ভোল্টেজে (১.৫ ভোল্ট) উপনিত হয়। এই সময় সে ব্যাটারীর সাথে সেয়ানে সেয়ানে ফাইট দেয় অর্থাৎ বিদ্যুৎ প্রবাহ থামিয়ে দেয়, কারন যেন ক্যাপাসিটরটি উলটা চার্জের ব্যাটারীতে পরিনত হয় (-১.৫ ভোল্ট)। তাই প্রথমে বাল্বটি ভালোভাবে জ্বলতে থাকলেও ক্যাপাসিটর যত চার্জ হয় ততই ডিম হতে হতে একবার নিভেই যায় (ক্যাপাসিটর ফুল চার্জ)।

battery-cap

এই বার যদি আমরা ব্যাটারীটাকে খুলে ফেলি এবং ব্যাটারী যেখানে ছিল সেই দুইপ্রান্ত জোড়া দিয়ে দেই তবে এই বার ফুল চার্জড ক্যাপাসিটর থেকে (উলটা ব্যাটারী) আগের কারেন্ট যে দিকে যেত ( আসল ব্যাটারির + থেকে –এর দিকে) তার উলটা দিকে প্রবাহিত হয়। এবারে ক্যাপাসিটরের চার্জ ফুল থেকে ধীরে ধীরে শুন্য হতে থাকে। ফলে বাল্বের উজ্বলতা প্রথমে বেশী থকে পরে একেবারে নিভে যায় (ক্যাপাসিটর ফুল ডিসচার্জ)। এই পেজে সুন্দর একটা ফ্ল্যাশ এনিমেশন সাথে থিউরি আছে দেখতে পারঃ (http://www.learnabout-electronics.org/ac_theory/capacitors02.php)

এখন এই ক্যাপাসিটর কতক্ষনে চার্জ হবে বা ডিসচার্জ হবে তা দুইটি বিষয়ের উপর নির্ভর করে

১। ক্যাপাসিটরের ক্ষমতা (ক্যাপাসিটেন্স C, যার একক ফ্যারাড)

২। সার্কিটের রোধ (রেসিষ্ট্যান্স R যার একক ওহম, যা চার্জের চলাচলে বাধা দেয়। যত বেশী রেসিষ্ট্যান্স তত চার্জ চলাচলে বাধা, তত বেশী সময় লাগে চার্জ বা ডিসচার্জ হতে)

তাই R, C এর গুন ফল RC কে টাইম কনস্ট্যান্ট বলে। এই গুনফল R এর কারনেই হোক বা C এর কারনে হোক অথবা এই দুইয়ের কারনেই হোক যত বড় বা ছোট হবে ক্যাপাসিটিভ সার্কিটে তত বেশী বা কম সময় লাগবে ক্যাপাসিটর চার্জ হয়ে সার্কিটের প্রবাহ বন্ধ বা চালু হতে।

RC টাইমিং ব্যাবহারে ট্রাঞ্জিষ্টার বেসড লেড ফ্লাশারঃ

আমরা যদি ঐ ক্যাপাসিটরকে ক্রমাগত চার্জ ডিসচার্জ চক্রে ফেলতে পারি তবে আমরা ডিসি সার্কিট থেকেই এমন একটা অন/অফ পালস তৈরী হবে যা লেডকে অন অফ করতে পারব। তাই রেজিষ্ট্যান্স ও ক্যাপাসিটর ছাড়াও একটি সুইচিং ডিভাইস লাগবে যা ক্যাপাসিটর চার্জড হলেই ক্রমাগত শর্ট সার্কিট করে দিবে (ব্যাটারি খুলে আমরা দুই প্রান্ত জোড়া দিয়ে যে কাজ করেছি) আর ডিসচার্জ হলেই ওপেন সার্কিট করে দিবে যাতে ক্যাপাসিটর আবার চার্জড হতে পারে। এই সুইচিং (শর্ট সার্কিট/ ওপেন সার্কিট) আমরা ট্রাঞ্জিষ্টর দিয়ে খুব এফিশিয়েন্টলি করতে পারি। ট্রাঞ্জিষ্টর বেস ফরোয়ার্ড বায়াসে অন বা শর্ট হয় আর রিভার্স বায়াসে অফ বা ওপেন হয়ে যায়।

নিচের চিত্রের সার্কিটটি লক্ষ্য করিঃ

2trans-led-flasher
(এই সার্কিটের সাথে এর আগে প্রজেক্ট-৫ঃ ফ্লিপ-ফ্লপ তৈরী এর এক পুশ বাটন দুই লেড সার্কিটের তুলনা করে দেখতে পার। দেখবে যে এরা প্রায় একই। কিছুটা কানেকশন কিছুটা অদল বদল আর পুশ বাটনটি বাদ দেয়া হয়েছে। আগে যে কাজটি ম্যানুয়ালি বা টিপে টিপে করা হতো এখন ক্যাপাসিটর নিজেই সেই কাজটি করে।)

এই খানে দুইটি করে ক্যাপাসিটর, ট্রাঞ্জিষ্টর, আর লেড দিয়ে একটি সার্কিট তৈরী করা হয়েছে দৃষ্টি নন্দন করার উদ্দেশ্যে। এখানে লেড দুটির রঙ ভিন্ন করলে আরো ভালো হয়। এই সার্কিটের জোড়ায় জোড়ায় যে পার্টস ব্যাবহার করা হয়েছে তা একটি আরেকটির রেটিং সমতুল্য। কিন্তু বাস্তবে হুবুহু একই সমতুল পার্টস তৈরী করা যায় না। অন্তর্নিহিত কারনেই রেটিং একই থাকার পরও একই রেটিং এর দুটি পার্টসে কিছু ভিন্নতা থাকে। এখন যদি এই সার্কিটিকে চালু করলে কি হতে পারে? একটু বিশ্লেষন করে দেখা যাকঃ

প্রথম পর্যায়ঃ ধরাযাক সুইচ অন করার সাথে সাথে ডান পাশের ট্রাঞ্জিষ্টার, ডান রেসিষ্টোরের দ্বারা পজেটিভ বায়াস পেয়ে অন হয়ে যায় এবং ডান পাশের লেড জ্বলতে শুরু করে। ডানের ট্রাঞ্জিষ্টারটি এখানে শর্ট সার্কিটের মতো আচরন করায় ডানের ট্রাঞ্জিষ্টরে কোন চার্জ থাকেনা, কিন্ত ইত্যাবসরে বামের ট্রাঞ্জিষ্টারটি ওপেন সার্কিটে চার্জ হতে থাকে। যতই বামের ক্যাপাসিটর চার্জ হয়। তার নেগেটিভ প্লেটে যুক্ত ডানের ট্রাঞ্জিষ্টারের বেস, ততই বায়াস হারিয়ে একসময় ডান পাশের ট্রাঞ্জিষ্টারকে বন্ধ করে দেয় (0.69RT সেকেন্ড পরে)।
দ্বিতীয় পর্যায়ঃ ডানের ট্রাঞ্জিষ্টার বন্ধ হলে কারেন্ট বামের ট্রাঞ্জিষ্টরে প্রবাহিত হতে থাকে। ডানের ক্যাপাসিটর ইত্যাবসরে ওপেন সার্কিটে চার্জ হতে থাকে। কিন্ত চার্জ হতে থাকলে সেও আগের মতো করে বাম পাশের ট্রাঞ্জিষ্টারকে নির্দিষ্ট সময় পর (0.69RT সেকেন্ড পরে)অফ করে দেয়। এই ভাবে তৃতীয়, চতুর্থ ….. চলতেই থাকে যতক্ষন সার্কিটে বিদ্যুৎ প্রবাহ থাকে।

এখন এক্যটা লেড কতক্ষন জ্বলে ? এটি নির্ভর করে RC টাইম কনষ্ট্যান্টের উপর। যেমন পরিক্ষায় দেখা যায় এক একটা ট্রাঞ্জিষ্টর 0.69xRC সেকেণ্ড পরে অফ হয়ে যায়। তাহলে যদি ট্রাঞ্জিষ্টার অন-অফ টাইমিংকে এভাবে লেখা যায়ঃ

t1 = 0.69xRC (বামের ট্রাঞ্জিষ্টর)

t2 = 0.69xRC (ডানের ট্রাঞ্জিষ্টর)

এখন দুই টাঞ্জিষ্টর মিলে যে অফ-অন হয় একে পুর্ন একটা চক্র ধরলে পূর্ন টাইমিং সমীকরন নিচের মত হয়ঃ

T = t1+t2 = 1.38 RC

চিত্রানুসারে আমাদের ক্যাপাসিটর আর রেসিষ্টরের মান বসালে আমাদের টাইমিং আসে

T = 1.38 X (100×10^3) X (10 x10 ^ -6)
= 1.38 সেকেন্ড

আমরা জানি হার্জে ফ্রিকোয়েন্সি f= 1/T = 1/1.38= 0.72 হার্জ।

এখানে আমরা ধরে নিয়েছি t1 = t2, যেহেতু দুই জোড়া R,C অনুরূপ। কিন্তু তা যে হতেই হবে এমন নয়। আমরা ভিন্ন ভিন্ন মানের R, C নিলে t1 ও t2। ভিন্ন হবে। নিচের চিত্র উপরের অংশে t1 = t2 দিয়ে পালস দেখানো হয়েছে। নিচের অংশে t2>t1 দিয়ে দেখানো হয়েছে।
যেহেতু ১ হার্জ মানে সেকেন্ডে একবার পালস তৈরী হওয়া, তাই উপযুক্ত RC নির্বাচনে আমরা হয়তো ১ হার্জের একটা পালস তৈরী করে একটা ডিজিটাল ঘড়ির কাছাকাছি পালস তৈরি করতে পারব ( এক্সাক্ট ১ হার্জ পালস বেশ কঠিন কাজ)। আবার আমরা যদি ৫০ হার্জের একটা পালস তৈরী করতে পারি তবে হয়তো একটা ইনভার্টারও বানানো যায় যা দিয়ে বাসাবাড়ির এসি তৈরী করা সম্ভব।

৫৫৫ আইসি দিয়ে লেড ফ্লাশারঃ

নিচে ৫৫৫ আইসি আর ক্যাপাসিটর দিয়ে সহজে কিভাবে দুইটি লেড অল্টারনেটিভ ভাবে ফ্ল্যাশ করানো যায় তাই দেখানো হয়েছে। এখানে আমরা ভ্যারিয়েবল ১০০ কে রেসিষ্টর ব্যাবহার করেছি যাতে আমরা এর মান পরিবর্তন করে বা টাইম কনষ্টান্ট পরিবর্তন করে ফ্লাশের টাইমিং পরিবর্তন করতে পারি।

555 flasher
৫৫৫ আইসি কে কেন টাইমার আইসি বলা হয় সম্ভবত এখান থেকে তোমরা বুঝতে পারবে। ক্যাপাসিটর ও রেসিষ্টরের সাহায্যে এই আইসি দিয়ে টাইমিং পালস তৈরী করা যায়। সাধারনত এই পালস গুলি স্কয়ার ওয়েভ (অন-অফ-অন-অফ) হয়। তবে একটি মডিফাই করলেই আমরা সাইন ওয়েভ, স-টুথ ওয়েভ তৈরী করতে পারি। আসলে এই সিম্পল ফ্লাশিং ছাড়াও বুদ্ধি খাটিয়ে আরো কিছু কম্পোনেন্টের (ডিজিটাল/এনালগ) সহায়তায় অনেক জটিল জটিল ফ্লাশিং বা টাইমিং তৈরি করা যায়। নেটে এধরনের প্রচুর উদাহরন পাবে।

ইউটিউবে গেলে এই ৫৫৫ আইসি দিয়ে প্রচুর ফ্লাশিং লেডের উদাহরন দেখতে পাবে।

যেমন এখানেঃ https://www.youtube.com/watch?v=gYnd_nMi39g

স্বল্প খরচে ডিজিটাল ভোল্ট মিটার (০-৩০ ভোল্ট, ডিসি)

6
ডিজিটাল ভোল্ট মিটার

ডিসি ভোল্ট মিটার(০ থেকে ৩০ ভোল্ট)

ভোল্ট মিটার এর প্রয়জনীতার কথা বলে শেষ করা যাবেনা, আর যদি তা হয় ডিজিটাল ভোল্ট মিটার, হবিস্ট দের কাছে তো এর বিকল্প ভাবাই যায়না, কোন প্রজেস্ট এর ইনপুট পাওয়ার সাপ্লাই এর জন্য যারা ভেরিয়েবল পাওয়ার সাপ্লাই ব্যাবহার করেন তাদের কাছে এটা সোনায় সোহাগা। একটা ভোল্ট মিটার থাকলে আপনি অনায়াসে লোডের ইনপুট ভোল্ট কে সেট করে নিতে পারবেন। যাহ আপনার ডিভাইজ এর কাজ করার এ্যাকুরিসি বাড়িয়ে দেয়। এবং প্রজেক্ট এর নষ্ট হওয়া থেকে বাঁচিয়ে দেয়। এটা তৈরির জন্য দুই ধরনের ডিভাইস ব্যাবহার করা যায় , ডিজিটাল আইসি বেজ ও মাইক্রোকন্ট্রোলার বেজ। মাইক্রোকন্ট্রোলার বেজ নিয়ে আমরা এই প্রজেক্ট বানবো কেননা এই মাইক্রোকন্ট্রোলার বেজ সিস্টেম সুবিধাজনক। যেমন খরচ কম হয়, জটিলতা কম সার্কিট ছোট। ডিজিটাল আইসি টি মনে হয় ৩০০-৫০০ টাকার মত স্টেডিয়াম মার্কেট-এ

ICL7107

প্রজেক্ট
প্রজেক্ট টি PIC 16F676 মাইক্রোকন্ট্রোলার দিয়ে বানাব  । ইনপুট ভোল্ট মেজর করে MCU(মাইক্রোকন্ট্রোলার) এর internal adc কনভার্টার ও রেজিস্টারের নেট ওয়ার্ক। adc কনভার্টার ও রেজিস্টারের নেট ওয়ার্ক ভোল্টেজ কে বিভাজিত করে ইনপুট ভোল্ট পরিমাপ করে। আর যাহা ডিজিটাল আকারে ৩ টি ৭ সিগমেন্ট ডিসপ্লে তে প্রদর্সিত হয়। ডানের ডিজিট টা দশমিক এবং বামের দুইটা পূর্ন মান দেখায়। ডিভাইস টি চালনা করার জন্য ভোল্টেজ রেগুলেটর 7805 IC ও ফিল্টারিং

12166786_1049157721772664_2137419869_n_20151016114335154

ক্যাপাসিটর ব্যাবহার হয়েছে , ৭ সিগমেন্ট কে ড্রাইভ করার জন্য ব্যাবহার করা হয় ৩ টি ট্রানজিস্টার ১০ টি রেজিস্টেন্স। একটি ভেরিয়েবল যাহা ভোল্ট কে এডজাস্ট করার জন্য । এছাড়া 5.1 যেনার ডায়ড ব্যাবহার হয়েছে যাতে MCU এর ইনপুট পরিমাপের ভোল্টভোল্ট এর উপর না যায়।

পিসিবিঃ

Screenshot_2015-10-16-11-35-29_20151016113858891

বানাতে ১৪০/- থেকে যায়গা ভেদে ১৮০/- হতে পারে।

প্রজেক্ট টি বানানোর সুবিধার্থে নিচে সংযুক্ত ফাইল (PCB PDF layout and Proteus file) দেওয়া হল।

DC Voltmeter 0-30V(16F676)

প্যাসিভ ক্রসওভার তৈরী (অডিও ফ্রিকোয়েন্সী কন্ট্রোল)

13

প্যাসিভ ক্রসওভার তৈরী:

উফারের জন্য:

  • ৭ মিমি – ৭ মিমি — ৪.৫ সেমি সাইজের ট্রান্সফরমারের আই কোর
  • মিটার ১৮/১৯ গেজের এনামেল কপার তার

কোর ভাল মানের হতে হবে। কোন নষ্ট ট্রান্সফরমার বা নতুন কোর নিতে পারেন। কোর কে ভাল করে পাতলা টেপ দিয়ে পেচিয়ে নিন। এবার দুই পাশে ০.৫ সেমি পরিমান জায়গা রেখে তার পেচিয়ে নিন। তাড়াহুড়ো না করে আস্তে আস্তে সুন্দর করে পেচাবেন। তারের দুই প্রান্ত ভাল করে আটকাবেন এবং সম্পুর্ণ কোর টি টেপ দিয়ে পেচিয়ে নেবেন। কানেকশন দেবার জন্য দুই প্রান্ত প্রয়োজনমত রাখবেন।

মিডরেঞ্জের জন্য:

  • ৫ মিমি – ৫ মিমি — ৩.৫ সেমি সাইজের ট্রান্সফরমারের আই কোর
  • মিটার ২০/২১ গেজের এনামেল কপার তার

আগের মতই তার পেচিয়ে নেবেন।

আসুন তাহলে ছবিতে দেখি ডায়াগ্রাম

বাজারে এই প্যাসিভ ক্রসওভার পাওয়া যায় যার দাম ৮০০ টাকা থেকে ১৫০০ টাকা। এই ক্রসওভার টি বানাতে সর্বোচ্চ ১০০ টাকা লাগতে পারে। ১০ মাইক্রোফেরাড ননপোলার ক্যাপাসিটর না পেলে দুটি ২২ মাইক্রোফেরাডের ইলেকট্রোলাইট ক্যাপাসিটর এর নেগেটিভ প্রান্ত জোড়া দিলেই হয়ে যাবে। তাতে করে খরচও পরবে কম।

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

  • উফার – ৫০০ হার্টজ,
  • মিডরেঞ্জ – ৫০০- ৩ কিলোহার্টজ এবং
  • টুইটার ৩ কিলোহার্টজ থেকে ২০ কিলোহার্টজ

পর্যন্ত ফ্রিকোয়েন্সী রেঞ্জে কাজ করে।

আমি নিজেও বানিয়েছি এবং বিডি ইলেকট্রনিক্স গ্রুপে সার্কিট টি পরীক্ষা করা হয়েছে এবং কাজ করেছে।

Android ও Arduino দিয়ে নিয়ন্ত্রণ করুন বাসার বিভিন্ন সুইচ ,পর্ব ২

2

আগের পর্বে আমারা যতদূর করেছি তার ফলে এ রকম একটা ডিসপ্লে তৈরি হয়

এনড্রয়েড ডিসপ্লের উদাহরণ

এখন আসল কাজে আসা যাক।

বাম পাসের টুলবার থেকে জাভা এর ভিতর তিনটি জাভা ফাইল তৈরি করি যার একটা করা আছে…
১.MainActivity.java

২.ListDivices.java

৩.HomeAutomationActivity.java

এবার ফাইল তিনটিতে নিচের মত করে কোড গুলো লিখে দি।।

****MainActivity.java
package com.homeautomation;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.ToggleButton;

publicclass MainActivity extends Activity {
	BluetoothAdapter mBluetoothAdapter;
	BluetoothSocket mmSocket;
	BluetoothDevice mmDevice;
	OutputStream mmOutputStream;
	InputStream mmInputStream;
	Editable nameb;
	String blname;
	intstat;
	finalintAPPLY_ACTIVE = 1;
	finalintAPPLY_CONNECTION = 2;
	String DEVICE = null;
	EditText name;

	@Override
	protectedvoid onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
		setContentView(R.layout.activity_main);
		getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
				R.layout.actionbar);
		name = (EditText) (findViewById(R.id.bluetoothName));
		Button ok = (Button) (findViewById(R.id.button1));
		Button connect = (Button) findViewById(R.id.button2);

		ok.setOnClickListener(new View.OnClickListener() {

			publicvoid onClick(View v) {
				// TODO Auto-generated method stub
				Intent openList = new Intent(MainActivity.this,
						ListDivices.class);
				startActivityForResult(openList, APPLY_CONNECTION);
			}
		});
		connect.setOnClickListener(new View.OnClickListener() {

			@Override
			publicvoid onClick(View v) {
				// TODO Auto-generated method stub
				nameb = name.getText();
				blname = nameb.toString();
				if (!blname.equals("")) {
					try {
						findBT();
						stat = 1;
					} catch (IOException e) {
						stat = 0;
						e.printStackTrace();
					}
				} else {
					Toast.makeText(getApplicationContext(),
							"First add your device then press connect",
							Toast.LENGTH_SHORT).show();
				}
			}
		});

		final ToggleButton fan = (ToggleButton) findViewById(R.id.toggleButton1);
		fan.setOnClickListener(new View.OnClickListener() {

			publicvoid onClick(View v) {
				// TODO Auto-generated method stub
				if (fan.isChecked()) {
					if (stat == 1) {
						try {
							mmOutputStream.write('1');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				} else {
					if (stat == 1) {
						try {
							mmOutputStream.write('2');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				}
			}
		});

		final ToggleButton light1 = (ToggleButton) findViewById(R.id.toggleButton2);
		light1.setOnClickListener(new View.OnClickListener() {

			publicvoid onClick(View v) {
				// TODO Auto-generated method stub
				if (light1.isChecked()) {
					if (stat == 1) {
						try {
							mmOutputStream.write('3');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				} else {
					if (stat == 1) {
						try {
							mmOutputStream.write('4');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				}
			}
		});

		final ToggleButton light2 = (ToggleButton) findViewById(R.id.toggleButton3);
		light2.setOnClickListener(new View.OnClickListener() {

			publicvoid onClick(View v) {
				// TODO Auto-generated method stub
				if (light2.isChecked()) {
					if (stat == 1) {
						try {
							mmOutputStream.write('5');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				} else {
					if (stat == 1) {
						try {
							mmOutputStream.write('6');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				}
			}
		});

		final ToggleButton light3 = (ToggleButton) findViewById(R.id.toggleButton4);
		light3.setOnClickListener(new View.OnClickListener() {

			publicvoid onClick(View v) {
				// TODO Auto-generated method stub
				if (light3.isChecked()) {
					if (stat == 1) {
						try {
							mmOutputStream.write('7');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				} else {
					if (stat == 1) {
						try {
							mmOutputStream.write('8');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				}
			}
		});

		final ToggleButton tv = (ToggleButton) findViewById(R.id.toggleButton5);
		tv.setOnClickListener(new View.OnClickListener() {

			publicvoid onClick(View v) {
				// TODO Auto-generated method stub
				if (tv.isChecked()) {
					if (stat == 1) {
						try {
							mmOutputStream.write('9');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				} else {
					if (stat == 1) {
						try {
							mmOutputStream.write('0');
						} catch (IOException e) {
							// TODO Auto-generated catch block
							Toast.makeText(
									MainActivity.this,
									"Connection not established with your home",
									Toast.LENGTH_SHORT).show();
							e.printStackTrace();
						}
					} else
						Toast.makeText(MainActivity.this,
								"Connection not established with your home",
								Toast.LENGTH_SHORT).show();
				}
			}
		});

	}

	void findBT() throws IOException {
		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		// if(mBluetoothAdapter == null)
		// {
		// myLabel.setText("No bluetooth adapter available");
		// }

		if (!mBluetoothAdapter.isEnabled()) {
			Intent enableBluetooth = new Intent(
					BluetoothAdapter.ACTION_REQUEST_ENABLE);
			startActivityForResult(enableBluetooth, 1);

		}

		Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
				.getBondedDevices();
		if (pairedDevices.size() > 0) {
			for (BluetoothDevice device : pairedDevices) {
				if (device.getName().equals(blname))
				// FireFly-B1A7Change to the name of your bluetooth module (Case
				// sensitive)
				{
					mmDevice = device;
					break;
				}
			}
		}
		// myLabel.setText("Bluetooth Device Found");

		UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); // Standard
																				// //SerialPortService
																				// ID

		mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);

		mmSocket.connect();
		mmOutputStream = mmSocket.getOutputStream();
		mmInputStream = mmSocket.getInputStream();
	}

	@Override
	publicboolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		returntrue;
	}

	@Override
	publicboolean onOptionsItemSelected(MenuItem item) {
		super.onOptionsItemSelected(item);

		switch (item.getItemId()) { // Get id from R.java file
		case R.id.action_about:
			startActivity(new Intent(this, About.class));
			break;
		}
		returntrue;
	}

	@Override
	protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		caseAPPLY_ACTIVE:
			if (resultCode == Activity.RESULT_OK) {
				Toast.makeText(getApplicationContext(),
						"Bluetooth is activated", Toast.LENGTH_SHORT).show();
			} else {
				Toast.makeText(getApplicationContext(),
						"Bluetooth is not activated", Toast.LENGTH_SHORT)
						.show();
				finish();
			}
			break;
		caseAPPLY_CONNECTION:
			if (resultCode == Activity.RESULT_OK) {
				DEVICE = data.getExtras().getString("name");
				Toast.makeText(getApplicationContext(),
						"Device " + DEVICE + " is selected", Toast.LENGTH_SHORT)
						.show();
				name.setText(DEVICE);
			} else {
				Toast.makeText(getApplicationContext(),
						"Please pair your device & select it",
						Toast.LENGTH_SHORT).show();
			}

		default:
			break;
		}
	}
}

 

****ListDivices.java
package com.homeautomation;
import java.util.Set;

import android.app.ListActivity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

publicclass ListDivices extends ListActivity {
	BluetoothAdapter myBluetooth;
	static String MAC_ADDRESS = null;
	String DeviceName;
	String list[];

	@Override
	protectedvoid onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ArrayAdapter<String> ArrayBluetooth = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_1);
		myBluetooth = BluetoothAdapter.getDefaultAdapter();
		Set<BluetoothDevice> pairedDevices = myBluetooth.getBondedDevices();
		if (pairedDevices.size() > 0) {
			for (BluetoothDevice paired : pairedDevices) {
				DeviceName = paired.getName();
				ArrayBluetooth.add(DeviceName);
			}
		}
		setListAdapter(ArrayBluetooth);
	}

	@Override
	protectedvoid onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		String infoGeneral = ((TextView) v).getText().toString();
		Intent returnMac = new Intent();
		returnMac.putExtra("DeviceName", infoGeneral);
		setResult(RESULT_OK, returnMac);
		finish();

	}
}

 

****HomeAutomationActivity.java

package com.homeautomation;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

publicclass HomeAutomationActivity extends Activity {
	/** Called when the activity is first created. */
	BluetoothAdapter mBluetoothAdapter;

	@Override
	publicvoid onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		startActivity(new Intent(this, MainActivity.class));
		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		if (mBluetoothAdapter == null) {
			Toast.makeText(this, "Bluetooth is not available",
					Toast.LENGTH_SHORT).show();
			finish();
			return;
		}
	}

	publicvoid onStart() {
		super.onStart();
		if (!mBluetoothAdapter.isEnabled()) {
			Intent enableIntent = new Intent(
					BluetoothAdapter.ACTION_REQUEST_ENABLE);
			startActivityForResult(enableIntent, 3);
			finish();
			// Otherwise, setup the chat session
		}
	}

	@Override
	protectedvoid onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}

	@Override
	protectedvoid onPause() {
		// TODO Auto-generated method stub
		super.onPause();
	}

	@Override
	protectedvoid onResume() {
		// TODO Auto-generated method stub
		super.onResume();
	}

}

 

main activity.java ফাইল এর ভিতর লক্ষ করিঃ

mmoutputstream.write(‘সংখ্যা’);

একটা লাইন প্রতিটা বাটন এর জন্য দুই বার করে দেয়া আছে।
এখানে fan অনের জন্য “1” এবং অফের জন্য  “2” দেয়া আছে যা fan button টি তে টাচ করলে arduino তে পাঠাবে।

কোড স্ক্রীণশট

আপনি প্রতিটা বাটন এর জন্য এভাবে কমান্ড ঠিক করে দিবেন।

এবার রান এ ক্লিক করুণ।

android screenshot 2

*** \Android Workspace\homeautomation\app\build\outputs\ এরকম এড্রেস এ আপনি apk টা পাবেন ।

.APK  ফাইল টি এই খান থেকে ডাউনলড করে নিতে পারেন

পর্ব-১

পর্ব-৩

 

 

রেগুলেটেড পাওয়ার সাপ্লাই

12

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

রেগুলেটেড পাওয়ার সাপ্লাই সার্কিট ডায়াগ্রাম কেমন হয়?

আসুন নীচের সার্কিট টি দেখি —

12V-regulated-supply-for-the-fv-converter

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

images (2)

বাজারে এটি ৫, ৬, ১২, ১৫ ইত্যাদি মানে পাওয়া যায়। সাধারণ ভাবে এর নম্বর হয় LM78xx টাইপ। এই xx ভ্যালুর মান যত হবে এই আইসি দিয়ে ততভোল্টের রেগুলেটেড আউটপুট পাওয়া যাবে। উদাহরণ হিসাবে বলা যায় যদি আমরা ৫ ভোল্ট চাই তবে 7805 মানের আইসি লাগবে, আবার যদি ১২ ভোল্ট চাই তবে 7812 মানের আইসি লাগবে।

সার্কিটের মাঝে ক্যাপাসিটরগুলো মুলত ফিল্টারিংয়ের কাজে ব্যবহৃত হচ্ছে। খুব বেশী সফস্টিকেটেড বা সংবেদনশীল সার্কিট না হলে এইগুলোর তেমন প্রয়োজন নেই। কোন অবস্থায় ২০ ভোল্টের বেশী ইনপুটে দেওয়া যাবে না, দিলে আইসি নষ্ট হয়ে যাবে। ডাটা শীটে ২৫ ভোল্ট লিখা থাকতে পারে তবে আমাদের এখানে যে মানের পার্টস পাওয়া যায় সেটা বিবেচনা করে ২০ ভোল্টের বেশী ব্যবহার না করাই ভালো হবে ইনপুটে।

কোন জিজ্ঞাসা থাকলে কমেন্ট অংশ খোলা রইল বা ফেসবুকের মাধ্যমেও কমেন্ট করে আপনার প্রশ্নের উত্তর জেনে নিতে পারবেন।

মিস কল দিয়ে নিয়ন্ত্রণ করুন আপনার ডিভাইস (প্রজেক্ট-৬)

13

কেমন হয় যদি দূরে বসে শুধু মোবাইল ফোনের মিস কল দিয়ে কোন যন্ত্র চালু/বন্ধ করা যায়? মজার হয় তাই না? আজকে সহজ কিন্তু দারুণ ইলেকট্রনিক বিজ্ঞান প্রজেক্টে আমরা সেটাই শিখব।

তোমরা ভাবছ, জটিল জটিল সব সার্কিট বোধয় এতে লাগবে! নাহ খুব সিম্পল ভাবে এটি করা সম্ভব। কারন সবচেয়ে জটিল জিনিস যা হলো একটি মোবাইল সেট, তা আমাদের হাতের কাছেই এখন সহজ লভ্য। হয়ত পুরান একটি সেট অবহেলায় ঘরের কোনেই পড়ে আছে। সেই অবহেলার জিনিসটাই আজকের মুল্যবান বস্তু।

মোবাইল সেট ছাড়াও লাগবে একটা লাইট সেন্সর (আগে করেছি)।

আর একটা সিংগেল পুশ বাই ষ্টেবল ফ্লিপ ফ্লপ সার্কিট (এটাও আগে করেছি)। নিচে প্রথমে একটা এক্সপেরিমেন্টাল সার্কিট পরে একটা প্র্যাক্টিকাল সার্কিট নিয়ে কাজ করব।

প্রথমে মোবাই ফোনটাকে প্রয়োজন মতো প্রস্তুত করে নিতে হবে এই প্রজেক্টের জন্য। তোমরা জানো যে মোবাইলে কল আসলে রিং বাজে আর কি পরিবর্তন ঘটে? ডিসপ্লেটি জ্বলে উঠে। কোন কোন ক্ষেত্রে ভাইব্রেশন হয়। এই তিন ভাবে মোবাইল আমাদের জানায় যে একটি কল এসেছে।

আমরা তিনটি পদ্ধতিকেই আমাদের কাজে লাগাতে পারি। তবে ভাইব্রেশন আর রিং দিয়ে আমরা কাজ করবো না। কারন প্রসেসটি একটু জটিল।

রিংগার দিয়ে অবশ্য অনেক বেশী ফাংশন যুক্ত করা সম্ভব (যেমন আলাদা আলাদা নাম্বারের জন্য আলাদা রিংটোন এবং এথেকে আলাদা কমান্ড) কিন্তু এতে সার্কিট জটিল হবে।

আমরা সহজ সরল রাখবার খাতিরে শুধু অন/অফ করবো খুবই সহজ ভাবে। আমরা ডিসপ্লের আলোটাকে ব্যাবহার করব।

আমরা জানি অন্ধকারে LDR এর রোধ অনেক বেশী থাকে আলোতে রোধ কমে যায়। এখন একটা অন্ধকার বাক্সে একটা মোবাইল আর তার ডিসপ্লের সরাসরি একটা LDR মুখামুখি রাখলে কি হবে? যখনি কল আসবে LDR এ আলো পরবে আর রোধ কমে যাবে তাই না।

প্রথম ছবিতে এই ধারনাটি দেখানো হয়েছে। একটি আলো বিরুধি বাক্সে (কাঠ/ষ্টিল/ মোটা কার্টুন) একটি সিম সহ মোবাইল সেট রাখা হয় একটি এল ডি আর ওর ভিতর দিয়ে মাল্টিমিটার কানেকশন দেয়া হল। এখন ঐ মোবাইলে কল দিয়ে মাল্টিমিটার রিডিং দেখি। যদি দেখি রোধ কমে গেছে তবে এই সেটাপে আমাদের সার্কিট তৈরী করা যাবে।

L

 

এবার একটা সিংগেল পুশ বাটন বাই ষ্টেবল ফফ সার্কিট তৈরী করি (আগে করা হয়েছে) তবে পুশ বাটনের পরিবর্তে এল ডি আর এর দুই পা থেকে পুশ বাটন লাগানোর দুই প্রান্তে লাগাই (২য় চিত্র)। এবার আবার কল দেই। একবার কলে যদি পুশ অন, আরেকবার কলে যদি পুশ অফের মতো আচরন করে তবে সার্থক এটি দিয়েই কাজ হবে।

চিত্রে LDR কে মোবাইল ডিসপ্লের উপর স্থাপন করা হচ্ছে। অবশ্যই একটি বক্সের মধ্যে যাতে আশেপাশের আলো না পড়ে।
চিত্রে LDR কে মোবাইল ডিসপ্লের উপর স্থাপন করা হচ্ছে। অবশ্যই একটি বক্সের মধ্যে যাতে আশেপাশের আলো না পড়ে।

কিন্তু অনেক ক্ষেত্রে আমাদের বেসিক সেটাপ বিভ্রান্তিকর রেজাল্ট দিতে পারে। তাই আমরা চুড়ান্ত ভাবে কার্যকর সিস্টেম করতে একটি লাইট সেন্সর বানাই (আগে করা হয়েছে)। যাতে আলো পাওয়া মাত্রই সার্কিট অন আর অন্ধকারে অফ হয়ে যায়। এবার ৩য় চিত্রানুযায়ী সিস্টেম সেটাপ করি। কল দেই, আশা করি এবার কল পাবার সাথে সাথে কাংখিত রেজাল্ট পাওয়া যাবে। মোবাইলে একটি চার্জার যুক্ত করে রাখলে ২৪ ঘন্টা ৭ দিনই কাজ করবে।

Light Sensor + FF

 

দ্রষ্টব্যঃ

# নতুন বা অপরিচিত সিম নিলে ভাল হয়। যাতে ঐ নাম্বারে তুমি নিজে ছাড়া আর কেউ কল করবেনা।

# উপদ্রব এড়াতে কলব্লক + মেসেজ ব্লক সিস্টেম যুক্ত মোবাইল হলে ভাল হবে । যেটাতে হোয়াইট আর ব্ল্যাক লিষ্ট করা যায় তা সবচেয়ে ভাল (অনেক কমদামী চায়না মোবাইলেই আছে আর এন্ড্রয়েড হলে তো কথাই নেই)। হোয়াইট লিষ্টে তোমার নাম্বারটি শুধু থাকবে এছাড়া বাকি অল-ব্লক করে দাও। ফলে একমাত্র তুমি কল দিলেই সেটের ডিসপ্লে জ্বলে উঠবে অন্য সব ব্লক থাকবে।

# ডিসপ্লে যাতে ফ্লিকারিং (আলো লাফানো) না হয়। সম্ভব হলে রিঙ্গার ও অবশ্যই ভাইব্রেশন অফ রাখবে। এতে ফ্লিকারিং ও ফলস অন/অফের সম্ভাবনা কমে যাবে।

মন্দ দিকঃ

এটি একটি মজার সিস্টেম কিন্তু প্রফেশনাল কাজের উপযুক্ত নয়। এর বড় কারন এতে ফিড ব্যাক সিস্টেম নাই। দৃষ্টির আড়ালে থাকা অবস্থায় সার্কিট অন না অফ অবস্থায় আছে তা সরাসরি বুঝার উপায় নেই। ফলে স্মৃতি বিভ্রম হলে যে টা চাইছ তার উল্টোটা হতে পারে। এছাড়া এর উপর ১০০ ভাগ নির্ভর না করাই ভালো।

অটোমেটিক সার্জ ভোল্টেজ প্রটেক্টর

7
সার্জ ভোল্টেজ প্রোটেক্টর সার্কিট ডায়াগ্রাম

আটোমেটিক সার্জ প্রটেক্টর সার্কিট

বাসা বাড়ি বা অফিসে আপনার দামী যন্ত্র সব সময় হুমকীর মুখে থাকে। কারণ বিদ্যুত চলে যাবার পর আবার মনের ভুলে সুইচ অফ না করলে যখন বিদ্যুত ফিরে আসে তখন সার্জ ভোল্টেজের কারণে আপনার মুল্যবান যন্ত্রটি বিকল হয়ে যেতে পারে। এই ভুলটি আর যেন না হয় তার জন্য এই আটোমেটিক সার্জ প্রটেক্টর সার্কিট টি কাজ করবে।

সার্জ ভোল্টেজ কিঃ

“In general a surge is a transient wave of current, which is a subcycle overvoltage with a duration of less than a half-cycle of the normal voltage waveform”

সহজ ভাবে বললে – ক্ষণিক সময়ের জন্য হাই ভোল্টেজ এর উপস্থিতি যা কিনা বিদ্যুৎ চলে গিয়ে আবার আসলে পরিলক্ষিত হয়

সুতরাং, বিদ্যুৎ চলে গেলে ইলেকট্রিক্যাল ও ইলেকট্রনিক্স যন্ত্রপাতি’র সুইচ অফ রাখাই উচিত। এই সহজ সার্কিট টি আপনার হয়ে ঠিক এই কাজ টিই করে দেবে।

অর্থাৎ আপনি ভুলে গেলেও এই যন্ত্রটি নিজে থেকেই ডিভাইসের সুইচ অফ করে দেবে ফলে সার্জ ভোল্টেজ আর ডিভাইসের ক্ষতি করতে পারবে না।

সার্কিট পরিচিতি

বিদ্যুত চলে যাবার পর অটোমেটিক এই সার্কিট আপনার যন্ত্রকে অফ করে দিবে। এর পর আবার বিদ্যুত আসলেও যন্ত্রে বিদ্যুত যাবে না যতক্ষণ পর্যন্ত আপনি S1 সুইচটি না প্রেস করবেন।

আসুন দেখি ছোট এই সার্জ প্রটেক্টর সার্কিটটি তৈরী করতে কি কি লাগবে –

  • ১. একটি ৬ ভোল্টের ট্রান্সফরমার
  • ২. ৩ টি সাধারণ রেকটিফায়ার ডায়োড – 1n4007
  • ৩. একটি 1000 মাইক্রোফেরাড মানের ক্যাপাসিটর
  • ৪. একটি রিলে সুইচ – ৬ ভোল্টের এবং এর এম্পিয়ার রেটিং আপনার যন্ত্রের পাওয়ারের সাথে সামঞ্জস্যপূর্ণ হতে হবে।
  • ৫. একটি পুশ টু অন সুইচ
  • ৬. কানেকশন দেবার জন্য ভালমানের সোল্ডারিং উপযোগী ইনসুলেটেড তার।
সহজ সার্জ প্রোটেক্টর সার্কিট ডায়াগ্রাম
সহজ সার্জ প্রোটেক্টর সার্কিট ডায়াগ্রাম

ডায়াগ্রামটি দেখুন, খুব সহজ একটি ডায়াগ্রাম। আশাকরি এই অটোমেটিক সার্জ ভোল্টেজ প্রটেক্টর সার্কিট টি বানাতে পারবেন খুব সহজেই।

যেহেতু সার্কিটটি ২২০ ভোল্ট এ চলে তাই সাধারণ সতর্কতা অবশ্য পালনীয় এবং ২২০ ভোল্ট লাইনে কাজের অভিজ্ঞতা বাঞ্চনিয়।

সতর্কতা

এই প্রটেক্টর সার্কিটটি বানানোর পর আলাদাভাবে টেস্ট না করে ব্যবহার করবেন না।

(আপডেটঃ আমাদের সাইটে প্রকাশিত G.M Khalilur Rahman ভাইয়ের বানানো হাই ও লো-ভোল্ট প্রটেক্টর সার্কিট টি দেখতে পারেন। সেটিতেও স্বয়ংক্রিয় Surge voltage প্রটেকশন আছে)

ডায়োড সম্পর্কিত গুরুত্বপূর্ণ কিছু তথ্য – (২)

2

ডায়োড সম্পর্কিত প্রশ্নডায়োড সিরিজে সংযোগ করলে Volt drop হয় কিন্তু Current controll করছে না কেন? প্রত্যেকটা ডায়োডের নিজ্বস একটা রেজিষ্ট্যান্স থাকে তাহলে ডায়োড কেন Current Controll করছে না?

উত্তরঃ-  ১টি ডায়োডকে মিটারে মাপলে ডায়োডের গঠন ও নাম্বার অনুযায়ী silicon diode এর ক্ষেত্রে (0.5K থেকে 1.2K ) দেখায়, এটা হল  ডায়োডের dynamic resistance ডাইনামিক রোধ৷ কিন্তু যখন conductive অবস্থায় বা ডায়োডের মধ্য দিয়ে যখন কারেন্ট প্রবাহিত হতে থাকে তখন ডায়োডের Forward resistance (অগ্রবর্তী রোধ) কমতে থাকে ৷

ডায়োড সম্পর্কিত প্রশ্নের উদাহরণ চিত্র সহকারে দেখানো হয়েছে
ডায়োড সম্পর্কিত প্রশ্নের উদাহরণ চিত্র সহকারে দেখানো হয়েছে

১টি ডায়োডের মধ্যে (Electron ও Hole) যতবেশী Charge carrier সুযোগ পাবে, ডায়োডের (conductivity) কন্ডাকটিভিটি তত বৃদ্ধি পাবে এবং (forward Resistivity) রেজিষ্টিভিটি কমতে থাকে, এটাই ডায়োডের ধর্ম ৷silicon diode এর ক্ষেত্রে Voltage drop 0.6v-0.7v এবং Resistive drop 0.3v-0.5v ধরা হয় ৷

images (9)অর্থাৎ ১টি ডায়োডের (Anode) এনোডে যদি 0.7v+0.3 to 0.5v বা 1v থেকে1.2v অতিক্রম করে তখন conductivity (কন্ডাকটিভটি) বৃদ্ধি পেতে থাকে ও ডায়োডের মধ্য দিয়ে কারেন্ট প্রবাহিত হতে শুরু করে এবং Forward resistance ফরওয়ার্ড রেজিষ্ট্যান্স কমতে থাকে, কমতে কমতে  0.10 নীচে বা 0 ওহম রোধের কাছাকাছি চলে আসে ৷ এখানে সামান্যতম রোধ থাকে তা খুবই নগন্য, যা হিসেবে ধরা হয় না৷ এই জন্যই ডায়োড Volt drop করে কিন্তু Current control করে না ৷

images (8)

images (84)

আশাকরি ডায়োড সম্পর্কিত কিছু গুরুত্বপূর্ণ প্রশ্নের উত্তর আমর উপরোক্ত আলোচনা থেকে পেয়েছি।