MultiWii

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 плата?

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

uwrtey

mataor, в смысле “ручками” ?
в смысле код целиком переписать ?

varvar

Господа, а что сказать мультивию, чтобы замедлить скролинг по меню OLED дисплея или вообще заставить переключать пункты по шагам? Что-то он у меня так быстро с пункта на пункт перескакивает, попасть в нужное место меню практически нереально.

В настройках стоит

      #define OLED_I2C_128x64
      #define SUPPRESS_OLED_I2C_128x64LOGO
      #define DISPLAY_FONT_DSIZE
      #define LCD_CONF

Телеметрия не включена за ненадобностью.

AlexeyStn
varvar:

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

Я делал следующим образом:
В файле “LCD.ino” есть функция “configurationLoop()”
Там есть такое место:


if (refreshLCD) {
      ConfigRefresh(p);
      refreshLCD = 0;
    }

Туда я добавил обычную задержку в 200 миллисекунд и скроллинг стал медленнее. Но и настройка параметров тоже стала медленнее.


if (refreshLCD) {
      ConfigRefresh(p);
      refreshLCD = 0;
      delay(200);
    }
flygreen

Народ, а кто какие ПИДы ставит на удержание высоты ? У меня коптер колбасит примерно два-два с половиной метра по высоте. Тудым-сюдым. Датчик паралонкой закрыт. Вчера на поле с собой нотер брал, тыркал,тыркал так и не держит высоту. Болтается…

Пиды выставил так P 2.0 I 0 D 0 Плата криус СЕ.

witalik17

Подскажите пожалуйста.Купил платку летавшую,нужно залить немного другую прошивку.Проблема в том что пробовали на 5 разных компах,3 разных шнурка,ни один с компов не видит плату,драйвера не помогают.Платка светит 2 красных светодиода.

natol

Скрин старый но конфиг для квадро не плохой.

mataor
flygreen:

У меня коптер колбасит примерно два-два с половиной метра по высоте.

flygreen:

Плата криус СЕ.

а чего более лучшего вы хотите? если нужно лучше - АИО и маховий

П.С. также в обоих случаях важна балансировка пропеллеров и моторов

flygreen

Висит то хорошо, почти никуда не уползает. А, вот высоту не держит. Балансировку делал и винтов и моторов. Плата конечно какашная, думал может кто боролся с ней. Чего толкового подскажет . )

Кстати где можно “маховий” взять ? Я так понимаю надо аффтору писать непосредственно ?

omegapraim

да над писать автору в личку или на почту.

vatanuki

ктонибуть уже успел облетать 2.3?
интересно будет ли маховий на базе 2.3 ?