Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить

Радиоуправление. Переходим на МК.

Пн янв 27, 2014 18:04:21

Решил поднять эту тему. Покоя мне не даёт)) Продолжаем учиться. Цель-получить опыт и знания...
Подведём итоги:
1-Схемы с частотным (тональным) разделением каналов (на LC, RC) - много деталей, ложные страбатывания... - помеха с частотой контура LC (RC) - ложное срабатывание.
2-Схемы число-импульсного разделения каналов - много деталей, ложные страбатывания... малейшая помеха, количество импульсов меняеться - ложное срабатывание.
3-Схемы с временным разделением каналов (как в аппаратуре пропорционального управления) - много деталей, ложные страбатывания... - малейшая помеха, количество и фаза импульсов меняеться - - ложное срабатывание.
4-Схема ДТМФ (от телефонов) - при слабом сигнале, (сигнал зашумлен) всплески шума приемник ДТМФ воспринимает как частоты ДТМФ кода... - - ложное срабатывание.

Выше предлагали: дублирование команды, т.е. например если команда пришла два(три) раза подряд одна и та же, значит она истинна - этот метод для п.1; п.2; п.3; п.4; - не работает!!! Делать схемы на логике с передачей контрольных сумм... Вы себе размер схемы представляете??? :facepalm:

Вывод: переходим на МК. :roll:
Сильно меня не пинать!!!)) Я только начал работать с МК.
Качаем бесплатно cvavr, Proteus... Берём самую дешёвую mega8... USB-программатор... и поехали! Пишем на Си
Для сравнения: cхема на транзисторах - с временным разделением каналов (как в аппаратуре пропорционального управления) - более 60 транзисторов :facepalm: ИзображениеИзображение... дальше продолжать схему смысла нет. :)))
На МК - mega8 - 2 шт.
Для начала - 4 дискретных команды: 00100101 - 1; 00101001 - 2; 00101011 - 3; 00101101 - 4.
Т.е. используем 1 байт (8 бит) для передачи одной команды. Коды выбираем таким образом, чтобы в нашем коде "0" и "1" не повторялись более 3 (трёх) раз подряд. Иначе трудно будет пропустить посылку по радиоканалу - появляется постоянная составляющая...
И каждый байт должен начинаться с "0" - это будет стартовый бит. И каждый байт должен заканчиваться "1" - это будет стоповый бит.
Не трудно посчитать, что в 1-м байте можно разместить 16 комбинаций кода:
00100101 00110011 01001101 01011011
00101001 00110101 01010011 01100101
00101011 01001001 01010101 01101001
00101101 01001011 01011001 01101101
Биты "0" и "1" будем передавать с частотой 500 Гц. Радиоканал - простая радиостанция с узкополосной ЧМ. :tea:
Последний раз редактировалось roman.com Вт янв 28, 2014 16:35:09, всего редактировалось 3 раз(а).

Re: Радиоуправление: делаем сами.

Пн янв 27, 2014 21:51:00

Ну, с цифровым подходом в первом приближении делается чуток хитрее - для распознавания используется не одиночный бит, а байт, при этом достоверность улучшается многократно. Для телеуправления, думаю, достаточно тетрады или даже триады, далее должен следовать инфокод значения управляющей величины и в конце стоповый (разделительный) код. Если первый и последний анализировать математически в МК, то количество ложных интерпретаций должно резко сократиться. ИМХО.

Re: Радиоуправление: делаем сами.

Пн янв 27, 2014 23:17:48

svic писал(а):для распознавания используется не одиночный бит, а байт
Вы забегаете вперед...))Я только про это хотел сказать.
Почему именно 500 Гц ? Вообще при разработке нужно стремиться использовать существующие стандарты. Так схема получиться универсальной, работающая практически со всеми типами раций... телефонами и т.д. У меня полоса пропускания рации примерно такая же как и у заводских: примерно 200...2700 Гц (линейная область 200...2000 Гц) - это полоса разговорного тракта всех раций, радиотелефонов, проводных телефонов и т. д... Значит при передачи простых кодов (00100101 - 1; 00101001 - 2; 00101011 - 3; 00101101 - 4...... ) получим импульсы с частотой 250 или 500 Гц. При таких частотах мы получаем довольно хорошую прямоугольность импульсов на выходе приёмника. Гармоники прямоугольных импульсов укладываються в полосу пропускания рации... Как показывает практика, лучше всего передавать биты через рации со скоростью несколько сотен бит. Получаем несколько сотен герц. Позже поэксперементируем со скоростью передачи. Пока остановимся на 500 Гц. Я могу внести изменения в схему рации для низкой скорости передачи... даже постоянной составляющей. Но это уже получиться не универсальная схема.
Кодировка.При использовании МК вопрос с количеством деталей уже не стоит так остро. Поэтому для распознавания используется не одиночный бит, а байт целиком. Я тут накидал схемку кодера-декодера байтов...
Кодер (TX).получился простенький. Кнопки 1,2,3,4, - команды, 0,5- служебные для настройки радиоканала. Нажимаем кнопку 0 получаем на выходе меандр 480 Гц. Кнопка 5- меандр 240 Гц.
При нажатии любой кнопки будет выполняться соответствующая команда, пока не нажмем другую кнопку... :roll: Изображение
Нажимаем кнопку 1 - код 00100101 - пауза - код 00100101.... и т.д. бесконечно.
Нажимаем кнопку 2 - код 00101001 - пауза - код 00101001.... и т.д. бесконечно.
Нажиаем одновременно кнопку 1 и 2 - код 00100101 - пауза - код 00101001 - код 00100101 - пауза - код 00101001.... и т.д. бесконечно. Т.е. поочереди передаются коды 1 и 2...
Так же и с другими кнопками. Байты разделены синхропаузами... Пока ничего лучше (проще) не придумал.
Компилируем... Прошиваем mega8... Все работает :tea: Изображение

Декодер (RX). тут сложнее... Приемник и передатчик на atmega8. Для упрощения схемы используеться внутренний генератор RC - 1 Мгц. Фьюзы не трогаем.Приёмник:ИзображениеДиод D1-индикатор сигнала. D1,D2,D3,D4 - выход команд на реле.
Теперь алгоритм приёмника: в исходном состоянии на ноге 28 (порт PC5) "1" (+5V). При поступлении команды "0"- старт бит (0V) запускаеться программа алгоритма определения состояния ноги 28 (порт PC5) через равные промежутки времени. При этом мигает диод D1-индикатор сигнала.
Я пока не дошел до всяких таймеров и т.д... поэтому задержку я сделал используя бесконечный цикл while (1). После доработки программы я использовал счетчики for (a=0;a<b;a++). На счетчиках программа получилась почти в два раза меньше. :solder:
Короче, при появлении "0" на 28 (порт PC5) включаеться счетчик задержки, время задержки задаеться при настройке-c=100. Затем включаеться счетчик проверки состояния, первого бита кода. Он проверяет состояние ноги 28 (порт PC5). Проверка: 70 раз, количество проверок задаеться также при настройке-b=70... Если первый бит "0" то включаеться второй счетчик задержки c=100... затем второй третий счетчик проверяет второй бит кода... и опять задержка... и опять проверка третего бита кода... и так пока программа не проверит все 8 бит кода. В зависимости от расположения битов в коде вывоиться соответствующая команда: D1,D2,D3,D4. После этого МК переходит в режим ожидания... и ожидания следующей посылки кода... Если хоть один бит неверный то происходит сброс МК... и ожидания следующей посылки кода... и т.д. бесконечно.
Изображение
Короче простенькая програмка с возможностью расширения на большее количество кнопок.

Задержки между определениями импульсов кода нужны для того чтобы небыло ошибок при фазовом шуме импульсов... который незбежно появиться при прохождении через радиоканал. Т.е. форма и фаза импульсов сильно изменяться - это устраняеться задержками.

Вообщем примерно так .. Жду замечаний, предложений :roll:
Вложения
RX исходник Си.txt
(5.7 KiB) Скачиваний: 735
TX - исходник Си.txt
(1.74 KiB) Скачиваний: 603
TX.png
(42.5 KiB) Скачиваний: 1233

Re: Радиоуправление: делаем сами.

Ср янв 29, 2014 11:50:53

Если код не верный, то:
Изображение
И так со всеми кнопками... В данной схеме время рекции получаеться около 0,04 секунды! Т.е. от нажатия кнопки на передатчике до срабатывания ключа на транзисторе проходит около 0,04...0,05 секунды (можно даже точно настроить время реакции). C такими скоростями уже можно говорить о высшем пилотаже )) :beer:
В Proteuse все работает четко... осталось проверить в реале :)
Вопрос на засыпку! Какая стабильность встроенного тактового RC-генератора у ATmega8 ??? Это важно, если будут большие масивы кодов... :roll:
svic писал(а):думаю, достаточно тетрады или даже триады, далее должен следовать инфокод значения управляющей величины и в конце стоповый (разделительный) код.

1-Кик видим, триады (3 бита) и даже тетрады (4 бита) недостаточно для надежного распознования кода... лучше байт целиком.
2-далее должен следовать инфокод значения управляющей величины - над этим ещё поработаем... :roll:
3-в конце стоповый (разделительный) код... помоему проще сделать синхропаузу. :)А результат будет даже лучше. Синхропаузу проще реализовать... Хотя по надежности может лучше будет стоповый (разделительный) код... :roll:
Вложения
код ошибка.png
(34.57 KiB) Скачиваний: 1084
код.png
(42.12 KiB) Скачиваний: 1205

Re: Радиоуправление: делаем сами.

Чт янв 30, 2014 18:13:03

roman.com писал(а):4-Схема ДТМФ (от телефонов) - при слабом сигнале, (сигнал зашумлен) всплески шума приемник ДТМФ воспринимает как частоты ДТМФ кода... - - ложное срабатывание.


Чтобы не было ложных срабатываний команды должна кодироваться не одним символом, а, например, парой разных символов, не имеющих общих частот.
Недопустимо 1-2 (697/1209 - 697/1336)
Допустимо 1-5 (697/1209 - 770/1336)

Re: Радиоуправление: делаем сами.

Пт янв 31, 2014 16:29:19

ks0 писал(а):Недопустимо 1-2 (697/1209 - 697/1336)Допустимо 1-5 (697/1209 - 770/1336)

Да, наверное вы правы. Так как частота 1209 при сильном щуме выглядит на экране анализатора как частота 1336 или выше... Т.е. частоту (синусоиду) 1209 Гц шум разбивает на несколько частей... в итоге вместо "1" на выходе получаем "2"...
Нажимаю "5", получаю "7" ... и т.д. Только появляеться другая проблема:
1-специализированных микросхеме я не нашёл... Передатчик ...ВЖ18 можно выдрать из телефона (номеронабирателя), а вот приёмника ...ВЖ19 на радиорынке нет. :( Поэтому купил mega8 ))) В интернете есть схемы с прошивками передатчиков и приёмников ДТМФ кода на mega8, только возникает вопрос: за зачем использовать ДТМФ код на МК, если на МК можно собрать намного лучше схему кодирования :) Дажепри передаче простого байта кода получаем намного более защищенную радиолинию... и скорость передачи выше в десятки раз! (при тех же частотах передачи). :roll: т.е. время реакции выше.
2-при передачи двухчастотного кода модуляция получаеться 50% ... т.е. радиоканал используеться только наполовину.
При ИКМ (импульсно-кодовая модуляция) модуляция 100%... т.е. выжимаем из радиоканала максимум. Значит дальность и надежность выше.
И т.д. и т.п...

Re: Радиоуправление: делаем сами.

Вс фев 02, 2014 01:46:38

Собрал в железе. Для устранения фазового шума уменьшил длительность импульсов опроса... пропустил по радиоканалу...
Изображение
Впринципе для простых игрушек пойдет...
Изображение
Но для более сложных систем программа пока слишком сырая :roll: Одного байта недостаточно для четкого распознования посылок... При слабом сигнале - ложные срабатывания, т.к. разница в коде 1 бит... под действием помех 00100101 - 1; превращаеться в 00101101 - 4. И синхронизация по стартовуму биту работает при хоршем сигнале... Короче нужно поработать. Хорошо что ничего ненужно перепаивать, как на логике))) Вот преимщество МК... :tea:

Re: Радиоуправление: делаем сами.

Вс фев 09, 2014 01:41:51

АлександрЛ писал(а):"самое простое" управление...
Мы обсуждаем тут радиоуправление. :tea:
Доработал свою схемку (программу): добавил счетчики ошибок, сброс при отсутствии сигнала, уменьшил длительность опроса, увеличил код до 20 бит... Получилась рабочая схема: нет ложных срабатываний, работает даже при зашумленном (слабом) сигнале - ИзображениеОсциллографа под рукой нет. Использую звуковую карту компьютера. На самом деле форма импульсов - прямоугольная, просто искажения звуковухи (режит нижнии частоты). :roll:
Код 20 бит с синхро паузой и стартовыми битами...
0011---0101/1001--0101/0101 - команда 1
0011---0101/0011--0110/1001 - команда 2
0011---0110/1010--1001/0101 - команда 3
0011---0011/0110--1010/1001 - команда 4
Можно увеличить количество команд... Программа использует только 20% памяти МК. Короче очень простенькая програмка на mega8 (или любой другой). Кстате, Proteusврет! Фаза импульсов в реале немного другая чем в симуляторе... Вот и верь всяким там симуляторам :)))
ATmega8 по даташиту я не нашел информации о стабильности встроенного RC-тактового генератора. :dont_know: По доташиту напряжение питания ATmega8 - 4,5...5,5 V. На практике она нормально работает при 4...6 V. Однако, при изменении напряжения питания меняеться частота встроенного RC-тактового генератора. Работа данной схемы напрямую зависит от частоты встроенного RC-тактового генератора. Это четко видно на осциллограмах. При напряжении питании 4 V частота встроенного RC-тактового генератора увеличиваеться, фаза импульсов опроса сдвигаетьсяИзображение
При питании 6 V частота встроенного RC-тактового генератора уменьшаеться и появляються ошибки при определении кода:Изображение
Поэтому питание ATmega8 должно быть от стабилизатора 5 V:ИзображениеПри 5 V ток потребления 10 mA, что сравнимо с простыми схемами на КМОП логике или транзисторах. Габариты схемы на транзисторах даже страшно себе представить :facepalm: На КМОП логике - несколько десятков микросхем. На микроконтроллере - всего две микросхемы: одна в приемник вторая в передатчик. :lol:
При хорошем сигнале (С/Ш около 10:1) ошибок нет. Напряжение на антенном входе приёмника около 1 мкВ:
Изображение
При слабом сигнале (С/Ш около 3:1) ошибок практически нет. Напряжение на антенном входе приёмника около 0,5 мкВ.
Изображение
При слабом сигнале (С/Ш около 2:1) ошибки 50% (потеря половины пакетов). Напряжение на антенном входе приёмника около 0,3 мкВ. Реле начинает переодически отключаться (дребезжать):
Изображение
При слабом сигнале (С/Ш меньше 1:1) ошибки 100% (потеря всех пакетов):
Изображение
При отсутствии сигнала:
Изображение
самое главное - при любом уровне сигнала никаких ложных срабатываний! :)
Радиоканал - наша любимая рация http://radiokot.ru/circuit/analog/receiv_transmit/30/
Осталось приделать релюшки и получиться простая 4-х командная схема радиоуправления. :tea:
Вложения
tx4 - 8.c
(3.96 KiB) Скачиваний: 890
rx4 - 8.c
(17.41 KiB) Скачиваний: 863

Re: Радиоуправление: делаем сами.

Вс авг 03, 2014 12:28:09

Появилось свободное время... продолжаем :tea:
Достал свою рацию:
http://www.radiokot.ru/forum/download/f ... ?id=128930
Изображение
Собрал к ней простенький переходник для подключения МК:
Изображение
Можно собрать компаратор... но это долго и сложно. Переходник подключается практически к любой рации или FM приёмнику и т.д. вместо динамика. При средней громкости (около 50%) на выходе получаем четкие импульсы. Диоды (красные) прямое падение напряжения 2 V. Они защищают вход МК от перенапряжения. (без них один порт МК я уже спалил :oops: ). Делитель 22к-33к задает начальное смещение на входе МК. Если напряжение на входе МК более 2,6 V (при 5 V питании) то МК воспринимает как "1". Если напряжение на входе МК менее 2,6 V то МК "думает" что это "0".
Результаты эксперемента (осциллограмы сняты через звуковую карту компьютера со входа МК - вывод 28). Зелёным цветом - импульсы на входе МК. Красным цветом - импульсы контроля работы МК (вывод 2 МК), начало и конец отсчета пакета.
Для примера передаем команду №1. Ей соответствует код 01011001010101011011. Частота импульсов 480 Гц. Сигнал на выходе приёмника инвертирован.
При чётком сигнале передатчика потерь пакетов нет. Команда выполняется чётко. Время реакции около 0,1...0,2 секунды.
Изображение
При слабом сигнале (С/Ш около 1:2) потеря пакетов около 50%:
Изображение
При слабом сигнале (С/Ш менее 1:1) потеря пакетов около 90%: Т.е. если долго держать кнопку то команда все же выполняется.
Изображение
А это МК ищет код (но не может найти :) ) в шумах при отсутствии сигнала (передатчик выключен):
Изображение
Чуть подробней о борьбе с помехами. Для надежной работы при слабом сигнале передатчика МК анализирует каждый бит. Для этого каждый бит разбивается на 144 равных частей. Т.е. МК измеряет напряжение на входе 144 раза за время прохождения каждого бита. Затем МК математически определяет сколько в одном бите "+" и столько "-" и принимает значение данного бита "1" или "0":
Изображение
Аналогично и с другими импульсами:
Изображение
И даже при таких импульсах МК чётко распознаёт биты правильно- "1" или "0":
Изображение
Таким образом, мелкие помехи нам не страшны. Радиоуправление работает при слабом уровне сигнала. Вот. :tea:
Есть ещё у кого какие идеи?
Вложения
tx.c
(5.18 KiB) Скачиваний: 523
rx.c
(7.22 KiB) Скачиваний: 921

Re: Радиоуправление: делаем сами.

Вс авг 10, 2014 17:28:19

Провёл ряд экспериментов. Улучшил синхронизацию. В остальном ничего лучшего не получается. Для высокой скорости реакции требуется постоянно передавать синхро пакет, чтобы принимающий МК был постоянно синхронизирован с передающим МК. :solder:
Короче, при напряжении на антенном входе приёмника 0,3 мкВ (27Мгц) система работает чётко. Время реакции менее 0,1 секунды (зависит от количества кнопок). Скорость передачи получилась 40 пакетов в секунду. Для получения ещё большей чувствительности (работа при меньшем сигнале без потерь пакетов) приходится уменьшать скорость передачи пакетов (уменьшаем частоту импульсов). Однако это уменьшает скорость реакции модели, что для игрушек не пойдет. Для всяких стационарных радиосигнализаций не требуется высокая скорость реакции... поэтому система работает при меньшем уровне сигнала (сигнал/шум менее 1:1). Т.е. просто дольше держим кнопку на передатчике. :tea:
Пару слов о синхронизации. Запуск МК-приёмника идет по переднему фронту первого бита пакета. При слабом сигнале идет "скольжение". Синхронизируемся по первому правильному пакету. Пропускаем не более 6 пакетов:
Изображение
Благодаря "умной" синхронизации количество потерянных пакетов (при слабом сигнале) заметно уменьшено:
Изображение
Кстате, благодаря такой системе анализа, МК прекрасно работает и с любыми сигналами на входе. Например с такими:
Изображение
Т.е. форма импульсов (амплитуда, фронт, фазовый шум, длительность и скважность...)нам не критична.
Короче, получилась простенькая базовая программка. Теперь можно её "подкрутить" под конкретные задачи. :tea:

Re: Радиоуправление: делаем сами.

Пн авг 11, 2014 23:35:26

Переходим к практике. :)
А вот и первая схема. Схема рабочая. Собрана на макетке и протестирована! (питание МК и выводы для прошивки на схеме не показаны-они стандартные по даташиту):
Изображение
Пульт на 6 кнопок. Кнопки работают независимо. Т.е. при нажатии на кнопку (в передатчике) горит светодиод соответствующий номеру кнопке (в приёмнике), один или несколько (или все сразу), в любой последовательности. :tea:

Примечание:
1-Время включения светодиода (скорость реакции) зависит от количества нажатых кнопок (25мс...150мс).
При хорошем уровне сигнала МК синхронизируется по переднему фронту первого принятого бита.
2-Время выключения светодиода не зависит ни от кнопок ни от уровня сигнала.
3-Для повышения скорости реакции (если это нужно), при низком уровне сигнала передатчика, кнопка "№6" должна быть постоянно нажата. При этом МК синхронизируется по последнему пакету (кнопке "№6").
4-В приёмнике добавлен светодиод-индикатор. Если он горит-МК синхронизирован. Если не горит-нет сигнала (есть одна несущая передатчика). Если мигает-на входе МК шум (передатчик выключен).

Короче, получился простенький пульт с возможностью расширения на любое количество кнопок (сколько есть свободных портов у МК).
Исходники прикрепил. Копируем в cvavr, компилируем, прошиваем любым программатором МК и... наслаждаемся. :tea:
Вложения
rx1.c
исходник приёмник
(7.89 KiB) Скачиваний: 685
tx1 - 8.c
исходник передатчик
(5.18 KiB) Скачиваний: 869

Re: Радиоуправление: делаем сами.

Вс авг 17, 2014 19:43:29

На базе этой схеме можно собрать например гусеничный танк... Вместо светодиодов ставим релюшки:
Изображение
При хорошем сигнале время реакциии менее 0,1 сек. Т.е. достаточно высокое для выполнения сложных манёвров. Время реакции зависит от количества нажатых кнопок. Все 6 пакетов от шести кнопок передаються поочереди. Время передачи одного пакета 25 мс. Для более точного управления можно сделать 1,2,3,4 кнопки высокоприоритетными - они будут передоваться в первую очередь. Остальные 5,6, и т.д. будут передаваться в промежутках между 1,2,3,4 кнопками... В этом случае скорость реакции будет постоянная. Короче, все зависит от конкретных задач. :tea:

Короче, простое дискретное радиоуправление у нас есть. Усложним задачу! Переходим к пропорциональному радиоуправлению. Провел разные эксперементы... остановился на встроенном АЦП...
Изображение
Крутим резистор... диоды показывают напряжение в двоичном коде. Стандартные настройки АЦП в cvavr. Время обновления (время оцифровки) около 0,3 мс. Теперь нужно придумать как это передать и принять... :roll:
Вложения
АЦП.c
(931 байт) Скачиваний: 872

Re: Радиоуправление: делаем сами.

Вт авг 19, 2014 00:42:55

Придумал)). Используем манчерский код. https://ru.wikipedia.org/wiki/%D4%E8%E7 ... 0%ED%E8%E5
Встроенный АЦП МК измеряет напряжение на входе 0...5 V и переводит в код 0...1024 бит. Такая точность поворота руля нам не нужна. Поэтому 1024 делим на 68. Получаем 15 делений поворота (0000...1111). Передаём четыре бита кода... переведя в манчерский код... и инвертировав для лучшей помехозащищенности (как в пульте телевизора)... 4 бит: 0(старт)-01010101(код)-10101010(инверсия кода)-11111(синхро пауза)... пакет 22 мс... При слабом сигнале появляются ошибки. :facepalm:
Проблема в том, что для лучшей помехозащищенности приходится увеличивать пакет... но при этом увеличивается время передачи... уменьшается время реакции...
1024 делим на 33. Получаем 31 делений поворота (00000...11111). Передаём пять бит кода... + № руля... +пауза... 0010101010101010101101010101011111... короче 30 пакетов в секунду. Проверяем. :tea:

Re: Радиоуправление: делаем сами.

Вт авг 19, 2014 15:45:22

короче собрал на макетке схемку...
Изображение
вместо кнопок поставил переменные резисторы. Крутим резисторы... в приёмнике выводится код поочереди от двух резисторов одновременно. програмка получилась простенькой. пришлось увеличить пакеты до 30 бит. Ложных срабатываний не даблюдается при любом уровне сигнала. получился не совсем манчестерский код... но смысл тот же: при передаче "1" и "0" не повторяются более двух раз подряд. Т.е. нет постоянной составляющей... можно спокойно передавать по радиоканалу:
Изображение
короче после эксперементов пришёл к технологии простых пультов от телевизора (тот же принцип)... измеряем напряжение на входах (их может быть много) поочереди, очифровываем... делим на нужный коэффициент... переводим в "манчестерский код" и передаём по радиоканалу...
0(старт бит)-0101(номер кнопки)-0101010101(двоичный код величины напряжения)-1010(инверсия номера кнопки)-1010101010(инверсия кода величины напряжения)-1(стоп бит)-11111(синхро пауза). Ложных показаний нет. Время передачи про хорошем сигнале не более 70 мс. При слабом сигнале система тоже работает, только увеличивается время передачи... часть пакетов теряется, но команда всёравно выполняется:
Изображение
Т.е. система нормально работает при не сильно зашумленном сигнале:
Изображение
короче получилась базовая програмка для передачи как дискретный команд, так и пропорциональных (аналоговых сигналов). Можно "подкрутит" под конкретные задачи. Например улучшить распределение трафика или ещё что... Вот теперь мы можем передавать разные типы сигналов. Осталось приделать моторчики или релюшки... ))) :tea:
Вложения
rx1.c
(9.62 KiB) Скачиваний: 863
tx1 - 8.c
(6.94 KiB) Скачиваний: 849

Re: Радиоуправление: делаем сами.

Вт авг 26, 2014 21:55:26

продолжаем...
Накидал на макетке вот такую рабочую схемку пропорционального управления:
Изображение
Под рукой сервомашинок нет, поэтому все резисторы пока крутим вручную...
В ходе эксперементов выяснилось, что если медленно крутить резисторы управления, то в приёмнике появляются неоднозначности... АЦП измерят напряжение на входе вместе с помехами и выдаёт значения в пределах 0...31 (00011111), при этом при переходе напри от одного уровня к другому 1...2...3... АЦП выдает два значения 1 и 2... 2 и 3... и т.д... Т.е. моторчики будут дёргаться туда-сюда (или будет дребезг реле). Поэтому в программу передатчика (при необходимости и в приёмнике) добавил фильтр-гистерезис.
Фильтр-гистерезис: После оцифровки 0...5 V получаем код 0...1024. Устанавливаем коэффициент деления 16. Получаем 64 значения... Реально получаем 63 значения. Буфер меняет своё значение если отклонение будет более чем на два деления. Полученный результат делим на 2. Получаем 31 значение... Короче "дребезга" больше нет... Лучше пояснить с помощью графика:
Изображение
Думаю всё понятно.
А вот осциллограмма сигнала. Данные от двух АЦП передаются поочереди:
Изображение
Добавлена одна кнопка для демонтрации и проверки-вкл/выкл лампочки. Код лампочки передаёться между кодами АЦП.
Короче получилась рабочая базовая программа. Количество АЦП и кнопок как и раньше может быть любым. Вот. :tea:
Вложения
tx1 - 8.c
(7.84 KiB) Скачиваний: 889
rx1.c
(12.7 KiB) Скачиваний: 932

Re: Радиоуправление: делаем сами.

Вт сен 02, 2014 22:21:49

Такс... продолжим. Усложним задачу! :wink: Попробуем приделать ШИМ для плавной регулировки скорости движения (оборотов двигателя). Пробовал сделать ШИМ простыми логическими операциями в программе. Но возникла сложность получения точно заданного ШИМ... появляется "дребезг" ... фазовый шум.
Накидал макетку ИзображениеДля ШИМ используем встроенный в МК таймер №1... В даташите пишут что таймер работает независимо от выполнения основной программы... Проверяем. Крутим резистор... На выходе получаем плавную регулировку яркости лампочки 0...12 V. :tea:
Вложения
rx1.c
(2.83 KiB) Скачиваний: 840

Re: Радиоуправление: делаем сами.

Ср сен 03, 2014 15:09:43

я же уже давал схему http://radiokot.ru/circuit/analog/receiv_transmit/30/ там на форуме всё расписано... я собирал плату размером 5х7 см ... в пачке сигарет на КТ315. нужна ещё компактней ? :roll:

Продолжим... получилась схемка простой машинки с плавной регулировкой скрости (0...31) ИзображениеШИМ действительно работает независимо от основной программы. ИзображениеПолучаем чёткие импульсы на выходе. :)
Правда для полной картины нужно приделать ещё "задний ход". Таймер №1 в МК имеет один выход. Самое простое приделать релюшку "задний ход" к одной из кнопок. ИзображениеПравда управлять такой машинкой будет не очень удобно. Нужно приделать "автоматическую коробку передач" :))) Вот. :tea:
Вложения
tx1 - 8.c
(10.13 KiB) Скачиваний: 828
rx1.c
(15.95 KiB) Скачиваний: 823

Re: Радиоуправление: делаем сами.

Пт сен 05, 2014 21:35:22

Такс... "подкрутил" программу приёмника. Улучшил синхронизацию. Количество ошибок (при слабом сигнале) сократилось примерно в три раза. Передатчик пока не трогаем.
При хорошем сигнале всё работает чётко. При слабом сигнале всё это работает так:
пункт 1 - МК непрерывно анализирует состояние порта (ножка PC4)... ищем "синхро паузу" (пять подряд "1"):
Изображениепри обнаружении "синхро паузы" переходим к пункту 2.
пункт 2 - МК ждёт первый бит кода. Запускаем "запись" кода по первому биту кода:
При хорошем сигнале:
Изображение
При слабом сигнале:
Изображение
Анализируем код. Если код верный, выполняем соответствующую команду и "запоминаем" положение пакета в общем потоке...
пункт 3 Переходим к точке приёма следующего пакета. При этом если следующий пакет не верный (помеха) , то переходим к точке приема следующего пакета. Т.к. МК знает в какой момент времени придет следующий пакет, то МК сразу переходит к этой точке (при этом уменьшается вероятность помехи). Выпадение до 5 пакетов (задаётся при настройке) из общего потока не влияет на синхронизацию МК:
Изображение
При потери более 5 пакетов (высокий уровень помех или передатчик выключен) выключаем все кнопки переходим к поиску "синхро паузы" - пункт 1. Процесс замыкается.
При настройке можно задавать "вероятность" определения "0" и "1", в зависимости от того что нам важнее: скорость передачи или надежность системы (отсутствие ошибок). :roll:
Кстате! В МК ATmega8 есть втроенный UART. https://ru.wikipedia.org/wiki/%D3%ED%E8 ... 2%F7%E8%EA Правда, по даташиту там высокие требования к импульсам...
Вопрос! Как передать UART при таком сигнале ??? :Изображение... а было бы интересно :))) .

Короче вот. :tea:
Вложения
передатчик.c
(16.63 KiB) Скачиваний: 867
приёмник.c
(16.63 KiB) Скачиваний: 812

Re: Радиоуправление: делаем сами.

Пн сен 08, 2014 17:59:39

Продолжим... дошли до UART в ATmega8. На одном из форумов предлагали использовать UART для радиоуправления. Проверяем.
Накидал схемку: Изображение Программа несколько строчек... Радиопульт на 6 кнопок по UART. Получилась самая простая система радиоуправления ! :))) Нажимаем кнопку №1 > закидываем байт (00000010) в буфер UDR передатчика UART. При появлении байта в буфере UDR, передатчик автоматически переходит к передачи байта. Ждем пока передатчик передаст байт и закидываем следующий... Приёмник работает наоборот: при появлении "0" на входе, приёмник переходит к приёму байта. Ждём пока приёмник примет байт. Считываем принятый байт из буфера приёмника UDR и выводим на порт "D". Светодиоды показывают байт (номер кнопки). Вот и всё! :))) Вместо светодиодов подключаем реле или моторчики и катаем машинку или танчик ))).
Настройка: меняем местами резисторы на входе. Выставляем напряжение около 2,6 V. Если на входе МК напряжение больше половины напряжения питания МК (5 V), то МК воспринимает это как "1". Т.е. просто подтянули вход МК к "1". Вот и всё.
UART в чистом виде можно передать через обычную рацию, при низкой скорости: 110, 300, 600, 1200, 2400, 4800 (Baud Rant). Причем МК без кварца.
При хорошем сигнале как обычно всё работает чётко. Но даже небольшой шум - и сразу появляются ошибки. Причем ни Бит контроля четности , ни Стоп биты - 1 или 2 бита, не справляются с ошибками... Для примера так выглядит UART при скорости 1200(Baud Rant). Получили импульсы частотой 600 Гц: Изображение
Короче, использовать чистый UART, без фильтра (фильтра импульсов и фильтра ишибок) не рекомендуется. Вот. :tea:

Для интереса накидал програмку своего приёмника UART. Для сравнения:
Заводской UART при обнаружении бита работает так: Изображение Сделал тоже самое програмно, только увеличит время выборки на всю длительность импульса ИзображениеПолучился ФНЧ. (см. выше): Изображение. Как и ожидалось количество ошибок заметно уменьшилось. 115 выборок (столько выборок успевает сделать МК при тактовой частоте 1 МГц) против 3-х заводских... разница заметна. Ну а делее анализируем уже программно ошибки...
А вообще лучше перевести UART в манчестерский код и передавать "по человечески" - с кодировкой, с инверсией и т.д... (см. выше) :tea:
Всё это может пригодится если вдруг возникнет желание упралять машинкой или ещё чем с компьютера - через COM порт например, который работает по UART ... или через USB... - это ещё интересней )))) :P
Вложения
приёмник 6 кнопок.c
(1 KiB) Скачиваний: 844
передатчик 6 кнопок.c
(791 байт) Скачиваний: 575

Re: Радиоуправление: делаем сами.

Пн сен 15, 2014 22:34:37

Продолжим... :tea:
Последнии иследования показали, что использование синхронизации - не лучший способ передачи пакетов. Теряем время на поиск "правильного пакета" и синхронизацию по пакету... Поэтому пишем другой алгоритм. Меняем формат пакетов: 1(старт бит)-0101(номер АЦП)-0101010101(данные АЦП)-1010(инверсия номера АЦП) -1010101010(инверсия данных АЦП)-1(стоп бит)-0000(синхро пауза) - 35 бит. Изображение Пакет взяли в "рамочку" - "1______1" (старт бит - стоп бит). - Благодаря этому нам не важно чем начинаются и заканчиваются наши данные. В пакете никогда не повторяются "000" подряд (передача идет манчестерским кодом). МК анализирует каждый принятый бит и ищет синхро паузу - "000" подряд: Изображение. МК находит паузу даже в зашумленном сигнале. Приём начинается по первому пакету, без задержек на синхронизацию. При таком методе синхронизация не нужна. Количество ошибок при слабом сигнале примерно одинаковое с синхронизацией и без неё. Кроме того, пакеты могут быть разной длины: данные АЦП и ШИМ - более длинные, а пакеты кнопок -короткие, достаточно и 20 бит (см. выше). Позже поэкспериментируем. :tea:
Вместо "000" можно использовать любую кодовую комбинацию. Просто "000" - в данном случае самое простое. Для высокой скорости передачи (высокой скорости реакции) пакеты должны иметь минимальную длину.

Переходим к практике. Из всего выше сказанного получилось вот что: Схема собрана на макетке и протестирована. Схема передатчика:
Изображение
Схема приёмника:
Изображение
Передача без инверсии сигнала: "1" в передатчике = "1" в приёмнике. (соответственно "0" = "0").
Поворот влево-вправо Всё стандартно, как в заводской машинке. Только добавил "поворотники" (жёлтые диоды), которые автоматически начинают мигать при повороте влево-вправо соответственно (как в настоящем автомобиле). :roll:
Вперед-назад У ATmega8 только один выход ШИМ генератора. Точнее два генератора ШИМ и у каждого по одному выходу. Поэтому ничего лучше не придумал, как просто автоматический переключатель. Ещё при управлении (при остановки) трудно установить точно нейтральное (по центру) положение джойстика, поэтому для лучшей управляемости 4 деления сделал "стоп" (задаётся при настройке). Частоту ШИМ выбрал 1041 Hz. Можно выбрать из списка предделителя таймера, кратную 4. Можно взять например 260 Hz, но становятся заметны вибрации моторчика. При 1041 Hz ход более плавный, без вибрации.
Ещё осталось 4 кнопки, которые я ещё не придумал куда подключить :dont_know:
Время реакции модели (как и в предыдущих схемах) зависит от количества нажатых кнопок, т.к. все (нажатые) кнопки передаются по очереди. Если кнопки не нажаты, то передаются только пакеты АЦП и ШИМ. Соответсвенно время реакции не более двух пакетов т.е. около 0,1 секунды. Можно увеличить скорость передачи. Позже поэкспериментируем. :tea:
Вложения
tx1.c
(10.39 KiB) Скачиваний: 842
rx1.c
(17.76 KiB) Скачиваний: 544
Ответить