MultiWii
Помогите разобраться с мультивием, я уже с ног валюся 😃
В общем проблема следующая: квадрик крутится по YAW и ниче не могу с этим сделать. (по часовой стрелке, если смотреть сверху на лопасти).
Проверяйте выкосы моторов после падения. 100% один мотор завален на бок вот и крутит. Сам так попался)
Можно попробовать включить самолетный режим,яв в этом случае будет третьей осью.
Я включил самолетный режим.
Но к сожалению получил не то что хотел.
Я хочу получить пропорциональное отклонение сервоприводов при отклонении платы от горизонта… ( чем сильнее плата отклонена от горизонта, тем больше угол отклонения сервопривода )
А в итоге я получил отклонение сервопривода с возвратом на исходную позицию.
Угол отклонения зависит от ускорения, с которым плата меняет свою ориентацию.
Как исправить ситуацию?
*******************************
mataor, Ты не нашел свою версию прошивки ?
Ты не нашел свою версию прошивки ?
к сожалению не откопал… мож и удалил - с появлением БК она стала ненужной)))
но на самом деле там больше всего напичкано в разные режимы… сама стабилизация там практически исходная, чуток подправлена ток…
могу скинуть код тож под подвес но другого человека yadi.sk/d/7ZSKB0pRCFejq
Спасибо и на этом. А как это одним архивом качнуть?
Я хочу получить пропорциональное отклонение сервоприводов при отклонении платы от горизонта…
С этим я разобрался. Все это включается в ГУИ. Теперь сервоприводы отклоняются пропорционально с тангажем и креном.
Но вот с “курсом” то же самое я проделать не могу.
Кто подскажет “как быть”?
с курсом ток ручками… по гире как в БК не получится, а по компасу творит страшные вещи…
В смысле “только ручками” ?
Я че-то недопонял…
В смысле мультивий не подойдет? И придется прошивку самому переписывать?
Всех приветствую!
Если кто разбирался, подскажите плз., каким где в коде в прошивке берутся данные с приёмника и где просчитанные данные выходят непосредственно к регулятором двигателей? Основная идея, считать 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);
}
Так где ж тут мы задаём с какой ножки микросхемы читать данные?? Можете “разжевать” эту функцию?
Если кто раскапывал это, поделитесь плиз, буду очень благодарен!
хмм… это откуда вообще код?
Это код прошивки MultiWii_2_2, код функции из файла RX.INO
вы вообще полезли в абсолютно левые дебри…
вот чтение собственно сигналов:
#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 плата?
и вообще подробней объясните задачу (какой контроллер?, зачем и что нужно? и т.д. )
mataor, в смысле “ручками” ?
в смысле код целиком переписать ?
Господа, а что сказать мультивию, чтобы замедлить скролинг по меню OLED дисплея или вообще заставить переключать пункты по шагам? Что-то он у меня так быстро с пункта на пункт перескакивает, попасть в нужное место меню практически нереально.
В настройках стоит
#define OLED_I2C_128x64
#define SUPPRESS_OLED_I2C_128x64LOGO
#define DISPLAY_FONT_DSIZE
#define LCD_CONF
Телеметрия не включена за ненадобностью.
Господа, а что сказать мультивию, чтобы замедлить скролинг по меню OLED дисплея или вообще заставить переключать пункты по шагам?
Я делал следующим образом:
В файле “LCD.ino” есть функция “configurationLoop()”
Там есть такое место:
if (refreshLCD) {
ConfigRefresh(p);
refreshLCD = 0;
}
Туда я добавил обычную задержку в 200 миллисекунд и скроллинг стал медленнее. Но и настройка параметров тоже стала медленнее.
if (refreshLCD) {
ConfigRefresh(p);
refreshLCD = 0;
delay(200);
}
Народ, а кто какие ПИДы ставит на удержание высоты ? У меня коптер колбасит примерно два-два с половиной метра по высоте. Тудым-сюдым. Датчик паралонкой закрыт. Вчера на поле с собой нотер брал, тыркал,тыркал так и не держит высоту. Болтается…
Пиды выставил так P 2.0 I 0 D 0 Плата криус СЕ.
Подскажите пожалуйста.Купил платку летавшую,нужно залить немного другую прошивку.Проблема в том что пробовали на 5 разных компах,3 разных шнурка,ни один с компов не видит плату,драйвера не помогают.Платка светит 2 красных светодиода.
Скрин старый но конфиг для квадро не плохой.
У меня коптер колбасит примерно два-два с половиной метра по высоте.
Плата криус СЕ.
а чего более лучшего вы хотите? если нужно лучше - АИО и маховий
П.С. также в обоих случаях важна балансировка пропеллеров и моторов
Висит то хорошо, почти никуда не уползает. А, вот высоту не держит. Балансировку делал и винтов и моторов. Плата конечно какашная, думал может кто боролся с ней. Чего толкового подскажет . )
Кстати где можно “маховий” взять ? Я так понимаю надо аффтору писать непосредственно ?
да над писать автору в личку или на почту.
ктонибуть уже успел облетать 2.3?
интересно будет ли маховий на базе 2.3 ?