মাইক্রোকন্ট্রোলারের সাথে কিভাবে USB Communication করতে হয় এবং এর বিস্তারিত

আমি  চেষ্টা করব , আমি যতটুকু জানি তা  শেয়ার করতে। আশাকরি  যারা একেবারেই নতুন তারাও সফল ভাবে মাইক্রোকন্ট্রোলারের সাথে USB Communication করতে সক্ষম হবে। আমি যথাসম্ভব চেষ্টা করব।  আর আমার কোথাও কোন ভুল হলে দয়া করে ক্ষমা করে দেবেন।

আমি মনে করি , Serial Communication এর থেকে  USB(Universal Serial Bus)  কমিউনিকেশন  অনেক ভাল। কারন ইন্টারফেসিং এর ক্ষেত্রে তেমন কোন ঝামেলা নেই , যতটা RS232 Serial এর বেলায়।আর Speed ও অনেক ভালো।USB 1.0 এর Low Speed -1.5Mbit/second  & High Speed -12Mbit/second . এভাবে  USB এর Version যত বাড়বে , Speed ও তত বাড়বে। USB-3.0 এর speed 5Gbit/second . এটাকে SuperSpeed বলে। আরো বিস্তারিত জানার ইচ্ছা থাকলে  Wikipedia এর এই লিঙ্কে যেতে পারেন

যাই হোক ,  এবারে  আসল কথায় ফিরি। আমরা যে Mikrocontroller use করব তাতে USB 1.0 Support করে। এবারে প্রশ্ন করতে পারেন তাহলে  কখন High Speed এবং কখন  Low Speed।  Clock যখন  6MHz  তখন হবে Low Speed এবং  Clock যখন  48 MHz  তখন হবে High Speed .। আমরা চেষ্টা করব  High Speed এ   কমিউনিকেশন করতে। কিন্তু 48 MHz এর Clock pulse  সধারনত Noisy হয় ও দামে বেশি। তাই  আমরা  এই সমস্যা এরাবার জন্য PIC 18f2550 Microcontroller ব্যাবহার করব।কারন  Microchip কম্পানী তাদের কয়েকটি সিরিজের  মাইক্রোকন্ট্রোলারের ভিতর , Internal PLL Circuit দিয়ে দেয় , আর  PIC 18f2550 মাইক্রোকন্ট্রলার এর ভি্তর Internal PLL Circuit আছে।

PLL means Phase Locked Loop .  PLL Circuit 4MHz ক্লক কে 48MHz clock এ রুপান্তর করে। তাই আমরা যে  Crystal ই  ইউজ করব তা ভাগ হয়ে  4MHz হতে হবে। মানে যদি 12MHz হয় , তাহলে 12/3=4 MHz। আবার  যদি 20MHz হয় , তাহলে 20/5=4 MHz। কেননা   PLL Circuit 4MHz ক্লক কে 48MHz clock এ রুপান্তর করে , যা  coding এর সময় ডিফাইন করতে হয়।

Phase Locked Loop :

#Creating Source Code by MikroC :

এবার MikroC  open করুন  ,  New Project এ ক্লিক করুন। এবার নিচের মত দেখতে পাবেন।

এরপরে , নিচের ছবির দিকে খেয়াল করুন।

1--> আমরা জানি PLL circuit শুধুমাত্র 4MHz clock ইনপুট নেয়। তাই crystal 12MHz কে 3 দিয়ে ভাগ করতে হবে , যেটা পরে 96MHz এ convert হবে। যদি crystal 4MHz হয় , তাহলে কিছু করা লাগবেনা।

2 & 3--> আমরা use করছি USB 1.0 এবং এর High Speed হয় 48MHz এ। তাই আমাদের 96 MHz কে 2 দিয়ে ভাগ করতে হবে।

4 --> যেহেতু 12MHz Crystal Oscillator ব্যাবহার করেছি , তাই Oscillrtor Selection এর ক্ষেত্রে HS Oscillator (HS) সিলেক্ট করতে হবে।

5-->  PIC মাইক্রোকন্ট্রোলারের সাথে USB Communication  করতে হলে , অবশ্যই  Voltage Regulator    Enable  করতে হবে। এটা আসলে PIC মাইক্রোকন্ট্রোলারের ভিতরে অবস্থিত 3.3 voltage regulator। আর এটা enable করলে , মাইক্রোকন্ট্রোলারের  vusb pin এ 220 nf এর ক্যাপাসিটর  যুক্ত করতে হবে , Circuit Diagram এ দেখতে পাবেন।

Source Code Here :

unsigned char receivedata[64] absolute 0x500;       <--Variable Declaration
unsigned char senddata[64] absolute 0x580;

int i=0;
void Interrupt(){
USB_Interrupt_Proc();       <--Interrupt function

}

void main()     <--The Main Function

{
HID_Enable(&receivedata,&senddata);   <--To Enable HID
while(1){                          <-- Infinity LOOP
while(!HID_Read());      <--for reading
for(i=0;i<64;i++){
senddata[i]=receivedata[i];     <--Sending received data to senddata[i] variable

}
while(!HID_Write(&senddata,64));  <--for writting
}
}

1. unsigned char receivedata[64] absolute 0x500;
unsigned char senddata[64] absolute 0x580;

এখা্নে senddata ও receivedata  নামে দুটো  Array Variable ডিক্লার করা হয়েছে যা  ক্যারেক্টার টাইপ। USB Communication এর বেলায় যে সব ডাটা আদান-প্রদান হবে , তা অবশ্যই USB RAM এর ভিতর সেভ করতে হবে।PIC 18F2550 এ USB RAM মেমোরি হল [0x500->0x7FF]। তাই  receivedata[64] কে USB RAM এর 0x500 লোকশনে রাখা  হয়েছে , এরপর receivedata এর জন্য  জায়গা রেখে ,   গ্যাপ দিয়ে  0x580 তে senddata রাখা হয়েছে।

2. void Interrupt(){
USB_Interrupt_Proc();}

void Interrupt() একটা User Define ফাংশন , যেটার  ভিতর  USB_Interrupt_Proc() আছে। Interrupt কথার মানে হল কোন কিছুকে বাধা দেয়া। এই ফাংশন এর কাজ হচ্ছে  USB Connection কে সচল বা অচল করে দেয়া। যখন  USB_Interrupt_Proc() এনাবেল হবে Connection অফ হবে আর ডিজেবল হলে অন হবে।

3. HID_Enable(&receivedata,&senddata); 

এই ফাংশনের কাজ হল , USB 1.0 কে এনাবেল করা। যেটা  receivedata -এ রিসিভড ডাটা রাখবে ও senddata এর ডাটা গুলো সেন্ড করবে , USB এর মাধ্যমে।

**Note : HID means "Human Interface Device"

4. char HID_Read();

এই function ডাটা রিসিভ করে। রিসিভিং ফেইলড হলে 0 return করে , আর তা না হলে ক্যারেক্টার return করে।

while(!HID_Read());

এর মানে হল , ডাটা যতক্ষনে না রিসিভ হছে , ততক্ষন ডাটা রিসিভ করার চেষ্টা চালিয়ে যাওয়া।

char HID_Write();

এই function ডাটা send করে। sending ফেইলড হলে 0 return করে , আর তা না হলে  , যে ডাটা গুলো সেন্ড হয়েছে তার সংখা return করে।

while(!HID_Read());

এর মানে হল , ডাটা যতক্ষনে না সেন্ড হছে , ততক্ষন ডাটা সেন্ডিং  চালিয়ে যাওয়া।

5. for(i=0;i<64;i++){
senddata[i]=receivedata[i];    }

এই ফর লুপটা , ০ থেকে 63 বার ঘুরবে  এবং যে সকল ডাটা আমরা রিসিভ করব তা আবার  হোস্ট কে পাঠানোর  জন্য , senddata এর ভিতরে ঢুকবে।

 এবারে  Descriptor File Addition

Descriptor File : এই ফাইল টি আপনার  Microcontroller এর পরিচয় বহন করবে। মুল কথা হল  এ ফাইলটি আপনার device এর

Manufacture Name, Product ID , Vendor ID ইত্যাদি বহন করবে এবং device টিকে PC এর সাথে পরিচয় করিয়ে দেবে।

এবার দেখাব , কি করে Descriptor File বানাতে হয়।

Creating a Descriptor File :

প্রথমে MikroC Software এর   Tool->>HID Terminal এ ক্লিক করুন। এবার ডান পাশে  Descriptor  এ ক্লিক করুন। তাহলে নিচের মত দেখতে পাবেন।

এখানে  Vendor Name , Product Name  ইচ্ছে মত টাইপ করুন। এবার এদিকে লক্ষ করুন ,

Bus power নামে একটা অপশন  আছে , অবশ্যই এটাকে এনাবেল করতে হবে। এটা Microcontroller কে সরাসরি PC থেকে পাওয়ার নিতে  permission দেবে। আর Compiler এর ক্ষেত্রে অবশ্যই mikroC  select করবেন।

এবারে  Descriptor File টি , আপনার পছন্দ মত এক জায়গায় সেভ করুন। এরপর Descriptor Fileটি  প্রোজেক্টের সথে যোগ করব।

এখন , Project Manager ->>My_USB_Test->>Sources এ রাইট ক্লিক করুন , নিচের মত দেখা যাবে।

এরপর সেভড ফাইলটি , open করুন।

দেখবেন  Descriptor File টি add হয়ে গেছে। এবার  My_USB_Test  টি  Build and Run করুন। নিচের মত করে।

এবার .hex file টি , পছন্দমত জায়গায় সেভ করুন। পরে এটা Proteus Simulation এ কাজে লাগবে।

#Proteus Simulation :

Proteus ওপেন করে নিচের মত করে Circuit সা্জিয়ে ফেলুন। আর যারা পারবেন না, তারা নিচের Youtube Video টি দেখলেই হবে। আশা করি তাতেই বুঝতে পারবেন।

এবার PIC 18F2550 MCU তে double click করুন , নিচের মত দেখা যাবে।

এখন , দেখানো জায়গায় ক্লিক করুন ও সেভড হেক্স ফাইল লোড করুন।

লোড হয়ে গেলে , এ দিকে খেয়াল করুন। যদি proteus simulation এর মাধ্যমে USB Communication করতে হয় , তাহলে অবশ্যই Proteus Virtual USB ইনস্টল করতে হবে।

এবার  Simulation Run করুন। নিচে দেখুন।

#Data Sending and Receiving :

ডাটা কমিউনিকেশন এর জন্য MikroC HID Terminal ব্যাবহার করতে হবে।

এখন  Tool->>HID Terminal এ ক্লিক করুন। নিচের মত দেখতে পাবেন।

এখানে , SEND button এর বাম পাশে ডাটা  লিখবার জায়গা আছে। ডাটা লিখে send এ ক্লিক করলে ডাটা Mikrocontroller এ যাবে , ও পাঠানো ডাটা ফিরে আসবে। যা টারমিনালের নিচের অংশে দেখা যাবে। যেমন : Hi, It's me লিখে সেন্ড করলাম , পরে তা নিচের রিসিভার অংশে দেখা যাবে।

নিচের ছবিতে খেয়াল করুন।

এখন  যা লিখবেন তাই নিচের রিসিভারে দেখতে পারবেন। এভাবে করে  মাইক্রোকন্ট্রোলারের সাথে PC এর সংযোগ করতে পারবেন  USB এর মাধ্যমে।

চাইলে , YouTube এ video টি দেখে আসতে পারেন --> VideoLinkশেষে বলতে চাই যে , আমার জ্ঞান খুব কম

জানিনা আমি  কতটুকু করতে পেরেছি। আমি আমার মত করে চেষ্টা করেছি।

ভুল করলে দয়া করে ক্ষমা করে দেবেন।

সবাইকে ধন্যবাদ।

Level 0

আমি Naasif। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 11 বছর 10 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 4 টি টিউন ও 55 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 1 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস

Level 0

so nice vaiaa asa kori continue korben and wait for next tune.Thanks

    Level 0

    @Pranobonto:
    Many Many Thanks ….

Level 0

Thanks for shearing . Is’t Vary good. Carry on.

    Level 0

    @hira_lpc:
    Thank You………..

Level 0

টিউনটা ভাল হইছে। অল্প অল্প করে হলেও লেখা চালিয়ে যাবেন আশা করি। MikroC এর HID সাথে সাথে visual basic এর মত Software দিয়ে example দেখালে আরো ভাল হবে।

    Level 0

    @Faisal:
    আপনাকে অনেক ধন্যবাদ ফয়সাল ভাই । আসলে visual basic এর সর্ম্পকে তেমন কোন ধারনাই নাই ।