Tôi có quyền tự do trả lời câu hỏi của chính mình khi tôi hiểu được hầu hết câu hỏi và đây là một cách tốt để chia sẻ những phát hiện của tôi. Tôi cảm ơn Olin Lathrop đã cho tôi một nơi để bắt đầu và một số ý tưởng để thử, nhưng cuối cùng, giao thức hóa ra hoàn toàn khác với dự đoán của Olin, do đó tôi đăng câu trả lời này.
Cập nhật: Tôi đã đăng một câu hỏi tiếp theo liên quan đến 8 bit cuối cùng mà tôi không hiểu hết và Dave Tweed đã tìm ra nó . Tôi sẽ bao gồm các chi tiết ở đây, vì vậy câu trả lời này có thể hoạt động như thông số giao thức đầy đủ, nhưng hãy kiểm tra câu trả lời của Dave.
Tôi đã phải thử một số thứ khác nhau để tìm ra điều này, nhưng tôi khá tự tin rằng tôi đã nhận được nó. Điều kỳ lạ là tôi không tìm thấy bất cứ thứ gì giống với giao thức này ở nơi khác, nhưng nó rất có thể là một giao thức phổ biến mà tôi không biết về nó.
Dù sao, đây là những gì tôi đã tìm thấy:
Giao thức / mã hóa
Cả hai xung và khoảng trắng ở giữa được sử dụng để mã hóa dữ liệu. Xung / không gian dài là nhị phân một (1) và xung ngắn / không gian là nhị phân 0 (0). Các xung được gửi bằng cách sử dụng điều chế 38kHz hồng ngoại tiêu chuẩn @ 50% chu kỳ nhiệm vụ.
Thời gian xung / không gian nằm trong câu hỏi ban đầu, nhưng tôi sẽ lặp lại chúng ở đây cho đầy đủ:
Bit Pulse Space
-----+---------+---------
0 | 275µs | 285µs
1 | 855µs | 795µs
Tất cả các kiểu chữ tối đa ± 10,, 5 chữ 5 .. Điều này dựa trên các mẫu được chụp bằng bộ phân tích logic ở 16 MHz; Tôi không có máy hiện sóng, vì vậy tôi không biết hồ sơ chính xác (tức là thời gian tăng / giảm).
Các gói được lặp lại miễn là các đầu vào điều khiển được áp dụng và dường như được đặt cách nhau tối thiểu 100ms.
Truyền gói bắt đầu với phần mở đầu "xung 1", được cố định và không phải là một phần của dữ liệu. Không gian sau mã hóa bit dữ liệu đầu tiên của gói và xung cuối cùng mã hóa bit cuối cùng.
Mỗi gói dài 32 bit và chứa mọi đầu vào mà điều khiển từ xa có thể cung cấp. Các giá trị được đọc dưới dạng endian nhỏ, tức là MSB đầu tiên.
Cấu trúc dữ liệu
Dưới đây là cấu trúc cơ bản của các gói riêng lẻ. 8 bit cuối cùng đã làm tôi bối rối, nhưng điều đó đã được tìm ra ngay bây giờ (xem bên dưới).
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
Lưu ý: Phạm vi dựa trên các bài đọc cao nhất tôi nhận được. Giao thức có khả năng phạm vi lớn hơn - lên tới 255 cho van tiết lưu, 63 cho cao độ / ngáp - nhưng giới hạn ở khoảng một nửa.
Giá trị cao độ dường như có một dải chết từ 14-21 (đã bao gồm); chỉ các giá trị trên hoặc dưới thực sự làm cho máy bay trực thăng phản ứng. Tôi không biết nó có giống với cái ngáp không (khó nói, vì dù sao máy bay trực thăng không ổn định, và có thể chỉ tự xoay nhẹ).
Đây là về mặt đồ họa (so sánh với đồ họa trong câu hỏi ban đầu)
6 bit kiểm tra được tính bằng cách XOR tất cả các giá trị trước đó. Mỗi giá trị được coi là 6 bit. Điều này có nghĩa là 2 MSB của giá trị bướm ga 8 bit chỉ đơn giản là bị bỏ qua. I E
check = yaw ^ (throttle & 0x3F) ^ pitch ^ trim ^ channel
Ghi chú thực tế
Thời gian tín hiệu và điều chế không cần phải siêu chính xác. Ngay cả thời gian không chính xác của Arduino của tôi cũng hoạt động tốt mặc dù điều chế tinh ranh và một chút nhấn và bỏ lỡ thời lượng xung / không gian so với điều khiển từ xa thực sự.
Tôi tin rằng - nhưng chưa được thử nghiệm - rằng máy bay trực thăng sẽ đơn giản bám vào kênh tín hiệu đầu tiên mà nó tìm thấy. Nếu nó rời đi mà không có tín hiệu quá lâu (vài giây), nó dường như quay trở lại chế độ "tìm kiếm", cho đến khi nhận được tín hiệu một lần nữa.
Máy bay trực thăng sẽ bỏ qua các giá trị cao độ và ngáp nếu bướm ga bằng không.
Các lệnh trim chỉ được gửi một lần cho mỗi lần nhấn nút trên điều khiển từ xa. Có lẽ giá trị cắt chỉ đơn giản là tăng / giảm một giá trị trong bộ điều khiển riêng của máy bay trực thăng; Đó không phải là thứ mà điều khiển từ xa theo dõi. Vì vậy, bất kỳ việc thực hiện nào có lẽ phải tuân theo sơ đồ đó và chỉ gửi giá trị cắt trái / phải thường xuyên, nhưng nếu không thì mặc định là giá trị cắt không trong các gói.
Tôi khuyên bạn nên có một công tắc tiêu diệt mà chỉ cần đặt ga là 0. Điều này sẽ khiến máy bay trực thăng rơi khỏi bầu trời, nhưng nó sẽ chịu ít thiệt hại hơn khi nó không quay động cơ. Vì vậy, nếu bạn sắp gặp sự cố hoặc đâm vào vật gì đó, hãy nhấn nút tắt để tránh tước bánh răng hoặc làm gãy lưỡi dao.
Đèn LED hồng ngoại của điều khiển từ xa ban đầu dường như có bước sóng> 900nm, nhưng tôi không gặp vấn đề gì khi sử dụng đèn LED ~ 850nm.
Máy thu hồng ngoại của máy bay trực thăng vẫn ổn, nhưng không siêu nhạy, do đó nguồn IR của bạn càng sáng thì càng tốt. Điều khiển từ xa sử dụng 3 đèn LED nối tiếp, ngồi trên đường ray 9V thay vì đường ray 5V được sử dụng bởi logic. Không kiểm tra chính xác mức rút hiện tại của họ, nhưng tôi muốn đặt cược là 50mA.
Dữ liệu mẫu
Dưới đây là một loạt các gói, cho bất kỳ ai quan tâm (vâng, tôi đã viết mã bộ giải mã; tôi không giải mã được tất cả những thứ này). Kênh A gói đến từ cùng một hình chụp với đồ thị trong câu hỏi ban đầu.
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
Như đã đề cập ở trên, 8 bit cuối cùng đã được tìm ra, nhưng chỉ cho hậu thế, đây là những suy nghĩ ban đầu của tôi. Hãy bỏ qua nó hoàn toàn, vì tôi đã sai khá nhiều trong dự đoán của mình.
8 bit cuối cùng
8 bit cuối cùng của gói vẫn còn một chút bí ẩn.
Tất cả 4 bit từ bit 23 đến 26 dường như được xác định hoàn toàn bởi cài đặt kênh của điều khiển từ xa. Thay đổi kênh trên điều khiển từ xa không làm thay đổi giao thức hoặc điều chế theo bất kỳ cách nào; nó chỉ thay đổi 4 bit đó.
Nhưng 4 bit là gấp đôi những gì thực sự cần thiết để mã hóa cài đặt kênh; chỉ có ba kênh, vì vậy 2 bit là nhiều. Do đó, trong phần mô tả cấu trúc ở trên, tôi chỉ gắn nhãn 2 bit đầu tiên là "Kênh" và để lại hai phần còn lại được gắn nhãn là "X", nhưng đây là một phỏng đoán.
Dưới đây là mẫu các bit có liên quan cho từng cài đặt kênh.
Chan. Bits 23-26
-----+-------------
A | 0 1 0 1
B | 0 0 1 0
C | 1 0 0 0
Về cơ bản, có nhiều hơn 2 bit cần thiết để truyền cài đặt kênh. Có thể giao thức có 4 bit được đặt sang một bên để cho phép nhiều kênh hơn sau đó, hoặc vì vậy giao thức có thể được sử dụng trong các đồ chơi hoàn toàn khác nhau, nhưng tôi đơn giản là không biết. Đối với các giá trị lớn hơn, giao thức không sử dụng các bit thừa có thể bị bỏ sót (yaw / thr ga / pitch có thể nhận được với ít hơn một chút), nhưng đối với trim - cũng có 3 trạng thái - chỉ sử dụng 2 bit. Vì vậy, người ta có thể nghi ngờ rằng kênh cũng chỉ là 2 bit, nhưng điều đó khiến cho 2 phần tiếp theo không được tính.
Khả năng khác là tổng kiểm tra của gói dài 8 bit, bắt đầu bằng "bit X" và - thông qua ma thuật kiểm tra - chúng chỉ xảy ra bằng cách nào đó luôn phản ánh cài đặt kênh. Nhưng một lần nữa: tôi không biết.
Và nói về: Tôi không biết làm thế nào những bit kiểm tra được hình thành. Ý tôi là, chúng là các bit kiểm tra, vì chúng không tương ứng với bất kỳ đầu vào điều khiển nào và máy bay trực thăng dường như không phản hồi nếu tôi mân mê chúng. Tôi đoán đó là một loại CRC nào đó, nhưng tôi không thể tìm ra nó. Việc kiểm tra dài 6-8 bit, tùy thuộc vào cách bạn diễn giải "bit X", do đó, có rất nhiều cách có thể được đặt cùng nhau.