Escolar Documentos
Profissional Documentos
Cultura Documentos
#include <TimerOne.h>
#include <Wire.h>
#include <HMC5883L.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(48, 46,53,51,49,47 );
HMC5883L compass;
float t=0;
int error = 0;
const int trig_x0 = 5;
const int inecho_x0 = 4;
long dem_1 = 0;
long dem_2 = 0;
long dem_3 = 0;
#include <FuzzyRule.h>
#include <FuzzyComposition.h>
#include <Fuzzy.h>
#include <FuzzyRuleConsequent.h>
#include <FuzzyOutput.h>
#include <FuzzyInput.h>
#include <FuzzyIO.h>
#include <FuzzySet.h>
#include <FuzzyRuleAntecedent.h>
Fuzzy* fuzzy = new Fuzzy();
float tam1, tam2;
FuzzySet* rnp = new FuzzySet(0, 0, 0, 0.25);
FuzzySet* np = new FuzzySet(0, 0.25, 0.25, 0.5);
FuzzySet* vp = new FuzzySet(0.25, 0.5, 0.5, 0.75);
FuzzySet* xp = new FuzzySet(0.5, 0.75, 0.75, 1);
FuzzySet* rxp = new FuzzySet(0.75, 1, 1, 1);
//******khau D**************
void DemEncoder_1();
void DemEncoder_2();
void DemEncoder_3();
void vantoc();
float goc();
float goc()
{
MagnetometerRaw raw = compass.ReadRawAxis();
MagnetometerScaled scaled = compass.ReadScaledAxis();
int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)
float heading = atan2(scaled.YAxis, scaled.XAxis);
float declinationAngle = 0.0457;
heading += declinationAngle;
if(heading < 0)
heading += 2*PI;
if(heading > 2*PI)
heading -= 2*PI;
float headingDegrees = heading * 180/M_PI;
//Serial.print(" goc : ");
//Serial.println(headingDegrees);
return headingDegrees;
}
float khoangcach_x0()
{
digitalWrite(trig_x0, LOW);
delayMicroseconds(2); //tt chn pht
digitalWrite(trig_x0, HIGH);
delayMicroseconds(1000); // xut tn hiu 10us
digitalWrite(trig_x0, LOW); //tt nhn
tgian_x0 = pulseIn(inecho_x0, HIGH); // tgian nhn tn hiu
float khoangcach_y0()
{
digitalWrite(trig_y0, LOW);
delayMicroseconds(2); //tt chn pht
digitalWrite(trig_y0, HIGH);
delayMicroseconds(1000); // xut tn hiu 10us
digitalWrite(trig_y0, LOW); //tt nhn
void setup()
{
Serial.begin (9600);
Wire.begin();
Serial.println("Bat dau: ");
pinMode(52,OUTPUT);
lcd.begin(16, 2);
lcd.print("Bat dau: ");
compass = HMC5883L();
error = compass.SetScale(1.3);
if(error != 0){
};
error = compass.SetMeasurementMode(Measurement_Continuous);
if(error != 0){
};
Timer1.initialize(10000);
Timer1.attachInterrupt( ngattimer );
pinMode(A0, INPUT);
pinMode(in1_2, OUTPUT);
pinMode(in2_2, OUTPUT);
pinMode(in1_3, OUTPUT);
pinMode(in2_3, OUTPUT);
pinMode(pwm_1, OUTPUT);
pinMode(pwm_2, OUTPUT);
pinMode(pwm_3, OUTPUT);
// FuzzyInput P(1)
FuzzyInput* ep = new FuzzyInput(1);
ep->addFuzzySet(rnp);
ep->addFuzzySet(np);
ep->addFuzzySet(vp);
ep->addFuzzySet(xp);
ep->addFuzzySet(rxp);
fuzzy->addFuzzyInput(ep);
// FuzzyInput P (2)
FuzzyInput* dep = new FuzzyInput(2);
dep->addFuzzySet(anp);
dep->addFuzzySet(avp);
dep->addFuzzySet(zrp);
dep->addFuzzySet(dvp);
dep->addFuzzySet(dnp);
fuzzy->addFuzzyInput(dep);
// FuzzyInput D (3)
FuzzyInput* ed = new FuzzyInput(3);
ed->addFuzzySet(rnd);
ed->addFuzzySet(nd);
ed->addFuzzySet(vd);
ed->addFuzzySet(xd);
ed->addFuzzySet(rxd);
fuzzy->addFuzzyInput(ed);
// FuzzyInput D (4)
FuzzyInput* ded = new FuzzyInput(4);
ded->addFuzzySet(an_d);
ded->addFuzzySet(avd);
ded->addFuzzySet(zrd);
ded->addFuzzySet(dvd);
ded->addFuzzySet(dnd);
fuzzy->addFuzzyInput(ded);
// FuzzyInput i (5)
FuzzyInput* ei = new FuzzyInput(5);
ei->addFuzzySet(rni);
ei->addFuzzySet(ni);
ei->addFuzzySet(vi);
ei->addFuzzySet(xi);
ei->addFuzzySet(rxi);
fuzzy->addFuzzyInput(ei);
// FuzzyInput i (6)
FuzzyInput* dei = new FuzzyInput(6);
dei->addFuzzySet(ani);
dei->addFuzzySet(avi);
dei->addFuzzySet(zri);
dei->addFuzzySet(dvi);
dei->addFuzzySet(dni);
fuzzy->addFuzzyInput(dei);
// FuzzyOutput
FuzzyOutput* khaup = new FuzzyOutput(1);
fuzzy->addFuzzyOutput(khaup);
// FuzzyOutput 2
FuzzyOutput* khaud = new FuzzyOutput(2);
fuzzy->addFuzzyOutput(khaud);
// FuzzyOutput 3
FuzzyOutput* khaui = new FuzzyOutput(3);
fuzzy->addFuzzyOutput(khaui);
//**********************************************************
**************
// ******************************** luat mo khau D ***********
//**********************************************************
**************
// Building FuzzyRule 26 "rnd and and = rld1"
void loop()
{
if (Serial.available()) // nhn d liu t my tnh
{
while (Serial.available () > 0)
{
bientam = Serial.read();
/*
/////////////////////////////////////////////////////////////////////////////////////////
gn bin tm
///////////////////////////////////////////////////////////////////////////////////////////
*/
if (bientam == 'l') // tien
{
val = 0;
}
if (bientam == '1')
{
x = 10, y = 10, a1 = 0, a2= 0, t=0;
val = 10;
}
if (bientam == '2')
{
x = 20, y = 20, a1 = 0, t=0;
val = 10;
}
if (bientam == '3')
{
x = 30, y = 30, a1 = 0, a2= 0, t=0;
val = 10;
}
if (bientam == '4')
{
x = 40, y = 40, a1 = 0, a2= 0, t=0;
val = 10;
}
if (bientam == '5')
{
x = 50, y = 50, a1 = 0, a2= 0, t=0;
val = 10;
}
if (bientam == '6')
{
x = 10, y = 50, a1 = 0, a2= 0, t=0;
val = 10;
}
if (bientam == '7')
{
x = 50, y = 20, a1 = 0, a2= 0, t=0;
val = 10;
}
if (bientam == '8')
{
x = 50, y = 10, a1 = 0, a2= 0, t=0;
val = 10;
}
if(bientam == 'o')
{
a1 = 1, a2= 0, x= 0, y=0;
val = 10;
}
if(bientam == 'b')
{
a1 = 0, a2= 1, x= 0, y=0;
val = 10;
}
lcd.clear();
/*
/////////////////////////////////////////////////////////////////////////////////////////
iu khin
///////////////////////////////////////////////////////////////////////////////////////////
*/
if (val == 0) // tien
{
Serial.println(" ,Tien ");
lcd.setCursor(0, 0);
lcd.print("Tien ");
digitalWrite(52,0);
digitalWrite(in1_2, 1);
digitalWrite(in2_2, 0); // dc2
analogWrite(pwm_2, 80 );
digitalWrite(in1_3, 0);
digitalWrite(in2_3, 1); // dc3
analogWrite(pwm_3, 80 );
}
if (val == 1) // lui
{
Serial.println(" ,Lui");
//dco quay thuan ;
lcd.setCursor(0, 0);
lcd.print("Lui ");
digitalWrite(52,0);
digitalWrite(in1_2, 0);
digitalWrite(in2_2, 1); // dc2
analogWrite(pwm_2, 80 );
digitalWrite(in1_3, 1);
digitalWrite(in2_3, 0); // dc3
analogWrite(pwm_3, 80 );
analogWrite(pwm_1, 0 ); // dc1
digitalWrite(in1_2, 1);
digitalWrite(in2_2, 0); // dc2
analogWrite(pwm_2, 255 );
digitalWrite(in1_3, 1);
digitalWrite(in2_3, 0); // dc3
analogWrite(pwm_3, 255 );
}
digitalWrite(in1_2, 0);
digitalWrite(in2_2, 1); // dc2
analogWrite(pwm_2, 255 );
digitalWrite(in1_3, 0);
digitalWrite(in2_3, 1); // dc3
analogWrite(pwm_3, 255 );
}
if (val == 4) // dung
{
Serial.println(" ,Dung ");
lcd.setCursor(0, 0);
lcd.print("Dung ");
analogWrite(pwm_1, 0 );
analogWrite(pwm_2, 0 );
analogWrite(pwm_3, 0 );
t=0;
digitalWrite(in1_2, 0);
digitalWrite(in2_2, 1); // dc2
analogWrite(pwm_2, 100 );
digitalWrite(in1_3, 1);
digitalWrite(in2_3, 0); // dc3
analogWrite(pwm_3, 100 );
}
if (val == 6) // nghich
{
Serial.println(" ,Quay nghich ");
//dco quay nghich
lcd.setCursor(0, 0);
lcd.print("Quay Nghich ");
digitalWrite(52,0);
digitalWrite(in1_2, 1);
digitalWrite(in2_2, 0); // dc2
analogWrite(pwm_2, 100 );
digitalWrite(in1_3, 0);
digitalWrite(in2_3, 1); // dc3
analogWrite(pwm_3, 100 );
}
}
}
Serial.print(","); // x0 0
Serial.print(x_dat);
Serial.print(",");// 1
Serial.print(x_thuc);
Serial.print(","); // y0 2
Serial.print(y_dat);
Serial.print(",");// 3
Serial.print(y_thuc);
Serial.print(","); // goc 4
Serial.print(gochientai);
Serial.print(",");// kp 5
Serial.print(kp);
Serial.print(","); //ki 6
Serial.print(ki);
Serial.print(","); // kd 7
Serial.print(kd);
Serial.print(","); // u1 8
Serial.print(u1);
Serial.print(","); // u2 9
Serial.print(u2);
Serial.print(","); // u3 10
Serial.println(u3);
lcd.setCursor(0, 0);
lcd.print("x=");
lcd.print(x_thuc);
lcd.setCursor(0, 1);
lcd.print("y=");
lcd.print(y_thuc);
fuzzy->setInput(1, quangduonght);
fuzzy->setInput(2, de);
fuzzy->setInput(3, quangduonght);
fuzzy->setInput(4, de);
fuzzy->setInput(5, quangduonght);
fuzzy->setInput(6, de);
fuzzy->fuzzify();
kp = outputP_tam *10 ;
ki = outputI_tam *0.001;
kd = outputD_tam *100;
x_thuc = khoangcach_x0();
y_thuc = khoangcach_y0();
if(x_thuc >100) {
x_thuc = 100;
}
if(y_thuc >100) {
y_thuc = 100;
}
//sua tam
gochientai = goc();
//gochientai = 237;
error_x = x_thuc - x_dat;
error_y = y_thuc - y_dat;
preError_y = error_y;
preError_x = error_x;
duty1 = abs(v1);
duty2 = abs(v2);
duty3 = abs(v3);
if(duty1 > 1500){
duty1 = 1500;
}
if(duty2 > 1500){
duty2 = 1500;
}
if(duty3 > 1500){
duty3 = 1500;
}
u1 = map(duty1, 0, 1500, 60 , 250);
u2 = map(duty2, 0, 1500, 60 , 250);
u3 = map(duty3, 0, 1500, 60 , 250);
// chuong trinh chinh
//11111111111111//////////////*****************///////////////
if (gochientai < (gocdat + 10))
{
//dco quay nghich
digitalWrite(in1_1, 0);
digitalWrite(in2_1, 1);
analogWrite(pwm_1, 100 ); // dc1
digitalWrite(in1_2, 1);
digitalWrite(in2_2, 0);
analogWrite(pwm_2,100 ); //dc2
digitalWrite(in1_3, 0);
digitalWrite(in2_3, 1);
analogWrite(pwm_3, 100); // dc3
}
//22222222222222222222222222222222222222222
if (gochientai > (gocdat - 10))
{
//dco quay thuan ;
digitalWrite(in1_1, 1);
digitalWrite(in2_1, 0);
analogWrite(pwm_1, 100); // dc1
digitalWrite(in1_2, 0);
digitalWrite(in2_2, 1);
analogWrite(pwm_2, 100); //dc2
digitalWrite(in1_3, 1);
digitalWrite(in2_3, 0);
analogWrite(pwm_3, 100); // dc3
}
//3333333333333333333333333333
if (gochientai <= (gocdat + 10) && gochientai >= (gocdat - 10) )
{
// bam xung cho dong co 1
if (v1 > 0)
{
digitalWrite(in1_1, 1); // dc1
digitalWrite(in2_1, 0);
analogWrite(pwm_1, u1 +3);
}
if (v1 < 0)
{
digitalWrite(in1_1, 0); // dc1
digitalWrite(in2_1, 1);
analogWrite(pwm_1, u1+3);
}
if (v1 == 0)
{
analogWrite(pwm_1, 0 );
}
// dong co 2
if (v2 > 0)
{
digitalWrite(in1_2, 0);
digitalWrite(in2_2, 1); // dc2
analogWrite(pwm_2, u2 );
}
if (v2 < 0)
{
digitalWrite(in1_2, 1);
digitalWrite(in2_2, 0); // dc2
analogWrite(pwm_2, u2 );
}
if (v2 == 0)
{
analogWrite(pwm_2, 0 );
}
// dong co 3
if (v3 > 0)
{
digitalWrite(in1_3, 1);
digitalWrite(in2_3, 0); // dc3
analogWrite(pwm_3, u3 );
}
if (v3 < 0)
{
digitalWrite(in1_3, 0);
digitalWrite(in2_3, 1); // dc3
analogWrite(pwm_3, u3);
}
if (v3 == 0)
{
analogWrite(pwm_3, 0 );
}
}
}
}
2) Code Pidc.m
V = kp* [ex;ey] + ki*[tpex;tpey] + kd * [dhex;dhey]
u1 = V'*[0;1] + pdthe;
u2 = V'*[-sqrt(3)/2;-0.5] + pdthe;
u3 = V'*[sqrt(3)/2;-0.5] + pdthe;
sys(1) = u1;
sys(2) = u2;
sys(3) = u3;
3) Code Quangduong.m
ex = u(1);
ey = u(2);
u = sqrt(ex*ex + ey*ey)
sys(1) = u;