කලින් පාඩමෙන් අපි තීරු දර්ශකයක LED 10ක් blink කරන ආකාරය ගැන ඉගෙන ගත් අතර. දැන් අපි තවත් අලුත් කේතකරණ සංකල්ප කිහිපයක් යොදාගනිමින් LED ආලෝක මට්ටම අඩු වැඩි කරන ආකාරයට පරිපථක් නිර්මාණය කරන ආකාරය හා එයට ප්රෝග්රෑම් එකක් නිර්මාණය ආකාරය ගැන විමසා බලමු. එමගින් ඔබට ඇනලොග් සිග්නල් ප්රතිදාන භාවිතා කරන ආකාරය පිලිබද මනා අවබෝධයක් ලබා ගත හැකිය.
Project 4.1 – LED වල විවිධ දීප්තින් විමෝචනය කිරිම.
මුලින්ම ආර්ඩුයිනෝ බෝර්ඩ් එක භාවිතා කර LED 4 ක වෙනස් ආකාරයේ ආලෝක මට්ටම අඩු වැඩි කරන ආකාරයට පරිපථක් සකස් කරමු.
අවශ්යය උපාංග
පරිපථ සම්බන්ධ දැනුම
දැන් අපි LED එකක ආලෝක තත්වය අඩු වැඩි කිරීමට අදාල පරිපථය සකස් ආකාරය ගැන ඉගෙන ගනිමු.
PWM (Pulse Width Modulation)
PWM ලෙස හදුවන්නේ Pulse Width Modulation යන දීර්ඝ නමයි. ඩිජිටල් සිග්නල් භාවිතයෙන් ඇනලොග් පරිපථයක් හැසිරවීමට මෙය ඉතාමත් හොද ක්රමයකි. මෙහිදී සාමාන්ය ආකාරයට ප්රතිදාන සිග්නල් සෘජුවම ලබා ගත නොහැකිය. PWM ක්රමවේදය මෙම කාර්යය ඉටු කිරීම ඉතා පහසු කරවයි.
PWM වලදී ඩිජිටල් පින් භාවිතා කර විවිධ සංඛ්යාත වල චතුරස්රාකාර තරංග(square waves) යැවීම සිදුකරයි. එහිදී සිදුවන්නේ විවිධ කාල පරාස වලදී high level සහ low level මට්ටම් පවත්වා ගැනීමයි. පහත සටහන දෙස හොදින් බලන්න.
සාමාන්යයයෙන් මෙම high level සහ low level මට්ටම් වල කාල පරාසයන් එක හා සමාන වේ. මෙම කාල පරාසයට period එකක් යයි කියනු ලැබේ. ප්රතිදානය high වන කාලය සාමාන්යයෙන් pulse width ලෙස හැඳින්වෙන අතර pulse width එකේ ප්රතිශතය duty cycle ලෙස හඳුන්වයි.
අප ලබා දෙන ඩිජිටල් සිග්නල් එකේ high level මට්ටමේ දිග අනුව අදාළ ඇනලොග් සිග්නල් එකේ අගය වෙනස් වේ. ඉහත රූපසටහනේ පරිදි ඇනලොග් සිග්නල් එකට අදාල වෝල්ටීයතාව 0V සිට 5V අතර වෙනස් වේ,(high level එක 5V ලෙස සලකයි.) එමගින් වෝල්ටීයතාවට අදාල pulse width එක පෙන්වයි.
- පලමු අවස්ථාවේ duty cycle එක 0% වේ. එනම් එමගින් ලැබෙන වෝල්ටීයතාව 0V වේ. මෙහි දී ලැබෙන්නෙ අවම අගයයි. මෙය ඩිජිටල් LOW අවස්ථාවට සමාන වේ.
- දෙවන අවස්ථාවේ duty cycle එක 25% වේ. එනම් එමගින් ලැබෙන වෝල්ටීයතාව 1.25V වේ.
- තුන්වන අවස්ථාවේ duty cycle එක 50% වේ. එනම් එමගින් ලැබෙන වෝල්ටීයතාව 2.5V වේ.
- හතරවන අවස්ථාවේ duty cycle එක 75% වේ. එනම් එමගින් ලැබෙන වෝල්ටීයතාව 3.75V වේ.
- පස්වන අවස්ථාවේ duty cycle එක 100% වේ. එනම් එමගින් ලැබෙන වෝල්ටීයතාව 5V වේ. එනම් උපරිම අගය වේ. මෙය ඩිජිටල් HIGH අවස්ථාවට සමාන වේ.
PWM එකේ duty ratio එක් වැඩිවත්ම output power එක වැඩි බව ඉහත සටහනෙන් ඔබට මනාව අවබෝධ කර ගත හැකිය. එම නිසා LED එකක දීප්තිය පාලනය කිරීමට , DC මෝටරයක වේග පාලනයට වැනි දෑ සඳහා මෙය යොදා ගත හැක.
ආර්ඩුයිනෝ උනෝ බෝර්ඩ් එකක PWM පින් 6ක් ඇත. එවා ඩිජිටල් පින් තුළම පවති. ඒවා හදුනාගැනිමට ඒවයේ අංකය ඉදිරියේ “~” ලෙස යොදා ඇත.
කේතකරණය පිළිබද දැනුම
ෆන්ෂන් එකක ආපසු ලබා දෙන අගය (Return value of function)
අපි කලින් පාඩමේදී ආපසු ලබා දෙන අගය නොතොත් return value එකක් නැතුව ෆන්ශන් එකක් භාවිතා කරන ආකාරය විමසා බැලුවෙමු. දැන් ආපසු ලබා දෙන අගය සහිත ෆන්ශන් එකක් භාවිතා කරන ආකාරය පිලිබඳ ඉගෙන ගනිමු.
int sum(int i, int j) { int k = i + j; return k; }
“int” යන්නෙන් අදහස් වන්නේ ආපසු ලබා දෙන අගය හි දත්ත වර්ගය පිළිබඳවයි. ආපසු ලබා දෙන අගයෙහි දත්ත වර්ගය මුලින් void ලෙස යොදා ඇත්නම් ෆන්ෂන් එක අගයක් ආපසු ලබා දෙන්නේ නැත.
එක් ෆන්ෂන් එකකට නැවත යැවිය හැක්කේ එක් අගයක් පමණි. ෆන්ෂන් එකේ අගය ආපසු ලබා දීමට නම් return යන පදය සමග යොදා කේතනය කර ගැනීම අනිවාර්යය වේ. එම පේළිය return satatment ලෙස හදුන්වයි.
return පදය සමග යොදා කේතනය කර ඇති පේළිය ක්රියාත්මක වන විට ෆන්ෂන් එක එම පේළියට පසු ඇති කේතනය නොසලකා වහාම එම පේළිය එක ක්රියාත්මක වේ.
ආපසු ලබා දෙන අගය සහිත ෆන්ෂන් එකක් සකස් කරන ආකාරය පහත දැක්වේ.
int a = 1, b = 2, c = 0; c = sum(1, 2); // after the execution the value of c is 3 sum (int x, int y){ in k = x +y; return k; }
ආපසු ලබා දෙන අගය සහිත ෆන්ෂන් එකක්, වෙනත් ෆන්ෂන් එකක අගයක් ලෙස ගත හැකිය. උදාහරණයක් ලෙස, පහත කේත පේළිය බලන්න.
delay(sum(100, 200));
මෙය පහත කේත පේළිය හා සර්වසම වේ.
delay(300);
return
අපි ආපසු ලබා දෙන අගය සහිත ෆන්ෂන් එකක් තුල return satatment එකක කාර්යය පිලිබඳ සොයා බැලුවෙමු. එසේම මෙම ෆන්ෂන් එක ආපසු ලබා දෙන අගයක් නොමැතිවද භාවිතා කල හැකිය. නමුත් එහිදී return පදයට පසු කිසිම දත්තක් නොතිබිය යුතුය. එය පහත ආකාරයට දැක්විය හැකියි.
return;
මෙහිදී return statment එක ක්රියාත්මක වන විට, එම ෆන්ෂන් එක අවසානයේ ක්රියාත්මක වීම වෙනුවට එහි ක්රියාකාරිත්වය ක්ෂණිකව අවසන් වේ. උදාහරණයක් ලෙස පහත කේත සටහන බලන්න.
මෙහි 35 36 කේත පේළි ක්රියාත්මක නොවන අතර 33 පේළියෙන් එම ෆන්ෂන් එක නවති.
පරිපථ සැකැස්ම
මෙහිදී LED 4ක් සඳහා ආර්ඩුයිනෝ බෝර්ඩ් එකේ ඇති ඩිජිටල් D5,D6, D9 සහ D10 පින් භාවිතා කරයි.
Schematic diagram
Hardware connection
Sketch 1.1
දැන් අපි LED 4 ක් වෙනස් දීප්තීන් වලින් දල්වන ආකාරය බලමු. මේ සඳහා භාවිතා කරනු ලබන ප්රතිදාන පින් 4 මගින් PWM සිග්නල් 4ක් යොදාගමු. මේවායේ duty cycle 2%, 10%, 50% සහ 100% අගයන් භාවිතා කළ විට වෙනස් දිප්තීන්ගෙන් ඉහත සඳහන් කරන ලද LED 4 දැල්වෙන ආකාරය දැක ගත හැකිය.
// set pin numbers: int ledPin1 = 5, // the number of the LED1 pin ledPin2 = 6, // the number of the LED2 pin ledPin3 = 9, // the number of the LED3 pin ledPin4 = 10; // the number of the LED4 pin void setup() { // initialize the LED pin as an output: pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); } void loop() { // set the ports output PWM waves with different duty cycle analogWrite(ledPin1, map(2, 0, 100, 0, 255)); analogWrite(ledPin2, map(10, 0, 100, 0, 255)); analogWrite(ledPin3, map(50, 0, 100, 0, 255)); analogWrite(ledPin4, map(100, 0, 100, 0, 255)); }
පින් 4 හඳුන්වා දීමෙන් පසුව, ඒ සඳහා වෙනස් duty cycle සමඟ PWM සිග්නල් ලබා දීම සකස් කල යුතුය. මෙහිදි 0-225 පරාසයේ තිබෙන PWM අගයන් 0-100 ත් අතරට ගෙන ඒම සදහා map ෆන්ෂන් එක භාවිතා කරයි.
උදාහරණයක් ලෙස ledpin1 එක සැලකු විට, map ෆන්ෂන් එක භාවිතයෙන් 0-225 පරාසයෙන් 2% ලෙස සකස් කල විට ප්රතිදානය වන PWM සිග්නල් එකේ duty cycle එක 2% වේ.
analogWrite(ledPin1, map(2, 0, 100, 0, 255));
කේතය නිවැරදිදැයි පරීක්ෂා කිරීමෙන් පසුව අප්ලෝඩ් කරන්න. එවිට විවිධ දීප්තින් වලින් LED දැල්වෙන ආකාරය ඔබට දැක ගත හැකිය.
කේතය නිවැරදිදැයි පරීක්ෂා කිරීමෙන් පසුව අප්ලෝඩ් කරන්න. එවිට විවිධ දීප්තින් වලින් LED දැල්වෙන ආකාරය ඔබට දැක ගත හැකිය.
Project 3.2 – LED Blink Smoothly.
අවශ්යය උපාංග
පෙර පාඩමට අවශ්ය උපකරණ මේ සඳහා යොදා ගන්නා අතර LED හා resistor කිහිපයක් ඉවත් කල යුතුය.
පරිපථ සැකැස්ම
මෙහිදී පෙර පරිපථයේ පරිදිම වන අතර D6, D9 සහ D10 යන පින් වලට සම්භන්ධ කර ඇති LED හා ප්රතිරෝධක ඉවත් කරන්න.
Schematic diagram
Hardware connection
Sketch 3.2.1
දැන් අපි LED එකක් නිවී තිබෙන අවස්ථාවේ සිට ආලෝක මට්ටම ටික ටික වැඩි වී දීප්තිමත් ලෙස දැල්වී පසුව නැවත ආලෝක මට්ටම අඩු වී ගොස් නිවී යන ආකාරයට ප්රෝග්රෑම් එකක් සකස් කරමු. මේ සඳහා PWM සිග්නල් එකේ duty cycle එක 0% සිට 100% දක්වා සහ 100% සිට 0% දක්වා වෙනස් කිරීම චක්රයක් ලෙස සිදු කරමු. මෙහිදි ඔබට ලූප් භාවිතා කර පහසුවෙන් මෙය සිදු කර ගත හැකිය.
// set pin numbers: int ledPin = 5; // the number of the LED pin void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); } void loop() { // call breath() cyclically breath(ledPin, 6); delay(500); } void breath(int ledPin, int delayMs) { for (int i = 0; i <= 255; i++) { // "i" change from 0 to 255 analogWrite(ledPin, i); // corresponding duty cycle - from 0%-100% delay(delayMs); // adjust the rate of change of brightness } for (int i = 255; i >= 0; i--) { // "i" change from 255 to 0 analogWrite(ledPin, i); // corresponding duty cycle - from 0%-100% delay(delayMs); // adjust the rate of change in brightness } }
delay ෆන්ශන් (ms) එක cycle එකේ කාලය වෙනස් කිරීමට යොදා ගනී. තවද එහි අගය වෙනස් කරමින් දීප්තින් වෙනස් වන වේගය ඔබට පාලනය හැකිය. මෙහි දී කලින් ප්රෝග්රෑම් වල වගේම for ලූප් දෙකක් භාවිතා කර ඇත.
කේතනය නිවැරදිදැයි පරීක්ෂා කිරීමෙන් පසුව අප්ලෝඩ් කරන්න. එවිට LED වල දීප්තිය අඳුරේ සිට දීප්තියට සහ දීප්තියේ සිට අඳුරට චක්රයක ලෙස වෙනස් වීම ඔබට දැක ගත හැකිය.