สารบัญ:

ทำความเข้าใจการผสมช่อง: 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% ได้ เพราะเมื่อคุณหมุน การเคลื่อนไหวโดยรวมจะถูกจำกัดให้เป็นวงกลมภายในตาราง ซึ่งหมายความว่าคุณจะไม่มีวันเข้าไปในมุมขวาบนนั้นจริงๆ

นอกจากนี้ยังส่งผลให้มุมของกริดไม่ถูกใช้งาน นี่ไม่ใช่ปัญหาหากคุณใช้จอยสติ๊ก/กิมเปิลซึ่งจำกัดการเคลื่อนไหวของคุณเพื่อไม่ให้พื้นที่เหล่านั้นเข้าถึงได้ แต่มิฉะนั้น คุณจะต้องการส่วนนั้นของตารางทำบางสิ่งเพื่อให้การเคลื่อนไหวของคุณรู้สึกได้สัดส่วนโดยสมบูรณ์

หากคุณเป็นผู้เรียนรู้ด้วยภาพเหมือนฉันเอง แนวคิดนี้อาจง่ายกว่าที่จะเรียนรู้โดยการดูวิดีโอที่จุดเริ่มต้นของคำแนะนำนี้

มาดูตัวอย่างโค้ดกันบ้าง

หมายเหตุเกี่ยวกับตัวอย่างโค้ดของฉัน: ฉันกำลังคิดว่าคุณจะได้รับค่า joystick_x และ joystick_y อย่างไร เนื่องจากค่านี้จะเปลี่ยนไปตามโปรเจ็กต์ของคุณ นอกจากนี้ ฉันจะทำการแมป/จำกัดที่ ±100 แต่คุณอาจต้องจับคู่กับ 1000 - 2000 สำหรับ PWM หรือ 0 - 255 สำหรับเอาต์พุตแบบแอนะล็อก ฯลฯ ฉันมักจะจำกัด… เผื่อไว้

ตัวอย่าง Arduino:

//หมุนทางคณิตศาสตร์

รัศมีสองเท่า = -45*M_PI/180; int leftThrottle = joystick_x * cos(rad) - joystick_y * บาป (rad); int rightThrottle = joystick_y * cos(rad) + joystick_x * บาป (rad); //จำกัด leftThrottle = จำกัด (leftThrottle, -100, 100); rightThrottle = ข้อ จำกัด (rightThrottle, -100, 100);

ตัวอย่างจาวาสคริปต์:

//rotationvar rad ทางคณิตศาสตร์ = -45*Math. PI/180; leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (ราด); rightThrottle = joystick_y * Math.cos(rad) + joystick_x * Math.sin(rad);//constrainleftThrottle = บังคับ (leftThrottle, -100, 100); rightThrottle = บังคับ (rightThrottle, -100, 100); // helper functionvar constrain = ฟังก์ชัน (num, min, max) { return Math.min (Math.max (num, min), max); };

ขั้นตอนที่ 3: วิธีการ » Simple

วิธีการ » แบบง่าย
วิธีการ » แบบง่าย

ต่อไป เรามีสมการง่ายๆ ที่ตอนแรกฉันหยิบขึ้นมาจากหนึ่งในวิดีโอเรื่อง Adventures in Science SparkFun ของ Shawn Hymel ที่เขาบังเอิญทำโปรเจ็กต์ที่คล้ายกันมากกับที่ฉันทำอยู่

สมการนี้ช่วยให้คุณใช้ความเร็วเต็มที่เมื่อพุ่งไปข้างหน้า แต่เหมือนกับวิธีการหมุน โดยไม่สนใจพื้นที่มุมของตาราง เนื่องจากในบางกรณี ค่าสูงสุดคือ 100 และในบางกรณี ค่าสูงสุดคือ 200 ดังนั้น คุณจะใช้ฟังก์ชันจำกัดเพื่อละเว้นสิ่งใดหลังจาก 100

และอีกอย่าง ฉันไม่ได้เรียกสิ่งนี้ว่าง่ายๆ อย่างเสื่อมเสีย… มีความสวยงามในความเรียบง่าย

ตัวอย่าง Arduino:

int leftThrottle = จอยสติ๊ก_y + จอยสติ๊ก_x;

int rightThrottle = joystick_y - จอยสติ๊ก_x; //จำกัด leftThrottle = จำกัด (leftThrottle, -100, 100); rightThrottle = ข้อ จำกัด (rightThrottle, -100, 100);

ตัวอย่างจาวาสคริปต์:

var leftChannel = joystick_y + จอยสติ๊ก_x;

var rightChannel = joystick_y - joystick_x; // จำกัด leftChannel = จำกัด (leftChannel, -100, 100); rightChannel = ข้อ จำกัด (rightChannel, -100, 100); // helper functionvar constrain = ฟังก์ชัน (num, min, max) { return Math.min (Math.max (num, min), max); };

ขั้นตอนที่ 4: วิธีการ » สัดส่วน

วิธีการ วิธีการ » ได้สัดส่วน
วิธีการ วิธีการ » ได้สัดส่วน

ฉันหลุดพ้นจากวิธีง่าย ๆ โดยหวังว่าจะทำให้สมการทั้งสองโลกดีที่สุด แนวคิดในที่นี้คือการทำให้เป็นสัดส่วนอย่างสมบูรณ์ในทุกทิศทางแม้ในแนวทแยง แม้ว่าคุณจะเคลื่อนที่ในระยะทางที่ไกลกว่า แต่ก็มีช่วงเดียวกันกับเมื่อคุณเคลื่อนที่ในแนวตั้งซึ่งมีระยะทางน้อยกว่า

คุณลงเอยด้วยมาตราส่วน -200 ถึง +200 ในทุกทิศทางในตัวอย่างของฉัน ฉันจับคู่ค่านั้นกับ ±100 เพราะมันแสดงถึงเปอร์เซ็นต์ของกำลังที่ส่งไปยังแต่ละช่องสัญญาณ อย่างไรก็ตาม คุณจะต้องแมปกับสิ่งใดก็ตามที่คุณใช้งานได้ กรณีสำหรับตัวควบคุมมอเตอร์ของคุณ ตัวอย่างเช่น หากคุณกำลังส่งสัญญาณ PWM คุณอาจแมปสิ่งนั้นกับ 1,000 ถึง 2000 หรือหากคุณกำลังส่งสัญญาณแอนะล็อก คุณอาจแมปไปที่ 0-255 และกำหนดทิศทางเป็นบูลีน เป็นต้น

ตัวอย่าง Arduino:

int leftThrottle = จอยสติ๊ก_y + จอยสติ๊ก_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 หรือช่วงใดก็ได้ที่คุณต้องการleftThrottle = map(leftThrottle, 0, 200, -100, 100); rightThrottle = map(rightThrottle, 0, 200, -100, 100); //constrainleftThrottle = จำกัด (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 หรืออะไรก็ได้ที่คุณต้องการleftThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); //constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // ฟังก์ชันตัวช่วยบางส่วน var constrain = function (num, min, max) { return Math.min (Math. สูงสุด (จำนวน, นาที), สูงสุด); }; 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 = (จำนวน/ช่วงนิ้ว)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); แมป = outSpan*(p/100) - (outMax/2); แมปกลับมา;};

แนะนำ: