Arduino Lesson 06 – Serial Communication

අපි කලින් පාඩමේදී push button එකක් හරහා LED එකකට අදාන(Input) සිග්නල් එකක් ලබා දෙන ලදි. අපි දැන් ඊට වඩා ටිකක් සංකීර්ණ ක්‍රමයක් වන serial communication කියන්නේ මොකක්ද කියලා බලමු.

Serial මගින් දත්ත ලබා ගන්නා ආකාරය

අපි මෙහිදී පරිගණකයට දත්ත යැවීමට හා ලබාගැනීමට ආර්ඩුයිනෝ බෝර්ඩ් එකේ ඇති සීරියල් පෝර්ට් එක නොහොත් USB පෝර්ට් එක පාවිච්චි කරනු ලබේ.

අවශ්‍යය උපාංග

කේතකරණය පිළිබද දැනුම

Bit and Byte

කලින් සඳහන් කළ ආකාරය වගේම පරිගණකය පාවිච්චි කරන්නේ binary සිග්නල් නොහොත් දෙකේ පාදයේ සංඛ්‍යයා වේ. Binary සිග්නල්  වල බීට් 1 ක් කියන්නේ “1” හෝ “0” යන ද්වීමය සංඛ්‍යා දෙකෙන් එකකි. එනම් එය ගබඩා කිරීමටද එම ඉඩ ප්‍රමාණය අවශ්‍යය වේ. එවැනි 8ක් එකතු උනාම අපිට බයිට් 1ක් ලැබේ. දත්ත ගබඩා කිරීමේදී හා හුවමාරුවේදී මූලික ඒකකය වෙන්නේ බයිට් එකයි. එක බයිට් එකකට අංක 256ක් (28) නිරූපණය කිරීමේ හැකියාව තිබේ. එනම් එහි දී 0 – 255 පරාසය මේ සදහා භාවිතා කරයි.

උදාහරණයක් ලෙස:

10010110 යන බයිනරි අගය දක්වන ආකාරය පහත දැක්වේ.

Sequence 7 6 5 4 3 2 1 0
Number 1 0 0 1 0 1 1 0

අපිට බයිනරි අගයක් ඒ කියන්නේ ද්වීමය සංඛ්‍යාවක් ඩෙසිමල් වලට නොහොත් දශමය සංඛ්‍යාවක් විදිහට පරිවර්තනය කර ගන්න අවශ්‍යය යැයි සිතමු. එවිට මුලින්ම කළ යුතු වන්නේ ද්වීමය සංඛ්‍යාවේ අග සිට මුලට 0 පටන් ගෙන අදාල ඉලක්කම් ඉහත ආකාරයට සදා ගැනීමයි. ඊට පසු එම බයිනරි අගයෙහි ඉලක්කම දෙකෙහි බලයක් ලෙස ගුණ කිරීමයි. ඊට පසු ලැබෙන එම අගයන් සියල්ල එකතු කළ විට ඇදාළ ද්වීමය සංඛ්‍යාව ලැබේ. උදාහරණයක් විදිහට 10010110 කියන ද්වීමය සංඛ්‍යාව අරගෙන බලමු.

  • 10010110 2 = 1*27+0*26+0*25+1*24+0*2^3+1*22+1*21+0*20
  • 10010110 2 = 128+0+0+16+0+4+2+0
  • 10010110 2 = 150

පහත දක්වා ඇති ක්‍රමයට ඔබට පහසුවෙන් දශමය සංඛයා ද්වීමය සංඛ්‍යා වලට පරිවර්තනය කළ හැකි වේ. ඔබ කළ යුත්තේ ශේෂය ඒ කියන්නේ ඉතිරිය බිංදුවක් වෙනකන් දශමය සංඛ්‍යාව 2න් බෙදාගෙන යැමයි. එහෙම කළ විට සමහර පියවරවල් වල 1ක් ඉතුරු වේ. සමහර පියවරවල් වල එසේ ඉතුරු නොවේ. ඒ ටික පිළිවෙලට ලියා ගත් විට යට ඉඳන් උඩට 1 සහ 0 විතරක් තියෙන අංකයක් ඔබට ලැබේ. එසේ ලැබෙන්නේ පරිවර්තනය කරපු binary අංකයයි. කලින් උදාහරණේම මෙහිදී අරගෙන බලමු.

උදාහරණය:

පිළිතුර = 10010110.

පරිපථ සම්බන්ධ දැනුම

Serial සහ Parallel Communication

සීරියල් දත්ත හුවමරු ක්‍රමය මගින් දත්ත හුවමාරු කරන විට පාවිච්චි කරන්නේ එක කේබල් සම්බන්ධතාවයක් පමණි. මෙහිදී එම දත්ත හුවමාරු වෙන්නේ එක බීට් එකකට පසු තවත් බීට් එකක් විදිහයි. නමුත් පැරලල් දත්ත හුවමරු ක්‍රමයේදී වෙන්නේ එක වර සම්පුර්ණ ද්වීමය සංඛ්‍යාව ටික මර්ග 8 ඔස්සේ හුවමාරු කිරීමයි. සීරියල් දත්ත හුවමරු ක්‍රමය වලදී පාවිච්චි කරන්නේ අඩු කේබල් ප්‍රමාණයක් නිසා විශේෂයෙන්ම පරිගණක අතර දත්ත හුවමාරුවට වගේම දිගු දුර පරිගණක හා පර්යන්ත හුවමාරු වලදී මෙය භාවිතා කරයි. පැරලල් දත්ත හුවමරු ක්‍රමය වේගවත් උනත් වැඩි කේබල් ප්‍රමාණයක් භාවිත වන නිසා වියදම වැඩි බැවින් එය කෙටි දුර දත්ත හුවමාරු වලදී භාවිතා කරයි.

Serial communication

සීරියල් දත්ත හුවමරු ක්‍රමය සාමාන්‍යයෙන් භාවිතා කරන්නේ Universal Asynchronous Receiver/Transmitter (UART) කියන ක්‍රමවේදයයි.. ඒ වගේම මේවා බොහෝවිට භාවිතා කරන්නේ ඉලෙක්ට්‍රොනික පරිපථ තුළ දත්ත හුවමාරුව සඳහායි. මෙහිදී සන්නිවේදන මාධ්‍යය දෙකක් භාවිත වේ. ඒවායේ කාර්ය වෙන්නේ දත්ත යැවීම (TX line) සහ දත්ත ලබා ගැනීමයි (RX line). උපකරණ හෝ අදාළ පරිපථ දෙකක් අතර  සීරියල් දත්ත හුවමාරු ක්‍රමය මගින් දත්ත හුවමාරුවට ආදාළ රූප සටහනක් පහත දැක්වේ.

සීරියල් දත්ත හුවමාරු ක්‍රමය මඟින් දත්ත හුවමාරුවට පෙර එහි දෙපසම බවුන්ඩ් රෙට්(BAUD rates) සමාන විය යුතුය. උපකරණ දෙක අතර දත්ත හුවමාරුව සඳහා මෙම බවුන්ඩ් රෙට් සමාන වීම අනිවාර්ය වේ. සාමාන්‍ය භාවිතයේදී මේ සඳහා බවුන්ඩ් රෙට් එක ලෙස 9600 සිට 115200 අතර භාවිතා කරයි.

Arduino හි ඇති Serial Port

පරිගණකය සමඟ සීරියල් ක්‍රමයට දත්ත හුවමාරු කිරීම සදහා ආර්ඩුයිනෝ බෝර්ඩ් එකේ USB පෝර්ට් එකක් තිබේ. ආර්ඩුයිනෝ සොෆ්ට්වෙයාර් එක හරහා කේතයක් අප්ලෝඩ්  කරන්නෙත් මේ serial(USB) port එක හරහායි. පරිගණකයට සම්භන්ධ කර ඇති සීරියල් සහිත උපකරණ COMx ලෙස පරිගණකය විසින් හඳුනා ගනි. ඒ වගේම එමගින් හුවමාරු වන දත්ත වල විස්තර බලාගැනිම සදහා serial monitor window භාවිතා කරයි. ඒ සඳහා ආර්ඩුයිනෝ බෝර්ඩ් එක පරිගණකයට සම්භන්ධ කිරීමෙන් පසුව ආර්ඩුයිනෝ සොෆ්ට්වෙයාර් එක හරහා අදාළ උපකරණය තෝරා, ඉහල දකුණු කෙලවරේ ඇති කාචයක සලකුණ(serial monitor icon) ක්ලික් කිරීමෙන් එය විවෘත කර ගත හැකිය.

Serial Monitor එකේ අතුරුමුහුණත පහත දැක්වේ. ඔබ නිවැරදිව ආර්ඩුයිනෝ බෝර්ඩ් එක පරිගණකයට සම්බන්ධ කර නොමැති නම් හෝ අදාළ උපකරණය තෝරා නොමැති නම් මෙම window එක විවෘත නොවේ. නිවැරදිව Serial Port එක තෝරා ගැනීමට Tools කියන menu bar එක භාවිත කරන්න. එය පළමු පාඩමේදී ඔබට පැහැදිළි කරන ලදි.

පරිපථ සැකැස්ම

මෙහිදී කිසිම පරිපථ සැකැස්මක් නැත. ඔබේ ආර්ඩුයිනෝ බෝර්ඩ් එක USB කේබලය හරහා පරිගණකයට සම්බන්ධ කිරීම ප්‍රමාණවත් වේ.

Sketch 1.1

දැන් අපි කිසියම් වචන ටිකක් බෝර්ඩ් එකෙන් පරිගණකය වෙත ලබා ගෙන එය serial monitor window එක බලාගන්නා ආකාරය ගැන විමසා බලමු.

int counter = 0; // define a variable as a data sending to serial port 

void setup() { 
  Serial.begin(9600); // initialize the serial port, set the baud rate to 9600 
  Serial.println("UNO is ready!");  // print the string "UNO is ready!" 
} 

void loop() { 
  // print variable counter value to serial 
  Serial.print("counter:");  // print the string "counter:" 
  Serial.println(counter);   // print the variable counter value 
  delay(500);	// wait 500ms to avoid cycling too fast 
  counter++;	// variable counter increases 1 
}

මෙහි setup() ෆන්ෂන් එකේ Serial.begin(9600); මගින් අදහස් වන්නේ සීරියල් පෝර්ට් එක මගින් දත්ත හුවමාරු කිරීමට බෝර්ඩ් එක සූදානම් බවයි. පසුව අදාළ විචල්‍යයන් loop() ෆන්ෂන් එක තුළ ඇතුලත් කර අදාළ වචන හෝ වාක්‍යය ප්‍රින්ට් කර ගත හැකියි.

Serial class

class එකක් කියන්නේ C++ පරිගණක භාෂාවේ එන සංකල්පයකි. ආර්ඩුයිනෝ සොෆ්ට්වේයාර් එක භාවිතා කරන්නෙත්  C සහ C++ භාෂාව නිසා මෙයත් C++ භාෂාවේම දිගුවකි.

මෙතැනදී අපි මෙම සංකල්පයන් ගැන වැඩිදුර ඉගෙනීමට නොයන අතර මෙහි භාවිත පිලිබඳ පමණක් අධ්‍යයනය කරයි. ඔබට මේ ගැන වැඩිදුර මේ පිළිබදව ඉගෙනීමට අවශ්‍යයනම් තනිව මේ ගැන සොයා බලන්න පුළුවන්.  සීරියල් කියන්නේ class එකක නමකි. ඒකට විවිධ විචල්‍යයන් සහ ෆන්ෂන් අතුළත් වී තිබේ. මෙහිදී විචල්‍යයන් සහ ෆන්ෂන් වලට ඇතුල් වීමට “” කියන operational character එක භාවිතා කරයි. ඒ මේ ආකාරයටයි, Serial.begin(speed); සීරියල් පෝර්ට් සක්‍රීය කිරීම අර්ථ දැක්වීමට භාවිතා කරයි. මෙහි පරාමිතිය සීරියල් පෝර්ට් එකේ baud rate එකම ෆන්ෂන් එක වෙත යැවීමට භාවිතා කරයි. Serial.println(val); මෙහි පරාමිතිය වන්නේ ඔබට යැවීමට අවශ්‍ය දෙයයි. එය නව පෙළියක් වෙත යැවීමට භාවිතා කරයි.

කේතයන් නිවැරදිදැයි පරීක්ෂා කිරීමෙන් පසු අප්ලෝඩ්  කරන්න. එවිට බෝර්ඩ් එකට මගින් අදාළ දත්ත පරිගණකය යැවීම ඔබට දැක ගත හැකිය. එය ඔබට එම ලැබෙන දත්ත serial monitor දැක ගත හැකිය.

මෙය නිවැරදිව display නොවේ නම්, serial monitor එකේ baud rate එක නිවැරදිදැයි පරීක්ෂා කරන්න. එක වින්ඩෝවේ දකුණු පස පහල දැක්වේ.

Serial මගින් දත්ත යවන ආකාරය.

අවශ්‍යය උපාංග

අපි මෙහිදී පරිගණකයට දත්ත යවන්න ආර්ඩුයිනෝ බෝර්ඩ් එකේ ඇති සීරියල් පෝර්ට් එක නොහොත් USB පෝර්ට් එක පාවිච්චි කරනු ලැබේ. අන්තිමට අපි සාකච්චා කල පාඩමේ පරිදිම වේ.

කේතකරණය පිළිබද දැනුම

Interruption (බාධා කිරීම්)

කුමක් හෝ ක්‍රියාවලියකට අදාළව ලැබෙන විධාන ලැබීම interruption මගින් පාලනය කිරීම වේ. අපි උදාහරණයක් බලමු. ඔබ tv එක බල බල ඉන්නකොට වතුර එකක් රත් කිරීම සදහා heater එක ගහන්න යැයි ඔබේ මව පවසයි. එතකොට ඔබ සැරින් සැරේ එම වතුර එක රත් වී ඇත්දැයි බැලීමට අවශ්‍යය වේ. එවිට ඔබට tv එක හරියට නැරඹීමට හැකි නොවේ. නමුත් ඔබට වතුර රත් වී අවසන් වීම දැනගැනීමට කේතලයට එලාම් එකක් සවි කළ හැකියි. එවිට පහසුවෙන් එය ඔබට දැනගන්න පුලුවන්, එය interruption එකක් විදියට හදුන්වන්න පුලුවන්. එතකොට ඔබට කිසිම බය නැතුව tv එක නැරඹීය හැකියි.

මෙම inturruption වල වාසි ලෙස සෑම විටම ක්‍රියාවලිය සිදුවී ඇති දැයි හැම විටම පරීක්ෂා කිරීම අවශ්‍ය නොවීමයි. නමුත් ක්‍රියාවලිය සිදු වන විට එය වහාම පාලකය වෙත දැනුම් දෙයි. එවිට ප්‍රොසෙසර්ය interruption ෆනෂන් එක වෙත ගොස් එය පාලනය කිරීම සිදු කරයි. පසුව බාධා සිදු වූ ස්ථානයට ගොස් එතැන් පටන් ප්‍රෝග්‍රෑම් එක නොකඩවා ක්‍රියා කරයි.

පරිපථ සැකැස්ම

පෙර පාඩමේ පරිදිම වේ.

Sketch 2.1

දැන් අපි  serial monitor එකෙන් දත්ත ලබාගෙන  නැවත යවන්න පුළුවන් ආකාරයේ සරල ප්‍රෝග්‍රෑම් එකක් ගැන සලකා බලමු.

char inChar // define a variable to store characters received from serial port 

void setup() { 
  Serial.begin(9600);	//initialize serial port, set baud rate to 9600 
  Serial.println("UNO is ready!"); // print the string "UNO is ready!" 
} 

void loop() { 
  if (Serial.available()) {	// judge whether data has been received 
    inChar = Serial.read();	// read one character 
    Serial.print("UNO received:"); // print the string "UNO received:" 
    Serial.println(inChar);        // print the received character 
  } 
}

setup() ෆන්ෂන් එකෙන් අදහස් වෙන්නේ බෝර්ඩ් එක සුදානම් බව  සීරියල් පෝර්ට් එකෙන් දැන්වීමයි. පසුව loop() ෆන්ෂන් එක මගින් දිගින් දිගටම කියවීම සඳහා දත්ත තිබේදැයි සොයා බලයි. එය දිගටම සිදු කරමින් දත්ත ලැබෙන අවස්ථාවේ ඒවා ලබා ගනි.

Serial Class

●      Serial.available(); ෆන්ෂන් එකෙන් සිදුවන්නේ සීරියල් පෝර්ට් එක මගින් කියවිය යුතු දත්ත සියලු  byte වලින් ලබා දෙන්න යන්නයි.

●      Serial.read(): ෆන්ෂන් එකෙන් සිදුවන්නේ සීරියල් පෝර්ට් එක මගින් මඟින් කියවිය යුතු දත්ත  byte වලින් ලබා දෙන්න. යන්නයි.

ප්‍රෝග්‍රෑම් එක නිවැරදිදැයි බැලීමෙන් පසුව code එක අප්ලෝඩ් කරන්න. කුමක් හෝ අකුරක් sending area එකේ type කර send බොත්තම ඔබන්න. එවිට බෝර්ඩ් එකට යවන දත්ත නැවත ලැබෙන ආකාරය ඔබට දැක ගත හැකිය.

char type

Char වර්ගයේ විචල්‍යයක් මගින් අක්ෂරයක් නියෝජනය කරයි. නමුත් කෙලින්ම අක්ෂරයක් char වර්ගයේ ගබඩා කිරීම කල නොහැක. එහි ගබඩා වන ඉලක්කම් මඟින් අකුරු නැවත ප්‍රතිස්ථාපනය කරයි.

Char වර්ගයේ එක් ඉලක්කමක් සඳහා බයිට් එකක ඉඩක් වෙන් වේ. මෙහිදී 0-127 තෙක් අගයක් භාවිතා වන බැවින් අකුරු 128ක් සඳහා මෙය ප්‍රතිස්ථාපනය කල හැකිය. මෙම අගයන් හා අක්ෂර අතර සම්බන්ධය පවත්වාගන්නේ ASCII වගුවට අනුවයි. ASCII වගුව පිලිබඳ වැඩි විස්තර සඳහා උප ග්‍රන්ථ බලන්න.

උදාහරණයක් විදිහට අපි විචල්‍යයට a හා 0 ආදේශ කරොත් මේ විදියට aChar=’a’ සහ bChar=’0′, මේ සඳහා ලැබෙන අගයන් වන්නේ aChar සඳහා 97 සහ bChar සඳහා 48 යි.

Sketch 2.2

සීරියල් පෝර්ට් එකට දත්ත ලැබෙන විට, එයට interrupt ක්‍රියාවලියක් ආරම්භ කළ හැකිය. ඒ වගේම එය හැසිරවීමේ ක්‍රියාවලියට පිවිසීමටත් මෙයට පුළුවන් වේ. දැන් අපි serial monitor window එකෙන් දත්ත ලබා ගැනීමට හා නැවත යැවීමට interrupt එකක් භාවිතා කරමු. මෙහිදී අපි Interrupt එක වැඩසටහනට බාධා නොවන බව පෙන්වීමට නිරන්තරයෙන් loop() ෆන්ෂන් එකේ අංකය වෙනස් කරමින් යවනු ලැබේ.

char inChar;  // define a variable to store character received from serial port
int counter = 0; // define a variable as the data sent to Serial port 

void setup() { 
  Serial.begin(9600);// initialize serial port & set baud rate to 9600 
  Serial.println("UNO is ready!");  // print the string "UNO is ready!" 
} 

void loop() { 
  // Print value of variable counter to serial 
  Serial.print("counter:");  // print the string "counter:" 
  Serial.println(counter);   // print the value of variable "counter" 
  delay(1000);	// wait 1000ms to avoid cycling too fast 
  counter++;	// variable "counter" increases 1 
} 

void serialEvent() { 
  if (Serial.available()) { // judge whether the data has been received 
    inChar = Serial.read();	// read one character 
    Serial.print("UNO received:"); // print the string "UNO received:" 
    Serial.println(inChar);	// print the received character 
  } 
}

interrup ෆන්ෂන් එක විදිහට වැඩ කරන්නේ void serialEvent() කියන ෆන්ෂන් එකයි. සීරියල් විදියට දත්ත ලැබෙන විට, ප්‍රොසෙසර් එක මේ ෆන්ෂන් එක ක්‍රියාත්මක කර පසුව වැඩසටහන ඉදිරියට පවත්වාගෙන යාමට මුල් interrupt අවස්ථාවට පැමිණ වැඩසටහන නොකඩවා ක්‍රියාත්මක කරයි. එම නිසා loop() ෆන්ෂන් එක ක්‍රියාත්මක වන්නේ නැත.

ප්‍රෝග්‍රෑම් එක නිවැරදිදැයි පරික්ෂා කර අප්ලෝඩ් කරන්න. Serial monitor විවෘත කළ පසු සංඛයා නොකඩවා බෝර්ඩ් එකට යැවීම ඔබට දැක ගත හැකිය. Sending area එකෙහි යම් දත්තයක් පුරවා send බොත්තම එබූ විට  එම දත්ත නැවත ලැබීම දැක ගත හැකිය.

Serial දත්ත හුවමාරු භාවිතයන්.

අපි මෙහිදී LED එකක් පාලනය කිරීමට ආර්ඩුයිනෝ බෝර්ඩ් එකේ ඇති සීරියල් පෝර්ට් එක භාවිතා කරයි. 

මෙහිදී අප ප්‍රතිදානය ලෙස  PWM සිග්නල් එකක් LED එකට යැවීමට බෝර්ඩ් එකෙහි එකේ ඇති D11 පින් එක භාවිතා කරයි.

පරිපථ සැකැස්ම

Schematic diagram

Hardware connection

Sketch 3.1

code එක මූලිකව sketch 5.2.1 වලට සමානයි. නමුත් දත්ත ලැබීමෙන් පසුව arduino UNO බෝර්ඩ් එකේ output port එක PWM duty cycle form එකට පරිවර්තනය වේ.

int inInt;	// define a variable to store the data received from serial
int counter = 0; // define a variable as the data sending to serial 
int ledPin = 11; // the number of the LED pin 

void setup() { 
  pinMode(ledPin, OUTPUT);	// initialize the LED pin as an output 
  Serial.begin(9600); // initialize serial port, set baud rate to 9600 
  Serial.println("UNO is ready!");	// print the string "UNO is ready!" 
} 

void loop() { 
  if (Serial.available()) {// judge whether the data has been received 
    inInt = Serial.parseInt();  // read an integer 
    Serial.print("UNO received:"); // print the string "UNO received:" 
    Serial.println(inInt);     // print the received character 
    // convert the received integer into PWM duty cycle of ledPin port 
    analogWrite(ledPin, constrain(inInt, 0, 255)); 
  } 
}

Serial එක දත්ත ලබා ගන්නා විට output port එක PWM duty cycle form එකට පරිවර්තනය වේ. ඉන් පසු LED එක ආලෝකය විමෝචනය කරයි.

Serial Class

Serial.parseInt(): නැවත ඇතුල් කිරීමේ අගය ලෙස int වර්ගයේ  සංඛ්‍යාවක් ලෙස ලැබෙනු ඇත.

constrain(x, a, b)

a හා b අතර x හි සීමාව,  x>a නම් නැවත ඇතුල් කිරීම a ලෙසද  x< b නම් නැවත ඇතුල් කිරීම  b ලෙස ගනී.

Verify කිරීමෙන් පසුව code එක අප්ලෝඩ් කරන්න. serial monitor විවෘත කර 0-255 අතර සංඛ්‍යාවක් sending area එකේ type කර send කරන්න. එවිට UNO බෝර්ඩ් එකෙන් තොරතුරු නැවත එවන අතර, LED එකේ brightness එක අපි යවනු ලබන සංඛ්‍යාව අනුව වෙනස් වේ.

Leave a Reply

Your email address will not be published. Required fields are marked *

Index