Სარჩევი:

არხის შერევის გაგება: 4 ნაბიჯი (სურათებით)
არხის შერევის გაგება: 4 ნაბიჯი (სურათებით)

ვიდეო: არხის შერევის გაგება: 4 ნაბიჯი (სურათებით)

ვიდეო: არხის შერევის გაგება: 4 ნაბიჯი (სურათებით)
ვიდეო: კახი კალაძე დატროლეს 😀🤣🤣 2024, ნოემბერი
Anonim
Image
Image
შერევის მეთოდი »არცერთი
შერევის მეთოდი »არცერთი

თუ თქვენ ოდესმე მართავდით დისტანციური მართვის შასის, დიდი შანსია, რომ თქვენ გამოიყენეთ მიქსინგი, თუნდაც ეს არ იცოდეთ. კერძოდ, თუ თქვენ იყენებდით ერთ ჯოისტიკს ან გიმბლს ავტომობილის გასაკონტროლებლად, რომელიც იყენებს სკაიდსა და დიფერენციალურ მართვას, თქვენ იყენებთ შერევას.

შერევა არის ის, თუ როგორ გამოიყენება თქვენი ჯოისტიკიდან მიღებული მონაცემები იმის დასადგენად, თუ რამდენი ენერგია უნდა მიეწოდოს შასის თითოეულ მხარეს.

თუ ჯოისტიკს გახსნით, ჩვეულებრივ შიგნით ნახავთ ორ პოტენციმეტრს. ერთი გაზომეთ თქვენი ამჟამინდელი პოზიცია Y ღერძის გასწვრივ (ზევით და ქვევით), ხოლო მეორე გაზომეთ სად ხართ X ღერძის გასწვრივ (გვერდიდან გვერდზე).

მიუხედავად იმისა, რომ მე არ მაქვს ოფიციალური ტრენინგი ამ თემაზე, მე ადრე მომიწია კოდის შერევა და ცოტა ხნის წინ მინდოდა ცოტა უფრო ღრმად ჩავუღრმავდე ამ საკითხს.

პირველ რიგში მინდა აღვნიშნო, რომ RC გადამცემების უმეტესობას აქვს შერევის უნარი, როგორც ბევრ ძრავის კონტროლერს. ეს ინფორმაცია იქნება ყველაზე სასარგებლო, თუ თქვენ თვითონ უნდა შეურიოთ თქვენს კოდს. თქვით მაგალითად, თუ თქვენ იყენებთ Arduino– ს RC მიმღებიდან არაერთგვაროვანი მონაცემების წასაკითხად, ან კითხულობთ ანალოგიურ მონაცემებს ქოთნებიდან ჯოისტიკში, ან თუ კითხულობთ კოორდინატებს ციფრული ჯოისტიკიდან მობილურ აპლიკაციაში.

მოდით შევხედოთ შერევის სხვადასხვა მიდგომას.

ნაბიჯი 1: შერევის მეთოდი »არცერთი

ჯერ მოდით შევხედოთ რა ხდება, თუ შერევას საერთოდ არ იყენებთ. თუ თქვენ უბრალოდ აგზავნით მონაცემებს ერთი ღერძიდან შასის ერთ მხარეს და მეორე ღერძი მეორე მხარეს, თქვენი მანქანა არ რეაგირებს ისე, როგორც თქვენ გსურთ.

მაგალითად, თუ თქვენ ჯოისტიკს პირდაპირ წინ უბიძგებთ, Y ღერძი არის სრული გასროლით, ხოლო X ღერძი 0. -ზე, ასე რომ თქვენ მართავთ წრეებს და არა პირდაპირ.

ნაბიჯი 2: მეთოდი მეთოდი »როტაცია

მეთოდი მეთოდი »როტაცია
მეთოდი მეთოდი »როტაცია

ერთ-ერთმა თანამშრომელმა ერთხელ მითხრა, რომ ერთი წამით შეგიძლიათ გადააბრუნოთ თქვენი გადამცემი 45 გრადუსი ღარიბი კაცის შერევისთვის. თუ ფიქრობთ, რომ ჯოისტიკში არსებული ორი პოტენომეტრის მნიშვნელობები არის x x y ღერძი ბადეზე (ორივე ღერძი მოიცავს -100 – დან +100 – მდე) ამას დიდი აზრი ექნება, რადგან ორივე ღერძზე +100 – ზე მიდიხართ როდესაც ჯოისტიკს მაღლა და მარჯვნივ უბიძგებთ. ასე რომ, თუ ეს პირდაპირ თქვენს ორ შასის არხზეა (თქვენი რობოტის მარცხენა და მარჯვენა მხარეები), ეს აიძულებს თქვენს რობოტს წინ წავიდეს.

ასე რომ, შერევის პირველი მეთოდი, რაც მე ოდესმე შევეცადე, იყო მათემატიკური ბრუნვა x და y კოორდინაციით 45 გრადუსი ქსელის ცენტრალური წერტილის გარშემო.

ეს კარგად მუშაობს, თუმცა 100% -იანი სიმძლავრით წინ ვერ წავალ, რადგან როცა ბრუნავთ, მთლიანი მოძრაობა შეზღუდულია ქსელის წრეზე, რაც იმას ნიშნავს, რომ თქვენ ვერასოდეს შეხვალთ ზედა მარჯვენა კუთხეში.

ეს ასევე იწვევს ქსელის კუთხეების არ გამოყენებას. ეს არ არის პრობლემა, თუ თქვენ იყენებთ ჯოისტიკს/გიმპლს, რომელიც ზღუდავს თქვენს მოძრაობას, ასე რომ, ეს ადგილები მაინც არ არის მიღწეული, მაგრამ წინააღმდეგ შემთხვევაში თქვენ მოისურვებთ, რომ ბადის იმ ნაწილმა რაღაც გააკეთოს ისე, რომ თქვენი მოძრაობები სრულიად პროპორციული იყოს.

თუ თქვენ ხართ ვიზუალური შემსწავლელი, როგორც მე, ეს კონცეფცია შეიძლება უფრო ადვილი იყოს, თუ უყურებთ ვიდეოს ამ ინსტრუქციის დასაწყისში.

მოდით შევხედოთ კოდის მაგალითებს.

შენიშვნები ჩემი კოდის მაგალითების შესახებ: მე გამოვტოვებ, თუ როგორ მიიღებთ ჯოისტიკ_ქსისა და ჯოისტიკს_ი ღირებულებებს, რადგან ის შეიცვლება თქვენი პროექტის მიხედვით. ასევე მე იქნება რუკების/შეზღუდვის 100 but მაგრამ თქვენ ალბათ უნდა დაგჭირდეთ რუკა 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); // შეზღუდვა leftThrottle = შეზღუდვა (leftThrottle, -100, 100); rightThrottle = შეზღუდვა (rightThrottle, -100, 100);

JavaScript მაგალითი:

// მათემატიკურად rotatevar rad = -45*მათემატიკა. PI/180; leftThrottle = joystick_x * მათემატიკა. co (rad) - joystick_y * მათემატიკა rightThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad); // constrainleftThrottle = შეზღუდვა (leftThrottle, -100, 100); rightThrottle = შეზღუდვა (rightThrottle, -100, 100); // დამხმარე functionvar constrain = ფუნქცია (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; // შეზღუდვა leftThrottle = შეზღუდვა (leftThrottle, -100, 100); rightThrottle = შეზღუდვა (rightThrottle, -100, 100);

JavaScript მაგალითი:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // შეზღუდვა leftChannel = შეზღუდვა (leftChannel, -100, 100); rightChannel = შეზღუდვა (rightChannel, -100, 100); // დამხმარე functionvar constrain = ფუნქცია (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 = მარცხენა throttle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - განსხვავება: rightThrottle + განსხვავება; // რუქა 200 to -დან 100 ± -მდე ან რა დიაპაზონი გჭირდებათ: // constrainleftThrottle = შეზღუდვა (leftThrottle, -100, 100); rightThrottle = შეზღუდვა (rightThrottle, -100, 100);

JavaScript მაგალითი:

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 ± -მდე ან რაც გჭირდებათ ft € -100, 100); // შეზღუდვა leftThrottle = შეზღუდვა (leftThrottle, -100, 100); rightThrottle = შეზღუდვა (rightThrottle, -100, 100); // ზოგიერთი დამხმარე ფუნქცია ვრცელი = ფუნქცია (რიცხვი, წთ, მაქსიმუმი) {დაბრუნება მათემატიკა (მათემატიკა მაქს (რიცხვი, წთ), მაქს); }; 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); mapped = outSpan*(p/100) - (outMax/2); დაბრუნება რუქაზე;};

გირჩევთ: