Saya mengambil kebebasan untuk menjawab pertanyaan saya sendiri karena saya mendapatkan sebagian besar jawabannya dan ini adalah cara yang baik untuk berbagi temuan saya. Terima kasih saya kepada Olin Lathrop karena telah memberi saya tempat untuk memulai dan beberapa ide untuk dicoba, tetapi pada akhirnya, protokolnya ternyata sangat berbeda dari dugaan Olin, maka saya memposting jawaban ini.
Pembaruan: Saya memposting pertanyaan tindak lanjut mengenai 8 bit terakhir, yang saya tidak sepenuhnya mengerti, dan Dave Tweed menemukan jawabannya . Saya akan memasukkan detailnya di sini, jadi jawaban ini dapat berfungsi sebagai spesifikasi protokol lengkap, tetapi periksa jawaban Dave.
Saya harus mencoba beberapa hal yang berbeda untuk mendapatkan ini, tetapi saya cukup yakin bahwa saya mendapatkannya. Anehnya, saya belum menemukan sesuatu yang menyerupai protokol ini di tempat lain, tetapi mungkin itu merupakan protokol umum yang tidak saya ketahui.
Bagaimanapun, inilah yang saya temukan:
Protokol / pengkodean
Kedua pulsa dan ruang di antaranya digunakan untuk menyandikan data. Pulsa / spasi panjang adalah biner satu (1), dan pulsa / spasi pendek adalah biner nol (0). Pulsa dikirim menggunakan modulasi inframerah 38kHz konsumen standar @ 50% duty-cycle.
Pengaturan waktu denyut / ruang ada di pertanyaan awal, tapi saya akan mengulanginya di sini untuk kelengkapan:
Bit Pulse Space
-----+---------+---------
0 | 275µs | 285µs
1 | 855µs | 795µs
Semua ± 10μs maks., ± 5µs typ .. Ini didasarkan pada sampel yang ditangkap dengan penganalisa logika pada 16MHz; Saya tidak memiliki osiloskop, jadi saya tidak tahu profil pastinya (yaitu waktu naik / turun).
Paket diulang selama input kontrol diterapkan dan tampak berjarak minimal 100 ms.
Transmisi paket dimulai dengan pembukaan "pulsa 1", yang diperbaiki dan bukan bagian dari data. Spasi berikut mengkode bit data pertama dari paket, dan pulsa terakhir mengkodekan bit terakhir.
Setiap paket panjangnya 32 bit, dan berisi setiap input yang dapat disediakan oleh kendali jarak jauh. Nilai dibaca sebagai endian kecil, yaitu MSB pertama.
Struktur data
Di bawah ini adalah struktur dasar dari paket individu. 8 bit terakhir membuat saya bingung, tapi itu sudah diketahui sekarang (lihat di bawah).
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
Catatan: Kisaran didasarkan pada pembacaan tertinggi yang saya dapatkan. Protokol ini mampu rentang yang lebih besar - hingga 255 untuk throttle, 63 untuk pitch / yaw - tetapi tutup sekitar setengahnya.
Nilai nada tampaknya memiliki deadband dari 14-21 (termasuk); hanya nilai-nilai di atas atau di bawah yang benar-benar membuat helikopter bereaksi. Saya tidak tahu apakah itu sama untuk menguap (sulit untuk mengatakan, karena helikopter itu tidak stabil, dan mungkin hanya berputar sedikit sendiri).
Ini dalam istilah grafis (bandingkan dengan grafik pada pertanyaan awal)
6 bit cek dihitung dengan XOR'ing semua nilai sebelumnya. Setiap nilai diperlakukan sebagai 6 bit. Ini berarti bahwa 2 MSB dari nilai throttle 8-bit diabaikan begitu saja. Yaitu
check = yaw ^ (throttle & 0x3F) ^ pitch ^ trim ^ channel
Catatan praktis
Pengaturan waktu dan modulasi sinyal tidak harus super akurat. Bahkan timing Arduino saya yang tidak akurat sama sekali bekerja dengan baik meskipun modulasi cerdik dan sedikit hit and miss pada durasi pulsa / ruang dibandingkan dengan remote control yang sebenarnya.
Saya percaya - tetapi belum diuji - bahwa helikopter hanya akan menempel pada saluran sinyal pertama yang ditemukannya. Jika dibiarkan tanpa sinyal terlalu lama (beberapa detik), tampaknya kembali ke mode "pencarian", sampai memperoleh sinyal lagi.
Helikopter akan mengabaikan nilai pitch dan yaw jika throttlenya nol.
Perintah trim dikirim hanya sekali per tombol-tekan pada remote control. Agaknya nilai trim hanya menambah / mengurangi nilai di controller helikopter sendiri; itu bukan sesuatu yang dilacak oleh remote control. Jadi setiap implementasi dari ini mungkin harus tetap berpegang pada skema itu, dan hanya mengirim nilai trim kiri / kanan sesekali, tetapi jika tidak default ke nilai trim nol dalam paket.
Saya sarankan memiliki saklar mematikan yang hanya menetapkan throttle ke nol. Ini akan menyebabkan helikopter jatuh dari langit, tetapi ia akan mengalami kerusakan lebih sedikit ketika tidak memutar motornya. Jadi, jika Anda akan menabrak atau menabrak sesuatu, tekan tombol bunuh untuk menghindari melepaskan gigi atau merusak bilah.
LED IR remote control asli tampaknya memiliki panjang gelombang> 900nm, tapi saya tidak punya masalah menggunakan ~ 850nm LED.
Penerima IR helikopter tidak apa-apa, tetapi tidak super sensitif, jadi semakin terang sumber IR Anda, semakin baik. Remote control menggunakan 3 LED secara seri, duduk di rel 9V bukannya rel 5V yang digunakan oleh logika. Belum memeriksa undian mereka saat ini dengan sangat tepat, tapi saya berani bertaruh itu adalah 50mA.
Contoh data
Berikut adalah banyak paket, untuk siapa saja yang tertarik (ya, saya membuat skrip dekoder; saya tidak mendekodekan semua ini). Paket saluran A berasal dari tangkapan yang sama dengan grafik pada pertanyaan awal.
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
Seperti disebutkan di atas, 8 bit terakhir telah ditemukan, tetapi hanya untuk anak cucu, inilah pemikiran asli saya. Jangan ragu untuk mengabaikannya sama sekali, karena dugaan saya salah besar.
8 bit terakhir
8 bit terakhir dari paket masih sedikit misteri.
4 bit dari bit 23 hingga 26 semuanya tampaknya sepenuhnya ditentukan oleh pengaturan saluran remote control. Mengubah saluran pada kendali jarak jauh tidak mengubah protokol atau modulasi dengan cara apa pun; itu hanya mengubah 4 bit itu.
Tetapi 4 bit adalah dua kali lipat dari yang sebenarnya dibutuhkan untuk menyandikan pengaturan saluran; hanya ada tiga saluran, jadi 2 bit banyak. Oleh karena itu, dalam uraian struktur di atas, saya hanya memberi label 2 bit pertama sebagai "Saluran", dan meninggalkan dua lainnya berlabel "X", tetapi ini dugaan.
Di bawah ini adalah contoh bit yang relevan untuk setiap pengaturan saluran.
Chan. Bits 23-26
-----+-------------
A | 0 1 0 1
B | 0 0 1 0
C | 1 0 0 0
Pada dasarnya, ada 2 bit lebih dari yang dibutuhkan untuk mengirimkan pengaturan saluran. Mungkin protokol memiliki 4 bit yang disisihkan untuk memungkinkan lebih banyak saluran nanti, atau lebih tepatnya protokol dapat digunakan dalam mainan yang sama sekali berbeda, tapi saya tidak tahu. Untuk nilai yang lebih besar, protokol tidak menggunakan bit tambahan yang bisa ditinggalkan (yaw / throttle / pitch bisa bertahan dengan sedikit lebih sedikit masing-masing), tetapi untuk trim - yang juga memiliki 3 status - hanya 2 bit yang digunakan. Jadi orang bisa curiga bahwa saluran tersebut juga hanya 2 bit, tetapi itu membuat 2 berikutnya tidak terhitung.
Kemungkinan lain adalah bahwa checksum paket adalah 8 bit, dimulai dengan "bit X", dan - melalui keajaiban checksumming - mereka kebetulan mencerminkan pengaturan saluran. Tetapi sekali lagi: Saya tidak tahu.
Dan berbicara tentang: Saya tidak tahu bagaimana bit-bit cek terbentuk. Maksudku, mereka adalah bit check, karena mereka tidak sesuai dengan input kendali tunggal, dan helikopter tampaknya tidak merespon jika saya bermain-main dengan mereka. Saya kira ini semacam CRC, tapi saya belum bisa mengetahuinya. Cek tersebut panjangnya 6-8 bit, tergantung pada bagaimana Anda mengartikan "bit X", jadi ada banyak cara yang bisa disatukan.