Обзор схем..))
Раньше (в прошлом веке, а точнее ТЫСЯЧЕЛЕ́ТИИ

) схемы собирали на радиолампах и резонансных реле. Дискретное радиоуправление.
http://rw6ase.narod.ru/00/rk/rum1.html
Затем появились схемы на транзисторах. Пропорциональное радиоуправление. РРМ.
http://s1921687209.narod.ru/00/rk/supranar828.html
В нашем веке (а точнее ТЫСЯЧЕЛЕ́ТИИ

) появились схемы Пропорциональное радиоуправление. РСМ.
http://www.radioc.co.uk/Flysky-FS-TH9x- ... p/3501.htm
Вообще... все заводские схемы (РСМ) радиоуправления работают по одному принципу. В пульте стоит МК, который измеряет напряжение на всех резисторах (джойстиках) и на всех кнопках (переключателях). Переводит всё в "цифру" и передаёт уже в цифровом виде на заводской радиомодуль. Заводской радиомодуль сам считает контрольную сумму и собирает из данных пакет для передачи в эфир: добавляет преамбулу, добавляет синхрослово, иногда ещё добавляет адрес пульта, ... и т.д. Затем всё это передаёт в эфир.
Александр собирает кораблик на самодельном радиомодуле (обычной рации). Самодельный радиомодуль ничего не умеет, кроме как только просто передавать импульсы. ))) Поэтому все измерения... сборка пакетов, подсчёт контрольной суммы... и т.д. при передачи, у нас всё делает МК.
Самодельный приёмник тоже ничего не умеет, кроме как принимать сигнал. Поэтому в приёмнике у нас тоже всем занимается МК.
Теперь подробней.
Передатчик у нас работает по стандартному алгоритму. Сначала измеряет напряжение на резисторах (джойстиках), с помощью аппаратного АЦП. В МК ATmega8 стоит обычный АЦП последовательного приближения. принцип его работы простой. Например тут подробно про него написано:
http://www.efo.ru/cgi-bin/go?2089
Подробней можно почитать в справочнике или даташите ATmega8.
Если кратко, то:
1- переключаем обычный переключатель (мультиплексор) к первому выводу.
2- сравниваем напряжение на первом резисторе с напряжением питания.
3- переводим напряжение резистора в двоичный код. На выходе получаем десятизначное число.
4- впринципе можно было бы передавать и десятизначное число, но есть проблема. На входе АЦП всегда присутствуют шумы и всякие наводки... Поэтому на входе АЦП обязательно нужно устанавливать ФНЧ: конденсатор и резистор. Величина конденсатора и резистора подбирается в процессе настройки.
-Если выбрать конденсатор маленькой ёмкости, то шумы и наводки будут проникать на вход АЦП.
-Если выбрать конденсатор большой ёмкости, то он не будет успевать заряжаться от переменного резистора (ждойстика). В этом случаем получим задерку измерения напряжения на джойстике. Модель будет выполнять команды с задержкой.
Но простой ФНЧ (резистор+конденсатор) не гарантируют полное отсутствие шумов на входе АЦП. ФНЧ только уменьшает уровень шума на входе АЦП, но не убирает шум полностью... Поэтому при каждом измерении напряжения на резисторе, у нас будут на выходе разные данные. Данные на выходе АЦП будут отличаться на величину последних разрядов (в зависимости от шума на входе АЦП). Десять знаков - это максимальная точность измерения АЦП ATmega8. В Вольтах это: 5/1024=0,0048828125 Вольт. Обычно напряжение шума получается выше чем 0,0048828125 Вольт.... Шумы на входе АЦП приводят к неточностям измерения...
Если мы будем использовать в схеме сервомашинки, то это надо учитывать. Т.к. сервомашинки управляются длительностью импульса, а длительность импульса в приёмнике зависит от точности измерения АЦП в передатчике, то получается что наши сервомашинки будут "дрожать" от неточности измерения АЦП. В принципе, если использовать например сервомашинки с мёртвой зоной больше чем неточность измерения АЦП, то ничего страшного.))
Но мы решили всё таки получить на выходе АЦП постоянное значение (без неточностей измерения), поэтому добавили программный гистерезис, который убирает все неточности измерения. После фильтра-гистерезиса получаем 8-ми значное число. При этом точность измерения у нас получилась: 5/256=0,01953125 Вольт. Т.к. уровень шума на входе АЦП у нас меньше этого напряжения, то на выходе мы всегда имеем постоянное значение, которое зависит только от напряжения на резисторе, а не от шума на входе АЦП...
Получилось большое описание... )) Но думаю смысл ясен - мы просто уменьшили чувствительность нашего АЦП. Вот и всё. ))
Далее данные с резисторов записываем в оперативную память МК.
5- далее измеряем напряжение на кнопках. Тут всё просто. У МК на каждом выводе есть логическая схема с резистором. Его можно подключить к питанию программно. Подключаем резистор к питанию программно, получаем на выводе +5 вольт. При нажатии кнопки, получаем 0 вольт.
Далее логика определяет: напряжение +5 или 0 вольт... Так МК "знает" что кто-то нажал кнопку)) В зависимости от того какое напряжение на выводе МК (+5 или 0), МК записывает в оперативную память логический "1" или "0". Получаем байт 00000000, где каждый бит соответсвует своей кнопки. Например если нажмём кнопку №1, то получим так: 00000001. Если нажмём кнопку №2, то получим вот так: 00000010. А если нажмём одновременно кнопку №1 и №2, то получим вот так: 00000011. Каждой кнопке выделен свой отдельный бит. Поэтому все кнопки работают независимо. Можем нажимать кнопки в любой последовательности.. Хоть все семь кнопок сразу: 01111111. (7-й бит - 10000000 выделен для передачи номера пульта. Зачем? Об этом расскажу потом)) ).
6- далее ещё добавляем номер пакета. 00000001... По номеру можно точно определить... много чего)) Например сколько всего пришло пакетов, а сколько потерялось при передачи. Так можно оценить качество связи радиоканала.
7- далее считаем контрольную сумму всех байт. Сначала использовали CRC-8, но оказалось что CRC-8 не справляется с большим количеством ошибок при передачи. Поэтому в последней схеме использовали CRC-16. Впринципе можем использовать и CRC-32, но пакет будет слишком длинным...
Для вычисления контрольной суммы, мы использовали полином из того же радиомодуля: CRC-16-CCITT 0x1021. Выше уже обсуждали выбор полинома для CRC...
Ser60 писал(а):лучшший полином для длины 48 бит - это 0хC86C
Помоему при малых длинах... 4 байта... кодовое расстояние полинома значение не имеет. Хотя я могу ошибаться. Этот вопрос ещё требует уточнения))
Итого у нас получилось так:
Далее добавляем преамбулу, синхрослово, и паузу...
8- далее МК передаёт всё это передатчику. Причём передаёт не просто импульсы, а передаёт манчестером.
https://ru.wikipedia.org/wiki/Физическое_кодирование
В последней схеме использовали заводской радиомодуль fs1000a. Но можно использовать любой другой (или даже простую рацию, хоть самодельную, хоть заводскую. Не важно).