ฉันสละเสรีภาพในการตอบคำถามของตัวเองเนื่องจากฉันได้รับส่วนใหญ่แล้วและนี่เป็นวิธีที่ดีในการแบ่งปันสิ่งที่ฉันค้นพบ ขอบคุณ Olin Lathrop ที่ให้สถานที่เริ่มต้นและแนวคิดบางอย่างให้ฉันลอง แต่ในที่สุดโปรโตคอลกลับกลายเป็นค่อนข้างแตกต่างจากการเดาของ Olin ดังนั้นฉันจึงโพสต์คำตอบนี้
อัปเดต:ฉันโพสต์คำถามติดตามผลเกี่ยวกับ 8 บิตล่าสุดซึ่งฉันไม่เข้าใจและเดฟ Tweed คิดออก ฉันจะรวมรายละเอียดไว้ที่นี่ดังนั้นคำตอบนี้สามารถทำงานเป็นสเปคโพรโทคอลแบบเต็ม แต่ลองดูคำตอบของเดฟ
ฉันต้องลองทำสิ่งที่แตกต่างออกไปเพื่อให้ได้สิ่งนี้ แต่ฉันค่อนข้างมั่นใจว่าฉันได้รับมัน ผิดปกติฉันไม่พบสิ่งใดที่คล้ายกับโปรโตคอลนี้ที่อื่น แต่อาจเป็นโปรโตคอลทั่วไปที่ฉันเพิ่งไม่รู้
อย่างไรก็ตามนี่คือสิ่งที่ฉันได้พบ:
พิธีสาร / การเข้ารหัส
ทั้งพัลส์และช่องว่างที่อยู่ระหว่างนั้นถูกใช้เพื่อเข้ารหัสข้อมูล พัลส์ยาว / อวกาศคือไบนารีหนึ่ง (1) และพัลส์สั้น / อวกาศคือไบนารีศูนย์ (0) พัลส์จะถูกส่งโดยใช้การปรับ 38kHz อินฟราเรดของผู้ใช้มาตรฐาน @ 50% รอบการทำงาน
การกำหนดเวลาพัลส์ / สเปซอยู่ในคำถามเดิม แต่ฉันจะทำซ้ำที่นี่เพื่อความสมบูรณ์:
Bit Pulse Space
-----+---------+---------
0 | 275µs | 285µs
1 | 855µs | 795µs
ค่าสูงสุด± 10 max, ± 5 ทุกประเภท .. นี่คือตัวอย่างที่จับด้วยเครื่องวิเคราะห์ตรรกะที่ 16MHz; ฉันไม่มีออสซิลโลสโคปดังนั้นฉันจึงไม่ทราบโปรไฟล์ที่แน่นอน (เช่นเวลาขึ้น / ลง)
แพ็คเก็ตจะทำซ้ำตราบใดที่มีการใช้อินพุตควบคุมและดูเหมือนว่าจะเว้นระยะห่างกันอย่างน้อย 100ms
การส่งแพ็คเก็ตเริ่มต้นด้วยคำนำ "พัลส์ 1" ซึ่งได้รับการแก้ไขและไม่ได้เป็นส่วนหนึ่งของข้อมูล พื้นที่ต่อไปนี้เข้ารหัสบิตข้อมูลแรกของแพ็คเก็ตและชีพจรสุดท้ายเข้ารหัสบิตสุดท้าย
แต่ละแพ็คเก็ตมีความยาว 32 บิตและมีอินพุตทุกตัวที่รีโมทสามารถจัดเตรียมได้ ค่าจะถูกอ่านเป็น endian น้อยเช่น MSB ก่อน
โครงสร้างข้อมูล
ด้านล่างเป็นโครงสร้างพื้นฐานของแต่ละแพ็กเก็ต 8 บิตสุดท้ายทำให้ฉันสับสน แต่ตอนนี้ได้รับการคิดออก (ดูด้านล่าง)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
--+---------------------------+-----------+---+-------+-----------
P| Yaw | Throttle | Pitch | T | Chan. | Check
P: Preamble (always a pulse-1), T: Trim, Chan.: Channel
Bit Length Description (see note below)
-----------------------------------------------
0 1 Preamble. High 1
1-6 6 Yaw. Range 0-36 for left-right, 17 being neutral
7-14 8 Throttle. Range 0-134
15-20 6 Pitch. Range 0-38 for forward-back, 17 being neutral
21-22 2 Trim. Left = 1, right = 2, no trim = 0
23-26 4 Channel. A = 5, B = 2, C = 8
27-32 6 Check bits
หมายเหตุ:ช่วงขึ้นอยู่กับการอ่านสูงสุดที่ฉันได้รับ โปรโตคอลมีความสามารถในช่วงที่ใหญ่กว่า - มากถึง 255 สำหรับเค้น, 63 สำหรับระยะห่าง / หันเห - แต่ปิดที่ประมาณครึ่งหนึ่ง
ดูเหมือนว่าจะมีค่าพิทช์ตายจาก 14-21 (รวม); เฉพาะค่าที่สูงหรือต่ำกว่าที่จริงเท่านั้นที่ทำให้เฮลิคอปเตอร์ตอบสนอง ฉันไม่รู้ว่ามันเหมือนกันกับการหันเหหรือไม่ (ยากที่จะบอกเพราะเฮลิคอปเตอร์นั้นไม่เสถียรอยู่ดีและอาจหมุนด้วยตัวเองเล็กน้อย)
ที่นี่มันอยู่ในรูปแบบกราฟิก (เปรียบเทียบกับกราฟิกในคำถามเดิม)
บิตตรวจสอบ 6 บิตถูกคำนวณโดย XOR'ing ค่าก่อนหน้าทั้งหมด แต่ละค่าถือว่าเป็น 6 บิต ซึ่งหมายความว่า 2 MSBs ของค่าเค้นแบบ 8 บิตจะถูกละเว้นเพียงแค่ กล่าวคือ
check = yaw ^ (throttle & 0x3F) ^ pitch ^ trim ^ channel
บันทึกการปฏิบัติ
การกำหนดเวลาและการปรับสัญญาณไม่จำเป็นต้องแม่นยำมากนัก แม้แต่จังหวะเวลาที่ไม่แม่นยำของ Arduino ของฉันก็ยังทำงานได้ดีแม้จะมีการมอดูเลชั่นหลบและจังหวะและจังหวะการเต้นของชีพจร / พื้นที่เล็กน้อยเมื่อเทียบกับรีโมทจริง
ฉันเชื่อว่า - แต่ยังไม่ได้ทดสอบ - ว่าเฮลิคอปเตอร์จะยึดติดกับช่องสัญญาณแรกที่พบ หากถูกทิ้งไว้โดยไม่มีสัญญาณนานเกินไป (สองสามวินาที) มันจะกลับไปที่โหมด "ค้นหา" จนกว่าจะได้รับสัญญาณอีกครั้ง
เฮลิคอปเตอร์จะไม่สนใจค่า pitch และ yaw หาก throttle เป็นศูนย์
คำสั่งตัดแต่งจะส่งเพียงครั้งเดียวต่อการกดปุ่มบนรีโมทคอนโทรล สมมุติว่าค่าการลดลงนั้นเพิ่มขึ้น / ลดลงค่าในตัวควบคุมของเฮลิคอปเตอร์; ไม่ใช่สิ่งที่รีโมทควบคุมติดตาม ดังนั้นการนำไปปฏิบัติใด ๆ ของสิ่งนี้อาจติดอยู่กับแบบแผนนั้นและส่งค่าการตัดทิ้งเป็นครั้งคราวไปทางซ้าย / ขวา แต่เริ่มต้นเป็นค่าศูนย์การตัดแต่งในแพ็คเก็ต
ฉันขอแนะนำให้มีสวิตช์ฆ่าที่ตั้งค่าเค้นเป็นศูนย์ นี่จะทำให้เฮลิคอปเตอร์หลุดออกจากท้องฟ้า แต่มันจะรักษาความเสียหายได้น้อยลงเมื่อไม่หมุนมอเตอร์ ดังนั้นหากคุณกำลังจะชนหรือชนอะไรให้กดสวิตช์ฆ่าเพื่อหลีกเลี่ยงการลอกเกียร์หรือทำลายใบมีด
LED IR ของรีโมทคอนโทรลดั้งเดิมนั้นมีความยาวคลื่น> 900nm แต่ฉันไม่มีปัญหาในการใช้ LED ~ 850nm
ตัวรับสัญญาณ IR ของเฮลิคอปเตอร์นั้นใช้ได้ แต่ไม่ไวต่อแสงมากนัก รีโมตคอนโทรลใช้ไฟ LED 3 ดวงในซีรีย์นั่งอยู่บนราง 9V แทนราง 5V ที่ใช้โดยลอจิก ยังไม่ได้ตรวจสอบการวาดในปัจจุบันของพวกเขาอย่างแม่นยำ แต่ฉันจะเดิมพัน 50mA
ข้อมูลตัวอย่าง
นี่คือกลุ่มของแพ็คเก็ตสำหรับทุกคนที่สนใจ (ใช่ฉันเขียนสคริปต์ถอดรหัส; ฉันไม่ได้ถอดรหัสทั้งหมดนี้ด้วยมือ) ช่องทางแพ็คเก็ตมาจากการจับเช่นเดียวกับกราฟในคำถามเดิม
Channel A
Yaw Throttle Pitch Tr Chan Check Description
-----------------------------------------------------------
000100 10000100 000000 00 0101 000101 Left Mid + Throttle
000000 10000110 010001 00 0101 010010 Left Max + Throttle
100001 10000110 000000 00 0101 100010 Right Mid + Throttle
100100 10000100 010001 00 0101 110100 Right Max + Throttle
010001 00000000 001011 00 0101 011111 Forward Min
010001 00000000 000000 00 0101 010100 Forward Max
010001 00000000 011000 00 0101 001100 Back Min
010001 00000000 100101 00 0101 110001 Back Max
010001 00000000 010001 01 0101 010101 Left Trim
010001 00000000 010001 10 0101 100101 Right Trim
010001 00000011 010001 00 0101 000110 Throttle 01 (min)
010001 00010110 010001 00 0101 010011 Throttle 02
010001 00011111 010001 00 0101 011010 Throttle 03
010001 00101111 010001 00 0101 101010 Throttle 04
010001 00111110 010001 00 0101 111011 Throttle 05
010001 01010101 010001 00 0101 010000 Throttle 06
010001 01011111 010001 00 0101 011010 Throttle 07
010001 01101100 010001 00 0101 101001 Throttle 08
010001 01111010 010001 00 0101 111111 Throttle 09
010001 10000101 010001 00 0101 000000 Throttle 10 (max)
Channel B
Yaw Throttle Pitch Tr Chan Check Description
-----------------------------------------------------------
000000 10000110 010001 00 0010 010101 Left Max + Throttle
100100 10000110 010001 00 0010 110001 Right Max + Throttle
010001 00000000 001001 00 0010 011010 Forward Min
010001 00000000 000000 00 0010 010011 Forward Max
010001 00000000 010111 00 0010 000100 Back Min
010001 00000000 100110 00 0010 110101 Back Max
010001 00000000 010001 01 0010 010010 Left Trim
010001 00000000 010001 10 0010 100010 Right Trim
010001 00000001 010001 00 0010 000011 Throttle Min
010001 00110100 010001 00 0010 110110 Throttle Mid
010001 01100111 010001 00 0010 100101 Throttle High
010001 10001111 010001 00 0010 001101 Throttle Max
Channel C
Yaw Throttle Pitch Tr Chan Check Description
-----------------------------------------------------------
000000 10000101 010001 00 1000 011100 Left Max + Throttle
100100 10000101 010001 00 1000 111000 Right Max + Throttle
010001 00000000 001010 00 1000 010011 Forward Min
010001 00000000 000000 00 1000 011001 Forward Max
010001 00000000 010111 00 1000 001110 Back Min
010001 00000000 100110 00 1000 111111 Back Max
010001 00000000 010001 01 1000 011000 Left Trim
010001 00000000 010001 10 1000 101000 Right Trim
010001 00000001 010001 00 1000 001001 Throttle Min
010001 00110100 010001 00 1000 111100 Throttle Mid
010001 01100110 010001 00 1000 101110 Throttle High
010001 10000101 010001 00 1000 001101 Throttle Max
ดังที่ได้กล่าวไปแล้ว 8 บิตสุดท้ายได้คิดออก แต่สำหรับลูกหลานนี่เป็นความคิดดั้งเดิมของฉัน อย่าลังเลที่จะเพิกเฉยต่อเรื่องนี้อย่างสมบูรณ์เพราะฉันเดาผิด
8 บิตสุดท้าย
แพ็คเก็ต 8 บิตสุดท้ายยังคงเป็นปริศนา
4 บิตจากบิต 23 ถึง 26 ทั้งหมดดูเหมือนว่าถูกกำหนดโดยการตั้งค่าช่องสัญญาณของรีโมทคอนโทรล การเปลี่ยนช่องสัญญาณบนรีโมตคอนโทรลไม่ได้เป็นการเปลี่ยนแปลงโปรโตคอลหรือการปรับ แต่อย่างใด มันเปลี่ยนเพียง 4 บิตเหล่านั้น
แต่ 4 บิตเป็นสองเท่าสิ่งที่จำเป็นในการเข้ารหัสการตั้งค่าช่องสัญญาณ มีเพียงสามช่องเท่านั้นดังนั้น 2 บิตจึงมีมากมาย ดังนั้นในคำอธิบายโครงสร้างข้างต้นฉันได้ติดป้าย 2 บิตแรกเป็น "Channel" และเหลืออีกสองบิตที่มีป้ายกำกับว่า "X" แต่นี่เป็นการคาดเดา
ด้านล่างนี้เป็นตัวอย่างของบิตที่เกี่ยวข้องสำหรับการตั้งค่าแต่ละช่อง
Chan. Bits 23-26
-----+-------------
A | 0 1 0 1
B | 0 0 1 0
C | 1 0 0 0
โดยทั่วไปมี 2 บิตมากกว่าที่จำเป็นต้องมีเพื่อส่งการตั้งค่าช่อง บางทีโปรโตคอลมีการตั้งค่าไว้ 4 บิตเพื่อให้มีช่องสัญญาณเพิ่มเติมในภายหลังหรือดังนั้นโปรโตคอลสามารถใช้กับของเล่นที่แตกต่างกันโดยสิ้นเชิง แต่ฉันไม่รู้ สำหรับค่าที่ใหญ่กว่าโปรโตคอลจะใช้บิตพิเศษที่อาจถูกปล่อยออกมา (หันเห / คันเร่ง / ระยะห่างอาจทำได้น้อยกว่าละเล็กน้อย) แต่สำหรับการตัดแต่ง - ซึ่งมี 3 สถานะ - ใช้เพียง 2 บิตเท่านั้น ดังนั้นใคร ๆ ก็สงสัยว่าช่องนั้นก็แค่ 2 บิต แต่นั่นก็ทำให้ 2 อันถัดไปที่ไม่ได้รับการรับรอง
ความเป็นไปได้อีกอย่างก็คือการตรวจสอบแพ็คเก็ตนั้นมีความยาว 8 บิตเริ่มต้นด้วย "X bits" และ - ผ่านเวทมนตร์การตรวจสอบ - มันเกิดขึ้นกับการตั้งค่าช่องเสมอ แต่อีกครั้ง: ฉันไม่รู้
และพูดถึง: ฉันไม่รู้เลยว่าบิตเช็คเหล่านั้นเกิดขึ้นได้อย่างไร ฉันหมายถึงพวกมันคือบิตตรวจสอบเนื่องจากพวกมันไม่สอดคล้องกับอินพุตควบคุมเดี่ยวใด ๆ และเฮลิคอปเตอร์ดูเหมือนจะไม่ตอบสนองหากฉันเล่นซอกับพวกเขา ฉันเดาว่าเป็น CRC บางอย่าง แต่ฉันไม่สามารถเข้าใจมันได้ การตรวจสอบมีความยาว 6-8 บิตขึ้นอยู่กับวิธีที่คุณตีความ "X bits" ดังนั้นจึงมีหลายวิธีที่สามารถนำมารวมกันได้