MultiWii
Они все сейчас стабильно летают, багов нет уже.
Во наивный! 😃
Баги есть всегда и везде! 😉
Я Александр про те баги которые наивному глазу юзера не видно, а если их невидно и все летает хорошо то значить их и нет)))))
можно все беки паралельно
Репост из дневника Маховика, ибо там никто не отвечает.
Доброго время суток. Появилась одна проблемка, на которую я не обращал внимания, до того момента как поставил на коптер камеру. Вот видео отзнятое несколько часов назад.
Скрин пидов.

Как слишно из видео, моторы дребезжат, коптер потряхивает. Прошивка МахоВии 3.1 На стандартных пидах та же фыгня. . Пропи балансированы. Плата АИН, стоит на резиновых демпферах их СД-Рома. На графиках на максимальном газу до отрыва от земли особых вибраций не наблюдается и дребезжаний коптера тоже.
Вот что разкоментил
#define KILL_VIBRO
#define KILL_SMALL_OSCILLATIONS
#define ITG3200_LPF_20HZ
#define MPU6050_LPF_20HZ
Подскажите что не так. Куда крутить ПИДы?
мне кажется P много
можно все беки паралельно
Если ВЕС-и линейные - то да, а если импульсные - оставить только один.
я вообще использую один на контроллер, только не через моторные пины, а через вход питания на плате, один на жпс, итд, те стараюсь распределить нагрузку
Я юзаю внешний бек на 5А раньше юзал 1н рег все остальные отрубал. Суть в том что вероятность есть что сгорит но честно ни разу за все время обитания здесь не видел что бы кто то пожаловался что сгорело именно из-за этого. Но я перестраховщик)))) Лучше так чем отскребать потом остатки)))))
Подскажите что не так
Плата АИН, стоит на резиновых демпферах их СД-Рома.
повесить на скотч или вообще жестко закрепить
повесить на скотч или вообще жестко закрепить
Ок, попробую сделать подвес по жоще. А как же остальная вибрация, станет же вибрировать на плату еще больше? Ща почитаю про вибророзвязку. Спасибо за ответ.
маховий ПРЕДНАЗНАЧЕН на жесткую установку… правда он не отменяет балансировку моторов и пропеллеров - это должен делать каждый для большего ресурса моторов и более долгого полета
Репост из дневника Маховика
Может слишком мягкая виброразвязка? Попробуйте жестко поставить на нейлоновые стойки например.
p.s. извините, забыл обновить страницу, а тут оказывается уже ответили.
Помогите разобраться с мультивием, я уже с ног валюся 😃
Мультивий SE 2.0, двигателя, гиры и акселя откалибровал (правда когда запускаю калибровку двигателей, то в конце “заливки” все моторы включаются на секунду-другую, а потом выключаются).
В общем проблема следующая: квадрик крутится по YAW и ниче не могу с этим сделать. (по часовой стрелке, если смотреть сверху на лопасти). Пробовал затримить влево на 110 единиц (стало в GUI код по YAW показывать 1390) - и все равно крутится!
То что смог определить: когда начинаю рукой квадрик вращать против вращения - то ощущается как бы продиводействие небольшое, по крайней мере звук изменения оборотов слышен. А когда рукой пытаюсь провернуть по вращению - ничего не слышу и не ощущаю…
Пробовал отключить ANGLE, то же самое - крутится по часовой стрелке.
Две недели назад мне демонстрировали работоспособность контроллера - все было отлично! А я вот собрал - крутится 😦
Что посоветуете??
Прилагаю конфиг мультивия. Было падение, луч один согнулся, может еще чего там отвалилось…
Горизонт держит отлично (не наклониш рукой). Аппаратура FlySky, шестиканальная, “центра” держит хорошо (1500 плюс-минус 6)
Опять же Александр mahowik, все давно и подробно изложил rcopen.com/blogs/83206/15000
Помогите разобраться с мультивием, я уже с ног валюся 😃
В общем проблема следующая: квадрик крутится по 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 плата?
и вообще подробней объясните задачу (какой контроллер?, зачем и что нужно? и т.д. )