আরডুইনো ইউনো, মেগা 2560, লিওনার্দো এবং অনুরূপ বোর্ডগুলির প্রসঙ্গে:
- সিরিয়াল যোগাযোগ কীভাবে কাজ করে?
- সিরিয়াল কত দ্রুত?
- আমি কীভাবে প্রেরক এবং গ্রহণকারীর মধ্যে সংযোগ করব?
দয়া করে নোট করুন: এটি একটি রেফারেন্স প্রশ্ন হিসাবে তৈরি।
আরডুইনো ইউনো, মেগা 2560, লিওনার্দো এবং অনুরূপ বোর্ডগুলির প্রসঙ্গে:
দয়া করে নোট করুন: এটি একটি রেফারেন্স প্রশ্ন হিসাবে তৈরি।
উত্তর:
অ্যাসিঙ্ক্রোনাস সিরিয়াল (সাধারণত সিরিয়াল হিসাবে পরিচিত) যোগাযোগগুলি এক ডিভাইস থেকে অন্য ডিভাইসে বাইট প্রেরণে ব্যবহৃত হয়। একটি ডিভাইস নিম্নলিখিত এক বা একাধিক হতে পারে:
এসপিআই / ইউএসবি / আই 2 সি এর বিপরীতে সিরিয়াল যোগাযোগগুলির একটি ক্লক সংকেত নেই। স্যাম্পলিং ঘড়িটি সম্মত নমুনা হার (বাউড রেট হিসাবে পরিচিত) is প্রেরক এবং প্রাপক উভয়ই একই হার ব্যবহার করার জন্য কনফিগার করতে হবে বা প্রাপক অর্থহীন ডেটা গ্রহণ করবে (বিটগুলি যেভাবে প্রেরণ করা হয়েছিল তার একই হারে নমুনা না দেওয়ার কারণে)।
সংক্রমণটি অ্যাসিনক্রোনাস যার মূলত অর্থ বাইটগুলি যে কোনও সময় পাঠানো যেতে পারে যার মধ্যে বিভিন্ন ব্যবধান রয়েছে। এই গ্রাফিকটি একটি একক বাইট প্রেরণের চিত্রিত করে:
উপরের গ্রাফিকটিতে 'F' বর্ণটি প্রেরণ করা দেখানো হয়েছে। ASCII এ 0x46 (হেক্সে) বা 0b01000110 (বাইনারি)। অন্তত উল্লেখযোগ্য (কম-অর্ডার) বিট প্রথম প্রেরণ করা হয়, এইভাবে উপরে গ্রাফিক আপনি বিট অর্ডার আসার দেখুন: 01100010
।
বাইটগুলির মধ্যে "অলস" সময়টি অবিচ্ছিন্ন "1" বিট হিসাবে প্রেরণ করা হয় (কার্যকরভাবে, সংক্রমণ রেখাটি অবিচ্ছিন্নভাবে ধরে থাকে)।
বাইটের সূচনাটি নির্দেশ করতে, স্টার্ট বিটটি সর্বদা গ্রাফিকের মতো দেখানো রেখাটি কম টেনে ইঙ্গিত করা হয়। প্রাপক একবার প্রারম্ভিক বিটটি দেখতে পান, এটি নমুনার সময় থেকে 1.5 গুণ অপেক্ষা করে এবং তারপরে ডেটা বিটের নমুনা দেয়। এটি 1.5 বার অপেক্ষা করে যাতে এটি:
উদাহরণস্বরূপ, যদি 1/9600 = 0.00010416
বাউডের হার 9600 বাউড হয় তবে নমুনার হারটি সেকেন্ড (104.16 µ সে) হবে।
সুতরাং, 9600 বাডে, স্টার্ট বিট পাওয়ার পরে রিসিভারটি 156.25 ডিগ্রি অপেক্ষা করে এবং তারপরে প্রতি 104.16 ডিগ্রি স্যাম্পল করে samples
স্টপ বিটের উদ্দেশ্য হ'ল প্রতিটি বাইটের মধ্যে অবশ্যই 1 বিট রয়েছে তা নিশ্চিত করা। স্টপ বিট ব্যতীত, যদি কোনও বাইট শূন্যে শেষ হয়, তবে হার্ডওয়্যারটির পক্ষে পরবর্তী বাইটের আর বিটটির মধ্যকার পার্থক্যটি বলা অসম্ভব।
ইউনোতে উপরের আউটপুট উত্পাদন করতে আপনি এই কোডটি লিখতে পারেন:
void setup()
{
Serial.begin(9600);
Serial.print("F");
}
void loop ()
{
}
সঞ্চালনের সময় বাঁচানোর জন্য (পুরানো দিনগুলিতে, হি) আপনাকে বিভিন্ন সংখ্যক ডেটা বিট নির্দিষ্ট করার অনুমতি দেওয়া হয়েছিল। এটিমেগা হার্ডওয়ারটি 5 থেকে 9 পর্যন্ত সংখ্যক ডেটা বিটকে সমর্থন করে Clear
আপনি বিকল্পভাবে একটি সমতা বিট করতে পারেন। চরিত্রের মধ্যে 1 এর সংখ্যা গণনা করে এটি গণনা করা হয়, এবং তারপরে এই সংখ্যাটি বিজোড় হয় কিনা তা নিশ্চিত করে বা প্রয়োজনীয়তার সাথে সামঞ্জস্য বিট 0 বা 1 এ সেট করেও।
উদাহরণস্বরূপ, "F" (বা 0x46 বা 0b01000110) চিঠির জন্য আপনি দেখতে পাচ্ছেন যে সেখানে 3 টি রয়েছে (01000110 এ)। সুতরাং আমরা ইতিমধ্যে বিজোড় সমতা আছে। সুতরাং, সমতা বিট নিম্নলিখিত হিসাবে হবে:
প্যারিটি বিট, উপস্থিত থাকলে শেষ তথ্য বিটের পরে তবে স্টপ বিটের আগে উপস্থিত হয় appears
যদি প্রাপক সঠিক প্যারিটি বিট না পান তবে এটিকে "প্যারিটি ত্রুটি" বলা হয়। এটি ইঙ্গিত দেয় যে কিছু সমস্যা আছে। সম্ভবত প্রেরক এবং রিসিভার বিভিন্ন বাউড (বিট) হারগুলি ব্যবহার করার জন্য কনফিগার করা হয়েছে, বা লাইনে কোনও শব্দ ছিল যা শূন্যকে এক বা তদ্বিপরীত করে।
কিছু প্রাথমিক সিস্টেমগুলি "চিহ্ন" সমতা ব্যবহার করেছিল (যেখানে প্যারিটি বিট ডেটা নির্বিশেষে সর্বদা 1 ছিল), বা "স্পেস" প্যারিটি (যেখানে প্যারিটি বিট ডেটা নির্বিশেষে সর্বদা 0 ছিল)।
কিছু যোগাযোগ সরঞ্জাম 9-বিট ডেটা ব্যবহার করে, তাই এই ক্ষেত্রে প্যারিটি বিটটি 9 তম বিটে পরিণত হয়। এই 9 তম বিটটি প্রেরণের জন্য বিশেষ কৌশল রয়েছে (নিবন্ধগুলি 8-বিট রেজিস্টার তাই 9 ম বিটটি অন্য কোথাও স্থাপন করতে হবে)।
প্রারম্ভিক সরঞ্জামগুলি বৈদ্যুতিনভাবে কিছুটা ধীর হয়ে থাকে, তাই আগত বাইট প্রক্রিয়া করার জন্য রিসিভারকে সময় দেওয়ার জন্য, কখনও কখনও এটি নির্দিষ্ট করা হয়েছিল যে প্রেরক দুটি স্টপ বিট প্রেরণ করবেন। এটি মূলত আরও সময় যুক্ত করে যেখানে পরবর্তী প্রারম্ভিক বিটটি উপস্থিত হওয়ার আগে ডেটা লাইনটি বেশি রাখা হয় (আরও একটি বিট সময়)। এই অতিরিক্ত বিট সময়টি সর্বশেষ ইনকামিং বাইট প্রসেস করার জন্য রিসিভারকে সময় দেয়।
স্টিপ বিট হওয়ার কথা যখন রিসিভারটি লজিক্যাল 1 না পায় তবে এটিকে "ফ্রেমিং ত্রুটি" বলা হয়। এটি ইঙ্গিত দেয় যে কিছু সমস্যা আছে। বেশ সম্ভবত প্রেরক এবং রিসিভার বিভিন্ন বাউড (বিট) হারগুলি ব্যবহার করতে কনফিগার করা হয়েছে।
সাধারণত, সিরিয়াল যোগাযোগ আপনাকে গতি, ডেটা বিটের সংখ্যা, সমমানের ধরণ এবং স্টপ বিটের সংখ্যার মতো এই বলে বোঝানো হয়:
9600/8-N-1
এটি আমাদের বলছে:
এটি গুরুত্বপূর্ণ যে প্রেরক এবং প্রাপক উপরোক্ত বিষয়ে একমত হন, অন্যথায় যোগাযোগ সফল হওয়ার সম্ভাবনা কম।
আরডুইনো ইউনোতে হার্ডওয়্যার সিরিয়ালের জন্য ডিজিটাল পিন 0 এবং 1 উপলব্ধ রয়েছে:
দুটি আরডুইনোর সাথে সংযোগ স্থাপনের জন্য আপনি টিএক্স এবং আরএক্সকে এভাবে স্যুপ করে যান :
গতির বিস্তৃত পরিসর সমর্থিত (নীচে গ্রাফিক দেখুন)। "স্ট্যান্ডার্ড" গতি সাধারণত 300 বাউডের একাধিক (যেমন 300/600/1200/2400 ইত্যাদি)।
অন্যান্য "অ-মানক" গতি যথাযথ রেজিস্টারগুলি সেট করে পরিচালনা করা যায়। হার্ডওয়্যারশিয়াল বর্গটি আপনার জন্য এটি করে। যেমন।
Serial.begin (115200); // set speed to 115200 baud
থাম্বের নিয়ম হিসাবে, ধরে নিয়ে আপনি 8-বিট ডেটা ব্যবহার করছেন, তবে আপনি বাড রেট 10 দ্বারা বিভক্ত করে প্রতি সেকেন্ডে যে বাইটগুলি প্রেরণ করতে পারবেন তা অনুমান করতে পারেন (স্টার্ট বিট এবং স্টপ বিটের কারণে)।
সুতরাং, 9600 বাউডে আপনি 9600 / 10 = 960
প্রতি সেকেন্ডে 960 বাইট ( ) সঞ্চার করতে পারেন ।
আতমেগায় বাড রেট সিস্টেম ক্লকটি ভাগ করে এবং তারপরে একটি প্রাক-সেট সংখ্যা পর্যন্ত গণনা করে উত্পন্ন হয়। ডেটাশিটের এই টেবিলটি 16 মেগাহার্টজ ঘড়ির জন্য (যেমন আরডুইনো ইউনিোর একটি হিসাবে) নিবন্ধকের মানগুলি এবং ত্রুটির শতাংশ দেখায়।
ইউ 2 এক্সএন বিটটি ক্লক রেট বিভাজনকে প্রভাবিত করে (0 = 16 দ্বারা ভাগ করে, 1 = 8 দিয়ে ভাগ)। ইউবিআরআরএন রেজিস্ট্রারে প্রসেসর পর্যন্ত গণনা করা সংখ্যা রয়েছে।
সুতরাং উপরের টেবিল থেকে আমরা দেখতে পাচ্ছি যে আমরা 16 মেগাহার্টজ ঘড়ি থেকে নীচে 9600 বাউড পেয়েছি:
16000000 / 16 / 104 = 9615
আমরা 104 দ্বারা বিভক্ত করি এবং 103 দ্বারা নয় কারণ কাউন্টারটি শূন্য-আপেক্ষিক। সুতরাং এখানে ত্রুটিটি 15 / 9600 = 0.0016
যা উপরের টেবিলের (0.02%) যা বলেছে তার নিকটবর্তী।
আপনি লক্ষ্য করবেন যে কিছু বাডের হারের তুলনায় অন্যদের চেয়ে বেশি ত্রুটির পরিমাণ থাকে।
ডাটাশিট অনুসারে 8 টি ডাটা বিটের সর্বোচ্চ ত্রুটি শতাংশ 1.5% থেকে 2.0% এর মধ্যে রয়েছে (আরও তথ্যের জন্য ডেটাশিটটি দেখুন)।
আরডুইনো লিওনার্দো এবং মাইক্রো সিরিয়াল যোগাযোগের জন্য আলাদা ধারণা রাখে, কারণ তারা সিরিয়াল বন্দর দিয়ে নয়, হোস্ট কম্পিউটারের সাথে সরাসরি ইউএসবি মাধ্যমে সংযোগ করে।
এ কারণে, আপনাকে সিরিয়ালটি "প্রস্তুত" হয়ে ওঠার অপেক্ষায় থাকতে হবে (সফ্টওয়্যারটি যেমন একটি ইউএসবি সংযোগ স্থাপন করে), এর সাথে অতিরিক্ত কয়েকটি লাইন যুক্ত করে:
void setup()
{
Serial.begin(115200);
while (!Serial)
{} // wait for Serial comms to become ready
Serial.print("Fab");
}
void loop ()
{
}
তবে, আপনি যদি পিন ডি 0 এবং ডি 1 এর মাধ্যমে আসলে (ইউএসবি কেবল ব্যবহার করে) যোগাযোগ করতে চান তবে আপনার সিরিয়াল পরিবর্তে সিরিয়াল 1 ব্যবহার করা দরকার। আপনি এটি এরকম করুন:
void setup()
{
Serial1.begin(115200);
Serial1.print("Fab");
}
void loop ()
{
}
নোট করুন যে আরডুইনো সিরিয়াল যোগাযোগের জন্য টিটিএল স্তর ব্যবহার করে। এর অর্থ এটি প্রত্যাশা করে:
পিসির সিরিয়াল পোর্টে প্লাগ করার জন্য ডিজাইন করা পুরানো সিরিয়াল সরঞ্জামগুলি সম্ভবত আরএস 232 ভোল্টেজ স্তর ব্যবহার করে, যথা:
টিটিএল স্তরের ক্ষেত্রে এটি কেবল "উল্টানো" নয় (একটি "এক" একটি "শূন্য" এর চেয়ে বেশি নেতিবাচক), আরডুইনো তার ইনপুট পিনগুলিতে নেতিবাচক ভোল্টেজগুলি পরিচালনা করতে পারে না (5V এর চেয়ে বেশি ইতিবাচকও নয়)।
এই জাতীয় ডিভাইসগুলির সাথে যোগাযোগের জন্য আপনার প্রয়োজন একটি ইন্টারফেস সার্কিট। কেবল ইনপুট (আরডুইনো) এর জন্য, একটি সাধারণ ট্রানজিস্টার, ডায়োড এবং কয়েকজন প্রতিরোধক এটি করবে:
দ্বি-মুখী যোগাযোগের জন্য আপনাকে নেতিবাচক ভোল্টেজ তৈরি করতে সক্ষম হওয়া প্রয়োজন, সুতরাং আরও জটিল সার্কিটের প্রয়োজন। উদাহরণস্বরূপ, MAX232 চিপ চার্জ-পাম্প সার্কিট হিসাবে কাজ করার জন্য চার 1 µF ক্যাপাসিটরের সাথে একযোগে এটি করবে।
সফ্টওয়্যারসিরিয়াল নামে একটি লাইব্রেরি রয়েছে যা আপনাকে সফ্টওয়্যারগুলিতে হার্ডওয়্যারের পরিবর্তে সিরিয়াল যোগাযোগ (এক বিন্দু পর্যন্ত) করতে দেয়। এর সুবিধা রয়েছে যে আপনি সিরিয়াল যোগাযোগের জন্য বিভিন্ন পিন কনফিগারেশন ব্যবহার করতে পারেন। অসুবিধাটি হ'ল সফ্টওয়্যারটিতে সিরিয়াল করা আরও প্রসেসর-নিবিড় এবং ত্রুটির প্রবণতা। আরও তথ্যের জন্য সফ্টওয়্যার সিরিয়াল দেখুন ।
আরডুইনো "মেগা" এর 3 টি অতিরিক্ত হার্ডওয়্যার সিরিয়াল বন্দর রয়েছে। তারা বোর্ডে Tx1 / Rx1, Tx2 / Rx2, Tx3 / Rx3 হিসাবে চিহ্নিত রয়েছে x এগুলি সম্ভব হলে সফটওয়্যারসিরেলের অগ্রাধিকার হিসাবে ব্যবহার করা উচিত। এই অন্যান্য পোর্টগুলি খোলার জন্য আপনি সিরিয়াল 1, সিরিয়াল 2, সিরিয়াল 3 নামগুলি ব্যবহার করেন:
Serial1.begin (115200); // start hardware serial port Tx1/Rx1
Serial2.begin (115200); // start hardware serial port Tx2/Rx2
Serial3.begin (115200); // start hardware serial port Tx3/Rx3
হার্ডওয়্যারশিয়ার লাইব্রেরি ব্যবহার করে পাঠানো এবং গ্রহণ করা উভয়ই বাধা ব্যবহার করে।
আপনি যখন কাজটি করেন Serial.print
, আপনি যে ডেটা মুদ্রণের চেষ্টা করছেন তা কোনও অভ্যন্তরীণ "সংক্রমণ" বাফারে রাখা হয়। আপনার যদি 1024 বাইট বা তার বেশি র্যাম থাকে (যেমন ইউনোতে) আপনি একটি 64-বাইট বাফার পান, অন্যথায় আপনি 16 বাইট বাফার পান। যদি বাফারের ঘর থাকে তবে Serial.print
তাৎক্ষণিকভাবে রিটার্ন দেয়, সুতরাং আপনার কোডটি বিলম্বিত করবে না। যদি কোনও জায়গা না থাকে, তবে এটি রুম থাকার জন্য বাফারকে যথেষ্ট খালি করার অপেক্ষায় এটি "ব্লক করে"।
তারপরে, হার্ডওয়্যার দ্বারা প্রতিটি বাইট সংক্রামিত হওয়ার সাথে সাথে একটি বাধা বলা হয় ("ইউএসআর্ট, ডেটা রেজিস্টার খালি" বিঘ্নিত) এবং বাধা রুটিনটি বাফার থেকে পরবর্তী বাইটটি সিরিয়াল পোর্টের বাইরে প্রেরণ করে।
ইনকামিং ডেটা প্রাপ্ত হওয়ার সাথে সাথে একটি বিঘ্নিত রুটিনকে বলা হয় ("ইউএসআর্ট আরএক্স কমপ্লিট" ইন্টারপট) এবং ইনকামিং বাইটটিকে "রিসিভ" বাফারে স্থান দেওয়া হয় (উপরে বর্ণিত ট্রান্সমিট বাফার একই আকার)।
আপনি যখন ফোন করবেন তখন Serial.available
জানতে পারবেন যে "বদ্ধ" প্রাপ্ত বাফারে কয়টি বাইট উপলব্ধ। আপনি যখন কল করেন Serial.read
কোনও বাইট রিসিভ বাফার থেকে সরানো হয় এবং আপনার কোডে ফিরে আসে।
১০০০ বাইট বা আরও বেশি র্যাম সহ আরডিনোগুলিতে, রিসিভ বাফার থেকে ডেটা সরিয়ে নেওয়ার জন্য কোনও তাড়াহুড়া হয় না, তবে শর্ত থাকে যে আপনি এটি পূরণ না করতে পারেন। যদি এটি পূরণ হয় তবে পরবর্তী যে কোনও ডেটা ফেলে দেওয়া হবে।
মনে রাখবেন যে এই বাফারের আকারের কারণে খুব বড় সংখ্যক বাইট আসার অপেক্ষা করার কোনও অর্থ নেই, উদাহরণস্বরূপ:
while (Serial.available () < 200)
{ } // wait for 200 bytes to arrive
এটি কখনই কাজ করবে না কারণ বাফার এতটা ধরে রাখতে পারে না।
পড়ার আগে সর্বদা নিশ্চিত হয়ে নিন যে ডেটা উপলব্ধ। উদাহরণস্বরূপ, এটি ভুল:
if (Serial.available ())
{
char a = Serial.read ();
char b = Serial.read (); // may not be available
}
Serial.available
পরীক্ষা শুধুমাত্র নিশ্চিত আপনার আছে এক কিন্তু কোড দুই পড়া করার চেষ্টা করে বাইট পাওয়া যায়,। এটি কাজ করতে পারে, যদি বাফারে দুটি বাইট থাকে তবে না-আপনি ফিরে পাবেন -1 যা মুদ্রিত হলে 'ÿ' এর মতো দেখাবে।
ডেটা প্রেরণে কতক্ষণ সময় লাগে সে সম্পর্কে সচেতন হন। উপরে উল্লিখিত হিসাবে, 9600 বাউডে আপনি প্রতি সেকেন্ডে কেবল 960 বাইট প্রেরণ করেন, সুতরাং একটি এনালগ বন্দর থেকে 1000 রিডিং পাঠানোর চেষ্টা করুন, 9600 বাউড, খুব সফল হবে না।