فهرست مطالب:

درک کانال میکس: 4 مرحله (همراه با تصاویر)
درک کانال میکس: 4 مرحله (همراه با تصاویر)

تصویری: درک کانال میکس: 4 مرحله (همراه با تصاویر)

تصویری: درک کانال میکس: 4 مرحله (همراه با تصاویر)
تصویری: لحظه دستگیری قاتل که دو فرد را در کنار خیابان سر برید ! 2024, نوامبر
Anonim
Image
Image
روش مخلوط »هیچ
روش مخلوط »هیچ

اگر تا به حال با شاسی کنترل از راه دور رانندگی کرده اید ، به احتمال زیاد از میکس استفاده کرده اید ، حتی اگر آن را نمی دانید. به طور خاص ، اگر از یک جوی استیک یا گیمبل برای کنترل وسیله ای استفاده کرده اید که از فرمان لغزنده یا فرمان دیفرانسیل استفاده می کند ، از میکس استفاده کرده اید.

میکس به سادگی از داده های جوی استیک شما برای تعیین میزان قدرت مورد نیاز در هر طرف شاسی استفاده می شود.

اگر جوی استیک را باز کنید ، عموماً دو پتانسیومتر در داخل خواهید دید. یکی برای اندازه گیری موقعیت فعلی شما در امتداد محور Y (بالا و پایین) ، و دیگری برای اندازه گیری مکان شما در امتداد محور X (پهلو به پهلو).

اگرچه من هیچ آموزش رسمی در مورد این موضوع ندارم ، اما قبلاً مجبور بودم ترکیب کد را انجام دهم و اخیراً می خواستم کمی عمیق تر به موضوع بپردازم.

ابتدا می خواهم توجه داشته باشم که اکثر فرستنده های RC مانند بسیاری از کنترلرهای موتور دارای قابلیت اختلاط هستند. اگر بخواهید خودتان در کد خود میکس را انجام دهید ، این اطلاعات بسیار مفید خواهد بود. به عنوان مثال اگر از Arduino برای خواندن داده های مخلوط نشده از گیرنده RC استفاده می کنید ، یا داده های آنالوگ از گلدان ها را در یک جوی استیک می خوانید ، یا مختصات یک جوی استیک دیجیتالی را در یک برنامه تلفن همراه می خوانید.

بیایید نگاهی به برخی از روشهای مختلف اختلاط بیندازیم.

مرحله 1: روش مخلوط »هیچ

ابتدا اجازه دهید نگاهی بیندازیم که اگر به هیچ وجه از میکسینگ استفاده نکنید ، چه اتفاقی می افتد. اگر فقط داده ها را از یک محور به یک طرف شاسی و محور دیگر را به طرف دیگر ارسال کنید ، خودروی شما آنطور که می خواهید پاسخ نمی دهد.

به عنوان مثال ، اگر جوی استیک را تا انتها مستقیم به جلو فشار دهید ، محور Y در دریچه گاز کامل و محور X در 0 است. بنابراین شما به جای اینکه مستقیماً حرکت کنید ، در دایره رانندگی می کنید.

مرحله 2: روش روش »چرخش

روش روش »چرخش
روش روش »چرخش

یکی از همکارانش یکبار به من اشاره کرد که در یک نوبت می توانید فرستنده خود را 45 درجه برای ترکیب یک مرد فقیر بچرخانید. اگر به مقادیر دو پتانسیومتر در یک جوی استیک به عنوان محور x یا y در شبکه فکر می کنید (هر دو محور از -100 تا +100 را در بر می گیرد) این امر بسیار منطقی است زیرا شما در هر دو محور به +100 می روید. همانطور که جوی استیک را به سمت بالا و راست فشار می دهید. بنابراین اگر این برنامه مستقیماً به دو کانال شاسی شما (سمت چپ و راست روبات) ترسیم شود ، باعث می شود ربات شما به جلو حرکت کند.

بنابراین اولین روش اختلاطی که من تا به حال امتحان کرده بودم این بود که به صورت ریاضی مختصات x و y را 45 درجه در مورد نقطه مرکزی شبکه بچرخانم.

این کار خوب است ، اما من نمی توانم با قدرت 100 forward جلو بروم ، زیرا هنگام چرخش ، حرکت کلی محدود به یک دایره در داخل شبکه است ، به این معنی که شما هرگز نمی توانید واقعاً وارد آن گوشه سمت راست بالا شوید.

این امر همچنین منجر به عدم استفاده از گوشه های شبکه می شود. اگر از یک جوی استیک/گیمپل استفاده می کنید که حرکت شما را محدود می کند ، مشکلی ایجاد نمی کند ، اما به هر حال به آن مناطق دسترسی پیدا نمی کنید ، اما در غیر این صورت شما می خواهید آن قسمت از شبکه کاری انجام دهد تا حرکات شما کاملاً متناسب باشد.

اگر شما هم مانند من یک یادگیرنده بصری هستید ، ممکن است با تماشای فیلم در ابتدای این برنامه آموزشی ، درک این مفهوم آسان تر شود.

بیایید چند نمونه کد را بررسی کنیم.

نکاتی در مورد نمونه های کد من: من نحوه دریافت مقادیر joystick_x و joystick_y را که بسته به پروژه شما تغییر می کند ، کنار می گذارم. همچنین من نقشه برداری/محدود کردن 100 پوند را انجام خواهم داد ، اما احتمالاً لازم است نقشه 1000 - 2000 را برای PWM یا 0 - 255 را برای خروجی آنالوگ و غیره تهیه کنید. من همیشه محدود می کنم … در مورد هر مورد.

مثال آردوینو:

// بچرخان ریاضی

دو برابر راد = -45*M_PI/180 ؛ int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (rad) ؛ int rightThrottle = joystick_y * cos (rad) + joystick_x * sin (rad)؛ // constrain leftThrottle = محدود کردن (leftThrottle ، -100 ، 100) ؛ rightThrottle = محدود کردن (rightThrottle ، -100 ، 100) ؛

مثال جاوا اسکریپت:

// ریاضی rotatevar rad = -45*Math. PI/180؛ leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (rad) ؛ rightThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad) ؛ // constrainleftThrottle = constrain (leftThrottle ، -100 ، 100) ؛ rightThrottle = محدودیت (rightThrottle ، -100 ، 100) ؛ // helper functionvar constrain = function (num، min، max) {return Math.min (Math.max (num، min)، max)؛ }؛

مرحله 3: روش روش »ساده

روش روش »ساده
روش روش »ساده

در ادامه ما یک معادله بسیار ساده داریم که من اولین بار آن را از یکی از فیلمهای Shawn Hymel's Adventures in Science SparkFun برداشتم که در آن وی تصادفاً پروژه ای بسیار مشابه پروژه ای را که من روی آن کار می کردم ، کار می کرد.

این معادله به شما اجازه می دهد تا هنگام حرکت به جلو به سرعت کامل برسید اما مانند روش چرخش ، مناطق گوشه ای از شبکه را نادیده می گیرد. به این دلیل است که در برخی موارد حداکثر 100 و در برخی موارد حداکثر 200 است. بنابراین شما از یک تابع محدود برای نادیده گرفتن هر چیزی بعد از 100 استفاده می کنید.

و به هر حال من این ساده را تحقیرآمیز نمی نامم … در سادگی زیبایی وجود دارد.

مثال آردوینو:

int leftThrottle = joystick_y + joystick_x؛

int rightThrottle = joystick_y - joystick_x؛ // constrain leftThrottle = محدود کردن (leftThrottle ، -100 ، 100) ؛ rightThrottle = محدود کردن (rightThrottle ، -100 ، 100) ؛

مثال جاوا اسکریپت:

var leftChannel = joystick_y + joystick_x؛

var rightChannel = joystick_y - joystick_x؛ // constrain leftChannel = constrain (leftChannel، -100، 100)؛ rightChannel = constrain (rightChannel ، -100 ، 100) ؛ // helper functionvar constrain = function (num، min، max) {return Math.min (Math.max (num، min)، max)؛ }؛

مرحله 4: روش روش »متناسب

روش روش »متناسب
روش روش »متناسب

من از روش ساده ای استفاده کردم و امیدوارم از معادله هر دو جهان بهترین استفاده کنم. ایده اینجا این است که در تمام جهات حتی به صورت مورب کاملا متناسب باشد ، با وجود این که اگر مسافت بیشتری را حرکت می کنید ، دامنه مشابهی دارد که هنگام حرکت عمودی که فاصله کوچکتر است ، دارد.

در نهایت شما در مقیاس 200- تا 200+ در همه جهات در مثالهای من ، آن را به 100 پوند می رسانم زیرا نشان دهنده درصد توان مصرفی به هر کانال است - با این حال شما می خواهید آن را به هر چیزی که مورد استفاده شما است ترسیم کنید. کیف مخصوص کنترل موتور شما به عنوان مثال ، اگر سیگنال PWM را ارسال می کنید ، ممکن است آن را روی 1000 تا 2000 قرار دهید یا اگر یک سیگنال آنالوگ ارسال می کنید ، آن را روی 0-255 ترسیم کنید و جهت را به صورت بولی و غیره تنظیم کنید.

مثال آردوینو:

int leftThrottle = joystick_y + joystick_x؛

int rightThrottle = joystick_y - joystick_x؛ // در برخی موارد حداکثر 100 ، در برخی موارد 200 // اجازه دهید تفاوت را در نظر بگیریم بنابراین حداکثر همیشه 200int diff = abs (abs (joystick_y) - abs (joystick_x)) ؛ leftThrottle = leftThrottle <0؟ leftThrottle - diff: leftThrottle + diff؛ rightThrottle = rightThrottle <0؟ rightThrottle - diff: rightThrottle + diff؛ // نقشه از 200 تا 100 پوند یا هر محدوده ای که نیاز دارید // constrainleftThrottle = constrain (leftThrottle ، -100 ، 100) ؛ rightThrottle = محدودیت (rightThrottle ، -100 ، 100) ؛

مثال جاوا اسکریپت:

var leftThrottle = joystick_y + joystick_x؛ var rightThrottle = joystick_y - joystick_x؛ // در برخی موارد حداکثر 100 ، در برخی موارد 200 است ، // اجازه دهید تفاوت را در نظر بگیریم بنابراین حداکثر همیشه 200var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x))؛ leftThrottle = leftThrottle <0؟ leftThrottle - diff: leftThrottle + diff؛ rightThrottle = rightThrottle <0؟ rightThrottle -diff: rightThrottle + diff؛ // نقشه از 200 پوند به 100 پوند یا هر چیزی که نیاز دارید را نقشه برداری کنید (mapTepTrottle ، -200 ، 200 ، -100 ، 100) ؛ rightThrottle = نقشه (rightThrottle ، -200 ، 200 ، -100 ، 100) ؛ // constrain leftThrottle = constrain (leftThrottle ، -100 ، 100) ؛ rightThrottle = constrain (rightThrottle ، -100 ، 100) ؛ // برخی از توابع کمکیvar constrain = تابع (تعداد ، دقیقه ، حداکثر) {return Math.min (ریاضی حداکثر (تعداد ، دقیقه) ، حداکثر) ؛ }؛ var map = تابع (num، inMin، inMax، outMin، outMax) {var p، inSpan، outSpan، mapped؛ inMin = inMin + inMax؛ num = num + inMax ؛ inMax = inMax + inMax؛ inSpan = Math.abs (inMax-inMin) ؛ p = (num/inSpan)*100 ؛ outMin = outMin + outMax؛ outMax = outMax + outMax؛ outSpan = Math.abs (outMax - outMin) ؛ نقشه برداری = outSpan*(p/100) - (outMax/2) ؛ بازگشت نقشه برداری؛}؛

توصیه شده: