Создание собственной системы стабилизации

Sir_Alex
VitaliyRU:

Тут очень умные дядьки ). А никто в винде с COM портом не воевал? Сейчас событие “datareceived” msdn.microsoft.com/ru-ru/libr...vs.110).aspx винда дергает раз в 15 байт в буфере или ~7 миллисекунд, скорость(19200). А низзя винапи пнуть чтобы на каждый байт вызывала? Или в мультизадачной системе это анрыл и не выпендриваясь сделать на микро контроллере? Как на тойже ардуине мега с этим никто не проверял? Совсем нет время на изучение мат части ЗЫ задача максимально синхронизировать 4 COM порта… как можно точнее… Сори что не про коптеры…

Посмотрите в сторону размера буфера FIFO в настройках драйвера COM порта (кнопка “дополнительно”). Если драйвер FTDI, то там еще есть настройка времени Latency timer. instructables.com/…/Reducing-FTDI-Serial-Latency/
Суть Latecy timer - Это время, через которое вы получите событие о новых данных, не зависимо от того, заполнился буфер или нет.

VitaliyRU
Sir_Alex:

Посмотрите в сторону размера буфера FIFO в настройках драйвера COM порта

Тут я не вьехал. В C# в SerialPort есть размер буфера чтения, но она его игнорирует. Ставлю скорость 115200 и буфер 1000, а по факту буфер вообще 4 килобайта и боюсь что винда просто не успевает(на каждый вызов события или в петле если синхронно читать). Спасибо, в дровах попробую. COM порт железный, там мамка т.н. встраиваемая у нее 8 железных COM 😃.
Да и попробую ftdi хрен с ними с железными, в них-то такой настройки я не видел…

Sir_Alex
VitaliyRU:

Тут я не вьехал. В C# в SerialPort есть размер буфера чтения но она его игнорирует. Ставлю скорость 115200 и буфер 1000 а по факту буфер вообще 4 килобайта и боюсь что винда просто не успевает(на каждый вызов события или в петле если синхронно читать). Спасибо в дровах попробую. COM порт железный, там мамка т.н. встраиваемая у нее 8 железных COM .

c# для этого использовать наверное жестоко. Попробуйте реализовать на C или другом языке.

VitaliyRU
Sir_Alex:

c# для этого использовать наверное жестоко. Попробуйте реализовать на C или другом языке.

Там проект весь на C# хотя ничто не мешает DLL ку сделать на С. Это хотел в первую очередь проверить, просто мне кажеться все же особенности винды а не .NET
Алексей а как на тех же “ардуинах”(плату разводить времяни тоже нет 😃) там можно каждый байт считать? не пробовали случайно? Если можно это правильнее чем С на винде…
И еще раз спасибо за отклик 😃

Sir_Alex
VitaliyRU:

Алексей а как на тех же “ардуинах”(плату разводить времяни тоже нет ) там можно каждый байт считать? не пробовали случайно? Если можно это правильнее чем С на винде… И еще раз спасибо за отклик

Можете хоть каждый бит ловить )))

VitaliyRU
Sir_Alex:

Можете хоть каждый бит ловить )))

Вот не сомневался что где-где а тут опытные умные дядьки помогут 😃)
я просто по базам и гуям, а тут пришлось 😃)

Razek
VitaliyRU:

винда дергает раз в 15 байт в буфере или ~7 миллисекунд, скорость(19200). А низзя винапи пнуть чтобы на каждый байт вызывала? Или в мультизадачной системе это анрыл

Можно надо только самому реализовать чтение с ком порта со своим блэк джеком и шлюхами со своими событиям, в отдельных потоках. В котом будет крутиться ReadFile с нужным размером буфера. Получили данные послали события об этом главному потоку.
Открывать ком порт и читать из него:

::CreateFile(_T("\\\\.\\COM1"), GENERIC_READ | GENERIC_WRITE, NULL, 0, OPEN_EXISTING, NULL, NULL);
VitaliyRU
Razek:

Открывать ком порт и читать из него:

угу, погуглю спасибо

mataor

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

//Чтение данных из порта
function TMainForm.PortReadStr(DataSize:integer):string;
var BufStr:string;
begin
    BufStr:='';
    try
        //Если есть соединение с портом читаем данные
        if PortConnect_ then ComPort.ReadStr(BufStr,DataSize);
    except

    end;
    PortReadStr:=BufStr;
end;
//Запись команды Command в порт, и чтение ответа по истечению TimeOut
//Запись команды и чтение будет производится до тех пор, пока не
//будет получен ответ, или количество циклов будет болше SendCount
//Результатом функции является ответ
Function TMainForm.WriteComand(Command:string;SendCount:Integer;TimeOut:Integer):string;
var i:byte;
    AnswStr:string;
begin
    WriteComand:='';
    //Пишем данные
    PortWriteStr(Command);
    Delay(TimeOut);
    //читаем
    AnswStr:=PortReadStr(1024);
    i:=1;
    //если нет ответа и количество попыток не истекло
    while (SendCount>i) and (length(AnswStr)=0) do
    begin
        //Пишем данные
        PortWriteStr(Command);
        Delay(TimeOut);
        //читаем
        AnswStr:=PortReadStr(1024);
        inc(i);
    end;

    WriteComand:=AnswStr;
end;

в данном случае - отсылаем запрос и ждем определенное время на ответ и читаем буфер.

VitaliyRU
mataor:

в винде (я про делфи) можно ловить хоть каждый байт, это проблем не создает

Я вот тоже так думал, но C# чета не хочет. ComPort это какой unit в Delphi? сколько лет ее юзал но не приходилось 😃)
А с 4 мя ком полюбому многопоточно надо общаца, либо оно само асинхронно на событиях, либо руками многопоточно(что коряво КМК)… Com можно открывать/закрывать тока из основоного потока, иначе оно ругаецца 😃

SergDoc

Мысли над регулятором:
как известно повсеместно используется ПИД (думаю распространяться не стоит?)
а не заменить ли его на регулятор с одним параметром?
U = K*(angle + vel*dt1) только dt1 - не время цикла, а время между считыванием скорости с датчика и подачей данных в регулятор… грубо обнуляем dt1 при чтении и смотрим в него в момент расчёта регулятора…
дело в том, что D и I в ПИДе не что иное как коррекция ошибки пропорции, так как за время между считыванием данных с датчика и поступления их в расчёт ошибка накапливается - тупо на старых данных регулятор строим, а тут его слегка предсказали…
Что даёт? Офигенный плюс к карме Дринкеру с крутилками, их всего 3 ))) ну и как следствие меньше настроек?

VitaliyRU
SergDoc:

U = K*(angle + vel*dt1)

Это аналог PI. С настройкой(К) вынесенной за скобки. Без D будет расколбас при прочиъ равных и не раздельно P и I настраивать тоже не очень. Как то так КМК…
ЗЫ PID и то слишком примитвный, там не упрощать а усложнять надо, но с этой гребанной работой все лень/некогда 😦(

SergDoc

Не согласен - D мы как раз берём от скорости, а для чего, а именно для того, что P с течением времени (то что я обозначил dt1) рассчитывается неправильно, в идеале P мы получаем чуть меньше чем должно быть ибо угол уже уплыл и с каждой интерацией это всё больше и больше. И делаем мы что? - Увеличиваем P (коэффициентом) - переруливает, плохо 😦 о - берём D и им тормозим P - опять попандос, опять недоруливаем - давайте I введём - дабы дожимало - 3 параметра для шаманства вместо вычисления правильного показателя один раз?
тут как бэ слов мало тут делать и смотреть надо 😃

VitaliyRU:

Это аналог PI. С настройкой(К) вынесенной за скобки. Без D будет расколбас

КУК прекрасно переносит )))

VitaliyRU
SergDoc:

берём D и им тормозим P - опять попандос

С D мат модель чуть ближе к физической. То что D тормозит P(когда скорость и ускорение в разные стороны направлены) наоборот хорошо. Но все равно далеко от иделала. На разные возмущающие воздействия(по переданному импульсу) нужны разные PD. Ну и PID при слабых воздействиях толком не работает(в т.ч. по описанной выше причине) от этого коптер так на подушке ерзает и в ветер раскачиваться…
вот на такой хрени
реакция нужна как у кошки что бы в дверной проем пролететь по ФПВ 😃. Ветер от собственных винтов…
ЗЫ c Вашим dt я если честно идею не уловил…

SergDoc:

КУК прекрасно переносит )))

Если сравнивать с автомобильными подвесками то это начало прошлого века. Обычный амортизатор трения. А если посмотреть на WRC… то небо и земля. Причем сейчас на дорогих версиях серийных машин амортизаторы(типа бнв эмок, мерсов ML и прочих ауди РС и ипрез врыкс) по скожей технологии сделаны. Однотрубные с газом высокого давления 😃) Они позволяют юолее правильную регрессивную характеристику выдерживать.

SergDoc
VitaliyRU:

ЗЫ c Вашим dt я если честно идею не уловил…

идея дожать пропорцию до реальной (в момент расчёта регулятора)

VitaliyRU
SergDoc:

идея дожать пропорцию до реальной (в момент расчёта регулятора)

Ааа, перечитал еще раз - дошло 😃 Это все блохи не имеющие ни какого принципиального значения P и i то эмпирические были. И сами эти коэф. зависят от соотношения момента инерции к моменту от моторов грубо помноженное на приемистость моторов. Т.е. определяющем являеться не как скорость мерить, а физические параметры коптера. И вообще чем больше настроек тем лучше 😃) не ? 😃)

mataor
VitaliyRU:

ComPort это какой unit в Delphi?

угу, могу поделится если надо

oleg70
SergDoc:

только dt1 - не время цикла, а время между считыванием скорости с датчика и подачей данных в регулятор…

А разве это не одно и тоже ?? (по другому то как ?)

SergDoc:

Офигенный плюс к карме Дринкеру с крутилками, их всего 3

Для самолета вообще можно обойтись одной “П” - составляющей… (проверено), вполне сносно летает, но как и следовало ожидать угол крена/тангажа выдерживается с ошибкой, поэтому я все же “усложнил 😃” и добавил таки “И” “Д”.
А для коптера такое “кастрирование” выйдет боком однозначно…

Придумать бы метод оценки коэфициентов ПИДа в зависимости от реакции аппарата на возмущение (!)… т.е. как нибуть замерять их оптимальность… тогда можно было бы просто сделать “автокоррекцию” и вообще забыть про крутилки, но пока че то не могу…

fpv_mutant

Подскажите по ws2812…у меня есть 1 метр,есть ардуина мини…прошивка на апм 3,1,5
Чего я хочу? на каждый из четырех лучей прилепить по 8 диодов ws2812 и моргать предупреждениями АПМа и +свои эффекты.

SergDoc

Кто-нибудь MPU9250 в живую видел? Чёт мне приехали с какой-то маркировкой MP92 и без надписи iventsense?

omegapraim
SergDoc:

Кто-нибудь MPU9250 в живую видел? Чёт мне приехали с какой-то маркировкой MP92 и без надписи iventsense?

Тута походу честный магаз вот там картинка есть www.csgshop.com/product.php?id_product=169