MultiWii

serenya

Ну то что код подшаманить можно это понятно, а это был ответ на

mataor:

так задействуйте… в конфиге есть все для этого

romeo84
mataor:

хех… кто тебе такое сказал? 😛

я уже делал подобное, жертвуеш ненужной сейчас ногой, небольшая добавка кода - и вуаля все 4 аукса

кстати тут же если сделать одну мааааленькую правку - уже получаем работающий аукс 3

Благодарю. Сейчас попробую реализовать… Отпишусь как получится. Ведь явно не хватает двух ауксов…

PS Блин, как же тяжело без отладки что-либо делать ((

romeo84

Итак, если кому надо,

добавляем каналы AUX2, AUX3, AUX4 в прошивку MultiWii 2.3, Плата Crius multiwii se

  1. Раскомментить в config.h (строка 388)
#define RCAUXPIN8
#define RCAUXPIN12

так как иначе эти пины настроятся будут работать не на вход, а на выход на всякие там BUZZERы и т.д.

  1. В RX.cpp разрешаем прерывания от нужных нам пинов
/*************    atmega328P's Specific Aux2 Pin Setup    *********************/
    #if defined(PROMINI)
     #if defined(RCAUXPIN)
        PCICR  |= (1 << 0) ; // PCINT activated also for PINS [D8-D13] on port B
        #if defined(RCAUXPIN8)
          PCMSK0 = (1 << 0); PCMSK0 |= (1 << 3); PCMSK0 |= (1 << 4);
        #endif
        #if defined(RCAUXPIN12)

        #endif
      #endif
    #endif
  1. В RX.cpp настраиваем обработку прерываний от этих же пинов и формируем значения в ауксах от приёмника
/*********************      atmega328P's Aux2 Pins      *************************/
  #if defined(PROMINI)
    #if defined(RCAUXPIN)
    /* this ISR is a simplification of the previous one for PROMINI on port D
       it's simplier because we know the interruption deals only with one PIN:
       bit 0 of PORT B, ie Arduino PIN 8
       or bit 4 of PORTB, ie Arduino PIN 12
     => no need to check which PIN has changed */
    ISR(PCINT0_vect) {
      uint8_t pin;
      uint16_t cTime,dTime;
      static uint16_t edgeTime;
      static uint16_t edgeTimeAux[4]; // 0 не используется, 1 для aux2, 2 для aux3, 3 - резерв
      static uint8_t auxIntLast; // сохранённое состояние битов порта B после предыдущего прерывания
      uint8_t auxMask; // маска для определения изменённого входа порта B

      pin = PINB;
      auxMask = pin ^ auxIntLast;   // doing a ^ between the current interruption and the last one indicates wich pin changed
      cTime = micros();
      sei();
      auxIntLast = pin;          // we memorize the current state of all PINs [B0-B7]

      if (auxMask & 1<<0) { // если меняется бит 0 порта B (выход D08 на плате), то формируем aux2
        if (!(pin & 1<<0)) {     //indicates if the bit 4 of the arduino port [B0-B7] is not at a high state (so that we match here only descending PPM pulse)
          dTime = cTime-edgeTimeAux[1]; if (900<dTime && dTime<2200) rcValue[0] = dTime; // just a verification: the value must be in the range [1000;2000] + some margin
        } else edgeTimeAux[1] = cTime;    // if the bit 2 is at a high state (ascending PPM pulse), we memorize the time
      }

      if (auxMask & 1<<4) { // если меняется бит 4 порта B (выход D12 на плате), то формируем aux3
        if (!(pin & 1<<4)) {     //indicates if the bit 4 of the arduino port [B0-B7] is not at a high state (so that we match here only descending PPM pulse)
          dTime = cTime-edgeTimeAux[2]; if (900<dTime && dTime<2200) rcValue[1] = dTime; // just a verification: the value must be in the range [1000;2000] + some margin
        } else edgeTimeAux[2] = cTime;    // if the bit 2 is at a high state (ascending PPM pulse), we memorize the time
      }

      if (auxMask & 1<<3) { // если меняется бит 3 порта B (выход D11 на плате), то формируем aux4
        if (!(pin & 1<<3)) {     //indicates if the bit 4 of the arduino port [B0-B7] is not at a high state (so that we match here only descending PPM pulse)
          dTime = cTime-edgeTimeAux[2]; if (900<dTime && dTime<2200) rcValue[3] = dTime; // just a verification: the value must be in the range [1000;2000] + some margin
        } else edgeTimeAux[2] = cTime;    // if the bit 2 is at a high state (ascending PPM pulse), we memorize the time
      }


    }
    #endif
  #endif

Работает замечательно. Единственное, если выдернуть из платы провода всех ауксов, то вновь добавленные принимают хаотичные значения (то есть все, кроме aux1). Видать, где-то надо добавить дефолтное значение, если сигнала на пин не поступает. Где это делается - искать уже оочень в лом.

Вот итоги 3-х часового мучения и поиска багов в собственном коде… Подскажите, кто как отлаживает код? …перепрошивать девайс по 10 раз для того, чтобы фиг знает как угадать, что не ту переменную подставил это анреал мучения ))

flygreen

Народ, попробовал в Криус 2.0 SE залить base 2.1 от Маховика . Все работает кроме бародатчика. Чего не так могу делать ?

Или она изначально со старыми платами нефунциклирует ?

PS При этом обычная 2.2 работает…

Leon11t
flygreen:

Народ, попробовал в Криус 2.0 SE залить base 2.1 от Маховика

А вы прочтите пару последних абзацов и все станет понятно 😃)

Dhole
flygreen:

Или она изначально со старыми платами нефунциклирует ?

Гриш, Саша ваял свою прошивку под All in One, а там иной баро, нежели в SE.
И спецыяльно отмечено, что с иными вариациями MultiWii прошивка может работать криво, например.

Хотя - работает ))

Если охота поиметь все плюшки, то надлежит брать AOIP.

mataor

для старого баро есть файлик ИМУ с пометкой бмп085, но такого резултата как с мс5611 недобьетесь, будет в пределах метра-полутора бултыхаться
там разница и в коде, и в пидах

ну и оба варианта на мпу6050 рассчитаны соответственно

moscow

Собрал лёгкий квадрик на AIOP, залил туда MultiWii 2.3. Включил Horizont, а Baro вынес на переключатель пульта. Пробовал поднять квадрик с выключенным Baro - никакого намёка на стабилизацию высоты, резкие подъёмы и падения. Что, собственно логично.

Включить Baro? Мне не нужны ни удержание высоты “как в mahowii”, не нужен Naza-стиль полёта (газ в роли управления высотой, а не газом собственно), нужно как в старой MultiWii 2.1 - использование барометра для плавности высоты. Это уже нереально с новыми прошивками?

Завтра попробую на улице запустить жука, в комнате страшно включать Baro. Помню давныыым-давно, когда только-только mahowii отделялся от mw, включение этого удержания уносило мой коптер высокооооо в небо 😃, возможно из-за недогрузки - давно было.

Поянисните, пожалуйста, как используется барометр в официальном MultiWii 2.2 (я так понимаю, по 2.3 пока мало информации, так как он вышел несколько дней назад)?
Смотрю changelog между 2.2 и 2.3, по барометру нашёл только одно изменение - калибровка на земле с учётом температуры.

Мощность висения не точно 50%, помню это тоже имело значение… На назе в последнее время летал 😃, но решил мелкий квадрик на мультике собрать.

kostya-tin

по идее баро нужно включать в полете, т.к. при его включении запоминается положение стика газа и это положение и является точкой удержания высоты. лично делаю так и в штиль у меня на 2.2 у меня высота скачит где то на сантиметров 20 - не больше

moscow
kostya-tin:

по идее баро нужно включать в полете, т.к. при его включении запоминается положение стика газа и это положение и является точкой удержания высоты. лично делаю так и в штиль у меня на 2.2 у меня высота скачит где то на сантиметров 20 - не больше

Понятно.
Поднял сегодня во дворе, переключил в баро. Скачет жутко. Но у меня мотор один разбит и паралоном не закрывал барометр ещё. Идея ясна, буду доделывать. Спасибо.

vAkUuM

Здраствуйте, поставил NanoWii на GAUI 330. Пытаюсь подсоединить по SBUS приёмник futaba r7008sb. Пока никакие танцы с бубном не помогают. Ставили другой приёмник, тоже futaba, но предыдущую модель на такую же конфигурацию все получилось с первой попытки. На зарубежных форумах пишут что вроде на этом приёмнике futaba изменила протокол SBUS. Может у кого получилось соединить их?

Leon11t

Коллеги, написал тут небольшую прогу для прощета магнитного склонения для мультивия. Прошу потестить под себя, ну и критика также приветствуется. digiua.com/multiwii-mag-declination-calc/ Коменты можете оставлять, прямо там на сайте или здесь.

Taatarenkoff

За проведенный труд 5ка. Но в самом коментарии к дефайну есть эта супер сложная формула на 3 математических действия.

Convert the degree+minutes into decimal degree by ==> degree+minutes*(1/60)
Note the sign on declination it could be negative or positive (WEST or EAST)

Быстрее посчитать чем скачивать и запускать посторонний экзешник с подозрительно толстым размером 0.5мб

Leon11t

Сама прога весит 12кб, все остальное иконка )) В маховии я етой формулы не заметил.

bond62

сегодня обкатывал прошивку 2.3 на плате MULTIWII microWII c GPS по I2C .( влезла в при тык ) 5 минут полет был достаточно стабильный - висел на баро хорошо, удержание и возврат домой отрабатывал на ура . Потом на высоте 8 метров резкий останов движков всех сразу и результат - воткнулся в землю. электронику спасла банка пластиковая сама в вдребезги а контроллер целый. Очень спасает уже не первое падение и всегда электроника целая. Склоняюсь к тому что завис контроллер. У меня по шине I2C самодельная плата на модуль GPS стоит - I2C GPS NAV . возможно из-за неё.

mahowik
Leon11t:

Сама прога весит 12кб, все остальное иконка )) В маховии я етой формулы не заметил.

Все там есть… это мультивийное… смотрите около дефайна магнитного склонения

Leon11t
mahowik:

Всетам есть… это мультивийное… смотрите около дефайна магнитного склонения

Get your magnetic decliniation from here : magnetic-declination.com
Convert the degree+minutes into decimal degree by ==> degree+minutes*(1/60)
Note the sign on declination it could be negative or positive (WEST or EAST) */

Но оно не обясняет как конвертнуть градусы в минути.
Да и вообще, это школьная программа за седьмой клас😁
Не сильно вникая в текст написаного, я понял что нужно градуси додать к минутам, а потом умножить на результат 1/60

Taatarenkoff
Leon11t:

Да и вообще, это школьная программа за седьмой клас
Не сильно вникая в текст написаного, я понял что нужно градуси додать к минутам, а потом умножить на результат 1/60

Вот именно что школьная программа 😉 Умножение и деление имеют приоритет перед сложением/вычитанием.

varvar

Джентльмены, которые пытаются мучиться с версией 2.3 - если хотите запустить i2c_gps с малтивием - поправьте сначала багу в коде www.multiwii.com/forum/viewtopic.php?f=8&t=4246&p=…

Какого … автор полез в тот кусок кода, который прекрасно работал в предыдущей версии? 😃

bond62
varvar:

Джентльмены, которые пытаются мучиться с версией 2.3 - если хотите запустить i2c_gps с малтивием - поправьте сначала багу в коде www.multiwii.com/forum/viewtopic.php?f=8&t=4246&p=…

Какого … автор полез в тот кусок кода, который прекрасно работал в предыдущей версии? 😃

спасибо за подсказку. три ошибки которые выскакивали при инсталляции после правки исчезли. осталось проверить в полете.

fleshget

Вопрос по калибровке акселей и гироскопов перед каждым вылетом: иногда в поле параллельной земле поверхности нет. А что будет если калибрануть их, а коптер не идеально параллельно земле будет? Он так “криво” и летать будет? Я думаю что его будет “тянуть” вбок.
Или по уровню площадку выставлять? Или лучше откалибровать на заведомо параллельной плоскости (допустим дома), а перед вылетом не калиброваться?

flygreen

Вроде он и на кривой поверхности нормально инициализируется. Думается мне что это не калибровка…что-то другое. ИМХО. Еще не разу не включал на идеально ровном месте. Все вроде ровно летает…

serenya
fleshget:

Или лучше откалибровать на заведомо параллельной плоскости (допустим дома), а перед вылетом не калиброваться?

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

Tigra74
serenya:

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

Я уже задавал вопрос-но у меня при каждом включени калиибруется и гирик,и и аксель.
Плата MultiWii 328P Flight Controller w/FTDI & DSM2 Port.
Глюк платы,или в прошивке что-то пропустил?