به این ها توجه کنید : " 0 و 1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9 " خوب اینها چی هستند ؟ احتمالا جواب شما اینه که اعداد 0 تا 9 هستند .
اما میخوام بگم که اینها فقط ده تا شکل هندسی هستند که ما قرارداد کردیم که هر کدوم از این شکل ها نماینده ی یک عدد و تعداد اشیا باشه
خوب حالا اگه ده تا شی داشتیم چه کار کنیم ؟ من پیشنهاد میدم از این نماد " & " برای نشان دادن ده شی استفاده کنیم
خوب برای یازده چی ؟ " # " خوبه؟ . برای دوازده چی ؟ ...
اگه بخواهیم اینجوری پیش بریم به بینهایت نماد نیاز داریم
پس بنابراین از همین ده نماد و ترکیب دو یا چند تا از همینا استفاده میکنیم تا اعداد بزرگتر رو نمایش بدیم
خوب حالا چرا از ده نماد و ترکیب هاشون استفاده کنیم ؟ میتونستیم از پنچ نماد و ترکیب هاشون استفاده کنیم .
دلیل استفاده از ده نماد احتمالا به خاطر اینه که ما انسان ها ده انگشت داریم
حالا که ده انگشت داریم وقتی میخوایی تعداد نه رو نشون بدیم از نماد "9" استفاده می کنیم برای نمایش دادن عدد بعدی از دو نماد "0" و "1" در کنار هم استفاده می کنیم و "10" رو میسازیم و برای بعدیش "11" و ...
حالا اگه پنج انگشت داشتیم احتمالا اعدادمون به این صورت میشدند : "0" "1" "2" "3" "4" "10" "11" ... "20" "21" ... "30" "31" ... "40" ... "100" ...
خوب همون جور که میبینید فقط از پنج نماد و ترکیب اونها استفاده کردیم
خوب حالا اگه شانزده انگشت داشتیم باید از شانزده نماد و ترکیب اونها استفاده میکردیم
خوب برای اعداد صفر تا نه که نماد داریم برای اعداد ده تا پانزده نماد نیاز داریم . خوب پیشنهاد های مختلفی برای نماد های این اعداد وجود داره و بهترین اونها اینه که از "A" برای نشون دادن عدد ده ، از "B" برای نشون دادن عدد یازده ، از "C" برای نشون دادن عدد دوازده و ... استفاده کنیم
این جوری دیگه نیازی به طراحی نماد های جدید نداریم
پس اعداد در مبنای شانزده به این صورت میشن : " 0 و 1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9 و A و B و C و D و E و F و 10 و 11 و 12 و ... و 1A و 1B و 1C و ... و 1F و 20 و 21 و ... و 99 و 9A و 9B و 9C و 9D و 9E و 9F و A0 و A1 و ... و FF و ... و 100 و ... "
صحت حرفم رو هم میتونید توی calculator ویندوزتون توی حالت Programmer ببینید ( با alt+3 این حالت میاد ) ( توی این حالت سمت چپ نرم افزار یه حالت انتخاب ( بین bin ( مبنای 2 ) و oct ( مبنای 8 ) و dec ( مبنای 10 ) و hex ( مبنای 16 ) ) ظاهر میشه و با انتخاب هر کدوم از مبناها فقط ارقام اون مبنا فعال می شوند ( توی مبنای 16 شش تا حروف انگلیسی هم فعال می شوند ) و برای تبدیل عدد از یک مبنا به مبنای دیگه عددتون رو بزنید توی کادر و مبنا رو عوض کنید ) ( توی ویندوز xp روی حالت ساینتیفیک این امکان رو داده )
در پست قبلی کنترلر P توضیح داده شد و گفتیم که با قرار دادن سرعت مساوی خطا ضربدر Kp میتوانیم ربات فوتبالیست را رو به دروازه حریف نگاه داریم زیرا هرگاه ربات به هر دلیلی از زاویه مورد نظر منحرف شد با چرخش ( با سرعت مناسب به دست آمده از کنترلر P ) دوباره به سمت هدف باز میگردد . ( اگر سرعت موتورها را با PWM بین ۰ تا ۲۵۵ کنترل کنیم Kp مناسب برای ربات فوتبالیست عددی حدوداً بین ۱ تا ۱۰ میشود زیرا اگر Kp بزرگ باشد باعث میشود ربات بیشتر نوسان کند تا جایی که اگر خیلی بزرگ شود نوسانات ربات هیچگاه متوقف نمیشود )
حال فرض کنید ربات دقیقا رو به هدف ایستاده و خطا صفر است و سرعت ربات هم صفر است . در این شرایط همه چیز خوب پیش میرود و مشکلی وجود ندارد تا این که ربات را بچرخانیم و شرایط را به هم بزنیم یا به ربات دستور دهیم رو به جهت دیگری بایستد .
در این حالت فرض کنید ربات را به اندازه ۱ درجه منحرف کنیم ، در این صورت PWM ربات برابر ۱ ضربدر Kp میشود که مقدار خیلی کوچکی است ( مثلا ۵ )
مشکلی که در اینجا وجود دارد این است که وقتی به PWM موتورها عدد ۵ را بدهیم موتورها اصلا حرکت نمیکنند و نمیتوانند این خطای ۱ درجه را اصلاح کنند . زیرا PWM پنج کمتر از آن است که بتواند بر اصطکاک ایستایی غلبه کند و موتورها را به حرکت در آورد . ( با توجه به موتورها و ربات ممکن است ربات حتی با PWM ده یا پانزده هم نتواند حرکت کند و مثلا از ۱۷ به بالا بتواند حرکت کند ، در این صورت خطای ۲ و ۳ درجه را هم نمیتواند اصلاح کند )
چون کنترلر P نمی تواند این خطا را اصلاح کند و این خطا در سیستم باقی میماند و اصلاح نمیشود به آن خطای ماندگار میگویند
توجه کنید که اگر ربات در حال حرکت و اصلاح خطا باشد به خطای ۱ یا ۲ یا ۳ درجه خطای ماندگار نمیگوئیم بلکه زمانی به آن خطای ماندگار میگوئیم که ربات از حرکت ایستاده ولی هنوز مقدار کمی خطا در آن وجود دارد .
خوب برای حل این مشکل ( خطای ماندگار ) چه کاری باید انجام داد ؟
یکی از کارهایی که میتوان انجام داد این است که برنامهای بنویسیم که اگر برای مدت طولانی ( مثلا ۱۰۰۰ بار اجرا شدن برنامه ) مقدار خطا صفر نبود و تغییری هم نکرد آنگاه متوجه خطای ماندگار شده و ربات شروع به چرخش کند تا خطای ماندگار را اصلاح کند . اما سوال اینجاست که ربات با چه پی دبلیو امی بچرخد تا دوباره هدف را رد نکند ؟ خوب جواب این است که با توجه به این که مقدار خطا بسیار کوچک است با کوچکترین چرخشی این خطا اصلاح میشود پس ربات باید با کمترین پی دبلیو امی که میتواند حرکت کند ( پی دبلیو ام آستانه حرکت ) بچرخد تا امکان رد کردن آن بسیار کم شود .
اما پی دبلیو ام آستانه حرکت چقدر است ؟ پی دبلیو ام آستانه حرکت یک عدد ثابت نیست و هر چه ربات سنگین تر شود بیشتر میشود پس امکان محاسبه آن وجود ندارد . ( فرض کنید میخواهیم از ربات به عنوان جابجا کننده وسایل مختلف استفاده کنیم پس در این حالت وزن ربات و پی دبلیو ام آستانه حرکت مقدار ثابتی ندارد و با گذاشتن وسایل مختلف روی ربات تغییر میکند )
حال که مقدار پی دبلیو ام آستانه حرکت را نمیدانیم بهتر است در برنامه نویسی ابتدا به موتورها پی دبلیو ام ۱ بدهیم اگر نچرخید مقدار پی دبلیو ام را کم کم زیاد کنیم تا جایی که ربات بالاخره شروع به چرخش کند و خطا را اصلاح کند ، در این صورت ربات با کمترین سرعت ممکن حرکت میکند و امکان رد کردن هدف بسیار کم میشود .
حال فرض کنید ربات در موقعیتی بین ۲ درجه و ۳ درجه ایستاده باشه در این صورت عدد خطا مدام بین ۲ و ۳ تغییر میکند و دیگر نمیتوان به روش بالا ( ۱۰۰۰ بار ثابت بودن خطا ) متوجه خطای ماندگار شد . خوب این مشکل را چگونه میتوان حل کرد ؟
این مشکل را میتوان به این صورت حل کرد که بگوییم اگر میانگین خطا برای مدت طولانی غیر صفر بود ربات شروع به چرخش کند . و چون میخواستیم سرعت چرخش هم کمترین مقدار باشد و کم کم بالا برود میتوانیم بگوییم : PWM = میانگین خطا ضربدر مدت زمانی که این خطا وجود داشته . این ضرب کردن در زمان باعث میشود تا پی دبلیو ام کم کم بالا برود و به محض این که ربات به آستانه حرکت رسید با کمترین سرعت ممکن حرکت کند و احتمال رد کردن هدف بسیار کم شود . ضرب کردن میانگین خطا هم به این خاطر است که هر چه میانگین خطا بالاتر بود با سرعت بیشتری خطا را اصلاح کند .
خوب میدانیم که میانگین خطا = مجموع خطاها تقسیم بر تعداد آنهاست پس رابطهٔ بالا به این صورت میشود : PWM = مجموع خطاها ضرب در ( زمانی که این خطا وجود داشته تقسیم بر تعداد خطاها ) .
خوب عبارت داخل پرانتز بالا یک عدد ثابت است چون مثلا هر ۱ ثانیه ۱۰۰ بار خطا اندازهگیری میشود و زمان تقسیم بر تعداد خطاها = یک صدم میشود و تغییری نمیکند
حال چون سرعت چرخش و خطا از یک جنس نیستند برای برقراری رابطه بین آنها باید یه ضریب در نظر بگیریم مثلا m . و رابطهٔ بالا به این صورت در میآید : PWM = مجموع خطاها ضرب در ( m ضرب در زمان تقسیم بر تعداد خطاها ).
چون عبارت داخل پرانتز بالا عدد ثابتی است برای سادگی آن را Ki مینامیم و مینویسیم PWM = مجموع خطا * Ki
چون در این رابطه PWM به مجموع خطا ارتباط دارد و مجموع خطا ها در حالتی که تابع پیوسته خطا را داشته باشیم همان انتگرال تابع خطا میشود به این قسمت از کنترلر بخش انتگرالی میگویند . I نیز حرف اول کلمه integral به معنی انتگرال است
همان طور که از ابتدا گفته شد بخش کنترل انتگرالی وظیفه از بین بردن خطای ماندگار را دارد و به تنهایی استفاده نمیشود بلکه در کنار کنترلر P استفاده میشود . ترکیب P و I را کنترل PI میگویند و معادله آن به صورت زیر میشود :
پی دبلیو ام = ( Kp * خطا ) + ( Ki * مجموع خطاها )
استفاده هر دو کنترلر در کنار هم به صورت جمع آنها باعث میشود تا در حالتی که خطا زیاد است بخش P نقشه اصلی را در اصلاح ایفا کند و در حالتی که خطا خیلی کم است بخش I نقشه اصلی را داشته باشد .
همان طور که گفتیم هدف تمام سیستمهای کنترلی به حداقل رساندن اندازه خطا در کمترین زمان ممکن است .
همچنین گفتیم اختلاف بین پارامتر سیستم و دستور ورودی را خطای سیستم میگوییم
پارامتر سیستم توسط سنسور اندازه گیری میشود و دستور ورودی هم از یک مدار دیگر به سیستم داده میشود
یاد آوری میکنیم که دستور ورودی و پارامتری که میخواهیم کنترل کنیم و خروجی سنسور باید از یک جنس باشند و فعال کنند هم باید توانایی تغییر دادن پارامتر را داشته باشد
برای مثال در ربات فوتبالیست وقتی میخواهیم ربات رو به دروازهٔ حریف بایستد : پارامتری که میخواهیم کنترل کنیم ( زاویه ) جلوی ربات است ، دستور ورودی به ما میگوید که ربات باید در چه جهتی ( چه زاویهای ) بایستد و سنسور هم جهتی که ربات ایستاده ( زاویه ربات ) را اندازه گیری میکند . پس هر سه از جنس زاویه هستند و فعال کنندههای ربات ( موتورها ) میتوانند زاویه را تغییر دهند
همانطور که در شکل پست بالا دیده میشود : خطا در هر لحظه برابر است با مقدار مورد نظر ورودی ( reference ) منهای مقدار سنسور
توجه کنید که مقدار خطا در بعضی از لحظات مثبت و در بعضی از لحظات منفی خواهد بود .
حالا ربات فوتبالیست را فرض کنید که قرار است رو به زاویه ی صفر درجه بایستد یعنی مقدار مورد نظر ورودی ( Reference ) همیشه برابر صفر است . سنسور قطب نما هم در هر لحظه زاویه ی ربات رو اندازه گیری میکنه .
فرض کنید در یک لحظه قطب نما زاویه ۱۰ درجه را نشان دهد . ( تمام زوایا در دایره مثلثاتی هستند ) در این حالت خطا برابر صفر منهای ده مساوی ( منفی ده ) میشود . واضح است که در این حالت ربات باید در جهت خلاف مثلثاتی ( منفی ) بچرخد تا این انحراف ( خطا ) تصحیح شود ( کمتر شود تا به صفر برسد )
در حالت بر عکس اگر قطب نما زاویه -۱۰ درجه را نشان دهد . در این حالت خطا برابر صفر منهای منفی ده مساوی ( مثبت ده ) میشود . واضح است که در این حالت ربات باید در جهت مثلثاتی ( مثبت ) بچرخد تا این انحراف ( خطا ) تصحیح شود ( بیشتر شود تا به صفر برسد )
خوب پس اگر علامت خطا مثبت شد ربات باید در جهت مثبت بچرخد و اگر منفی شد باید در جهت منفی بچرخد ( واضح است که اگر خطا صفر باشد ربات باید بایستد )
سوال اینجاست که ربات با چه سرعتی بچرخد ؟
جواب واضح است : چون میخواهیم در کمترین زمان ممکن به خطای صفر برسیم پس ربات باید با حداکثر سرعت بچرخد
اما چرخیدن با حداکثر سرعت مشکلی به وجود میآید .
مشکل : فرض کنید خطا مثبت ده باشد . ربات شروع به چرخیدن میکند و خطا کم میشود تا به صفر برسد و وقتی به صفر رسید دستور میدهیم تا موتورها خاموش شوند و ربات بایستد . اما ربات که نمیتواند درجا!!! بایستد . چیزی شبیه لختی یا اینرسی باعث میشود تا ربات نتواند درجا بایستد ، بلکه سرعت ربات به تدریج کم میشود تا بایستد . همین باعث میشود تا ربات به جای ایستادن در صفر ، صفر را رد کند و برود در مثلا منفی ۱۵ بایستد . حالا باید دوباره برگردیم و در برگشت نیز همین مشکل تکرار میشود یعنی به جای ایستادن در صفر آن را رد میکند و مثلا در مثبت هیجده میایستد و ...
راه حل این مشکل استفاده از کنترلر است که در اینجا با استفاده از کنترلر PID میخواهیم این مشکل را حل کنیم .
سادهترین کاری که شاید به ذهن خیلیها برسد این است که سرعت را کم کنیم اما این کار نه تنها مشکل را حل نمیکند بلکه باعث میشود ربات خیلی کند خطا را تصحیح کند .
کار بهتری که میتوان انجام داد این است که : وقتی اندازه خطا زیاد است ربات با سرعت زیاد بچرخد و وقتی اندازه خطا کم است ربات با سرعت کم بچرخد . یعنی ربات با دو سرعت متفاوت بچرخد یا حتی وقتی اندازه خطا زیاد است ربات با سرعت زیاد و وقتی اندازه خطا متوسط است با سرعت متوسط و وقتی اندازه خطا کم است با سرعت کم بچرخد ( یعنی با سه سرعت متفاوت ).
پیشنهاد بهتر این است که ربات با n سرعت متفاوت بچرخد یعنی : سرعت ربات = خطا باشد و هر چه خطا کمتر شد سرعت ربات هم کمتر شود و هر چه خطا بیشتر شد سرعت ربات هم بیشتر شود .
در این حالت اگر دیدیم تصحیح خطا خیلی آرام انجام میشود میتوانیم خطا را در عددی ( بزرگتر از قبل ) ضرب کنیم یعنی : سرعت ربات = خطا * K
همچنین ممکن است باز هم مشکله قبلی ( رد کردن صفر و دوباره برگشتن و دوباره رد کردن و ... ) را داشته باشیم که در آن صورت میتوانیم خطا را در عددی ( کوچک تر از قبل ) ضرب کنیم تا مشکل حل شود .
این قاعده کلی را به یاد داشته باشید که در رابطه ( سرعت = خطا * K ) : هر چه K کوچک تر شود ، سیستم کند تر حرکت میکند و هر چه K بزرگ تر شود سیستم بیشتر نوسان ( رد کردن هدف و برگشت دوباره ) میکند تا به تعادل برسد ( خطا صفر شود )
( نوسان کردن سیستم کاملا طبیعی است و همیشه وجود دارد ولی هر چه تعداد این نوسانات کمتر شود بهتر است )
چیزی که تا به اینجا توضیح داده شد کنترلر P است . P حرف اول Proportional به معنی تناسب است . یعنی سرعت چرخش ( تغییر زاویه ) ربات با خطا تناسب ( نسبت مستقیم ) دارد . ضریب تناسب ( K ) به کار برده شده در این کنترلر را از این به بعد Kp مینامیم
دوستان اگر سوالی راجع به این پست و یا قبلی دارند بپرسند ولی خواهشا سوالات متفرقه راجع به PID رو بزارید بعد از اینکه توضیحات I و D هم تموم شد بپرسید