সিরিয়াল কমিউনিকেশন এর ১৪ গোষ্ঠী !!

আলোচ্য বিষয়

  • Practically learn about serial communication in Arduino.

এই ব্লগটা যদি তুমি ধৈর্য সহকারে মনোযোগ দিয়ে পড়ো তাহলে আশা করি অনেক কিছু জানতে ও শিখতে পারবা!

সাধারণ আলোচনা

মুলত আমরা আরডুইনো তে প্রোগ্রাম আপলোড করতে হলে পিসি বা মোবাইল যেকোনো একটার সাহায্যে কোড আপলোড করে থাকি!

তুমি যদি পিসির সাহায্যে কোড আপলোড করতে চাও তাহলে এই লিংক এ গিয়ে সফটওয়্যার ইন্সটল করে নিবে.

Click here ☞ arduino.cc

আর তুমি যদি এন্ড্রয়েড এ্যাপ এর সাহায্যে কোডিং করতে চাও তাহলে এই এ্যাপ ডাউনলোড করে নিবে.

Click here ☞ arduinodroid

  • এই ২টার যেকোনো একটা তোমার কাছে থাকা জরুরি যেহেতু আমরা সিরিয়াল কমিউনিকেশন কিভাবে কাজ করে তা প্র‍্যাক্টিকেলি দেখব তাই আমাদের কোডিং করার প্রয়োজন হবে!

এখন আরডুইনো তে কোড আপলোড করতে হলে আমাদের আরডুইনো কে পিসি বা মোবাইল এর সাথে (USB- type(B/A)) এর মাধ্যমে সংযুক্ত করতে হবে যাতে প্রোগ্রাম আপলোড করতে পারি।

এই যে USB দিয়ে আরডুইনো এর সাথে সংযুক্ত করে কোড আপলোড করলাম যে কমিউনিকেশন সিস্টেম এ এর নামই হলো সিরিয়াল কমিউনিকেশন। অর্থাৎ আরডুইনো সিরিয়াল কমিউনিকেশন এর মাধ্যমে ডাটা ট্রান্সমিট বা রিসিভ করে থাকে।মানে ডাটার আদান-প্রদান করে থাকে! আরডুইনো তে এই কমিউনিকেশন প্রটোকল এর নাম ( UART=Universal Asynchronous Receiver-Transmitter) আশা করি এতোটুকু পরিষ্কার👀

বড রেট কিন্তু মিলিয়ে দেখিও!

আমরা কিন্তু গত পর্বে(১৩) বলেছিলাম যখন আমরা সিরিয়াল কমিউনিকেশন করব তখন রিসিভার অ্যান্ড ট্রান্সমিটার (সেন্ডার) এর বড রেট (৯৬০০)একই থাকতে হবে এবং কমে রাখার চেষ্টা করতে হবে যাতে ডাটা মিসিং বা ইরর এর হার প্রতি সেকেন্ডে কমানো যায়!

এখানে তুমি কম্পিউটার এবং আরডুইনো এর বড রেট সেম রাখবা অর্থাৎ (৯৬০০)।

তো চলো এবার আমরা কোডিং এর যাদু চালু করি🥳আর দেরি কিসের?

  • প্রথমেই তোমাদের পিসি তে আরডুইনোর সফটওয়্যার বা মোবাইলে এ্যাপ টা ওপেন করতে হবে!

  • ২য় তো তোমাদের ২টা বেইসিক ফাংশন বিসমিল্লাহ বলে লিখে দিতে হবে (শুধুমাত্র মোবাইলে কোডিং করলে)

  • এরপর সিরিয়াল কমিউনিকেশন এর ক্ষেত্রে যে ফাংশন গুলা প্রয়োজন হয় সেগুলা সম্পর্কে ধীরে ধীরে জানব।

  • খেয়াল রাখবে আমার কোডিং স্ট্রাকচার এ কোথায় ছোট হাতের অক্ষর আর কোথায় বড় হাতের অক্ষর।কারন আরডুইনো কোডিং (case sensitive)মানে হলো ছোট লেটার এর জাগায় বড় লেটার দিলে কোডিং এ ইরর আসবে এবং ভাইস ভার্সা!

আগে আমরা একটা বেইসিক কোড এর স্ট্রাকচার দেখে নিই পরে আমি আস্তে আস্তে ব্যাখ্যায় আসব!

BASIC CODING:

Sample-1 (No Code):

বেইসিক সেই ২টা ফাংশন যেটার কোনো একটা না লিখলে কোনো কোড ই কাজ করবে না

void setup(){}
void loop(){}

All letter must be in small letter!

Sample-2 (Serial Begin):

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

এই শুরু হওয়াটাই হলো (Serial.begin) মানে তাকে সক্রিয় করা।

সিরিয়াল কমিউনিকেশন শুরু করতে আমরা Serial.begin(); এই ফাংশন টা কল করব।

এখানে কিন্তু Serial এর (S) বড় হাতের! এবং প্রতিটা কমান্ড বা স্টেটমেন্ট এর পরে সেমিকলন(;) অবশ্যই দিবা। এটা ফাংশন হলেও যেহেতু তুমি এটাকে দিয়ে কোনো কাজ করাবা সেহেতু এখন এটা টাস্ক হিসাবে গন্য হবে তাই সেমিকলন দিতে হবে!👀

Code:

void setup(){

Serial.begin();

}

void loop(){

}

দিলাম তো এবার সিরিয়াল কমিউনিকেশন এর পথ খুলে🤝?

না এখনো পারি নাই! কি জানি একটা মিসিং লাগতেছে আমার আছে🤔।

যদি তোমার উত্তর বড রেট হয় তাহলে তুমি ঠিক ধরেছ😄।

আমরা Serial.begin() এই ১ম বন্ধনীর মধ্যে কোনো বড রেট ফিক্সড করে দেই নাই। যার ফলে কমিউনিকেশন শুরু হবে না। কারন আরডুইনো জানেই না সে কত স্পিডে কিভাবে কম্পিউটার এর সাথে কমিউনিকেট করবে!

তাই আমরা লেখবো,

sample-3 (Baud Rate Check):

void setup(){
Serial.begin(9600);
}
void loop(){}

১ম বন্ধনীর ভিতরে বড রেট টা সেট করে দিতে হবে।

এখন আমরা যদি কোনো সেন্সর বা মডিউল এর সাথে সিরিয়াল কমিউনিকেশন করতে চাই (ব্লুটুথ মডিউল) তাইলে কি করব?

  • তখন আমরা আরডুইনো এর 0(rx=receive data), 1 (tx= transmit data) পিন ইউজ করব।

  • এক্ষেত্রে সেন্সর বা মডিউল এর( TX) = আরডুইনো এর (RX)

  • এবং মডিউল এর (RX) = আরডুইনো এর (TX) এভাবে কানেক্ট করব!

Reminder -2 (পিনের কানেকশনঠিকমতো দিও):

সব সেন্সর বা মডিউল দিয়েই কিন্তু সিরিয়াল কমিউনিকেশন করা যাবে না। যদি সেটা সিরিয়াল কমিউনিকেশন সাপোর্ট করে অর্থাৎ সেখানেও tx,rx পিন থাকে তবে শুধু সম্ভব।

আমরা চাইলে ২টা আরডুইনো এর মধ্যেও সিরিয়াল কমিউনিকেশন করাতে পারি!একই পিন ডায়াগ্রাম অনুযায়ী!

Reminder-3 (কোড আপলোডের সময়ে কিন্তু কানেকশন খুলে নিবে!):

আমরা যখন tx,rx নিয়ে কাজ করব এবং কোড আপলোড করবো তখন অবশ্যই কোড আপলোড এর সময়ে আরডুইনো থেকে tx,rx পিন খুলে নিবো।তা না করলে কোড আপলোড এর সময় ইরর দেখা দিবে। কারন আমাদের কম্পিউটার ও কোড আপলোড এর জন্য এই পিন গুলাই ইউজ করে। আর সিরিয়াল কমিউনিকেশন এ যেহেতু কোনো অ্যাড্রেস নাই তাই একটা ডিভাইস ছাড়া মাল্টিপল ডিভাইস অপারেট করা যায় না। যেটা আবার I2C কমিউনিকেশন এর ক্ষেত্রে করা সম্ভব ছিল!

এখন একটা কোড দেখি তারপর সে কোডে কি কি আছে নিউ অ্যাড করেছি তা একে একে আলোচনা করব! বেশি বড় হয়ে যাওয়ায় একটু শর্ট করার ফন্দি😶

Sample-4 (Properly Receive Serial Data):

Code:

char x;
void setup (){
Serial.begin(9600);
}
void loop(){
if( Serial.available() ) {
x=Serial.read();
}
Serial.write("Hello");
}

  • প্রথমেই void setup() এর উপরে একটা ভ্যারিয়েবল ডিক্লেয়ার করা হইছে character type এর যার নাম দিয়েছি x। অবশ্যই x এর পরে (;) দিতে হবে। (char x;)

  • পরে void লুপ এর মধ্যে নিউ একটা ফাংশন কল করেছি।.. Serial.available ()....

এর মাধ্যমে আমরা কোনো ডাটা পাচ্ছি কিনা সেটা বুঝাবে অর্থাৎ সিরিয়াল এভেইএবল আছি কিনা!

যদি আমরা কম্পিউটার থেকে আরডুইনো তে কোনো ডাটা পাই তখন এই ফাংশন টা if condition এর কারনে ট্রু(true) হবে এবং তখন ই কেবল সিরিয়াল রিড(read) করবে।যদি ডাটা না পাই তাহলে রিড করবে না অর্থাৎ তখন এই ফাংশন টা ফলস(false) হবে।

  • এরপরেই দেখো আমরা

  • if(Serial.available () ){

x= Serial.read ();

}

এখানে নিউ আরেকটা ফাংশন Serial.read();

সম্পর্কে জানবে তোমরা। এই ফাংশন এর কাজ হলো যখন সিরিয়াল কমিউনিকেশন এভেইলএবল হবে তখন শুধু ডাটা রিড করবে যেহেতু if condition এ আগের ফাংশন টা ইনক্লুড করে {} এর ভিতরেই এই ফাংশন টা কল করেছি।এবং এই ফাংশন এ যা রিড করবে তা ক্যারেক্টার টাইপ ভ্যারিয়েবল (x)এর মধ্যে জমা রাখবে!

  • এবার আমরা জানবো Serial.write() অথবা Serial.print() ফাংশন এর ব্যাপারে। ২টার কাজ একই।

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

Code: Serial.write("Hello");

এখানে ফাংশন এর ভিতরে "Hello" লেখা হয়েছে। আমরা যদি কোড আপলোড করি তাইলে আমরা সিরিয়াল মনিটর এ Hello ওয়ার্ড টা দেখতে পাবো!

  • রিমাইন্ডার : আমরা এই ফাংশন টা if condition এর {} এর বাইরে প্রিন্ট করাচ্ছি তাই আগের কন্ডিশনের কোনো ইফেক্ট পরবে না এখানে তেমন!

  • এবার অন্য একটা কোড এর এক্সাম্পল দেখি এবং বুঝার চেষ্টা করি।

Code:

  1. char x;

    void setup () {

    Serial.begin(9600);

    pinMode(13,OUTPUT);

    }

    void loop(){

    if( Serial.available() ) {

    x = Serial.read();

    if ( x == 'a' ) digitalWrite(13, HIGH);

    else if ( x == 'b' ) digitalWrite(13, LOW);

    }

    }

এবার এই কোড টা বুঝি🙌

  • এখানে এবার pinMode() নামের একটা ফাংশন কল করা হইছে এর কাজ হলো আমরা আরডুইনো এর কোন পিন নিয়ে কাজ করতে চাই সেই পিন এবং কি হিসাবে ডিক্লেয়ার করতে চাই। অর্থাৎ এর ২ টা প্যারামিটার ()⇨ ১ম বন্ধনীর প্রথম যে প্যারামিটার সেখানে আমরা কোন পিন নিয়ে কাজ করব সেটা লিখব। আমাদের ক্ষেত্রে আমরা ১৩ নং পিন নিয়ে কাজ করেছি(তোমরা চাইলে যেকোনো ডিজিটাল পিন ইউজ করতে পারো (তোমাদের সুবিধা মতো)।এবং এলইডি যেহেতু আউটপুট ডিভাইস তাই ১ম বন্ধনীর ২য় প্যারামিটার এ OUTPUT হিসাবে ইনিশিয়ালাইজ করেছি।

☞ pinMode(13,OUTPUT);

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

  • এই কোডে আমরা আগের কোডের if condition এর ৩য় বন্ধনীর মধ্যে ২টা কোড এক্সট্রা অ্যাড করেছি।

☞if(x=='a') digitalWrite(13,HIGH);

এর মানে হলো আমরা আগে সিরিয়াল থেকে বা কম্পিউটার থেকে যে ডাটা( X ) ⇨ নামের ভ্যারিয়েবল এ জমা করেছিলাম সিরিয়াল রিড করে সেই x এর মান যদি [ char 'a' ] হয় তাইলে ১৩নং পিন এ যে এলইডি আছে সেটা HIGH হবে। স্ট্রাকচার দেখো কিন্তু🌝

ক্যারেক্টার প্রকাশ করতে বা বুঝাতে সিংগেল কোটেশন এর মধ্যে লিখতে হয়☞(' ') সিংগেল কোটেশন। এবং ভ্যারিয়েবল টাইপ ক্যারেক্টর হলে শুধু সিংগেল লেটার ই লেখতে পারবে এই কোটেশন এর ভিতরে।কোনো ওয়ার্ড বা মাল্টিপল লেটার লিখতে পারবে না। যেমন:

if(x=='abc')digitalWrite(13,HIGH);

✘✘✘✘✘✘✘✘✘✘.......হবে না।

এর জন্য ভ্যারিয়েবল টাইপ স্ট্রিং(String) নিতে হবে!অ্যান্ড স্ট্রিং নিলে তখন সিংগেল কোটেশন এর জাগায় ডাবল কোটেশন হবে☞( " " )

লাইক:

char x ; এর জাগায় String x; এবং বাকি সব ঠিক থাকবে!

☞if(x=="abc")digitalWrite(13,HIGH);

  • সর্বশেষ যেটা আছে সেটা হলো

else if(x=='b')digitalWrite(13,LOW);

এর মানে আগের টা যদি ট্রু না হয় এবং x এর ভ্যালু 'b' হয় তাইলে ১৩নং এলইডি পিন কে এবার (LOW) দ্বারা এলইডি কে অফ হতে বলছি বা কমান্ড দিচ্ছি!

বাস শেষ আমদের এই কোডিং পার্ট! মজার না🤔?

Reminder-4 (Mind your brackets!):

ফাংশন এর কোথায় কোন বন্ধনী ব্যবহার করেছি,লেটার গুলা কেমন, স্ট্রাকচার কেমন সব যাতে ঠিক মতো কর তোমরা নাহলে কোড কাজ করবে না!

✪ পুশ বাটনের সাহায্যে এলইডি

নিয়ন্ত্রণ ও চ্যাট বোট তৈরি করা


কোড টা দেখে নেই আগে:

Sample-5 (ChatBot):

  1. int buttonstate=0;

    void setup(){

    pinMode(2,INPUT_PULLUP);

    pinMode(13,OUTPUT);

    Serial.begin(9600);

    }

    void loop(){

    buttonstate=digitalWrite(2);

    Serial.println(buttonstate);

    digitalWrite(13,buttonstate) ;

    if(Serial.available ()){

    char x=Serial.read();

    if(x=='a') Serial.println("you are very beautiful") ;

    if(x=='t') Serial.println("you are very intelligent");

    if(x=='w') Serial.println("you are very little");

    if(x=='r') Serial.println("you are very talkactive");

    if(x=='p') Serial.println("you are very shy");

    if(x=='j') Serial.println("you are very active");
    }
    }

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

  • এখানে প্রথমেই buttonstate নামে একটা ভ্যারিয়েবল নেওয়া হয়েছে যার ইনিশিয়াল ভ্যালু 0।

  • এই কোডে নিউ একটা ফাংশন pinMode এ ডিক্লেয়ার করা হয়েছে তাহলো-INPUT_PULLUP

☞pinMode(2,INPUT_PULLUP);

তোমরা যদি INPUT_PULLUP অথবা INPUT_PULLDOWN এর কাজ না জানো যে এটা কি তাহলে এই ভিডিওটি দেখে আসতে পারো

Click this

  • এরপর আমরা ২নং পিন এ ডিজিটাল রিডিং নিয়েছি যার ভ্যালু টা buttonstate এর মধ্যে জমা

থাকবে। এবং এই ভ্যালুটা সিরিয়াল মনিটর এ প্রিন্ট করানোর ব্যবস্থা করেছি।

  • এরপর digitalWrite (13, buttonstate); দিয়েছি। আগে কিন্তু আমরা এই ফাংশন এর ২য় প্যারামিটার এ HIGH কিংবা LOW দিছিলাম।

এখন দিয়েছি বাটনস্টেট। কারন পুশ বাটন এর যাই স্টেট না অবস্থা থাকুক না কেন তা এই ভ্যারিয়েবল এই জমা থাকবে।এখানে অবস্থা বলতে (০,১) কে বুঝানো হয়েছে।

  • এরপর আমরা সিরিয়াল রিডিং নিয়েছি অর্থাৎ সিরিয়াল মনিটরে কাজ করার জন্য যা করা দরকার তা করেছি।

  • এরপর সিরিয়াল মনিটর থেকে কিংবা কোনো ব্লুটুথ এ্যাপস এর মাধ্যমে আমরা যা ক্যারেক্টর সেন্ড করব সেই লজিক টা যদি ট্রু হয় তাহলে সিরিয়াল মনিটর এ তা আউটপুট দিবে বা প্রিন্ট করবে।

বাস শেষ এতোটুকুই। সহজ না ব্যাপারটা👀!

What is Software Serial?


Software Serial হলো মুলত আরডুইনো এর হার্ডওয়্যার সিরিয়াল (on board Rx, Tx)ব্যতীত অন্য যে ডিজিটাল পিন গুলোকে একাটি বিশেষ লাইব্রেরি এর মাধ্যমে বিশেষ পদ্ধতি তে সিগনাল জেনারেট করে হার্ডওয়্যার সিরিয়াল এর মতো কাজ করাই হলো সফটওয়্যার সিরিয়াল।

এর মাধ্যমে আমাদের আর হার্ডওয়্যার সিরিয়াল এর মতো tx,rx পিন গুলাকে কোড আপলোড করার সময় যে খুলে ফেলতে হতো তা আর হবে না!!

সেই বিশেষ লাইব্রেরি টি হলো:

☞SoftwareSerial

এটি কে কোডে ইনক্লুড করতে আগে ইন্সটল করে নিতে হবে পরে কোডে ইনক্লুড করতে এটা ফলো করো!

☞ <SoftwareSerial.h>

এই লাইব্রেরি সম্পর্কে আরো জানতে বা তোমাদের জ্ঞান এর পরিধি বাড়াতে যে কোন বোর্ড এর কোন পিন গুলাকে RX,TX পিন হিসাবে ব্যবহার করা যায় তার জন্য এই ব্লগ টি অবশ্যই পরবে!!

Software Serial library

তোমরা অনেক গুরুত্বপূর্ণ কিছু জানতে পারবে এর মাধ্যমে!

এটার একটা ডেমো কোড দেখি এবার!

Sample-6 (Software Serial):

#include<SoftwareSerial.h>
SoftwareSerial myserial(11,12);
void setup(){
Serial.begin(9600);
myserial.begin(9600);
}
void loop(){
if(myserial.available ()){
String x=myserial.readString();
Serial.println(x);
}
}

এখানে প্রথমেই সফটওয়্যার সিরিয়াল কমিউনিকেশন এর জন্য সেই লাইব্রেরি টি ইনক্লুড করা হয়েছে।

#include<SoftwareSerial.h>

এর পরে এই লাইব্রেরি এর আন্ডারে একটা অবজেক্ট ডিক্লেয়ার করা হয়েছে এই নামে

☞SoftwareSerial myserial(11,12);

এখানে myserial হলো অবজেক্ট টা। এখানে যেকোনো কিছু হতে পারে। যেমন ছবি তে tonmoy আছে। তুমি চাইলে নিজের নাম ও দিতে পারো।

এটার আবার ২টা প্যারামিটার আছে ১ম বন্ধনীর ভিতরে যেটা তোমরা ওই উপরে দেওয়া ব্লগ টি পড়লেই ভালো করে বুঝতে পারবে👀

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

  • এর পরে লুপ ফাংশন এ আমরা সফটওয়্যার সিরিয়াল এর মাধ্যমে স্ট্রিং টাইপ ডাটা রিড করব আর সেটাকে সিরিয়াল মনিটর এ প্রিন্ট করাবো কম্পিউটার এর। বাস কাজ শেষ💪🙌।

if(myserial.available ()){
String x=myserial.readString();
Serial.println(x);
}

এই লাইন গুলার মাধ্যমেই মুলত কাজ টা করেছি আমরা।

আর হে মনে রাখবে স্ট্রিং নিয়ে কাজ করলে অবশ্যই myserial/ Serial/ whatever you give object name তার পরে ( . read ) এর সাথে অবশ্যই (String) অ্যাড করবে নাহলে ডাটা রিড করতে পারবে না👀🥲!

আর হে String এর (S) কিন্তু বড় হাতের হবে। এই স্ট্রাকচার গুলা কিন্তু অবশ্যই ফলো করবে এটা আগেও বলেছি।

তো আজকে এখানেই শেষ করতে হচ্ছে দেখা হবে অন্য একদিন🫡!

~Tech Topia~

Stay with us