Вторник, 19.03.2024, 06:50
RC - Мастерская
Главная | Каталог статей | Регистрация | Вход
Меню
Статистика
Главная » Статьи » Чертежи и проекты » Микроконтроллеры

s.Bus декодер для расширения числа каналов
s.Bus декодер для расширения числа каналов

Обновление прошивки (версия 2)


Владельцы аппаратуры Turnigy 9X/9XR или FrSky Taranis так или иначе задавались вопросом получения более 8 каналов управления.
Сами эти пульты дают возможность транслировать на модель до 16 каналов. Но необходимо еще чтоб данную возможность поддерживали вч-модуль и приемник. На сегодняшний день есть как минимум 2 вч-модуля, которые дают такую возможность:

 

  • OrangeRx DSM2/DSMX - дает до 14 каналов. Правда стоит сказать, что на 14 каналов работает нестабильно. Приемлемый уровень стабильности обеспечивается при трансляции 12 каналов.
  • FrSky XJT - позволяет транслировать 16 каналов стабильно.

 

А вот с приемниками вышка проблемка. FrSky предлагает использовать 2 приемника - первый принимает первые 8 каналов, второй принимает вторые 8. OrangeRx вообще ничего не предлагает. Цена приемника FrSky 1200р, OrangeRx - 1100р за 8 каналов. Правда оба эти приемники предоставляют шину s.Bus с которой можно получить все 16 каналов при помощи специальных декодеров. Цена декодера 500р за 4 канала и 1000р в комплекте с картой программирования за те же 4 канала. Т.е. для решения задачи нам надо заплатить 1000р за декодеры и 500р за карту. Это вполне сопоставимо с ценой приемника и как-то слишком дорого.

Но друзья-китайцы так же дают нам все необходимые возможности для того чтоб получить желаемое минимум в 2 раза дешевле. Я предлагаю сделать свой собственный декодер, который даст все 16 каналов с шины s.Bus без всяких карт программирования.

О протоколе s.Bus я уже писал тут. Так же нам понадобится:

  1. микросхема 74HC14, которую можно за копейки купить в любом магазине радиодеталей.
  2. Arduino Mini на atMega168 - 300р на Паркфлаере.
  3. Планка контактов для подключения сервоприводов - 50р на Паркфлаере
  4. Маленькая макетная плата - 140р на Паркфлаере за 4 шт., но понадобится только одна

Итого: 400 - 450р

Так же понадобится паяльник и в меру прямые руки.

Схема будущего устройства предельно проста.

Микросхема 74HC14 представляет собой элемент булевой логики "НЕ" и содержит 6 таких элементов. Нам понадобится всего один.

Глядя на даташит подводим питание на выводы 7 и 14, 2 подключаем к выводу Rx Arduino, вывод 1 - к сигнальному контакту входной планки. Имеет смысл между выводом 1 микросхемы логики и Arduino впаять перемычку и вывести так же на контакт пин Tx. Это понадобится на случай, если Вы когда-нибудь захотите перепрошить контроллер.

Для начала собрал схему для отладки:

Вертикально стоящая плата справа - это USB-to-TTL преобразователь для подключения к ПК и заливки прошивки. На Паркфлаере есть достаточно много вариантов таких преобразователей - подойдет любой.

Далее пишем прошивку.
Для работы с s.Bus велосипед изобретать не будем - возьмем готовую библиотеку.

#include <FUTABA_SBUS.h>
FUTABA_SBUS sBus;


Для формирования выходного сигнала используем таймер 1 (длительность импульсов) и таймер 2 (контроль частоты импульсов). Импульсы на каналах будут сдвинуты относительно друг друга. Поэтому все 16 выходов разделим на два банка, чтобы за 20мкс успеть выдать сигнал на каждый канал. Для банка А будет использован первый компаратор, а для В - второй.
Настройка таймеров производится в функции Timer1_init().

Таймеру 1 выставляем делитель на 8 для получения отсчета 1/2мкс
  TCCR1B = 0<<CS12 | 1<<CS11 | 0<<CS10;
и разрешаем прерывания обоих компараторов
  TIMSK1 = (1<<OCIE1A) | (1<<OCIE1B);

Для таймера 2 устанавливаем делитель на 256
  TCCR2B = 1<<CS22 | 1<<CS21 | 0<<CS20;
сброс по совпадению
  TCCR2A = 1<<WGM21;
и разрешаем прерывание от первого компаратора
  TIMSK2 = 1<<OCIE2A;
Прерывание таймер будет генерить каждый раз, как досчитает до 68(число подобрано эмпирически под выходной импульс приемника OrangeRx DSMX 8 каналов).
  OCR2A = 68;

Не стоит забывать, что таймер 2 - восьмиразрядный. Именно из-за этого приходится выставлять ему такие настройки. Так же будем использовать только каждое 10-ое его прерывание.
  if (cnt==10)

По этому прерыванию будем производить инициализацию выходных каналов.
Для каждого канала в прерывании компаратора будем выполнять следующие действия:

 - выключим импульс на текущем канале
  ServoOff(curr_chA);

 - переход к следующему каналу
  curr_chA++;

 - установим следующее время срабатывания прерывания
    OCR1A = TCNT1 + SET_TIME(curr_chA);

 - включим импульс на новом канале
    ServoOn(curr_chA);

Итого получим выходные импульсы для всех 16-ти каналов.

Собственно осталось спаять схему и все!



 
Таким образом мы получили простой декодер к приемнику с шиной s.Bus для подключения устройств на 16 независимых каналов. При этом экономия составила минимум 500р.

Я нарочно не стал травить плату, а использовал Arduino, чтоб показать доступность изготовления такого устройства. Гуру легко смогут это сделать и получат еще уменьшение веса, габаритов и стоимости. Так же есть широкое поле деятельности по оптимизации кода прошивки. Но и в таком варианте устройство работает стабильно и выполняет свои функции.

Скачать исходники прошивки.
Категория: Микроконтроллеры | Добавил: Mactep (28.11.2013)
Просмотров: 14515 | Комментарии: 18 | Теги: decoder, Arduino, SBus, S.Bus | Рейтинг: 0.0/0
Всего комментариев: 18
5 Plohish  
0
чтобы не нагружать проц, можно сделать например с "джампиком" либо 16 по отдельности, либо один CPPM

6 Mactep  
0
16 каналов разделены на 2 банка.
Можно доработать так, чтобы при наличии перемычки между 1 и 2 каналами банка на 3 генерился CPPM из 8 каналов этого банка.
В итоге каждый банк может генерить либо канальные импульсы, либо CPPM.
Сделать это не сложно. Код открыт...

7 Plohish  
0
весь фокус в том, что 8 канальных приёмников с CPPM пруд пруди...
а вот на 16 нету sad

кстати странная позиция разработчика - я сделал как сделал, хотите что то доделать код открыт... что в переводе означает - "мне похеру делайте сами"

8 Mactep  
0
Ок. Напишу как будет время.

А позиция простая: я делал то, в чем имел необходимость. Это не какой-то коммерческий продукт рассчитанный на массового потребителя. Я просто сделал нечто и этим поделился. Front-end я естественно разрабатываю на других условиях.

9 Plohish  
0
ну оно понятно, тогда зачем спрашивал какие замечания и т.д. smile ?

если сделаешь думаю будет вещь полезная.

10 Mactep  
0
Замечания: один человек багу нашел. Мелочь конечно, но неприятная... 8 канал сбоил. Я сказал ему спасибо и поправил исходники. smile

11 Mactep  
0
Итого по существу предполагаю сделать следующее:
1. каналы можно будет переназначать, менять порядок, дублировать и т.д. Настройку этой фичи пока сделаю "гвоздями" в коде.
2. Для банка А замыкание выхода 1 и 2 перемычкой будет приводить к формированию CPPM по его каналам на выходе 3.
3. Для банка В замыкание выхода 15 и 16 перемычкой будет приводить к формированию CPPM по его каналам на выходе 14.
4. С учетом 1 можно будет получить любые 8 каналов с каждого выхода CPPM.
5. Т.к. банки независимы, то допустимо формирование CPPM на одном и канальных импульсов на другом.

Что забыл?

12 Plohish  
0
а как на один вход приёмника подавать 16 каналов с двух выводов вашего устройства?
нужно на одном выходе 16 каналов...

13 Mactep  
0
Никак. Большинство устройств просто не в состоянии распознать в CPPM более 8-ми каналов. Если 8-ми канальный CPPM имеет достаточно стандартные характеристики, то на 16 каналов они очень сильно разнятся.
Я могу запихнуть в PPM сколько угодно каналов. Но при этом время одного фрейма возрастет до безобразия(45мс и более). Как результат, время отклика становится неприемлемым.
Вариант 2 - уменьшение паузы между каналами и уменьшение синхропаузы. Но тут возрастает вероятность, что конечное устройство ошибочно примет синхропаузу за канальный импульс или "проспит" паузу между каналами.
Вариант 3 - pcm. но тут все еще хуже - отсутствует хоть какая-то стандартизация. и такой сигнал большинство устройств точно не распознает.

Такую штуку надо делать под конкретное принимающее устройство. Только у меня таких нет.

14 Mactep  
0
Заглянул в мультивий. С PPM он больше 8-ми каналов снять не может. Хотя он умеет читать s.Bus. И вот с него он снимает все 16 каналов

15 Plohish  
0
как тогда работает вот это устройство?
http://www.frsky-rc.com/product/pro.php?pro_id=112

16 Mactep  
0
Я думаю, что только с 8-ю.
16 каналов х 2200мкс = 35.2мс Это без пауз между каналами и синхропаузы.
А по Вашей ссылке на картинке значится длина фрейма 21/28мс.
16 каналов в 28мс физически не влезет.

17 Plohish  
0
понятно, но тогда и городить огород не стоит... приёмник с выходом в 8 каналов CPPM не проблема...

18 Mactep  
0
Дык и я о том же.
2 8-ми канальных CPPM - не проблема. CPPM для автопилота + вторые 8 каналов PWM - тоже. Но зачем?

4 Plohish  
0
комментарии как то криво отображаются, на в хронологическом порядке...

3 Plohish  
0
сейчас, например на таранисе пошли приёмники с S.bus но нет выхода CPPM, а многие LRS и автопилоты не умеют работать с S.bus

1 Plohish  
0
Хорошее и нужное устройство, но если бы вы добавили ещё и выход CPPM - цены бы ему не было!

2 Mactep  
0
А смысл?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск