MultiWii

mahowik
omegapraim:

Они все сейчас стабильно летают, багов нет уже.

Во наивный! 😃
Баги есть всегда и везде! 😉

omegapraim

Я Александр про те баги которые наивному глазу юзера не видно, а если их невидно и все летает хорошо то значить их и нет)))))

Leon11t

Репост из дневника Маховика, ибо там никто не отвечает.
Доброго время суток. Появилась одна проблемка, на которую я не обращал внимания, до того момента как поставил на коптер камеру. Вот видео отзнятое несколько часов назад.

Скрин пидов.

Как слишно из видео, моторы дребезжат, коптер потряхивает. Прошивка МахоВии 3.1 На стандартных пидах та же фыгня. . Пропи балансированы. Плата АИН, стоит на резиновых демпферах их СД-Рома. На графиках на максимальном газу до отрыва от земли особых вибраций не наблюдается и дребезжаний коптера тоже.


Вот что разкоментил
#define KILL_VIBRO
#define KILL_SMALL_OSCILLATIONS
#define ITG3200_LPF_20HZ
#define MPU6050_LPF_20HZ

Подскажите что не так. Куда крутить ПИДы?

Raptor_SK
dnuos:

можно все беки паралельно

Если ВЕС-и линейные - то да, а если импульсные - оставить только один.

dnuos

я вообще использую один на контроллер, только не через моторные пины, а через вход питания на плате, один на жпс, итд, те стараюсь распределить нагрузку

omegapraim

Я юзаю внешний бек на 5А раньше юзал 1н рег все остальные отрубал. Суть в том что вероятность есть что сгорит но честно ни разу за все время обитания здесь не видел что бы кто то пожаловался что сгорело именно из-за этого. Но я перестраховщик)))) Лучше так чем отскребать потом остатки)))))

mataor
Leon11t:

Подскажите что не так

Leon11t:

Плата АИН, стоит на резиновых демпферах их СД-Рома.

повесить на скотч или вообще жестко закрепить

Leon11t
mataor:

повесить на скотч или вообще жестко закрепить

Ок, попробую сделать подвес по жоще. А как же остальная вибрация, станет же вибрировать на плату еще больше? Ща почитаю про вибророзвязку. Спасибо за ответ.

mataor

маховий ПРЕДНАЗНАЧЕН на жесткую установку… правда он не отменяет балансировку моторов и пропеллеров - это должен делать каждый для большего ресурса моторов и более долгого полета

serenya
Leon11t:

Репост из дневника Маховика

Может слишком мягкая виброразвязка? Попробуйте жестко поставить на нейлоновые стойки например.
p.s. извините, забыл обновить страницу, а тут оказывается уже ответили.

fleshget

Помогите разобраться с мультивием, я уже с ног валюся 😃

Мультивий SE 2.0, двигателя, гиры и акселя откалибровал (правда когда запускаю калибровку двигателей, то в конце “заливки” все моторы включаются на секунду-другую, а потом выключаются).

В общем проблема следующая: квадрик крутится по YAW и ниче не могу с этим сделать. (по часовой стрелке, если смотреть сверху на лопасти). Пробовал затримить влево на 110 единиц (стало в GUI код по YAW показывать 1390) - и все равно крутится!

То что смог определить: когда начинаю рукой квадрик вращать против вращения - то ощущается как бы продиводействие небольшое, по крайней мере звук изменения оборотов слышен. А когда рукой пытаюсь провернуть по вращению - ничего не слышу и не ощущаю…

Пробовал отключить ANGLE, то же самое - крутится по часовой стрелке.

Две недели назад мне демонстрировали работоспособность контроллера - все было отлично! А я вот собрал - крутится 😦

Что посоветуете??

Прилагаю конфиг мультивия. Было падение, луч один согнулся, может еще чего там отвалилось…

Горизонт держит отлично (не наклониш рукой). Аппаратура FlySky, шестиканальная, “центра” держит хорошо (1500 плюс-минус 6)

Taatarenkoff
fleshget:

Помогите разобраться с мультивием, я уже с ног валюся 😃
В общем проблема следующая: квадрик крутится по YAW и ниче не могу с этим сделать. (по часовой стрелке, если смотреть сверху на лопасти).

Проверяйте выкосы моторов после падения. 100% один мотор завален на бок вот и крутит. Сам так попался)

uwrtey

Можно попробовать включить самолетный режим,яв в этом случае будет третьей осью.

Я включил самолетный режим.
Но к сожалению получил не то что хотел.

Я хочу получить пропорциональное отклонение сервоприводов при отклонении платы от горизонта… ( чем сильнее плата отклонена от горизонта, тем больше угол отклонения сервопривода )

А в итоге я получил отклонение сервопривода с возвратом на исходную позицию.
Угол отклонения зависит от ускорения, с которым плата меняет свою ориентацию.

Как исправить ситуацию?

*******************************

mataor, Ты не нашел свою версию прошивки ?

mataor
uwrtey:

Ты не нашел свою версию прошивки ?

к сожалению не откопал… мож и удалил - с появлением БК она стала ненужной)))

но на самом деле там больше всего напичкано в разные режимы… сама стабилизация там практически исходная, чуток подправлена ток…
могу скинуть код тож под подвес но другого человека yadi.sk/d/7ZSKB0pRCFejq

uwrtey

Спасибо и на этом. А как это одним архивом качнуть?

uwrtey

Я хочу получить пропорциональное отклонение сервоприводов при отклонении платы от горизонта…

С этим я разобрался. Все это включается в ГУИ. Теперь сервоприводы отклоняются пропорционально с тангажем и креном.
Но вот с “курсом” то же самое я проделать не могу.
Кто подскажет “как быть”?

mataor

с курсом ток ручками… по гире как в БК не получится, а по компасу творит страшные вещи…

uwrtey

В смысле “только ручками” ?
Я че-то недопонял…
В смысле мультивий не подойдет? И придется прошивку самому переписывать?

romeo84

Всех приветствую!

Если кто разбирался, подскажите плз., каким где в коде в прошивке берутся данные с приёмника и где просчитанные данные выходят непосредственно к регулятором двигателей? Основная идея, считать AUX3 со свободной ножки.

Пробовал искать сам, но упираюсь в непонятки:

по идее, массив со считанными значениями формируется вот так вот

      rcData[ROLL] = Servo_Buffer[0];
      rcData[PITCH] = Servo_Buffer[1];
      rcData[THROTTLE] = Servo_Buffer[2];
      rcData[YAW] = Servo_Buffer[3];
      rcData[AUX1] = Servo_Buffer[4];
      rcData[AUX2] = Servo_Buffer[5];
      rcData[AUX3] = Servo_Buffer[6];
      rcData[AUX4] = Servo_Buffer[7]; 

Массив Servo_Buffer хитроумным способом считается так

temp_int = (256*RF_Rx_Buffer[1+(2*i)]) + RF_Rx_Buffer[2+(2*i)];
        if ((temp_int>1500) && (temp_int<4500)) Servo_Buffer[i] = temp_int/2;

Копаем глубже, temp_int идёт отсюда

temp_int = (256*RF_Rx_Buffer[1+(2*i)]) + RF_Rx_Buffer[2+(2*i)];

А RF_Rx_Buffer берём так

send_read_address(0x7f); // Что за адрес это такой?
    for(i = 0; i<17; i++) {//read all buffer
      RF_Rx_Buffer[i] = read_8bit_data();
    }   

Теперь тупик… Вот процедура чтения 8 бит данных с моими комментами

uint8_t read_8bit_data(void) {
  uint8_t Result, i;

  SCK_off; // PORTC &= 0xFB зачем-ть в порт С пихаем 1111 1011
  Result=0;
  for(i=0;i<8;i++) {                    //read fifo data byte
    Result=Result<<1;
    SCK_on;
    NOP();
    if(SDO_1) { // (PINC & 0x01) == 0x01 проверяем на первой ножке порта С логическую единичку...?? Как этим мы читаем PWM сигнал определённого канала, загадка!
      Result|=1;
    }
    SCK_off;
    NOP();
  }
  return(Result);
}  

Так где ж тут мы задаём с какой ножки микросхемы читать данные?? Можете “разжевать” эту функцию?

Если кто раскапывал это, поделитесь плиз, буду очень благодарен!

romeo84

Это код прошивки MultiWii_2_2, код функции из файла RX.INO

mataor

вы вообще полезли в абсолютно левые дебри…
вот чтение собственно сигналов:

#if defined(STANDARD_RX)

#if defined(FAILSAFE) && !defined(PROMICRO)
   // predefined PC pin block (thanks to lianj)  - Version with failsafe
  #define RX_PIN_CHECK(pin_pos, rc_value_pos)                        \
    if (mask & PCInt_RX_Pins[pin_pos]) {                             \
      if (!(pin & PCInt_RX_Pins[pin_pos])) {                         \
        dTime = cTime-edgeTime[pin_pos];                             \
        if (900<dTime && dTime<2200) {                               \
          rcValue[rc_value_pos] = dTime;                             \
          if((rc_value_pos==THROTTLEPIN || rc_value_pos==YAWPIN ||   \
              rc_value_pos==PITCHPIN || rc_value_pos==ROLLPIN)       \
              && dTime>FAILSAFE_DETECT_TRESHOLD)                     \
                GoodPulses |= (1<<rc_value_pos);                     \
        }                                                            \
      } else edgeTime[pin_pos] = cTime;                              \
    }
#else
   // predefined PC pin block (thanks to lianj)  - Version without failsafe
  #define RX_PIN_CHECK(pin_pos, rc_value_pos)                        \
    if (mask & PCInt_RX_Pins[pin_pos]) {                             \
      if (!(pin & PCInt_RX_Pins[pin_pos])) {                         \
        dTime = cTime-edgeTime[pin_pos];                             \
        if (900<dTime && dTime<2200) {                               \
          rcValue[rc_value_pos] = dTime;                             \
        }                                                            \
      } else edgeTime[pin_pos] = cTime;                              \
    }
#endif

  // port change Interrupt
  ISR(RX_PC_INTERRUPT) { //this ISR is common to every receiver channel, it is call everytime a change state occurs on a RX input pin
    uint8_t mask;
    uint8_t pin;
    uint16_t cTime,dTime;
    static uint16_t edgeTime[8];
    static uint8_t PCintLast;
  #if defined(FAILSAFE) && !defined(PROMICRO)
    static uint8_t GoodPulses;
  #endif

    pin = RX_PCINT_PIN_PORT; // RX_PCINT_PIN_PORT indicates the state of each PIN for the arduino port dealing with Ports digital pins

    mask = pin ^ PCintLast;   // doing a ^ between the current interruption and the last one indicates wich pin changed
    cTime = micros();         // micros() return a uint32_t, but it is not usefull to keep the whole bits => we keep only 16 bits
    sei();                    // re enable other interrupts at this point, the rest of this interrupt is not so time critical and can be interrupted safely
    PCintLast = pin;          // we memorize the current state of all PINs [D0-D7]

    #if (PCINT_PIN_COUNT > 0)
      RX_PIN_CHECK(0,2);
    #endif
    #if (PCINT_PIN_COUNT > 1)
      RX_PIN_CHECK(1,4);
    #endif
    #if (PCINT_PIN_COUNT > 2)
      RX_PIN_CHECK(2,5);
    #endif
    #if (PCINT_PIN_COUNT > 3)
      RX_PIN_CHECK(3,6);
    #endif
    #if (PCINT_PIN_COUNT > 4)
      RX_PIN_CHECK(4,7);
    #endif
    #if (PCINT_PIN_COUNT > 5)
      RX_PIN_CHECK(5,0);
    #endif
    #if (PCINT_PIN_COUNT > 6)
      RX_PIN_CHECK(6,1);
    #endif
    #if (PCINT_PIN_COUNT > 7)
      RX_PIN_CHECK(7,3);
    #endif

    #if defined(FAILSAFE) && !defined(PROMICRO)
      if (GoodPulses==(1<<THROTTLEPIN)+(1<<YAWPIN)+(1<<ROLLPIN)+(1<<PITCHPIN)) {  // If all main four chanells have good pulses, clear FailSafe counter
        GoodPulses = 0;
        if(failsafeCnt > 20) failsafeCnt -= 20; else failsafeCnt = 0;
      }
    #endif
  }
  /*********************      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;

      pin = PINB;
      cTime = micros();
      sei();
      #if defined(RCAUXPIN8)
       if (!(pin & 1<<0)) {     //indicates if the bit 0 of the arduino port [B0-B7] is not at a high state (so that we match here only descending PPM pulse)
      #endif
      #if defined(RCAUXPIN12)
       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)
      #endif
        dTime = cTime-edgeTime; if (900<dTime && dTime<2200) rcValue[0] = dTime; // just a verification: the value must be in the range [1000;2000] + some margin
      } else edgeTime = cTime;    // if the bit 2 is at a high state (ascending PPM pulse), we memorize the time
    }
    #endif
  #endif

а в функции void computeRC() получаем готовые значения в массив rcData[chan]

или же у вас OpenLRS плата?

и вообще подробней объясните задачу (какой контроллер?, зачем и что нужно? и т.д. )