roboforum.ru

Технический форум по робототехнике.

Нечёткая логика в Ардуино

Нечёткая логика в Ардуино

Sliad » 18 мар 2015, 12:46

Добрый день. Появилась необходимость запрограммировать на ардуино алгоритм "нечёткой логики", позволяющей крутить двигатель в зависимости от сочетания температур, снимаемых с 2 датчиков. Один датчик находится в помещении другой снаружи. Грубо говоря охлаждение помещения. Ну возможно и для других целей. Нечёткая логика в данном варианте нужна для того, чтобы регулировать угол поворота объекта управления. Чтобы не было только открыть/закрыть, а возможно было открытие на 10%,25%,50% и т.д. Почитав литературу по нечёткой логике удалось набросать такие уравнения по стандартным термам.
http://itmages.ru/image/view/2371176/41142116

Так же написал вот такую программу в С++ для расчёта угла открытия.
Код: Выделить всёРазвернуть
#include <tchar.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{
float x1,x2;
cout«"vvedite x1\n";
cin»x1;
cout«"vvedite x2\n";
cin»x2;
float m1,m2,m4,m5;
// внутри
// первое значение
if (x1<=20)
{
m1=1;
}
if (x1>20 && x1<=22)
{
m1=((22-x1)/(22-20));
}
if (x1>22 && x1<=28)
{
m1=0;
}
if (x1>28 && x1<=30)
{
m1=((30-x1)/(30-28));
}
if (x1>30)
{
m1=1;
}
// Второе значение
if (x1<=20)
{
m2=0;
}
if (x1>20 && x1<=22)
{
m2=(x1-20)/(22-20);
}
if (x1>22 && x1<=28)
{
m2=1;
}
if (x1>28 && x1<=30)
{
m2=((x1-28)/(30-28));
}
if (x1>30)
{
m2=0;
}

// снаружи
// первое значение
if (x2<=10)
{
m4=1;
}
if (x2>10 && x2<=20)
{
m4=((20-x2)/(20-10));
}
if (x2>20 && x2<=30)
{
m4=((30-x2)/(30-20));
}
if (x2>30)
{
m4=1;
}
// Второе значение
if (x2<=10)
{
m5=0;
}
if (x2>10 && x2<=20)
{
m5=(x2-10)/(20-10);
}
if (x2>20 && x2<=30)
{
m5=(x2-20)/(30-20);
}
if (x2>30)
{
m5=1;
}

// поиск минимума и максимума внутри
float p1,p2,p3,p4,p5,p6;
if (x1<=20)
{
p1=m2;
}
else {p1=0;}
if (x1>20 && x1<=30)
{
if (m1>m2)
{
p2=m1;
}
else
{
p2=m2;
}
}
if (x1>30)
{
p3=m1;
}
else {p3=0;}
// поиск минимума и максимума снаружи
if (x2<=10)
{
p4=m5;
}
else {p4=0;}
if (x2>10 && x2<=30)
{
if (m4<m5)
{
p5=m4;
}
else
{
p5=m5;
}
}
if (x2>30)
{
p6=m4;
}
else {p6=0;}
// внутри холодно

float a;
if (x1<=20 && x2<=10)
{
a=(p1*p4*0)/(p1+p4);
}
if (x1<=20 && x2>10 && x2<=20)
{
a=(p1*p4*0+p1*p5*25)/(p1+p4+p5);
}
if (x1<=20 && x2>30 )
{
a=(p1*p4*0+p1*p5*25+p1*p6*50)/(p1+p4+p5+p6);
}
// внутри средняя

if (x1>20 && x1<=30 && x2<=10)
{
a=(p2*p4*25)/(p2+p4);
}
if (x1>20 && x1<=30 && x2>10 && x2<=20)
{
a=(p2*p4*25+p2*p5*50)/(p2+p4+p5);
}
if (x1>20 && x1<=30 && x2>30 )
{
a=(p2*p4*25+p2*p5*50+p2*p6*75)/(p2+p4+p5+p6);
}
// внутри жарко

if (x1>30 && x2<=10)
{
a=(p3*p4*50)/(p3+p4);
}
if (x1>30 && x2>10 && x2<=20)
{
a=(p3*p4*50+p3*p5*75)/(p3+p4+p5);
}
if (x1>30 && x2>30 )
{
a=(p3*p4*50+p3*p5*75+p3*p6*100)/(p3+p4+p5+p6);
}

// снаружи холодно

if (x1<=10 && x2<=10)
{
a=(p4*p1*0)/(p1+p4);
}
if (x1>20 && x1<=30 && x2<=10)
{
a=(p4*p1*0+p4*p2*25)/(p4+p1+p2);
}
if (x1>30 && x2<=10 )
{
a=(p4*p1*0+p4*p2*25+p4*p3*50)/(p4+p1+p2+p3);
}

// снаружи средняя

if (x1<=20 && x2>10 && x2<=30)
{
a=(p1*p5*25)/(p1+p5);
}
if (x2>10 && x2<=30 && x1>20 && x1<=30)
{
a=(p5*p1*25+p5*p2*50)/(p1+p2+p5);
}
if (x2>10 && x2<=30 && x1>30 )
{
a=(p5*p1*25+p5*p2*50+p5*p3*75)/(p5+p1+p2+p3);
// снаружи жарко

if (x1<=10 && x2>30)
{
a=(p6*p1*50)/(p6+p1);
}
if (x1>10 && x1<=30 && x2>30)
{
a=(p6*p1*50+p6*p2*75)/(p6+p1+p2);
}
if (x1>30 && x2>30 )
{
a=(p6*p1*50+p6*p2*75+p3*p6*100)/(p3+p1+p2+p6);
}

cout«"m1="«m1«"\n";
cout«"m2="«m2«"\n";
cout«"m4="«m4«"\n";
cout«"m5="«m5«"\n";
cout«"p1="«p1«"\n";
cout«"p2="«p2«"\n";
cout«"p3="«p3«"\n";
cout«"p4="«p4«"\n";
cout«"p5="«p5«"\n";
cout«"p6="«p6«"\n";
cout«"a="«a«"\n";
system ("pause");
return 0;
}


Подскажите как её перенести адекватно в ардуино. Кроме того, сталкивался ли кто с программированием нечёткой логики в Ардуино, если да то как вы это реализовали. Буду очень признателен, если поможете.

Re: Нечёткая логика в Ардуино

Vladimat » 19 мар 2015, 11:11

Нечёткой логики тут будет недостаточно. Необходим ионный бульбулятор торсионного поля.

Дружище, ты описал обычный автоматический регулятор, преобразующий температуру в угол поворота задвижки, которые школьники во дворце пионеров за полдня собирают. При чём тут умные книжки про нечёткую логику?

Re: Нечёткая логика в Ардуино

Duhas » 19 мар 2015, 14:40

потому что это одно и то же, просто нечеткая логика позволяет это все формализовать + чуток плюшек.

Re: Нечёткая логика в Ардуино

Vladimat » 19 мар 2015, 15:45

Может, я чего не понимаю, но логика +1 градус температуры => +3 градуса поворота задвижки является предельно чёткой. :-)
Пример нечёткой логики "возможно, уже прохладно, не прикрыть ли форточку? Не знаю, может быть ещё проветрим."

Re: Нечёткая логика в Ардуино

avr123.nm.ru » 20 мар 2015, 10:32


Re: Нечёткая логика в Ардуино

Duhas » 21 мар 2015, 09:52

Vladimat писал(а):является предельно чёткой. :-)

почитайте еще поподробнее про нечеткую логику, название и правда обещает больше чем по факту является.

Re: Нечёткая логика в Ардуино

Vladimat » 21 мар 2015, 11:31

Duhas писал(а):
Vladimat писал(а):является предельно чёткой. :-)

почитайте еще поподробнее про нечеткую логику, название и правда обещает больше чем по факту является.

Вы знаете, можно и релятивистскую механику применить для управления задвижкой вместо ньютоновской. Это не будет ошибочно, но не имеет никакого смысла. Зачем наворачивать не пойми что там где это не требуется?

Re: Нечёткая логика в Ардуино

Duhas » 21 мар 2015, 15:07

вы можете упереться и не слушать, и не пытаться понять, мне все равно.

Re: Нечёткая логика в Ардуино

Sliad » 22 мар 2015, 20:43

+1 градус - 3 градуса открытия задвижки не подходит, т.к. зависимости, как видно на картинке, идут как минимум по двум температурам - внешней и внутренней. Управление осуществляется посредством сверки этих температур, и в зависимости от результата идёт необходимая регулировка. Это самый простой вариант. К тому же устройства типа автоматического регулятора - это так же дополнительные деньги. Duhas, благодарю за ссылку, займусь изучением.

Re: Нечёткая логика в Ардуино

Duhas » 23 мар 2015, 06:33

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

Re: Нечёткая логика в Ардуино

Sliad » 01 апр 2015, 09:22

Нечёткую логику запрограммировал. Теперь проблема возникла, наверное, в самом простом. Расчёт угла открытия и количества оборотов происходит в loop, программа работы двигателя написана отдельно. Идёт в лупе только обращение к ней. Так вот, простой случай. Угол рассчитан - допустим, получилось 50%. Двигатель совершил количество оборотов, соответствующее этому проценту открытия. Прошло какое-то время и угол пересчитан и составляет теперь 70%. Как сделать так, чтобы двигатель не пытался сделать из существующего положения количество соответствующих 70% открытия оборотов, а сделал недостающие обороты, т.е. оставшиеся 20%? Количество оборотов в программе двигателя сохраняется в переменной i. Но в лупе она не задана и оперировать ей не получается.


Rambler\'s Top100 Mail.ru counter