Специальные цены   новые товары
Закрытая тема
Страница 1 из 6 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 40 из 204

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

Тема раздела Бортовая электроника в категории Cамолёты - Общий; Хочу принять на ардуину канал с приемника. Как различать разные положения крутилки? Его в ШИМ (PWM) ногу или в обычную ...

  1. #1

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144

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

    Хочу принять на ардуину канал с приемника. Как различать разные положения крутилки?
    Его в ШИМ (PWM) ногу или в обычную цифровую? или в аналоговую? как вообще ходит сигнал из приемника к перефирийным устройствам?

    (Arduino mini= 2,5 грамм, Апаратура TH9b FlySky, приемник обычный 8-ми канальный)

  2.  
  3. #2

    Регистрация
    26.04.2011
    Адрес
    Киев, Украина
    Возраст
    36
    Сообщений
    112
    Илья, обычно я принимаю сигнал с приемника в AVR так - подается он на вход с обработкой внешнего прерывания, это значит, когда меняется фронт сигнала ШИМ от приемнка с возростающего - на спадающий и наооборот, авр генерирует прерывание. Дальше при помощи таймера мы подсчитываем длину импульса ШИМ-сигнала и пишем соответсвующий код реакции...
    вообщем все просто, если Вы хорошо знакомы с программированием контроллеров..
    Также различаются разные положения крутилки - это разные длины ШИМ импульса, которые меряются выше указанным мной способом...
    Я так делал свою электронику для серв, кил свичи, реверсы, замедлители и др. устройства, управляемые ШИМом..

  4. #3

    Регистрация
    16.12.2005
    Адрес
    Москва
    Возраст
    35
    Сообщений
    4,452
    Записей в дневнике
    13
    Ежели без sum ppm, то банально: начинаем при появлении высокого уровня, останавливаемся при исчезновении высокого уровня.
    Время между этими двумя событиями и есть сигнал приемника.

    Высчитывать это можно и таймерами, и прерываниями, и банальным millis() в основном цикле

  5. #4

    Регистрация
    07.06.2008
    Адрес
    Москва
    Возраст
    47
    Сообщений
    8,296
    Цитата Сообщение от eliash Посмотреть сообщение
    Его в ШИМ (PWM)
    Обязательно!
    Иначе- замучаетесь ложняки вылавливать.

  6.  
  7. #5

    Регистрация
    26.04.2011
    Адрес
    Киев, Украина
    Возраст
    36
    Сообщений
    112
    Цитата Сообщение от blade Посмотреть сообщение
    Обязательно!
    Иначе- замучаетесь ложняки вылавливать.
    Если бы ув. blade разбирался в контроллерах он бы знал, что Arduino mini нога PWM обозначает только то, что с неё удобно получать ШИМ, читаем описание: "Pins 3, 5, 6, 9, 10, and 11 can provide PWM output; for details see the analogWrite() function."
    Но упомянутая нога, может быть и входом для ШИМ, также нога №2 может быть входом для ШИМ..
    осталось написать соответсвующий код для этого контроллера..

  8. #6

    Регистрация
    07.06.2008
    Адрес
    Москва
    Возраст
    47
    Сообщений
    8,296
    Цитата Сообщение от project Ikar Посмотреть сообщение
    Если бы ikar разбирался в контроллерах он бы знал
    Если бы Вы разбирались в чём нибудь, кроме болтологии, то знали бы что, например в Атмега 8 (я на них делал автопилот, поэтому все тонкости их схемотехники мне известны) есть две ноги, заточенные на приём PWM сигнала- а именно 5 и 6 (в дип 28 версии) и две- заточенные на выдачу его же (но уже обработанного-15,16).
    Не вдаваясь в изучение Ат368 или 1280, почему то склонен считать, что организация портов на них-аналогичная.
    И именно затем, чтобы человек не муд...чался, разбираясь- почему длительность ШИМ сигнала на входе- определяется то так, то эдак, а на выходе- импульс трясётся, что вызывает рычание серв- я ему и посоветовал найти входы/выходы аппаратно заточенные на обработку PWM.

  9. #7

    Регистрация
    26.04.2011
    Адрес
    Киев, Украина
    Возраст
    36
    Сообщений
    112
    Цитата Сообщение от blade Посмотреть сообщение
    Если бы Вы разбирались в чём нибудь, кроме болтологии, то знали бы что, например в Атмега 8 (я на них делал автопилот, поэтому все тонкости их схемотехники мне известны) есть две ноги, заточенные на приём PWM сигнала- а именно 5 и 6 (в дип 28 версии) и две- заточенные на выдачу его же (но уже обработанного-15,16).
    Не вдаваясь в изучение Ат368 или 1280, почему то склонен считать, что организация портов на них-аналогичная.
    И именно затем, чтобы человек не муд...чался, разбираясь- почему длительность ШИМ сигнала на входе- определяется то так, то эдак, а на выходе- импульс трясётся, что вызывает рычание серв- я ему и посоветовал найти входы/выходы аппаратно заточенные на обработку PWM.
    Ну, во-первых, я согласен с тем, что я немного резковато выразился насчет Вашей личности, это потому что Вы в соседней теме меня раздражали,..
    А по существу вот, что скажу - пин 5 атмеги8 (кстате у Arduino mini используется чип атмега 168, который идентичен по разпиновке атмеге8, ну это Вы и так знаете), так вот этот пин №5 в дип версии, мало чем отличается, например, от пина №4 - это просто братья-близнецы, кроме порта ввода-вывода, они еще имеют функцию подключения источников внешнего прерывания.. Пин6 - отличается от выше указанных, тем, что, цитирую из даташита "XCK (USART External Clock Input/Output) T0 (Timer/Counter 0 External Counter Input)" тоесть внешнее тактирование интерфейса УСАПП, или внешнее тактирование таймера/счетчика0..
    Короче говоря, в этом контроллере нет специально заточенных ног на ШИМ-вход, на выход есть(!), но на вход - самые удобные ноги - это уже названные мною, те самые братья-близнецы, потому что они дают возможность более легкую программу написать, для обработки ШИМа.. И по большему счету, при достаточном владении языком программирования, можно написать код, который обработает, адекватно ШИМ, если даже его будете подавать на другие ноги (понятное дело - кроме служебных, питание и т.д.).
    А тяслось у Вас, только потому, что, видимо Вы забыли поставить так называемую подтяжку, или была криво написана прога.
    Я делал проекты на разных кристаллах, в том числе на меге8 - ничего у меня не тряслость и работало четко...

    Если Вы не согласны с тем, что я изложил тут, ув. blade, то пожалуйсто ткните в меня местом из даташита на указанный Вами мега8, где сказано, что названные Вами ножки (5 и 6) "заточены под ШИМ". Буду Вам признателен.

  10.  
  11. #8

    Регистрация
    29.06.2007
    Адрес
    Москва
    Возраст
    65
    Сообщений
    3,925
    Цитата Сообщение от project Ikar Посмотреть сообщение
    ничего у меня не тряслость и работало четко
    Извините, что вмешиваюсь: а у Вас "не тряслось" в "Протеусе" или Вы сервы подключали?

  12. #9

    Регистрация
    09.08.2003
    Адрес
    Москва
    Возраст
    54
    Сообщений
    8,120
    Вставлю и я пятачок . Сразу оговорюсь, что в теме микроконтроллеров я недавно, поэтому тягаццо с мэтрами по части знания даташитов не буду. Но модельной электроникой я занимаюсь четверть века, поэтому представление о том, что должно получиться в результате, у меня присутствует.
    В общем, у меня делается так:
    1) Обработка импульса ведется в прямом цикле, без таймеров и прерываний (для новичка это важно, помогает избежать гимора на этапе знакомства с железом).
    2) Первый-второй импульсы после включения пропускаются (они могут быть битыми и привести к неверной отработке устройства).
    3) Разрядность при обработке должна быть выше разрешающей способности сервы (у меня импульсу 1,5 мс соответствует 2000-2500 тиков), это избавит от дерганья сервы.
    4) Сам импульс должен сразу проверяться на пригодность к дальнейшей обработке (у меня это диапазон 0,8-2,2 мс).
    5) Если на выходе после обработки должен получаться дискретный сигнал, используется "защелка" с гистерезисом в 2-3 тика, это исключит ложные срабатывания вблизи точки переключения.
    6) Если на выходе после обработки должен получаться ШИМ, то "защелка" не нужна.
    7) Если на выходе должен быть какой-то результирующий сервоимпульс, то правила его формирования должны соответствовать п.п. 1 и 3., тактировать выходные импульсы лучше входными, обработку вести во время синхропаузы.
    8) Для обеспечения максимальной совместимости по уровням сигнала, импульс желательно обрабатывать на входе аналогового компаратора, но это не обязательно.
    9) Схема обязательно макетируется, только это гарантирует ее нормальную последующую работу на рабочей плате.
    Данные советы на системах с ИИ не проверялись, но вполне пригодны в 90% случаев для простых модельных устройств типа сервореверсера, подкала, коллекторного регулятора оборотов и т.д.

  13. #10

    Регистрация
    26.04.2011
    Адрес
    Киев, Украина
    Возраст
    36
    Сообщений
    112
    Цитата Сообщение от foxfly Посмотреть сообщение
    Извините, что вмешиваюсь: а у Вас "не тряслось" в "Протеусе" или Вы сервы подключали?
    Я протеусом не пользуюсь вообще, как при написании прог так и при проектировании и сборки железа. Прошивки проверяю на макете или на конструкторе или непосредственно на железе..

  14. #11

    Регистрация
    07.06.2008
    Адрес
    Москва
    Возраст
    47
    Сообщений
    8,296
    Цитата Сообщение от V_Alex Посмотреть сообщение
    1) Обработка импульса ведется в прямом цикле, без таймеров и прерываний (для новичка это важно, помогает избежать гимора на этапе знакомства с железом).
    Вот именно это и достигается применением аппаратно-заточенных под ШИМ входов/выходов.
    Иначе, даже выглядящие вполне прилично на осциллографе канальные импульсы, вызывают тряску серв

  15. #12

    Регистрация
    26.04.2011
    Адрес
    Киев, Украина
    Возраст
    36
    Сообщений
    112
    Цитата Сообщение от blade Посмотреть сообщение
    Вот именно это и достигается применением аппаратно-заточенных под ШИМ входов/выходов.
    Иначе, даже выглядящие вполне прилично на осциллографе канальные импульсы, вызывают тряску серв
    выглядящие вполне прилично на осциллографе импульсы, не могут вызывать тряску серв, повторяю - эта проблема решается правильно написаным софтом и установкой "подтяжек"..

    И опять же, нету у контроллера аппаратно-заточеннх под ШИМ входов (не путать с выходами!)..
    Ув. blade, разъясните мне пожалуйсто, что такое по Вашему "аппаратно-заточенный под ШИМ вход" и что за чудо схемотехника стоит за этим входом, что он носит гордое название "аппаратно-заточенный"?..
    Вот, просто, любопытно, сколько занимаюсь контроллерами с детальным изучением даташитов и впервые вижу такое определение, просветите пожалуйсто)

  16. #13
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    55
    Сообщений
    2,367
    ICP

  17. #14

    Регистрация
    26.04.2011
    Адрес
    Киев, Украина
    Возраст
    36
    Сообщений
    112
    Цитата Сообщение от msv Посмотреть сообщение
    ICP
    ну извините меня, ICP в атмега8 это - 14 нога, а не названные выше, и она обозначает вход триггера захвата фронта таймера-счетчика 1. Им можно мерять импульсы, не спорю (правда там есть свои нюансы), но например в том же ардуино используется для этих целей нога с альтернативной функциеей - внешнее прерывание по изменению фронта, а почему? потому, что так проще код написать - через внешнее прерывание, и что освобождает процессор от всяких циклов с задержками для других задач..
    У меня был такой проект, где в меге8 - был и сервотестер, и замерщик ШИМ-сигнала, для активаций оборудования, и слежения за линией питания, и вся телеметрия эта, передавалась по последовательной шине другому контроллеру. Все происходило в одно и тоже время, прошивка заняла 95% места в кристалле...

  18. #15

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Окей, из приемника выходит PPM. мерять его по изменению фронта. это уже более-мение понятно.

    Подскажите, чем вы эмулируете PPM в протеусе? там есть генираторы П импульсов - но как тестить? запустил с одной величиной - потом остановил - запустил с другой?
    а тут же еще надо последовательность _П_I--I_ как получить вход, для отладки в протеусе?

  19. #16
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    55
    Сообщений
    2,367
    Просто читая таймер по прерыванию имеем нестабильность на время входа в прерывание. Это как мин 4 такта проца, как макс. время окончания подпрограммы другого прерывания или просто по каким то причинам запрещены прерывания (запись в EEPROM итп). C ICR все железно, достаточно смотреть флаги и читать значения не реже времени строба или по тому же прерыванию. Для протеуса в качестве генератора PPM использовал Easy HDL, там пишется простейший луп с необходимыми длительностями. Для отладки вполне достаточно.

  20. #17

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Цитата Сообщение от msv Посмотреть сообщение
    Просто читая таймер по прерыванию имеем нестабильность на время входа в прерывание. Это как мин 4 такта проца, как макс. время окончания подпрограммы другого прерывания или просто по каким то причинам запрещены прерывания (запись в EEPROM итп). C ICR все железно, достаточно смотреть флаги и читать значения не реже времени строба или по тому же прерыванию. Для протеуса в качестве генератора PPM использовал Easy HDL, там пишется простейший луп с необходимыми длительностями. Для отладки вполне достаточно.
    Вас не затруднит примерчик такого скрипта опубликовать?

  21. #18
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    55
    Сообщений
    2,367
    Да там все просто, что-то типа:
    Код:
    LBL_START:
    REM CH1 -------------
    OUT=0
    SLEEP FOR 0.0004
    OUT=1
    SLEEP FOR 0.0011
    REM CH2 -------------
    OUT=0
    SLEEP FOR 0.0004
    OUT=1
    SLEEP FOR 0.0011
    REM CH3 -------------
    OUT=0
    SLEEP FOR 0.0004
    OUT=1
    SLEEP FOR 0.0011
    REM CH4 -------------
    OUT=0
    SLEEP FOR 0.0004
    OUT=1
    SLEEP FOR 0.0011
    REM CH5 -------------
    OUT=0
    SLEEP FOR 0.0004
    OUT=1
    SLEEP FOR 0.0011
    REM CH6 -------------
    OUT=0
    SLEEP FOR 0.0004
    OUT=1
    SLEEP FOR 0.0004
    REM SYN -------------
    OUT=0
    SLEEP FOR 0.0004
    OUT=1
    SLEEP FOR 0.0026
    GOTO LBL_START

  22. #19

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Ээээ, то есть в каждый канал с приемника поступает вся пачка состояний каналов???
    что-то я не понял....
    или же только один канал выходит?
    то есть
    1) -
    2) + 4,8-6 вольт с бека
    3) PPM посылка соответсвующая данному каналу, длинною в 2500мс из которой в первые 400 мс синхропауза, потом длина отклонения стика пропорциональна длине сигнала. но не больше 2100мс

    я правильно понял?

  23. #20

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Все разобрался, всем спасибо за разъяснения.
    Теперь с помощью ардуины у меня есть БАНО.
    4 режима:
    1) режим готовности, все выключено.
    2) режим стоянки, работают только стояночные огни (габориты).
    3) режим взлета и посадки, включается такси фонарь (передние фары) и стробы.
    4) полетный режим, работают габариты и строба. такси фонарь выключен.
    код:
    Код:
    ////////////////////////////////////////////////////////////////////
    // BANO Arduino mini pro. 2,5 gramm. Channal for managment.  
    // Illia Golovatskyi mailto: ipspider@i.ua
    ////////////////////////////////////////////////////////////////////
    int ledTAXI = 2;                  // LED connected to digital pin 2 (4)  Front of the plane.
    int ledWHITE = 4;               // LED connected to digital pin 4 (6)  On the ruder.
    int ledRED   = 7;                 // LED connected to digital pin 7 (13) On the left console
    int ledGREEN = 8;               // LED connected to digital pin 8 (14) On the right console
    int ledFLY = 10;                  // LED connected to PWM pin 10 (16)    Strobe.  
    int pinInput = 3;                 // Input managment channel pin 3 (5)
    volatile int Recv;                 // store RC signal pulse length
    int Norm;                           // mapped value to be between 0-100
    volatile long  CH1PulseStartTicks;
    int CH1Ready;
    volatile int ParkFire = false;
    volatile int TaxiFire = false;
    volatile int FlyFire = false;
    unsigned  long  FlyStartTicks;
    unsigned long  FlyTicks;
    int BlinkFire = false;
    int FadeLow = 25;
    int FadeHigh = 255;
    ////////////////////////////////////////////////////////////////////
    void test () {
    digitalWrite(ledRED, HIGH);    // set the LED on
    digitalWrite(ledGREEN, HIGH);  // set the LED on
    digitalWrite(ledWHITE, HIGH);  // set the LED on
    digitalWrite(ledTAXI, HIGH);   // set the LED on
    analogWrite(ledFLY, 255);      // set the LED on
    delay(3000);                   // wait for a second
    digitalWrite(ledRED, LOW);     // set the LED off
    digitalWrite(ledGREEN, LOW);   // set the LED off
    digitalWrite(ledWHITE, LOW);   // set the LED off
    digitalWrite(ledTAXI, LOW);    // set the LED off
    analogWrite(ledFLY, 0);        // set the LED off
    }
    ////////////////////////////////////////////////////////////////////
    void setup()  { 
      // nothing happens in setup 
      pinMode(ledRED, OUTPUT);
      pinMode(ledGREEN, OUTPUT);
      pinMode(ledWHITE, OUTPUT);
      pinMode(ledTAXI, OUTPUT);
      pinMode(pinInput, INPUT); //PPM inputs from RC receiver
      attachInterrupt(1, ch1, CHANGE);    // catch interrupt 1 (digital pin 3) going HIGH and send to rc1()
      test(); 
    } 
    ////////////////////////////////////////////////////////////////////
    void ch1()
    {
      if (digitalRead( pinInput ) == HIGH)// did the pin change to high or low?
      {
        CH1PulseStartTicks = micros();// store the current micros() value
      }
      else
      {
        // Pin transitioned low, calculate the duration of the pulse
        Recv = micros() - CH1PulseStartTicks; // may glitch during timer wrap-around
        // Set flag for main loop to process the pulse
        CH1Ready = true;
      }
    }
    ////////////////////////////////////////////////////////////////////
    void ParkLed(){
      if (ParkFire) {
          digitalWrite(ledRED, LOW);     // set the LED off
          digitalWrite(ledGREEN, LOW);   // set the LED off
          digitalWrite(ledWHITE, LOW);   // set the LED off
          ParkFire = false;
      } else {
          digitalWrite(ledRED, HIGH);    // set the LED on
          digitalWrite(ledGREEN, HIGH);  // set the LED on
          digitalWrite(ledWHITE, HIGH);  // set the LED on
          ParkFire = true;
      }
    }
    ////////////////////////////////////////////////////////////////////
    void TaxiLed(){
      if (TaxiFire) {
          digitalWrite(ledTAXI, LOW);     // set the LED off
          TaxiFire = false;
      } else {
          digitalWrite(ledTAXI, HIGH);    // set the LED on
          TaxiFire = true;
      }
    }
    ////////////////////////////////////////////////////////////////////
    void FlyLed(){
      if (FlyFire) {
          digitalWrite(ledFLY, LOW);     // set the LED off
          FlyFire = false;
      } else {
          digitalWrite(ledFLY, HIGH);    // set the LED on
          FlyFire = true;
          FlyStartTicks = millis();
      }
    }
    ////////////////////////////////////////////////////////////////////
    void loop(){ 
     if (CH1Ready) {
        CH1Ready = false; // reset input flag
        // constrain and map the pulse length
        Norm = map(constrain(Recv, 1000, 2000), 1000, 2000, 0, 100);
        // Update LED
        if (Norm < 10) { // All LED is off.
          if (ParkFire == true) {ParkLed(); }
          if (TaxiFire == true) {TaxiLed(); }
          if (FlyFire  == true) {FlyLed(); }
          digitalWrite(ledTAXI, LOW);    // set the LED off 
        } else if (Norm < 25) { // Park light is on. (Red on left console, Green on right console and White on ruder)
            if (ParkFire == false) {ParkLed();}
            if (TaxiFire == true)  {TaxiLed(); }
            if (FlyFire  == true) {FlyLed(); }
        } else if (Norm < 50) { // Landing mode: Park light + taxi + strobe LED is on.
            if (ParkFire == false) {ParkLed();}
            if (TaxiFire == false) {TaxiLed(); }
            if (FlyFire  == false) {FlyLed(); }
        } else if (Norm < 75) { // Fly mode: Park light is on, strobe is blinking
            if (ParkFire == false) {ParkLed();}
            if (TaxiFire == true) {TaxiLed(); }     
            if (FlyFire == false) {FlyLed();}
        }
    }
    if (FlyFire == true) {
      FlyTicks = millis() - FlyStartTicks;
      if (BlinkFire) {   
         if (FlyTicks >100) {
           analogWrite(ledFLY,FadeLow);
           FlyStartTicks = millis();
           BlinkFire=false;     
         }
      } else {
         if (FlyTicks >500) {
           analogWrite(ledFLY,FadeHigh);
           FlyStartTicks = millis();
           BlinkFire=true;
         }  
      }
    }
    ////////////////////////////////////////////////////////////////////
    } // End of loop;
    ////////////////////////////////////////////////////////////////////
    Последний раз редактировалось eliash; 12.07.2011 в 02:28.

  24. #21
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    55
    Сообщений
    2,367
    Прошу прощения, я понял что нужен генератор группового PPM, а не канального декодированного PWM. Для Вашей задачи особой точности не требуется и код вполне работоспособен.. но контроль за переполнением CH1PulseStartTicks я бы все-таки сделал..

  25. #22

    Регистрация
    09.08.2003
    Адрес
    Москва
    Возраст
    54
    Сообщений
    8,120
    Цитата Сообщение от eliash Посмотреть сообщение
    Все разобрался, всем спасибо за разъяснения.
    Теперь с помощью ардуины у меня есть БАНО...
    Рано спасибо говорить. Самое интересное только начинается. Я так полагаю, что из присутствующих в данной теме, БАНО только ленивый не строил. Итак, мой вариант (рабочий, сделанный в железе):
    1) два крыльевых огня (красный-зеленый),
    2) белый проблесковый огонь (двойной проблеск),
    3) красный проблесковый огонь (одинарный проблеск),
    4) посадочные фары.
    Потребители 1-3 включаются при импульсе >1.3 мс, потребитель 4 - подключается дополнительно при импульсе >1,7 мс. Цацка реализована на attiny13а, объем загружаемого кода - 224 бита (21,9% памяти). Код писался в ассемблере AVR Studio.
    Коллеги, озвучьте, плиз, свои камни и размер загружаемого кода.

  26. #23

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Цитата Сообщение от 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 пропорциональный вход.
    Последний раз редактировалось eliash; 12.07.2011 в 10:35.

  27. #24

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

  28. #25

    Регистрация
    11.01.2011
    Адрес
    Ярославль
    Возраст
    30
    Сообщений
    1,561
    Цитата Сообщение от V_Alex Посмотреть сообщение
    версия БАНО
    В ArduCopter Mega (порт на АрдуМега 1280\2560) имеется БАНО, секвенсор. Код открыт.

  29. #26

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Цитата Сообщение от V_Alex Посмотреть сообщение
    Попробую объяснить свою точку зрения. Рабочие коды коммерческих версий устройств выкладывать никто не будет. Project Ikar звучил это в соседней теме совершенно определенно. Я считаю это справедливым, поскольку затраты времени и здоровья на вылизывание софта могут быть весьма значительными. Именно поэтому я предложил поделиться той частью информации, которая не нанесет разработчикам вреда. Кто сочтет нужным выложить код, тот самостоятельно примет такое решение. Ваша версия БАНО коммерческой ценности не имеет ввиду явной неконкурентоспособности (без обид).
    Что-то я не подумал про комэрцию есть в этом зерно истины
    То есть все стараются на этом заработать окей, нуль-проблем!
    Это только буржуи такие не жадные, и не стараются экономить на спичках? На их форумах хоть и с ошибками но код найти можно...

    Цитата Сообщение от Musgravehill Посмотреть сообщение
    В ArduCopter Mega (порт на АрдуМега 1280\2560) имеется БАНО, секвенсор. Код открыт.
    а что такое секвенсор здесь?

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

  30. #27

    Регистрация
    11.01.2011
    Адрес
    Ярославль
    Возраст
    30
    Сообщений
    1,561
    Цитата Сообщение от eliash Посмотреть сообщение
    а что такое секвенсор здесь?
    Олег Syberian писал код для последовательного переключения выходов. У него видео есть, где он на коптере включает БАНО, фару, еще что-то.
    Цитата Сообщение от eliash Посмотреть сообщение
    в версии Arducopter2.0.34 не нашел бано
    Вы ищите в профильной ветке - "ArduCopter Mega: порт на обычную Arduino (тестим)". Там выложены различные версии.
    Цитата Сообщение от eliash Посмотреть сообщение
    собрать ардукоптер
    Не обязательно собирать. Просто посмотреть код. Он там "ардуиновский".

  31. #28

    Регистрация
    09.08.2003
    Адрес
    Москва
    Возраст
    54
    Сообщений
    8,120
    Цитата Сообщение от eliash Посмотреть сообщение
    Что-то я не подумал про комэрцию есть в этом зерно истины
    То есть все стараются на этом заработать окей, нуль-проблем!
    Это только буржуи такие не жадные, и не стараются экономить на спичках? На их форумах хоть и с ошибками но код найти можно...
    Не все, но некоторые пытаются . Даже та платформа, на которой Вы реализовали свой проект, производится с чисто коммерческими целями - есть ниша платежеспособных энтузиастов, следовательно она должна быть заполнена. А буржуи жадные по определению, просто настоящий буржуй умеет свою жадность контролировать .

  32. #29

    Регистрация
    26.04.2011
    Адрес
    Киев, Украина
    Возраст
    36
    Сообщений
    112
    Цитата Сообщение от V_Alex Посмотреть сообщение
    Не все, но некоторые пытаются . Даже та платформа, на которой Вы реализовали свой проект, производится с чисто коммерческими целями - есть ниша платежеспособных энтузиастов, следовательно она должна быть заполнена. А буржуи жадные по определению, просто настоящий буржуй умеет свою жадность контролировать .
    +1
    Я не знаю за сколько купил мой земляк эту ардуину, но если б я собирал что-то подобное из комплектующих - потратил бы, что-то в районе 6-7$

  33. #30
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    55
    Сообщений
    2,367
    Человек сделал то что хотел, так как хотел и поделился этим. Мне показалось, что в последних постах пытаются убедить, что он сделал все не так, за дорого, и вообще неправ.. Имхо странная реакция..

  34. #31

    Регистрация
    11.01.2011
    Адрес
    Ярославль
    Возраст
    30
    Сообщений
    1,561
    Цитата Сообщение от eliash Посмотреть сообщение
    Это только буржуи такие не жадные, и не стараются экономить на спичках? На их форумах хоть и с ошибками но код найти можно...
    Закрытый проект зачастую быстро отмирает. Единственный автор теряет интерес либо идеи. Открытые проекты живут долго. К тому же, мозговой штурм и множество участников могут "допилить" код до идеала.

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

  35. #32

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

  36. #33

    Регистрация
    11.01.2011
    Адрес
    Ярославль
    Возраст
    30
    Сообщений
    1,561
    Цитата Сообщение от project Ikar Посмотреть сообщение
    Я не знаю за сколько купил мой земляк эту ардуину, но если б я собирал что-то подобное из комплектующих - потратил бы, что-то в районе 6-7$
    В глубинке сильно дороже! В местном магазе за эти 7уе можно купить только кусочек текстолита. А еще нужен чип, которые не привозят (что avr, что ftdi за 300р), и обвязка "кондер\резистор по 5 р. за штуку". Ладно, это решается посылкой (с 11 июля не решается=)

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

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

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

  37. #34

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Цитата Сообщение от msv Посмотреть сообщение
    Прошу прощения, я понял что нужен генератор группового PPM, а не канального декодированного PWM. Для Вашей задачи особой точности не требуется и код вполне работоспособен.. но контроль за переполнением CH1PulseStartTicks я бы все-таки сделал..
    что вы имеете ввиду? за переполнением чего сделать контроль? защиту от быстрого дерганья ручки- чтоли? (ну чтоб не завалось по количеству прерываний)
    можно немого подробностей?

  38. #35
    msv
    msv вне форума

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

  39. #36

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Цитата Сообщение от msv Посмотреть сообщение
    Да не.. все проще..
    Просто бросается в глаза, что есть шанс между
    CH1PulseStartTicks = micros();
    и
    Recv = micros() - CH1PulseStartTicks;
    внутренняя переменная для функции micros() (наверняка она есть) переполнится и значение которое она вернет в второй строке будет меньше присвоенного в верхней строке. Если там тип long, случиться это не скоро, но я из тех программеров, которые всегда ставят рядом пустой и полный стаканы.. Поэтому бы эту ситуацию предусмотрел, тем более что ее можно очень просто разрешить.
    ну это даже если произойдет - то всего лишь могут потухнуть огни, до следующей посылки. А посылки идут каждые 20 милисекунд. что-то мне подсказывает, что оно если и моргнет - то никто этого не зметит.
    Я ж правильно понимаю, что приемник ретранслирует от передатчика каждую посылку?

  40. #37
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    55
    Сообщений
    2,367
    Тут такое дело, если Вы оценили вероятность некоторого необработанного события, учли все явные и косвенные последствия, которое оно может вызвать, и что оно не приведет к каким-то фатальным событиям системы (типа деления на ноль, неожиданного ветвления с возможностью переполнения стека итд итп), то конечно можно его игнорировать. Но чаще гораздо проще рядом с полным стаканом поставить пустой из анекдота и быть уверенным, что все предусмотрено на случай если пить не захочется.. Эта мысль не к Вашему конкретному коду, а в принципе, о "культуре" программирования.. Типа даже шутка была, что в "хорошей" программе должно быть не меньше 50% кода на обработку ситуаций, которые не случаются никогда.

  41. #38

    Регистрация
    09.08.2003
    Адрес
    Москва
    Возраст
    54
    Сообщений
    8,120
    Вариант "битых" пакетов и полного пропадания сигнала в программе стоит предусмотреть, а сам девайс после изготовления как следует погонять.
    В жизни бывает всякое. Например, увлечетесь полетами в сумерках, сядет передатчик, а следом "погаснет" самолет. Обидно...

  42. #39

    Регистрация
    09.03.2010
    Адрес
    Киев, Украина
    Возраст
    38
    Сообщений
    144
    Цитата Сообщение от msv Посмотреть сообщение
    Тут такое дело, если Вы оценили вероятность некоторого необработанного события, учли все явные и косвенные последствия, которое оно может вызвать, и что оно не приведет к каким-то фатальным событиям системы (типа деления на ноль, неожиданного ветвления с возможностью переполнения стека итд итп), то конечно можно его игнорировать. Но чаще гораздо проще рядом с полным стаканом поставить пустой из анекдота и быть уверенным, что все предусмотрено на случай если пить не захочется.. Эта мысль не к Вашему конкретному коду, а в принципе, о "культуре" программирования.. Типа даже шутка была, что в "хорошей" программе должно быть не меньше 50% кода на обработку ситуаций, которые не случаются никогда.
    Согласен полностью!

    Цитата Сообщение от V_Alex Посмотреть сообщение
    Вариант "битых" пакетов и полного пропадания сигнала в программе стоит предусмотреть, а сам девайс после изготовления как следует погонять.
    В жизни бывает всякое. Например, увлечетесь полетами в сумерках, сядет передатчик, а следом "погаснет" самолет. Обидно...
    О, а вот над этим действительно надо поработать.. как то ушло из виду такое поедение!

  43. #40

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

Закрытая тема

Похожие темы

  1. Ответов: 423
    Последнее сообщение: 14.08.2014, 10:04
  2. Фиксированная скорость нарастания сигнала PPM
    от АДэшник в разделе Самодельная электроника, компьютерные программы
    Ответов: 3
    Последнее сообщение: 16.05.2011, 17:36
  3. Продам Приемник "Pilotage-6 Digital", 40MHz, FM, микро, 6 каналов
    от Bizon в разделе Барахолка. Аппаратура
    Ответов: 4
    Последнее сообщение: 15.02.2011, 11:03
  4. RSSI сигнал на приёмнике 1.2 ГГц
    от =FLY= в разделе Полеты по камере, телеметрия
    Ответов: 9
    Последнее сообщение: 13.02.2011, 17:10
  5. PWM, PPM, частоты
    от ultrablox в разделе Новичкам
    Ответов: 10
    Последнее сообщение: 22.10.2010, 16:35

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения