Search This Blog

Friday, December 30, 2011

Testing fsolve and anonymous function

တစ်ခါက coefficient တွေ ပြောင်းလဲ နေတဲ့ equation တွေကို ဖြေရှင်းဖို့ လို လာပါတယ်။ ဒါနဲ့ MatLab ဖန်ရှင်တစ်ခု ဖြစ်တဲ့ fsolve ရယ်၊ function handle နဲ့ anonymous function တွေကို သုံးပြီး စမ်းကြည့်ထားတာပါ။
s=[3 7 11];
d=[1 3 5];
%ans= (2,1), (5,2), (8,3)
for i=1:3
x0 = [-5; -5]; % Make a starting guess at the solution
myfun =@(x) [x(1) + x(2) - s(i);
x(1) - x(2) - d(i)];
[x,fval] = fsolve(myfun,x0)  % Call 
end

Friday, December 16, 2011

Hand, Foot and Mouth Disease (HFMD)

အရင် တပါတ် လောက်က သမီးရဲ့ လက် နဲ့ ခြေ မှာ မိတ်လို အဖု နဲ့ အနီပြင် တွေ တွေ့လို့ ဆရာဝန် သွားပြတော့ HFMD ဒါမှမဟုတ် တုပ်ကွေး ကြောင့် ဖြစ်နိုင်တယ်လို့ ပြောပါတယ်။ နောက်တော့ သမီး ဖြစ်တာ တုပ်ကွေးပါ။ HFMD ကိုတော့ မကြားဘူးလို့ KK hospital က လက်ကမ်းစာရွက် မှာ တွေ့တာလေးကို ဖတ် ပြီး ဒီမှာ ပြန်ရေးထားပါတယ်။

မေး။ Hand, Foot and Mouth Diease (HFMD) ဆိုတာ ဘာလဲ?
ဖြေ။ အန်တရိုဗိုင်းရပ်စ် (Enterovirus) လို့ခေါ်တဲ့ ဗိုင်းရပ်စ် ပိုးတွေကြောင့် ဖြစ်တဲ့ ကူးစက်ရောဂါတစ်မျိုးပါ။ အသက် အရွယ် မရွေး ဖြစ်နိုင်ပြီး အထူးသဖြင့် မူကြို အရွယ် ကလေးတွေမှာ ဖြစ်တတ်ပါတယ်။ ဒီ ရောဂါဟာ ရှားပါးတဲ့ ရောဂါ အသစ် မဟုတ် ပါဘူး။ ရှေးကတည်းက ရှိခဲ့ပြီး စင်ကာပူ မှာ တွေ့ရတတ်တဲ့ ရောဂါတစ်မျိုးပါ။

မေး။ HFMD ဖြစ် မဖြစ် ဘယ်လို သိနိုင် မလဲ?
ဖြေ။ HFMD ဖြစ် တဲ့ ကလေးမှာ မိတ်လို၊ အရေကြည်ဖုလို၊ အနီကွက်တွေ လက်၊ခြေ နဲ့ တင်ပါး မှာ ထလာပါမယ်။ ပါးစပ်ထဲမှာ အနာပေါက် မယ်။ ဖျားပါ မယ်။ ဒါ့အပြင် လည်ချောင်းနာတာ၊ နှာရည်ယိုတာ၊ အန်တာ၊ ဝမ်းလျှောတာ နဲ့ မောပန်းတာတွေ လည်း ဖြစ်နိုင်ပါတယ်။ ကလေးကို ဆေးခန်း၊ မိသားစု ဆရာဝန် တို့နဲ့ ပြနိုင်ပါတယ်။ ဆေးရုံ အရေးပေါ် ဌာန ကို သွားဖို့ မလိုအပ်ပါ။

မေး။ ကလေးကို HFMD ဘယ်လို ကူးတာလဲ?
ဖြေ။ နှာရည်၊ တံတွေး၊ ဝမ်း၊ အရည်ကြည်ဖုက အရည် များကို တိုက်ရိုက် ထိခြင်းအား ဖြင့် အလွယ်တကူ ကူးနိုင်ပါတယ်။

မေး။ ဒီရောဂါက ပြင်းထန်လား?
ဖြေ။ ရောဂါဟာ သာမန်အားဖြင့် မပြင်းထန်ပါဘူး။ ကလေး အများစုဟာ တစ်ပါတ် လောက်ကြာရင် သက်သာ သွားပါတယ်။ ရှားရှားပါးပါး မှသာ တွေ့ရခဲတဲ့ ဗိုင်းရပ် ဗီဇကွဲတွေမှာ ပဲ ဦးနှောက် နဲ့ နှလုံး ရောင်တာ အစရှိတဲ့ နောက်ဆက်တွဲ ရောဂါ တွေ ဖြစ်တတ် ပါတယ်။

မေး။ HFMD က ပြုစုကုသ နိုင် ပါသလား?
ဖြေ။ တိကျတဲ့ ပြုစုကုသ မှု သတ်သတ်မှတ်မှတ် မရှိပါဘူး။ ရောဂါ လက္ခဏာ က များသော အားဖြင့် မပြင်းထန်ပဲ ကလေးရဲ့ ကိုယ်ခံအားစနစ်က ဗိုင်းရပ်စ် တွေကို တိုက်ထုတ် တဲ့အခါ များသောအားဖြင့် ပြန်ကောင်း သွားကြပါတယ်။ ဆရာဝန်က အဖျား မကြီးအောင် ဆေး ပေးပါ မယ်။ ကလေးကို တတ်နိုင် သမျှ အရည် များများ တိုက် သင့် ပါတယ်။ အစားအစာ ကို မျိုချရတာ နာကျင် နိုင်တာကြောင့် ကလေးဟာ အစာ စားချင်စိတ် နည်းနေနိုင်ပါတယ်။ ဒါပေမယ့် ရေဓာတ်ခန်းခြောက် ခြင်း မဖြစ်အောင် ကလေးက လုံလောက်တဲ့ အရည် သောက်ဖို့ သေချာအောင် ဂရုစိုက်ပေးပါ။ ကလေးကို သစ်သီးရေ၊ ထမင်းရည်၊ ဘာလီရည် အစရှိတဲ့ အရည်တစ်မျိုးမျိုး ကို နည်းနည်းချင်း (၁၀ ကနေ ၃၀ မီလီလီတာ လောက်) ကို နာရီဝက်ခြား တစ်ခါလောက် တစ်နေ့လုံး တိုက်ကျွေး ပေးပါ။ ဒါက ဗိုင်းရပ်စ် ကြောင့် ဖြစ်ပြီး ဘက်တီးရီးယား ကြောင့် ဖြစ်တာ မဟုတ်တဲ့ အတွက် အန်တီဗိုင်အိုတစ် (Antibiotics) တွေက ထိရောက်ထက်မြက်မှု မရှိပါဘူး။

မေး။ အန်တရိုဗိုင်းရပ်စ် (Enterovirus) တစ်ခါဖြစ်ဘူးရင် ဒီရောဂါကိုပြီးတဲ့ ခံနိုင်ရည်ရှိသွားပြီလား?
ဖြေ။ အဲဒီဖြစ်တဲ့ ဗိုင်းရပ်စ် အတွက်တော့ သီးသန့် ခံနိုင်ရည် ရှိသွားပါတယ်။ ဒါပေမယ့် အဲဒီ အန်တရိုဗိုင်းရပ်စ် (Enterovirus) အုပ်စု ထဲက ပဲ မတူတဲ့ ဗိုင်းရပ် ဗီဇကွဲ တွေကနေ ထပ်ဖြစ်ကောင်း ဖြစ်နိုင် ပါတယ်။

မေး။ ဒီရောဂါ မပြန့် ပွားအောင် ဘာလုပ်လို့ရလဲ?
ဖြေ။ ရောဂါဖြစ်နေတဲ့ ကလေးဟာ မပျောက်မချင်း ကလေးထိန်းကျောင်း၊ ကျောင်း၊ လူထူထပ်တဲ့ နေရာတွေကို မသွား ရပါဘူး။ တကိုယ်ရည် သန့်ရှင်းမှု ကို ဂရုစိုက်သင့်ပါတယ်။ ရောဂါရှိတဲ့ ကလေးကို ထိပြီးတဲ့အခါ၊ ကလေး ခါးတောင်းကျိုက်ကို လဲပေး ပြီးတဲ့အခါ၊ နဲ့ အစားအစာ များကို မကိုင်ခင်မှာ လက်ဆေးပါ။ ရောဂါဖြစ်နေတဲ့ ကလေး ကိုင်ထားတဲ့ ကစား စရာတွေ၊ စာအုပ်တွေ၊ ပန်းကန်ခွက်ယောက်တွေ၊ ပဝါ၊ အဝတ်အစားနဲ့ အခြား အသုံးအဆောင်များကို အခြား ကလေးများ မထိစေရပါဘူး။

မေး။ HFMD ဖြစ်နေတဲ့ ကလေးကို ဘယ်လို အချိန်မျိုးမှာ ဆေးရုံ အရေးပေါ် ဌာန ကို ခေါ်သွားသင့် သလဲ?
ဖြေ။ HFMD ဖြစ် တဲ့ ကလေး အများစု က အဖျားရှိပေမယ့် နေကောင်း တက်ကြွ ကြပါတယ်။ အများစုဟာ ဆေးခန်း၊ မိသားစု ဆရာဝန် တို့နဲ့တင် လုံလောက် အဆင်ပြေပါတယ်။ ဒါပေမယ့် အောက်ပါ ပြဿနာ များ ဖြစ်ပေါ်လာရင်တော့ ဆေးရုံ အရေးပေါ် ဌာန ကို ခေါ်သွားသင့် ပါတယ်။
၁။ ကလေးက အရည် သောက်တာ အရမ်းနည်းနေမယ်၊ မျိုမချ နိုင်ဘူး၊ တောက်လျှောက် အန်နေမယ် ဆိုရင်။
၂။ ကလေးက လျှာက ခြောက်နေမယ်၊ ဆီးသွားတာ နည်းနေတယ် (ရေဓာတ်ခန်းခြောက်ခြင်း) ဆိုရင်။
၃။ ကလေးက နုံးနေမယ်၊ ငိုက်နေမယ်၊ စိတ်တို စိတ်ဆိုးနေမယ်၊ မနားတမ်း ငိုနေမယ်၊ စိတ်ရှုပ်ထွေး စိတ်လွတ် နေမယ် ဆိုရင်။
၄။ တက် မယ်ဆိုရင်။
၅။ အသက်ရှုရ ခက်ခဲနေတယ် ဆိုရင်။
၆။ ကလေးက ဖြူဖပ်ဖြူရော်၊ ဖျော့တော့၊ ပြာနှမ်း လာတယ်ဆိုရင်။
၇။ ကလေးက ခေါင်းကိုက်တာ၊ ခေါင်းမူးတာ၊ အုန်းလွဲတာ တွေ ရှိတယ်ဆိုရင်။

Geometric Template Matching in LabVIEW

NI ရဲ့ IMAQ Vision Concepts Manual ထဲမှာ geometric template matching ကို အောက်ပါ အတိုင်း ဖော်ပြထားပါတယ်။ Geometric matching က ကင်မရာ က ဖမ်းယူ ရရှိတဲ့ ပုံမှာ ကိုယ်ရှာ ဖို့ သတ်မှတ်ထားတဲ့ အရာ ဘယ်နားမှာ ရှိနေလဲ ဆိုတာ ရှာပေး ပေး ပါတယ်။ Geometric matching က ဘယ်လို ပုံသဏ္ဍာန် ဆိုတာ သတ်မှတ်ထားတဲ့ အချက်အလက် ပေါ် မူတည်ပြီး ပုံစံပြား ကို ရှာပါတယ်။ Geometric matching ကို သုံးဖို့ အတွက် ရှာလိုတဲ့ ပစ္စည်း ကို ကိုယ်စား ပြုတဲ့ ပုံစံပြား တစ်ခုကို ဖန်တီးရ ပါတယ်။ စက်ရဲ့ အမြင်အနေနဲ့ အသုံးချ တဲ့ အခါ ပုံရိပ် တစ်ခု ချင်းစီမှာ ပုံစံပြား နဲ့ ကိုက်ညီမှု ရှိ တဲ့ နေရာတွေမှာ ဘယ်လောက်ထိ ကိုက်ညီမှု ရှိလဲ ဆိုတာ အမှတ်တွေ ပေးပါတယ်။ Geometric matching က အလင်းအမှောင် ပြောင်းလဲခြင်း၊ ပုံဝါးနေခြင်း၊ ပုံရိပ် မကြည်လင်ခြင်း၊ တဝက်တပြက် ဖုံးကွယ်နေခြင်း၊ အနေအထား နဲ့ အရွယ်အစား မတူခြင်း တွေ ရှိနေရင် တောင် ရှာ လိုတဲ့ ပုံစံပြား ရှိတဲ့ နေရာတွေ ကို ရှာပေးနိုင်ပါတယ်။ LabVIEW ထဲက IMAQ Find CoordSys (Pattern) 2 အစရှိတဲ့ VI တွေက ပုံစံပြား ကို ရှာဖို့ သုံးနိုင်ပါတယ်။ ပုံစံပြား ကို အောက်မှာ ဖော်ပြထားတဲ့ အဆင့်တွေ အတိုင်း ဖန်တီး နိုင်ပါတယ်။
Template Editor ကို Start -> All Programs -> National Instruments -> Vision -> Template Editor မှာဖွင့်ပါ။ File menu->New Template... ကိုနှိပ်ပါ။ Geometric Matching Template (Edge Based) ကိုရွေးပြီး ဖန်တီးမယ့် ပုံစံပြား ပါတဲ့ ပုံရိပ် ကို သတ်မှတ်ပေးပါ။ Select Template Region ဆိုတဲ့ tab မှာ ပုံစံပြား ဖန်တီးမယ့် နေရာကို သတ်မှတ်ပါ။ ဥပမာ အားဖြင့် (200,300) ကနေ (232,332) ထိ mouse ကို ဖိဆွဲ ပြီး သတ်မှတ်နိုင်ပါတယ်။ ပြီးနောက် မှတ်ထားတဲ့ နေရာကို ကိုယ်လိုချင်တဲ့ နေရာ ရောက်အောင် ပြန်ရွေ့နိုင်ပါတယ်။ Define curves ဆိုတဲ့ tab မှာ ပုံစံပြား ရဲ့ အနားသတ် ပုံစံနဲ့ ပတ်သက် တဲ့ အချက်တွေ ကို သတ်မှတ်ပါ။ ဥပမာ အားဖြင့် Extraction mode ကို normal၊ Edge Threshold ကို 32၊ Edge Filter size ကို Fine၊ Minimum Length ကို 5၊ Row Search Step Size ကို 1 နဲ့ Column Search Step size ကို 1 အစရှိသဖြင့် သတ်မှတ် နိုင်ပါတယ်။ Customize Scoring နဲ့ Specify Match Options tab တွေကိုတော့ နဂို အတိုင်း ထားနိုင်ပါတယ်။ File -> Save Template... ကိုနှိပ်ပြီး ပုံစံပြား ကို သိမ်းပါ။
နမူနာ အနေနဲ့ ဖန်တီးထားတဲ့ VI တွေကို

Geometric Template Matching on GitHub

မှာ ကြည့်နိုင်ပါတယ်။ VI အဝင် တွေ အတွက် သတ်မှတ်ခြင်း တွေကို အောက်မှာ ပြထားပါတယ်။

Saturday, August 13, 2011

Troubleshooting Daikin Aircon

Daikin(3MKD58DVM) inverter multi-split (R-22) aircon ကိုသုံးနေတာ တစ်နှစ် နှစ်နှစ် လောက်တော့ ရှိပြီ။ ပြီးခဲ့တဲ့ လကမှ indoor unit (FTKD25DVM) တစ်ခုက အလုပ် မလုပ် တော့ပဲ ဖွင့်လိုက်ရင် စက္ကန့်ပိုင်း လေးပဲ ထလုပ်ပြီး ပြန်ပြန် ပိတ်ပိတ် သွားတယ်။ နောက်တော့ LED indicator က မှိတ်တုပ် မှိတ်တုပ် ပဲ ပြနေတယ်။ အင်တာနက် ပေါ် ရှာဖတ် ကြည့်မှ ARC433B47 ရီမု ကွန်ထရိုး ကိုသုံးပြီး စစ်ကြည့်ဖို့ နည်းလမ်းတွေ တွေ့ တာနဲ့ ပြန်ပြီး ထုတ်နုတ် ထားလိုက်ပါတယ်။

Check Method 1

၁။ Timer cancel ခလုတ်ကို ၅ စက္ကန့် လောက် ဖိထား မယ်ဆိုရင် အပူချိန် ပြတဲ့နေရာ မှာ ၀၀ လို့ ပေါ်လာပါလိမ့်မယ်။


၂။ Timer cancel ခလုတ်ကို နှိပ်ရင် အသံတို တစ်ချက် ဒါမှမဟုတ် အသံတို နှစ်ချက် ကြားရပါလိမ့်မယ်။ အသံရှည် မြည်သံ ကြားရတဲ့ထိ ထပ်ခါ တလဲလဲနှိပ်ပါ။ ပြထားတဲ့ နံပါတ် တွေက ၀၀ ကစပြီး အောက်ပါ အစီအစဉ် အတိုင်း ပြောင်းသွား ပါလိမ့်မယ်။


၃။ အသံရှည် မြည်သံ ကြားရတဲ့ အခါ ပြနေတဲ့ နံပါတ် ကerror code ဖြစ်ပြီး ဖြစ်နိုင်တဲ့ ပြဿနာ အကြောင်းကို ဖော်ပြထားတဲ့ ဇယားကို အောက်မှာ တွေ့နိုင်ပါတယ်။

၄။ စစ်ဆေး ပြီးတဲ့ အခါ ပုံမှန် အခြေအနေ normal mode ကိုပြန်ရောက်အောင် timer cancel ခလုတ် ကို ၅ စက္ကန့် လောက် ဖိထားနိုင်ပါတယ်။ ဘာမှ မလုပ်ပဲထားရင်လဲ စက္ကန့် ၆၀ လောက် ကြာတဲ့ အခါ ရီမု ကွန်ထရိုးကသူ့ဟာသူ ပုံမှန် အတိုင်း ပြန်ဖြစ်သွားမှာပါ။

Check Method 2

၁။ TEMP ခလုတ် ရဲ့ အလယ်နဲ့၊ MODE ခလုတ်ကို ပြိုင်တူဖိလိုက်ပါ။ ပြနေတဲ့ နံပါတ် ရဲ့ ဘယ်ဘက် ဂဏန်း က မှိတ်တုပ် မှိတ်တုပ် ဖြစ်သွား ပါလိမ့်မယ်။


၂။ TEMP ခလုတ်ရဲ့ အပေါ် ဒါမှမဟုတ် အောက်ကို နှိပ်မယ် ဆိုရင် ဂဏန်း က ပြောင်းသွားပြီး အသံမြည်တာ ကြားရမှာပါ။

၃။ အသံကို အောက်က အတိုင်းစစ်နိုင်ပါတယ်။
အသံတို တစ်ချက်။ ။ ဘယ်ဘက် ဂဏန်းက error code မဟုတ်သေးပါဘူး။
အသံတို နှစ်ချက်။ ။ ဘယ်ဘက် ဂဏန်းက တော့ ဟုတ်သွားပြီ။ ဒါပေမယ့် ညာဖက် ဂဏန်းက error code မဟုတ်သေးပါဘူး။
အသံရှည် တစ်ချက်။ ။ ဂဏန်းနှစ်ခုလုံး ဟုတ်သွားပြီ။ ပြနေတဲ့ နံပါတ်က error code ဖြစ်ပါတယ်။


၄။ ဘယ်ဘက် ဂဏန်း ရပြီးတဲ့ အခါ MODE ခလုတ်ကို နှိပ်ပါ။ ညာဖက် ဂဏန်းက မှိတ်တုပ် မှိတ်တုပ် ဖြစ်သွား ပါလိမ့်မယ်။

၅။ TEMP ခလုတ်ရဲ့ အပေါ် ဒါမှမဟုတ် အောက်ကို နှိပ်မယ် ဆိုရင် ဂဏန်း က ပြောင်းသွားပြီး အသံမြည်တာ ကြားရမှာပါ။

၆။ အသံကို အောက်က အတိုင်းစစ်နိုင်ပါတယ်။
အသံတို တစ်ချက်။ ။ ဘယ်ဘက် ဂဏန်းက error code မဟုတ်သေးပါဘူး။
အသံတို နှစ်ချက်။ ။ ဘယ်ဘက် ဂဏန်းက ဟုတ်တယ်။ ဒါပေမယ့် ညာဖက် ဂဏန်းက error code မဟုတ်သေးပါဘူး။
အသံရှည် တစ်ချက်။ ။ ဂဏန်းနှစ်ခုလုံး ဟုတ်သွားပြီ။ ပြနေတဲ့ နံပါတ်က error code ဖြစ်ပါတယ်။


ရ။ အသံရှည် မြည်သံ ကြားရတဲ့ အခါ ပြနေတဲ့ နံပါတ် က error code ဖြစ်ပြီး၊ ဖြစ်နိုင်တဲ့ ပြဿနာ အကြောင်းကို ဖော်ပြထားတဲ့ ဇယားကို အောက်မှာ တွေ့နိုင်ပါတယ်။

၈။ စစ်ဆေး ပြီးတဲ့ အခါ diagnosis mode ကနေ ထွက်ဖို့ MODE ခလုတ် ကို နှိပ်ပါ။

၉။ ပုံမှန် အခြေအနေ normal mode ကိုပြန်ရောက်အောင် ON/OFF ခလုတ် ကို နှစ်ခါ နှိပ်ပါ။ ဘာမှ မလုပ်ပဲထားရင်လဲ စက္ကန့် ၆၀ လောက် ကြာတဲ့ အခါ ရီမု ကွန်ထရိုးကသူ့ဟာသူ ပုံမှန် အတိုင်း ပြန်ဖြစ်သွားမှာပါ။

Error Codes and Description of Fault

System

  • 00 ပုံမှန်
  • U0 refrigerant ဂတ်စ် အရည် နည်းနေပြီ
  • U2 ဗို့အား မမှန်။ မီးအား နည်း/များ နေပြီ
  • U4 အပြင်ယူနစ် နဲ့ အတွင်း ယူနစ် ကြား ဆက်သွယ်တဲ့ Signal ကြိုး ပြဿနာ
  • U7 အပြင်ယူနစ် ဆားကစ်ပြား ဆက်သွယ်ရေး Signal ပြဿနာ
  • UA အပြင်ယူနစ် နဲ့ အတွင်း ယူနစ် ကြား ဗို့အား မမှန်။
  • UH အခြား အခန်းက ရေ မခဲ အောင် လုပ်တဲ့ လုပ်ငန်း (Anti-icing function)


Indoor Unit

  • A1 အတွင်း ယူနစ် ဆားကစ်ပြား ပြဿနာ
  • A5 ခဲခြင်း၊ အပူလွန် ခြင်းမှ ကာကွယ်ခြင်း
  • A6 ပန်ကာ မော်တာနှင့် ဆက်စပ်သော ပြဿနာ
  • C4 အတွင်း အပူ ထိန်း (heat exchanger) ကိရိယာ၊ အပူချိန်တိုင်း ကိရိယာ တို့နှင့် ဆက်စပ်သော ပြဿနာ
  • C9 အခန်း အပူချိန်တိုင်း ကိရိယာ နှင့် ဆက်စပ်သော ပြဿနာ


Outdoor Unit

  • A5 ရေမခဲ အောင် လုပ်တဲ့ လုပ်ငန်း (Anti-icing function) ပြဿနာ
  • E1 အပြင် ယူနစ် ဆားကစ်ပြား ပြဿနာ
  • E5 ကွန်ပရက်စာ မနိုင်ဝန် ထမ်းခြင်း
  • E6 ကွန်ပရက်စာ ပိတ်သွားခြင်း (lock)
  • E7 DC ပန်ကာ ပိတ်သွားခြင်း (lock)
  • E8 အဝင် လျှပ်စစ် စီးဆင်းမှု လွန်ကဲခြင်း
  • EA လေးလမ်းသွား အဆို့ရှင် ပြဿနာ
  • F3 စွန့်ထုတ် ပိုက် အပူချိန်ထိန်း ပြဿနာ
  • F6 အအေးခံ ရာတွင် ဖိအား မြင့် အထိန်း ပြဿနာ
  • H0 ကွန်ပရက်စာ အာရုံခံ sensor စနစ် ပြဿနာ
  • H6 နေရာ အာရုံခံ စနစ် sensor ပြဿနာ
  • H8 CT နှင့် ဆက်စပ်သော ပြဿနာ
  • H9 အပြင် အပူချိန်တိုင်း ကိရိယာ နှင့် ဆက်စပ်သော ပြဿနာ
  • J3 စွန့်ထုတ် ပိုက် အပူချိန်တိုင်း ကိရိယာ နှင့် ဆက်စပ်သော ပြဿနာ
  • J6 အပြင် အပူ ထိန်း (heat exchanger) အပူချိန်တိုင်း ကိရိယာ နှင့် ဆက်စပ်သော ပြဿနာ
  • J8 အရည် ပိုက် အပူချိန်တိုင်း ကိရိယာ နှင့် ဆက်စပ်သော ပြဿနာ
  • J9 အငွေ့ ပိုက် အပူချိန်တိုင်း ကိရိယာ နှင့် ဆက်စပ်သော ပြဿနာ
  • L3 လျှပ်စစ် အိမ် အပူချိန် မြင့်တက်ခြင်း
  • L4 အပူဖြာ ဆူးတောင် အပူချိန် မြင့်တက်ခြင်း
  • L5 အထွက် လျှပ်စစ် စီးဆင်းမှု လွန်ကဲခြင်း
  • P4 အပူဖြာ ဆူးတောင်အပူချိန်တိုင်း ကိရိယာ နှင့် ဆက်စပ်သော ပြဿနာ


ကျွန်တော် တို့ရဲ့ ရီမု နဲ့ စစ်ကြည့်တော့ U4 လို့ ပြနေပါတယ်။ အပြင်ယူနစ် နဲ့ အတွင်း ယူနစ် ကြား ဆက်သွယ်မှု Signal ပြဿနာ ပေါ့။ အပြင်ယူနစ် ကပို့တာကို ကောင်းကောင်း မရတာ၊ ဒါမှမဟုတ် အပြင်ယူနစ် က ကောင်းကောင်း မပို့နိုင်တာပါ။ အဲဒီ လက်ကိုင်စာအုပ် မှာ ပြောထားတဲ့ ဖြစ်နိုင်တဲ့ ပြဿနာတွေက
၁။ အပြင် ယူနစ် ဆားကစ်ပြား ပြဿနာ
၂။ အတွင်း ယူနစ် ဆားကစ်ပြား ပြဿနာ
၃။ ဝါယာကြိုး ပြဿနာ
၄။ ပါဝါ ဆပ်ပလိုင်း မကောင်းတာ
၅။ အတွင်း ယူနစ် နဲ့ အပြင် ယူနစ် ဆက်ထားတဲ့ ဝါယာ နံပါတ် ၃ ပြတ်နေတာ တွေ ပါ။


အဲယားကွန်း ပြင်တဲ့သူတွေ အိမ်ကို ရောက်လာပြီး စစ်လိုက်တော့ အတွင်း ယူနစ် နဲ့ အပြင် ယူနစ် ဆက်ထားတဲ့ ဝါယာ နံပါတ် ၃ ပြတ်နေတာ ပါ။ ပြတ်တာက အပြင် ယူနစ် မှာ ဆက်ထားတဲ့ အဆက် နေရာမှာ ရေလေ တိုက်စားပြီးပြတ်တာပါ။ သူ့တို့ လှုပ်ပြလိုက်မှ နောက်ထပ် တစ်ခြား အတွင်း ယူနစ် တွေကို ဆက်ထားတဲ့ ဝါယာ နံပါတ် ၃ တွေပါ ပြတ်သွား သေးတယ်။ သူ့တို့က ဆက်ထားတဲ့ အိမ်ထဲ၊ အိမ်ပြင်က ဝါယာအားလုံး ဖြုတ်လဲရမယ်လို့ ပြောပါတယ်။ မလိုဘူး ထင်ပါတယ်။ ဝါယာ ထိပ်နားကို အခွံလေး နွာပြီး ပြန်ဆက် လိုက်တော့ OK သွားပါတယ်။ စိတ်ဝင်စားစရာ ကတော့ အတွင်း ယူနစ် တွေကို ဆက်ထားတဲ့ ဝါယာ အားလုံးမှာ နံပါတ် ၃ တွေပဲ တိုက်စား ခံရတာပါ။ ကြည့်ရတာတော့ အဲဒီ ဝါယာက DC ဗို့ကို သုံးပြီး electrode လို ဖြစ်သွားတယ် ထင်ပါတယ်။ နောက်ထပ် ပြန်ဖြစ် ဦးမယ့် ပုံပါပဲ။

၂၀၁၃ ဇွန် ၁၀ ဖြည့်စွက်ချက်

အဲကွန်းက အဲဒီကတည်းက ကောင်းသွားတာ အခုထက်ထိ ဘာပြဿနာမှ ပြန်မပေါ်သေးဘူး။ electrode ပြဿနာလည်း မဟုတ်လောက်ပြန်ဘူး။ အချို့သူတွေ ကွန်မန့်ပေးထားတာ ဒီစီ ဗို့မသုံးဘူးတဲ့။ ကွန်ထရက်တာ က အရည်အသွေးညံ့တဲ့ ဝါယာတွေ သုံးသွားလို့လည်း ဖြစ်နိုင်ပါတယ်။ ဒါကြောင့်နေမှာ သူတို့က ဝါယာအားလုံး ပြန်လဲဖို့ လိုတယ်လို့ ပြောပြီး ပြန်လဲသွားတာ။

၂၀၁၄ ဖေဖော်ဝါရီ ၁၀ ဖြည့်စွက်ချက်

ဒီပြဿနာပဲ နောက် အတွင်းယူနစ် တစ်ခု မှာ ထပ်ဖြစ်ပါတယ်။ ဒီတစ်ခါတော့ အပြင်ယူနစ်ထဲက ဆားကစ်ဘုတ် ပျက်တယ်လို့ ဆိုပါတယ်။ ပြန်လဲချင်ရင် ဒေါ်လာ ၈၀၀ လောက်ကုန်မယ် လို့ပြောပါတယ်။

Reference:
Malfunction code chart
Service Manual

Friday, June 3, 2011

Curve Fitting in Matlab

မိတ်ဆွေ တစ်ယောက်က data sample တွေက နေ curve equation ထုတ်ဖို့ လိုနေ ပါတယ်။ Excel မှာ polynomial ကို order 6 အထိပဲ ရလို့ higher order ရအောင် Matlab program ကူရေးပေး ဖို့ ဆိုလာ ပါတယ်။ ဂရပ် ပုံကို ပါ ဆွဲပေး ဖို့ program ရယ်၊ နမူနာ ဒေတာ ဖိုင်ရယ် ကို အောက်မှာ ရေးကြည့်ထား ပါတယ်။ ကျွန်တော် ကိုယ်တိုင်လဲ မကြာခဏ data fit လုပ်ဖို့ လိုတာ ကြောင့် ကျွန်တော့် အတွက်လဲ ဒါဟာ အသုံးဝင်ပါတယ်။ See d.txt and cf.m.
%--------------------------------------
%Curve fitting
%2011-Jun-03
%Programmer: Yan Naing Aye
%--------------------------------------
clc;
close all;
clear all;
%--------------------------------------
%get data from file that can be edited
load('d.txt');
X=d(:,1);
Y=d(:,2);
%--------------------------------------
%define order
N=2;
%--------------------------------------
%curve fitting
p=polyfit(X,Y,N);
%generate curve fitted data
[nr nc]=size(X);
YA=zeros(nr,1);
for i=0:N
    YA=YA+p(i+1)*X.^(N-i);
end
%--------------------------------------
%Plot Y vs X
figure;
plot(X,Y,' rd','LineWidth',2,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',6)
hold on;
plot(X,YA,'b','LineWidth',2,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',6)
hold off;            
grid on;
Title('Y vs X')
xlabel('X');
ylabel('Y');
legend('Sampled data','Fitted curve',...
       'Location','NW')
%--------------------------------------

Monte Carlo integration

Particle Filter အကြောင်း ဖတ်ကြည့်ရင်း uniform distribution နဲ့ Monte Carlo integration လုပ်တဲ့ Matlab program လေး တစ်ပုဒ် ကို အပျော် ရေးကြည့် ထားပါတယ်။ အဲဒီ equation ရယ်၊ program ရယ် ကို အောက်မှာ ကြည့်နိုင်ပါတယ်။
clc;
close all;
clear all;
%--------------------------------------
%Monte Carlo Integration
%--------------------------------------
%--------------------------------------
%limits
LowerLimit=1;
UpperLimit=3;
%--------------------------------------
%generate uniformly distributed random 
%numbers within the range
n=10000;
x=LowerLimit+(UpperLimit-LowerLimit)*rand(n,1);
%--------------------------------------
%Probability distribution function for 
%uniformly distributed random numbers
q=1/(UpperLimit-LowerLimit);
%--------------------------------------
%function to integrate
f=3.*x.*x;
i=mean(f./q)
%--------------------------------------

Thursday, May 5, 2011

Degrees of Freedom of the Human Arm

လူတွေရဲ့ လက်မှာ လှုပ်ရှားနိုင်တဲ့ ပုံစံ (degrees of freedom) ဘယ်နှစ်မျိုး ရှိလဲလို့ စဉ်းစား ဘူးပါသလား။ Saeed Benjamin Niku ရေးတဲ့ စာအုပ် တစ်အုပ် ဖြစ်တဲ့ Introduction to Robotics -Analysis, Control, Applications ထဲမှာ ဖတ်မိတဲ့ ဟာ တစ်ချို့ကို ပြန်ပြီး ထုတ်နုတ် တင်ပြ ချင်ပါတယ်။ လူ့ လက်မှာ ပခုံး၊ တံတောင်ဆစ် နဲ့ လက်ကောက်ဝတ် တွေက ကိုယ်၊ လက်မောင်း၊ လက်ဖျံ၊ လက်ဖဝါး တွေကို ဆက်ထား ပေးတဲ့ အဆက် နေရာတွေပါ။ ပခုံး က သုံးမျိုး လှုပ်နိုင်ပါတယ်။ coronal plane အတိုင်း အပေါ်အောက် လှုပ်လို့ရ သလို၊ transverse plane အတိုင်း ရှေ့နောက် လွှဲလို့ လဲရနိုင်ပြီး၊ လက်မောင်း ဝင်ရိုးမှာ လှည့်လို့ လည်း ရပါတယ်။ လူတွေရဲ့ ခန္ဓာဗေဒ ပြင်ညီ အခေါ်အဝေါ် ကို အောက်က Wikipedia က ပုံမှာ တွေ့နိုင်ပါတယ်။
တံတောင်ဆစ် ကတော့ အကွေး၊ အဆန့် တစ်မျိုးပဲ လှုပ်လို့ရတာပါ။ လက်ကောက်ဝတ် ကလဲ သုံးမျိုး လှုပ်နိုင်ပါတယ်။ အပေါ်အောက် လှုပ်တာ၊ ဘေးတိုက် လှုပ်တာ နဲ့ လက်ဖျံ တလျှောက် လှည့်တာ တွေ ဖြစ်ပါတယ်။ ဒါ့ကြောင့် လက်ချောင်းတွေကို ထည့်မစဉ်းစားဘူးဆိုရင် လူတွေရဲ့ လက်မှာ လှုပ်ရှားနိုင်တဲ့ ပုံစံ (degrees of freedom) ခုနှစ်မျိုး ရှိတယ်လို့ ပြောနိုင်ပါတယ်။

Tuesday, May 3, 2011

Byte Stuffing

ပစ္စည်း တစ်ခု ကနေ တစ်ခု data bytes တွေကို ပို့ဖို့ နဲ့၊ လက်ခံဖို့ အတွက် program တွေကို မကြာခဏ ရေးရပါတယ်။ ဒါနဲ့ပဲ ရိုးရှင်းတဲ့ byte stuffing မူကွဲ တစ်ခု ကို ရွေးပြီး data bytes တွေကို frame ဆောက် ပြီး ပို့ဖို့ နဲ့၊ လက်ခံဖို့ အတွက် လုပ်ရပါတယ်။ ပထမဆုံး အနေနဲ့ Frame ရဲ့ အစ နဲ့ အဆုံးကို သတ်မှတ်ဖို့ အတွက် control characters တွေ အနေနဲ့ 0x02 နဲ့ 0x03 ကို start of text (STX) ရယ်၊ end of text (ETX) ရယ် လို့ ထားလိုက် ပါမယ်။ လက်ခံရရှိတဲ့ ဒေတာ မှာ အမှား ပါမပါ စစ်ဖို့ အတွက် data bytes တွေရဲ့ exclusive-or တန်ဖိုးကို ETX နောက်မှာ အဆုံးသတ် checksum အနေနဲ့ ထည့်လိုက်ပါမယ်။ ပိုကောင်းတဲ့ error detection အတွက်တော့

CRC Calculation in VB and C

မှာဖော်ပြထားသလို CRC ကို သုံးလို့ ရပါတယ်။
ဥပမာ data byte နှစ်လုံး
0x30 0x31
ကို ပို့ဖို့ ဆိုရင်၊ ပို့ရမယ့် frame က
0x02 0x30 0x31 0x03 0x01
ဖြစ်ပါတယ်။ အစက 0x02 က STX အနေနဲ့ ထည့်ထားပြီး၊ data bytes တွေကို ပို့ပါမယ်။ ဘိတ်ရှေ့ က 0x03 က ETX အနေနဲ့ ထည့်ထားတာပါ။ data byte တွေရဲ့ exclusive-or (0x02^0x03) ဖြစ်တဲ့ 0x01 ကို checksum အနေနဲ့ နောက်ဆုံးက နေ ထည့်ထားတာပါ။ အကယ်၍ ပို့ရမယ့် ဒေတာမှာ control characters တွေ အနေနဲ့ သုံးထားတဲ့ 0x02 တို့၊ 0x03 တို့ ပါလာရင် ဘယ်လို လုပ်မလဲ လို့ မေးစရာရှိ ပါတယ်။ အဲဒီ အတွက် နောက်ထပ် control character 0x10 ကို Data Link Escape (DLE) အနေနဲ့ သတ်မှတ်ဖို့ လိုပါတယ်။ နောက်ထပ် ဥပမာ အနေနဲ့ data byte ငါးလုံး ဖြစ်တဲ့
0x30 0x02 0x65 0x10 0x03
အတွက် frame တစ်ခု ဆောက်ကြည့် ပါမယ်။ ဒေတာထဲမှာ STX တို့၊ ETX တို့၊ DLE တို့ ကိုတွေ့တိုင်း control character မဟုတ်ကြောင်း သိအောင် ရှေ့မှာ DLE တစ်လုံးကို အပို ထည့်ပေး မှာပါ။ ဒါဆို ပို့ရမယ့် frame က
0x02 0x30 0x10 0x02 0x65 0x10 0x10 0x10 0x03 0x03 0x44
ဖြစ်ပါတယ်။ C တို့၊ LabVIEW တို့ နဲ့ ပရိုဂရမ် တချို့ ရေးကြည့်ထားပါတယ်။ Example programs တွေကို အောက်က link မှာ တွေ့နိုင်ပါတယ်။

Byte Stuffing on GitHub


အောက်ကဟာက ပို့ဖို့ အတွက် frame ဆောက်တဲ့ C++ code ဖြစ်ပါတယ်။
// Byte stuffing- sending and receiving frames
// Author: Yan Naing Aye

#ifndef  FRAME_H
#define FRAME_H

#include 
#define STX 0x02
#define ETX 0x03
#define DLE 0x10

#define TX_BUF_SIZE 128
#define RX_BUF_SIZE 128
enum RX_STATE { IGNORE,RECEIVING,ESCAPE,RXCRC1,RXCRC2 };
//-----------------------------------------------------------------------------
class Frame {    
    RX_STATE rState;
protected:
    int TxN;//number of transmitting bytes
    int RxN;//number of receiving bytes
    char tb[TX_BUF_SIZE];//transmit buffer
    char rb[RX_BUF_SIZE];//receiving data
public:
    Frame();
    int setTxFrame(char* d,int n);
    unsigned int CRC16CCITT_Calculate(char* s,unsigned char len,unsigned int crc);
    int getTxN();
    int getRxN();
    int receiveRxFrame(char c);//get receiving frame from received char
    char* getTxBuf();
    char* getRxBuf();
};
//-----------------------------------------------------------------------------
Frame::Frame():TxN(0),RxN(0),rState(IGNORE){}
//-----------------------------------------------------------------------------
char* Frame::getTxBuf(){
    return tb;
}
//-----------------------------------------------------------------------------
char* Frame::getRxBuf(){
    return rb;
}
//-----------------------------------------------------------------------------
//Prepare transmitting frame
int Frame::setTxFrame(char* d,int n)
{
    unsigned int txcrc=0xFFFF;//initialize crc
    char c;
    int i=0,j=0;
    tb[i++]=STX;//start of frame
    for(j=0;j < n;j++) {
        c=d[j];
        if((c==STX)||(c==ETX)||(c==DLE)) tb[i++]=(DLE);
        tb[i++]=c;
    }
    tb[i++]=(ETX);//end of frame

    txcrc=CRC16CCITT_Calculate(d,n,txcrc);//calculate crc
    tb[i++]=txcrc & 0xFF;
    tb[i++]=(txcrc >> 8) & 0xFF;
    TxN=i;
    return TxN;
}
//-----------------------------------------------------------------------------
//Inputs
//s : pointer to input char string
//len: string len (maximum 255)
//crc: initial CRC value

//Output
//Returns calculated CRC
unsigned int Frame::CRC16CCITT_Calculate(char* s,unsigned char len,unsigned int crc)
{
    //CRC Order: 16
    //CCITT(recommendation) : F(x)= x16 + x12 + x5 + 1
    //CRC Poly: 0x1021
    //Operational initial value:  0xFFFF
    //Final xor value: 0
    unsigned char i,j;
    for(i=0;i < len;i++,s++) {
        crc^=((unsigned int)(*s) & 0xFF) << 8;
        for(j=0;j<8;j++) {
            if(crc & 0x8000) crc=(crc << 1)^0x1021;
            else crc <<=1;
        }
    }
    return (crc & 0xFFFF);//truncate last 16 bit
}
//-----------------------------------------------------------------------------
//get number of transmitting bytes
int Frame::getTxN()
{
    return TxN;
}
//-----------------------------------------------------------------------------
//get number of transmitting bytes
int Frame::getRxN()
{
    return RxN;
}
//-----------------------------------------------------------------------------
//process receiving char
int Frame::receiveRxFrame(char c)
{
    static char b;
    unsigned int crc;
    unsigned int rxcrc=0xFFFF;//initialize CRC
    switch(rState){
        case IGNORE:
            if(c==STX) { rState=RECEIVING;RxN=0;}
            break;
        case RECEIVING:
            if(c==STX) { rState=RECEIVING;RxN=0;}
            else if(c==ETX){rState=RXCRC1;}
            else if(c==DLE){ rState=ESCAPE; }
            else { rb[RxN++]=c; }
            break;
        case ESCAPE:
            rb[RxN++]=c; rState=RECEIVING;
            break;
        case RXCRC1:
            b=c; rState=RXCRC2;
            break;
        case RXCRC2:
            rState=IGNORE;
            crc=( (int)c << 8 | ((int)b & 0xFF) ) & 0xFFFF;//get received crc
            rxcrc=CRC16CCITT_Calculate(rb,RxN,rxcrc);//calculate crc
            //printf("crc: %x  rxcrc:%x \n",crc,rxcrc);
            if(rxcrc==crc){return RxN;}//if crc is correct            
            else {RxN=0;}//discard the frame

            break;
    }
    return 0;
}

//-----------------------------------------------------------------------------

//#############################################################################

class Frame2:public Frame {
    char Dt[20];//transmitting data
public:
    Frame2();
    void printTxFrame();
    void printRxFrame();
    void printRxData();
    void setTxData(float x,float y,float z,float b,float t);
};
//-----------------------------------------------------------------------------
Frame2::Frame2():Frame(),Dt(""){}
//-----------------------------------------------------------------------------
//Print out frame content
void Frame2::printTxFrame()
{
    printf("Tx frame buffer: ");
    for(int j=0;j < TxN;j++) printf("%02X ",(unsigned char)tb[j]);
    printf("\n");
}
//-----------------------------------------------------------------------------
//Print out frame content
void Frame2::printRxFrame()
{
    printf("Rx data buffer: ");
    for(int j=0;j < RxN;j++) printf("%02X ",(unsigned char)rb[j]);
    printf("\n");
}
//-----------------------------------------------------------------------------
//Set transmitting data
void Frame2::setTxData(float x,float y,float z,float b,float t)
{
    *(float*)(Dt)=x;
    *(float*)(Dt+4)=y;
    *(float*)(Dt+8)=z;
    *(float*)(Dt+12)=b;
    *(float*)(Dt+16)=t;
    Frame::setTxFrame(Dt,20);
}
//-----------------------------------------------------------------------------
//Print out received data
void Frame2::printRxData()
{
    float x,y,z,b,t;
    x=*(float*)(Dt);
    y=*(float*)(Dt+4);
    z=*(float*)(Dt+8);
    b=*(float*)(Dt+12);
    t=*(float*)(Dt+16);
    printf("Rx data: %f %f %f %f %f \n",x,y,z,b,t);
}
//-----------------------------------------------------------------------------

#endif // FRAME_H

Friday, March 4, 2011

Simple 6 DOF Translation and Rotation Stages

ပစ္စည်း တစ်ခု ကို 6 degrees of freedom (DOF) နဲ့ ထိန်းဖို့ လိုအပ်ချက် ပေါ်လာပါတယ်။ နေရာ ရွေ့ ဖို့ မော်တာနဲ့ မောင်းတဲ့ translation stage သုံးခု ရယ်၊ အနေအထား အတွက် မော်တာနဲ့ မောင်းတဲ့ rotary stage သုံးခု ကို သုံးပြီး ထိန်းမှာပါ။ သူ့ကို prismatic joint သုံးခု နဲ့ revolute joint သုံးခု ပါတဲ့ robot arm တစ်ခု အနေနဲ့ စဉ်းစားလို့ ရပေမယ့်၊ သာမန် ရိုးရှင်းတဲ့ ကိရိယာ တစ်ခု အတွက် မသင့်တော် တဲ့ ရှုပ်ထွေးတဲ့ kinematics တွက်ချက်မှု တွေ မပါအောင် တည်ဆောက်ချင် ပါတယ်။ နမူနာ တွက်ချက်မှု တစ်ခု ကို ဒီမှာ တွေ့ နိုင်ပါတယ်။ rotary stage တွေရဲ့ ဝင်ရိုးတွေ ကို အထိန်းခံ ပစ္စည်း မှာ ဖြတ်သွားအောင် စီစဉ် ထားမယ် ဆိုရင်တော့ ရိုးရှင်းတဲ့၊ ဒါရိုက် ထိန်းချုပ်လို့ ရတဲ့ ကိရိယာ တစ်ခုကို ရရှိနိုင်ပါတယ်။ ကျွန်တော် ဒီဇိုင်း လုပ်ကြည့်ထား တဲ့ ပုံတွေကို အောက်မှာတွေ့ နိုင်ပါတယ်။

Thursday, March 3, 2011

Capacitor selection for a Crystal Oscillator

ပုံမှန် crystal oscillator တစ်ခု နဲ့ နမူနာ layout design တစ်ခုကို ပုံတွေမှာ ဖော်ပြထားပါတယ်။ Crystal ထုတ်လုပ်သူ တွေက crystal တစ်ခု အတွက် ရှိသင့်တဲ့ CL (load capacitance) ကို သူ့အတွက် datasheet မှာ ဖော်ပြထားလေ့ ရှိပါတယ်။ အဲဒီ တန်ဖိုးဟာ crystal ကမြင်ရမယ့် C1 ၊ C2 နဲ့ pin ၊ board ၊ PCB trace တို့ရဲ့ ရှိသမျှ စုစုပေါင်း capacitance ( Cstray ) တို့ကို တန်းဆက် (series ဆက်) ထားတဲ့ တန်ဖိုးပါ။ Cstray ရဲ့ ပုံမှန် တန်ဖိုးက 2 pF နဲ့ 7 pF ကြားမှာ ရှိတတ်ပါတယ်။ သူတို့ ရဲ့ ဆက်သွယ်မှု ကို အောက်ပါ ညီမျှခြင်း နဲ့ ဖော်ပြနိုင် ပါတယ်။

CL=(C1 * C2)/(C1 + C2) + Cstray

C1 နဲ့ C2 တို့ကို ရွေးချယ်တဲ့ အခါ ပုံမှန်အား ဖြင့် တန်ဖိုးတူ တာကို သုံးကြပါတယ်။ ဒါကြောင့်

C1 = C2=2 * (CL - Cstray)

ဖြစ်ပါတယ်။ ဥပမာ Cstray က 4 pF နဲ့ CL က 18 pF ဖြစ်မယ်ဆိုရင် C1 နဲ့ C2 က 28 pF ဖြစ်သင့်ပါတယ်။ ဒါဆို ဝယ်လို့ရမယ့် normalized တန်ဖိုး 30 pF ကို သုံးနိုင်ပါတယ်။

Tuesday, February 22, 2011

Denavit-Hartenberg Representation of Robots

D-H model ဟာ robot links နဲ့ joints တွေကို ဖော်ပြဖို့ အတွက် ရိုးရှင်းတဲ့ ပုံစံ တစ်ခု ဖြစ်ပြီး ဘယ်လို robot ပုံစံ မျိုး အတွက် မဆို သုံးလို့ရပါတယ်။ လက်တံ (link) တစ်ခုစီ အတွက် z ဝင်ရိုးနဲ့ x ဝင်ရိုး တို့ကို သတ်မှတ်ပေးဖို့ လိုပါတယ်။ D-H representation မှာ y ဝင်ရိုးကို သုံးစရာ မလိုပါဘူး။ Lk ကို link k အတွက် frame လို့ သတ်မှတ်ကြမယ် ဆိုပါစို့။



၁။ Joint အားလုံး အတွက် Z ဝင်ရိုးကို သတ်မှတ်ပါ

Joint k+1 ရဲ့ ဝင်ရိုးကို zk လို့ သတ်မှတ်ပါ။ အကယ်၍ လည်တဲ့ revolute joint မျိုးဆိုရင် z axis ကို လည်တဲ့ဖက် အတိုင်း right hand rule သုံးပြီး သတ်မှတ်ပါ။ အကယ်၍ ဆန့်ထွက်တဲ့ prismatic joint မျိုးဆိုရင် z-axis ကို ဆန့်ထွက်တဲ့ ဖက် အတိုင်း သတ်မှတ်ပါ။

၂။ Origin များကို သတ်မှတ်ပါ

zk နဲ့ zk-1 တို့ အချင်းချင်း ဖြတ်သွားတဲ့ နေရာကို Lk ရဲ့ origin လို့ သတ်မှတ်ပါ။ အကယ်၍ မဖြတ်ခဲ့ ရင် zk ရော zk-1 ကိုပါ ထောင့်မတ်ကျတဲ့ common normal နဲ့ zk နဲ့ ဖြတ်တဲ့နေရာကို ယူပါ။ လိုင်း နှစ်လိုင်း ဟာ ဘယ်လိုပဲ ရှိ ရှိ နှစ်လိုင်း စလုံးကို ထောင့်မတ်ကျတဲ့ common normal လို့ ခေါ်တဲ့ လိုင်းတစ်လိုင်းတော့ အမြဲရှိပြီး အဲဒီနှစ်လိုင်း ရဲ့ အနီးဆုံး အကွာအဝေး လည်း ဖြစ်ပါတယ်။

၃။ X ဝင်ရိုးများကို သတ်မှတ်ပါ

xk ကို zk နဲ့ zk-1 ကြားက common normal ရဲ့ ဦးတည်ရာ အတိုင်း သတ်မှတ်ပါ။ အကယ်၍ z ဝင်ရိုး အချင်းချင်း ဖြတ်နေရင် xk ကို zk နဲ့ရော zk-1 နဲ့ပါ ထောင့်မတ်ကျ အောင် သတ်မှတ်ပါ။ (z ဝင်ရိုး တွေရဲ့ cross-product ဦးတည်ရာ အတိုင်း လို့ လည်းပြောလို့ ရပါတယ်)။ အကယ်၍ zk နဲ့ zk-1 တွေက ပြိုင်နေရင် xk ကို zk-1 နဲ့ ဝေးရာကို ဦးတည်ပါ။ အရင် ရှေ့က common normal ရဲ့ ဦးတည်ရာ အတိုင်း ဖြစ်နိုင်ရင် သတ်မှတ်ပါ။

၄။ Y ဝင်ရိုးများကို သတ်မှတ်ပါ

yk ကို right-handed frame Lk ဖြစ်အောင် သတ်မှတ်ပါ။

၅။ Kinematic Parameter လေးခု ကို ရှာပါ

k က xk-1 နဲ့ xk ကြားက zk-1 ဝင်ရိုးပေါ်က ထောင့်ပါ။ *dk က xk-1 နဲ့ xk ကြားက zk-1 ဝင်ရိုး တစ်လျှောက် အကွာအဝေး ပါ။ *ak က zk-1 နဲ့ zk ကြားက xk ဝင်ရိုး တစ်လျှောက် အကွာအဝေး ပါ။ *αk က zk-1 နဲ့ zk ကြားက xk ဝင်ရိုးပေါ်က ထောင့်ပါ။

၆။ Frame k-1 မှ Frame k သို့ ပြောင်းခြင်း

*Lk-1 ကို zk-1 ဝင်ရိုး ပေါ်မှာ θk လှည့်လိုက်ရင် xk-1 နဲ့ xk နဲ့ အပြိုင်ဖြစ် သွားပါမယ်။ ဘာ့ကြောင့်လဲ ဆိုတော့ common normals တွေ ဖြစ်တဲ့ ak-1 နဲ့ ak နှစ်ခုစလုံးက zk-1 ဝင်ရိုးနဲ့ perpendicular ဖြစ်နေလို့ပါ။ *Lk-1 ကို zk-1 ဝင်ရိုး တစ်လျှောက် dk ရွှေ့ရင် xk-1 နဲ့ xk က တစ်တန်းတည်း ဖြစ်သွားပါမယ်။ *Lk-1 ကို xk ဝင်ရိုး တစ်လျှောက် ak ရွှေ့ရင် Lk-1 နဲ့ Lk တို့ရဲ့ origin တွေဟာ တစ်ထပ်တည်း ဖြစ်သွား ပါမယ်။ *Lk-1 ကို xk ဝင်ရိုး ပေါ်မှာ αk လှည့်လိုက်ရင် zk-1 နဲ့ zk ဝင်ရိုး တွေဟာ အပြိုင်ဖြစ် သွားပါမယ်။ ဒီအချိန်မှာ frames Lk-1 နဲ့ Lk တို့ဟာ တထပ်တည်း ကျသွားပါပြီ။


simulation လုပ်ကြည့်မယ် ဆိုရင် Robotassist ဆိုတဲ့ free software လေးက အဆင်ပြေမယ် ထင်ပါတယ်။
Ref:
Introduction to Robotics -Analysis, Control, Applications; Second Edition, Saeed Benjamin Niku
Fundamental of Robotics -Analysis & Control, Robert J. Schilling