Arduino පාඩම 15 - I2C ප්‍රොටොකෝලය

10:38 PM

මේ ලිපියෙන් මම බලාපොරොත්තු වෙන්නේ I2C protocol එක ගැන කතා කරන්නයි. Arduino කරන ගොඩක් අය දැන හෝ නොදැන මේ Protocol එක use කරනවා ඇති මේවෙනකොටත්. මේ ලිපිය  මම protocol  එකක් ගැන කතාකරන පලවෙනි අවස්ථාව නිසා අපි මුලින්ම බලමු මොකක්ද මේ protocol කියන්නේ කියලා.

මොකක්ද  protocol කියන්නේ ?

 protocol කියන්නෙ නීති පද්ධතියකට. උදාහරණකින් පැහැදිලි කලොත් මෙහෙමයි. A හා B කියලා ඒ දෙක අතර communicate කරන device 2ක් තියෙනවා, ඒ වගේම මේ දෙක අතර data transfer වෙන්නේ x කියන  protocol එකෙන් කියලා හිතමු.

මේ x කියන  protocol එකෙන් වෙන්නේ මෙහෙම දෙයක්, අපි හැමෝම දන්නවා machine වලට තේරුම් ගන්න පුලුවන් 1  හා 0 කියන අවස්ථා විතරයි. ඒ කියන්නේ අපිට මේ device දෙක අතර communication එකේදී දාන සෙල්ලම් ඔක්කොම දාන්න වෙන්නෙ මේ 1  හා 0 වෙන් විතරයි. ඉතින් මේ 1  හා 0 තමන්ට කැමති විදිහට භාවිතා කරන්න පුලුවන්නේ ඉතින් මේ නිසා ඇතිවෙන අපහසුතා මගහරවා ගන්න අපිට protocol භාවිතා කරන්න පුලුවන්.

මෙතනදී අපි protocol එකක් හදනකොට එකේදී මෙ 1 හා 0 තේරුම ගන්නේ කොහොමද කියලා තමයි අර්ථ දක්වෙන්නේ. උදාහරණයක් විදිහට අපි හිතමු A device එකෙන් B device එකට x protocol එක හරහා "begin" කියලා command එකක් එනවා. ඉතින් මේ command එක එන්නේ 10001011 කියන  bit pattern කියලා, මේ bit pattern එක x protocol එකෙන් define කරලා තියෙන්නේ 10001011 කියන්නේ "begin" කියන වචනය කියලා. ඉතින් අර  A device එකෙන් B device එකට 10001011 කියලා pattern එක ආවහම B කියනා device එක දැන ගන්නවා 10001011 කියන්නේ "begin" කියන command එක කියලා, ඉතින් ඒ අනුව B device එක වැඩ කරනවා.

ඕක තමයි protocol කියන්නෙ මොකක්ද කියලා කියන්න පුලුවන් සරලම විදිහ. ඒත් ඇත්තටම මේ protocol වැඩකරන්නෙ මීට වඩා ගොඩක් සංකීර්ණ විදිහකට, ඊට අමතරව මේ protocol වැඩකරන විදිහ protocol එක අනුවත් වෙනස් වෙනවා.

protocol එකක් තෝරා ගැනීම

අපි මොකක් හරි project එකක් කරනකොට වඩා වැදගත් දෙයක් තමයි project එකට ගැලපෙන protocol එකක් තෝරාගන්නඑ එක. මේ වෙන කොට protocol විශාල ප්‍රමාණයක් තියෙනවා.ඒවා අතරින් කිහිපයක් තමයි,
  • UART (Serial protocol)
  • I2C
  • ISP
  • CAN
  • 4-20mA current loop
  • RS485
  • RS422
  • RS232 කියන්නේ.
UART කියන්නෙ අපි arduino වලදී නිතර භාවිත කරන Serial protocol එක.(හැම තිස්සෙම Serial.begin කියලා ගහන කෝඩ් එක), I2C ගැන අද අපි කතා කරමු, ICSP කියන්නෙ micro control අතර, ඒ වගේම Sensor-micro control අතර communication වලට භාවිතා කරන protocol එකක්, RS485,RS232 කියන්නේ ගොඩක්ම industrial වැඩ වලට ගැලෙපෙන device,sensor විශාල ප්‍රමාණයක් එකට සම්බන්ධ කරන්න පුලුවන් protocol  එකක්.

මම පසුගිය ලිපියක UART protocol එක use කරන හැටි ගැන කියලා දීලා තියෙනවා. මෙතනින් ඒ පාඩම බලන්න. අද මම කතා කරන්න යන්නේ I2C protocol එක ගැන.

I2C protocol 

I2C කියන්නෙ inter integrated circuit එකට. මේ protocol එකට power pin 2ක හැරුනහම SCL හා SDA කියලා තව pin 2ක් තියෙනවා. SCL pin එකෙන් කරනේ microcontroller එකේ ඉදලා වෙන microcontroller එකකට හරි sensor එකකට හරි clock signal එක යවන එක. SDA pin එකෙන් කෙරෙන්නේ data යවන එක. සාමාන්‍යයෙන් I2C protocol එකකට I2C device කිහිපයක් එකිනෙකට සම්බන්ධ කරන්න පුලුවන්. ඒ කියන්නේ මේ SCL,SDA pin වලට i2c device කිහිපයක්ම සම්බන්ධ කරන්න පුලුවන්. ඒ වගේම මේ වගේ device කිහිපයක් එකිනෙකට සම්බන්ධ කරහම ප්‍රධාන(Master) device එකට සම්බන්ධ කරලා තියෙන අනිත්(slave) device එකිනෙකින් වෙන් කරලා හදුනා ගන්න ID එකක් තියෙනවා. මේ කට අපි I2C address කියලා හදුන්වනවා. ඒ වගේම තමයි මේ master device එක සෑම විටම වගේ microcontroller එකක් සහිත device එකක් වෙනවා.

සාමාන්‍යයෙන් PCB එකක හදපු I2C device අතර twisted pair හෝ shielded cable යොදාගෙන 100m වගේ දුරකට data transmit කරන්න පුලුවන් කියලා සදහන් වෙනවා. කොහොම උනත් ප්‍රායෝගික තත්වයන් අනුව සත්‍ය දුර 100m වඩා අඩු වෙන්න ඉඩ තියෙනවා.

සාමනයෙන් අපිට මොකක් හරි device එකක් I2C connect කරන්න ඕනෙ උනොත් ප්‍රධාන වශයෙන් ක්‍රම 2ක් තියෙනවා.
  1. microcontroller එකක් භාවිතය
  2. I2C expander ic එකක් භාවිතය.
 ඒවගේම තමයි බොහොමයක් sensor සහ module වල I2C සදහා භාවිත වෙන්නෙ මේ I2C expander ic.

Micro-Controller එකක් භාවිතය

මෙතනදී මම microcontroller එකක් භාවිතය කියලා අදහස් කලේ Master device එක වගේම slave devices සදහාත් microcontroller එකක් භාවිතා කිරීමයි. 
example එකකින්ම මේක පැහැදිලි කරන්නයි සූදානම.

Send Data to Slave from Master


මේවැඩේට arduino board 3ක් ඕනේ වෙනවා. මම මෙතන්දී කරන්න හදන්නේ Arduino master device එකකට හයි කරපු potentiometer 2කින් arduino salve device 2කට වෙන වෙනම හයි කරපු LED 2ක brightness control කරන එක. 

Arduino mega/uno/nano/pro mini  වගෙ board වල A4 pin එක SDA විදිහටත් A5 pin එක SCL pin එකත් වෙනවා.

circuit diagram එක මෙහෙම හදා ගන්න. potentiometer විදිහට 10k වගේ එකක් දාන්න. ඒ වගේම arduino board වලට වෙන වෙනම power supply කරනවා නම් arduino boards සියල්ලෙහිම GND පින් එකට connect කරන්න


මීලගට පහත් දැක්වෙන codes වෙන වෙනම අදාල arduino boards වෙත upload කරන්න.


Code explain

මම මෙතනදී කරන්න හදන්නේ master device එකට හයි කරපු potentiometer දෙකෙන් වෙන වෙනම slave device 2 කට හයි කරපු LED දෙකේ brightness control කරන එකයි.

Master code - Send Data to Slave from Master

උඩම පේලියෙන් කරලා තියෙන්නෙ wire කියන library එක import කරගන්න එකයි. මේ library එකේ තමයි I2C වලට අදාල data ටික.

ඊළඟ පේලි දේකේ තියෙන්නේ A0, A1 කියන arduino analog pin දෙක define කරලා තියෙනවා. මේ පින් දෙකට තමයි potentiometer දෙක හයි කරලා තියෙන්නේ.

ඊට පස්සේ address1,address2 කියන define දෙකෙන් තියෙන්නෙ slave device දෙකේ address. 1 කියන්නේ පලවෙනි slave device එකේ address එක 2 ක කියලා තියෙන්නේ දෙවෙනි slave device එකේ addres.


ඊට පස්සේ තියෙන්නේ setup එක, Wire.begin(); කියන line එකෙන් තමයි I2C connection එක start කරන්නේ. ඊට පස්සේ ඉතින් analog pin 2 ක setup කරලා තියෙනවා.

ඊට පස්සේ තියෙන්නෙ loop එක. loop එක ඇතුලේ ලියන ඕනම code එකක් cycle එකක් වගේ power දීලා තියෙනකන් වැඩ කරනවා.

int pot1=analogRead(pot1)/4; කියන line එකෙන් int කියන type එකේ pot1 කියන නමින් variable එකක් හදලා එතනම ඒ variable එකට පලවෙනි potentiometer එකේ data read කරලා 4න් බෙදලා සමාන කරලා තියෙනවා. 4 න් බෙදලා තියෙන්නේ අපිට analog read එකක් 5v වලින් 1024 පන්ගුවක් විදිහට ලැබුනත් අපිට arduino වලදී analog write කරන්න පුලුවන් 5v වලින් 256 න් පංගුවක් විදිහට විතරක් නිසයි.

Wire.beginTransmission(address1);  මේ ලයින් එකෙන් කරන්නේ address1 කියන device එක I2C network එකෙන් හොයාගෙන එයත් එක්ක communication එක ආරම්භ කරන එකයි.

Wire.write(pot1);  මෙතනදී pot1 කියන value එක අදාල device එකට යවනවා. ඊට පස්සේ පේලියෙන් අදාල device එක අතර communication එක නවත්තනවා.

ඊට පස්සේ තියෙන්නෙත් දෙවෙනි  device එකට අදාල මේ code කොටසමයි. අන්තිමේදී 500 ms delay එකක් තියලා තියෙනවා.

Slave Code- Send Data to Slave from Master

Send data to Master from Slave

අපි කලින් කතාකලේ I2C හරහා master device එකේ ඉදලා slave device වලට data යවන්නේ කොහොමද කියන එකයි.
දැන් මම කියන්න හදන්නේ Salve device වල ඉදලා master device එකට data එවන්නේ කොහොමද කියන එකයි.

ඒ කට පහල තියෙන විදිහට circuit එක හදාගන්න, board 3 ම GND පින් එකට සම්බන්ධ කරන්න.



ක්‍රියාවලිය

මම මෙතනදී මුලිනම code explain කරන්න කලින් I2C හරහා slave device එකේ data master device එක read කිරීමේ ක්‍රියාවලිය පැහැදිලි කරන්න හිතුවා. 
මොකද මේ ක්‍රියාවලිය master එකෙන් slave එකට data send ක්‍රියාවලියට වඩා පොඩ්ඩක් වෙනස්.

master එකෙන් slave එකට data send කරනකොට උනේ master අපි දෙන data set එක අපි යවන්න ඕනේ slave device එකේ device address එකේ header එකකුත් එක්ක යවන එක. slave device එක හැමතිස්සෙම master එකෙන් data එනවද කීය කිය බල බල ඉන්නවා. එහෙම master එකෙන් data packet එකක් අවොත් එකේ තියෙන device address එක තමන්ගෙ address එකනම් ඒ packet එක read කරනව එහෙම නැත්නම් නොසලකා හරිනවා.

නමුත් slave එකෙන් එන data master එකෙන් read කරන්නේ පොඩ්ඩක් වෙනස් විදිහකට.

ඇත්තටමමෙතනදී වෙන්නේ slave device එකකින් එන data එකක් read කරගන්න ඕනේ උනහම කරන්නේ අදාලා slave device එකට request එකක් ගහන එක එහෙම්ත් නැත්නම් master device එකෙන් slave device එකකට ඉල්ලීමක් කරන්වා data එවන්න කියලා. 
මෙහෙම request එකක් ගැහුවට පස්සේ අදාල slave device එකෙන් data එවනවා, ඊටපස්සේ තමයි master එකෙන් slave device එකේ data read කරන්නේ.

Code Explain

මම මෙතන කරන්න හදන්නේ salve device 2කට වෙන වෙනම හයි කරපු pot 2 ක values master device එකට එවලා. master device එකේ serial monitor එක හරහා බලන එකයි.

Master code - Send Data to Master from Slave

මෙතනදීත් මම මුලින්ම Wire library එක import කරගෙන තියෙනව. ඊට පස්සේ මම කලින් වගේම Wire.begin(); එකෙන් I2C communication එක initialize කරගෙන තියෙනවා, ඊට පස්සේ Serial.begin(9600); කියන code එකෙන්  line එකෙන් serial communication එක 9600 ක baudRate එකක් සහිතව initialize කරගෙන තියෙනවා.

ඊටපස්සේ තියෙන්නේ loop එක. loop එක ඇතුලෙ තියෙන 
Wire.requestFrom(1, 4); 
    while (Wire.available()) {
    char c = Wire.read();
    Serial.print(c);        
}

code කොටස තමයි slave එකෙන් එන data read කරන්නේ.

Wire.requestFrom(1, 4);  මේ code එකෙන් තමයි slave device එකට request එක ගහන්නේ. වරහන් ඇතුලේ තියෙන 1 කියන ඉලක්කමෙන් කියවෙන්නේ slave device එකේ address එක. 4 කියන ඉලක්කමෙන් කියවෙනේ slave device එක එවන byte ගනන. මේ අගය slave device එක එවන data ප්‍රමාණය අනුව වෙනස් වෙනා .

video coming soon......

ඊලඟ කොටසින් I2C ගැන තව කතා කරමු.  article එක හොදයි නම් අනිත් අයටත් බලන්න share කරන්න. comment එකකුත් දාගෙන යන්න.



Share this

Related Posts

Previous
Next Post »

4 comments

Write comments
August 19, 2018 at 11:53 PM delete

congrats brother great explanation

Reply
avatar
Anonymous
September 5, 2018 at 2:45 AM delete

data transfer venne mona pin 1n da?
network karanne kohomada?
Thanks

Reply
avatar

ඔයාලගේ අදහස් උදහස් තමයි අපිව දිරිගන්වන්නෙ෴ EmoticonEmoticon