Как принять сигнал с приемника в AVR (PWM|Digital)

eliash
V_Alex:

Рано спасибо говорить. Самое интересное только начинается😈. Я так полагаю, что из присутствующих в данной теме, БАНО только ленивый не строил. Итак, мой вариант (рабочий, сделанный в железе):

  1. два крыльевых огня (красный-зеленый),
  2. белый проблесковый огонь (двойной проблеск),
  3. красный проблесковый огонь (одинарный проблеск),
  4. посадочные фары.
    Потребители 1-3 включаются при импульсе >1.3 мс, потребитель 4 - подключается дополнительно при импульсе >1,7 мс. Цацка реализована на attiny13а, объем загружаемого кода - 224 бита (21,9% памяти). Код писался в ассемблере AVR Studio.
    Коллеги, озвучьте, плиз, свои камни и размер загружаемого кода.

Давайте если уж озвучивать, то сразу выкладывать рабочую конфу. Камень такой-то, размер такой-то, весит столько, прошивка вот.
а то не делал только ленивый, а вот в свободном доступе нету.

Мой вариант:
Arduino Pro Mini (ATmega168) = 2,5 грам
Прошивка 3114 байт с загрузчиком из 30720 доступных = 10,14% от возможного.
4 режима, 5 выходов и 1 пропорциональный вход.

V_Alex
eliash:

Давайте если уж озвучивать, то сразу выкладывать рабочую конфу. Камень такой-то, размер такой-то, весит столько, прошивка вот…

Попробую объяснить свою точку зрения. Рабочие коды коммерческих версий устройств выкладывать никто не будет. Project Ikar звучил это в соседней теме совершенно определенно. Я считаю это справедливым, поскольку затраты времени и здоровья на вылизывание софта могут быть весьма значительными. Именно поэтому я предложил поделиться той частью информации, которая не нанесет разработчикам вреда. Кто сочтет нужным выложить код, тот самостоятельно примет такое решение. Ваша версия БАНО коммерческой ценности не имеет ввиду явной неконкурентоспособности (без обид).

Musgravehill
V_Alex:

версия БАНО

В ArduCopter Mega (порт на АрдуМега 1280\2560) имеется БАНО, секвенсор. Код открыт.

eliash
V_Alex:

Попробую объяснить свою точку зрения. Рабочие коды коммерческих версий устройств выкладывать никто не будет. Project Ikar звучил это в соседней теме совершенно определенно. Я считаю это справедливым, поскольку затраты времени и здоровья на вылизывание софта могут быть весьма значительными. Именно поэтому я предложил поделиться той частью информации, которая не нанесет разработчикам вреда. Кто сочтет нужным выложить код, тот самостоятельно примет такое решение. Ваша версия БАНО коммерческой ценности не имеет ввиду явной неконкурентоспособности (без обид).

Что-то я не подумал про комэрцию 😃 есть в этом зерно истины:)
То есть все стараются на этом заработать 😃 окей, нуль-проблем!
Это только буржуи такие не жадные, и не стараются экономить на спичках? На их форумах хоть и с ошибками но код найти можно…

Musgravehill:

В ArduCopter Mega (порт на АрдуМега 1280\2560) имеется БАНО, секвенсор. Код открыт.

а что такое секвенсор здесь?

в версии Arducopter2.0.34 не нашел бано. Штука конечно очень интресная, но собрать ардукоптер - это не одного дня дело 😃

Musgravehill
eliash:

а что такое секвенсор здесь?

Олег Syberian писал код для последовательного переключения выходов. У него видео есть, где он на коптере включает БАНО, фару, еще что-то.

eliash:

в версии Arducopter2.0.34 не нашел бано

Вы ищите в профильной ветке - “ArduCopter Mega: порт на обычную Arduino (тестим)”. Там выложены различные версии.

eliash:

собрать ардукоптер

Не обязательно собирать. Просто посмотреть код. Он там “ардуиновский”.

V_Alex
eliash:

Что-то я не подумал про комэрцию 😃 есть в этом зерно истины:)
То есть все стараются на этом заработать 😃 окей, нуль-проблем!
Это только буржуи такие не жадные, и не стараются экономить на спичках? На их форумах хоть и с ошибками но код найти можно…

Не все, но некоторые пытаются 😃 . Даже та платформа, на которой Вы реализовали свой проект, производится с чисто коммерческими целями - есть ниша платежеспособных энтузиастов, следовательно она должна быть заполнена. А буржуи жадные по определению, просто настоящий буржуй умеет свою жадность контролировать 😃.

project_Ikar
V_Alex:

Не все, но некоторые пытаются 😃 . Даже та платформа, на которой Вы реализовали свой проект, производится с чисто коммерческими целями - есть ниша платежеспособных энтузиастов, следовательно она должна быть заполнена. А буржуи жадные по определению, просто настоящий буржуй умеет свою жадность контролировать 😃.

+1
Я не знаю за сколько купил мой земляк эту ардуину, но если б я собирал что-то подобное из комплектующих - потратил бы, что-то в районе 6-7$

msv

Человек сделал то что хотел, так как хотел и поделился этим. Мне показалось, что в последних постах пытаются убедить, что он сделал все не так, за дорого, и вообще неправ… Имхо странная реакция…

Musgravehill
eliash:

Это только буржуи такие не жадные, и не стараются экономить на спичках? На их форумах хоть и с ошибками но код найти можно…

Закрытый проект зачастую быстро отмирает. Единственный автор теряет интерес либо идеи. Открытые проекты живут долго. К тому же, мозговой штурм и множество участников могут “допилить” код до идеала.

Исходники на форумах = бесплатный аудит кода. Если автор настолько крут, что не нуждается в аудите, то может не выкладывать код.

V_Alex
msv:

Человек сделал то что хотел, так как хотел и поделился этим. Мне показалось, что в последних постах пытаются убедить, что он сделал все не так, за дорого, и вообще неправ… Имхо странная реакция…

Абсолютно ничего странного. Человек не знал, как решить техническую проблему, пришел на Форум и спросил. Респект ему за это. За два дня сам (или с нашей помощью) он разобрался и решил проблему - дважды респект. На заданный ему встречный технический вопрос он сразу-же дал конкретный ответ - трижды респескт.
Никто никого не пытается убедить, что он сделал что-то неправильно или задорого. Наоборот, он сделал все очень быстро (и недорого, потому как время тоже стоит денехх) и остался доволен полученным результатам. Это лишь подтверждает коммерческую ценность платформы, на которой он решил задачу. Но сама платформа не заточена под последующую серийную реализацию. Вот, собственно, и всё.

Musgravehill
project_Ikar:

Я не знаю за сколько купил мой земляк эту ардуину, но если б я собирал что-то подобное из комплектующих - потратил бы, что-то в районе 6-7$

В глубинке сильно дороже! В местном магазе за эти 7уе можно купить только кусочек текстолита. А еще нужен чип, которые не привозят (что avr, что ftdi за 300р), и обвязка “кондер\резистор по 5 р. за штуку”. Ладно, это решается посылкой (с 11 июля не решается=)

+риск накосячить и спалить.

  • например, мои ЛУТ выглядят страшнее любой готовой Ардуинки. Шелкографии нет, облужено не зеркально, зеленка не нанесена. Да и пайка не идеал.
V_Alex:

Человек не знал, как решить техническую проблему, пришел на Форум и спросил. Респект ему за это. За два дня сам (или с нашей помощью) он разобрался и решил проблему - дважды респект.

Присоединяюсь! Сам следил за этим топиком.

eliash
msv:

Прошу прощения, я понял что нужен генератор группового PPM, а не канального декодированного PWM. Для Вашей задачи особой точности не требуется и код вполне работоспособен… но контроль за переполнением CH1PulseStartTicks я бы все-таки сделал… 😃

что вы имеете ввиду? за переполнением чего сделать контроль? защиту от быстрого дерганья ручки- чтоли? (ну чтоб не завалось по количеству прерываний)
можно немого подробностей?

msv

Да не… все проще…
Просто бросается в глаза, что есть шанс между
CH1PulseStartTicks = micros();
и
Recv = micros() - CH1PulseStartTicks;
внутренняя переменная для функции micros() (наверняка она есть) переполнится и значение которое она вернет в второй строке будет меньше присвоенного в верхней строке. Если там тип long, случиться это не скоро, но я из тех программеров, которые всегда ставят рядом пустой и полный стаканы… Поэтому бы эту ситуацию предусмотрел, тем более что ее можно очень просто разрешить.

eliash
msv:

Да не… все проще…
Просто бросается в глаза, что есть шанс между
CH1PulseStartTicks = micros();
и
Recv = micros() - CH1PulseStartTicks;
внутренняя переменная для функции micros() (наверняка она есть) переполнится и значение которое она вернет в второй строке будет меньше присвоенного в верхней строке. Если там тип long, случиться это не скоро, но я из тех программеров, которые всегда ставят рядом пустой и полный стаканы… Поэтому бы эту ситуацию предусмотрел, тем более что ее можно очень просто разрешить.

ну это даже если произойдет - то всего лишь могут потухнуть огни, до следующей посылки. А посылки идут каждые 20 милисекунд. что-то мне подсказывает, что оно если и моргнет - то никто этого не зметит.
Я ж правильно понимаю, что приемник ретранслирует от передатчика каждую посылку?

msv

Тут такое дело, если Вы оценили вероятность некоторого необработанного события, учли все явные и косвенные последствия, которое оно может вызвать, и что оно не приведет к каким-то фатальным событиям системы (типа деления на ноль, неожиданного ветвления с возможностью переполнения стека итд итп), то конечно можно его игнорировать. Но чаще гораздо проще рядом с полным стаканом поставить пустой из анекдота и быть уверенным, что все предусмотрено на случай если пить не захочется… 😃 Эта мысль не к Вашему конкретному коду, а в принципе, о “культуре” программирования… Типа даже шутка была, что в “хорошей” программе должно быть не меньше 50% кода на обработку ситуаций, которые не случаются никогда. 😃

V_Alex

Вариант “битых” пакетов и полного пропадания сигнала в программе стоит предусмотреть, а сам девайс после изготовления как следует погонять.
В жизни бывает всякое. Например, увлечетесь полетами в сумерках, сядет передатчик, а следом “погаснет” самолет. Обидно…

eliash
msv:

Тут такое дело, если Вы оценили вероятность некоторого необработанного события, учли все явные и косвенные последствия, которое оно может вызвать, и что оно не приведет к каким-то фатальным событиям системы (типа деления на ноль, неожиданного ветвления с возможностью переполнения стека итд итп), то конечно можно его игнорировать. Но чаще гораздо проще рядом с полным стаканом поставить пустой из анекдота и быть уверенным, что все предусмотрено на случай если пить не захочется… 😃 Эта мысль не к Вашему конкретному коду, а в принципе, о “культуре” программирования… Типа даже шутка была, что в “хорошей” программе должно быть не меньше 50% кода на обработку ситуаций, которые не случаются никогда. 😃

Согласен полностью!

V_Alex:

Вариант “битых” пакетов и полного пропадания сигнала в программе стоит предусмотреть, а сам девайс после изготовления как следует погонять.
В жизни бывает всякое. Например, увлечетесь полетами в сумерках, сядет передатчик, а следом “погаснет” самолет. Обидно…

О, а вот над этим действительно надо поработать… как то ушло из виду такое поедение!

1 month later
RL2000

Здравствуйте! Тожа заинтересован в считывания сигнала PWM с помощью ATmega. Прерывания по rise/fall, расчет числа тиков, но ведет себя странно. С приемника/серво-тестера сигнал ни в какую не считывает (подтягивающий резистор и включал, и выключал). А вот если завести PWM-сигнал с меги, то все прекрасно считывается, да и при обычной коммутации на +5В тоже все работает. Может, кто подкинет идею, в чем причина такой ерунды? Заранее спасибо!

V_Alex

Уровень сигнала с сервотестера может быть мал. Если в нем стоит стабилизатор на 3,3 В, а на внешнем проце 5 В, то система может глючить. Нужно согласовать уровни сигналов, например через транзисторный каскад.
Или попробуйте завести сигнал с сервотестера на вход аналогового компаратора Меги, а второй вход компаратора кинуть на внутренний опорник. В этом случае амплитуды входного сигнала должно хватить.

harrystar

Для начала напишите маленькую проверочную прогу, которая считывает состояние ноги к которой подключен сигнал и это же состояние выставляет на другой ноге. Соотв. у вас должен получиться программный “повторитель”. На вход подаете сигнал с сервотестера, на выход вешаете серву. Если все работает, значит все соединено правильно, все уровни совпадают и все подтяжки выставлены тоже правильно. Дальше уже можно писать код. Вместо сервы можно подключить резистор со светодиодом. Различие 1 мс импульсов от 2 мс импульсов видно на глаз (по изменению яркости).

RL2000

Добрый вечер! Спасибо за советы! Внезапно разобрался во всем сам. Не тот порт заткнул, когда все прояснилось - цифры на LCD стали показывать правильные длительности импульса. Правда, при попытке выдать принятый PWM на выход (через 16-битный таймер, т.к. основная программа занята), серва дергается. Дискретизация по времени приема PWM с сервотестера - порядка 52мкс, если ставить больше, как писали - 2000 тиков таймера на 2мс, то на основную программу просто не остается тактов процессора. Вообще, все это нужно чтобы в полете в какой-то момент отобрать управление у приемника и заставить серву исполнять сигнал по программе процессора. Может, лучше поставить транзистор, который будет закрывать путь для прохода PWM-сигнала с приемника по команде процессора?