Pages: [1]   Go Down
Author Topic: Fuzzy Logic Problem- Servo motor position control  (Read 2007 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hope your'e all in the best of your health and spirits.

I am encountering a small problem with the code of Fuzzy logic I generated through this website:

http://www.makeproto.com/projects/fuzzy/matlab_arduino_FIST/index.php

There seems to be a definition problem with the problem. I am posting the code here.
This is the header file.

Code:
typedef float (*_mffloat2)(float,float,float);                  
typedef float (*_mffloat3)(float,float,float,float);            
typedef float (*_mffloat4)(float,float,float,float,float);      
typedef double (*_mfdouble2)(double,double,double);              
typedef double (*_mfdouble3)(double,double,double,double);      
typedef double (*_mfdouble4)(double,double,double,double,double);

#define M_LN2 0.693147180559945309417                                    
union                                                                    
{                                                                        
double d;                                                              
struct{ int j,i;}n;                                                    
}_eco;                                                                  
#define EXP_A (1048576/M_LN2)                                            
#define EXP_C 60801                                                      
#define _exp(y) (_eco.n.i = EXP_A * (y) + (1072693248 - EXP_C), _eco.d)  

Here is the actual code.
You need to go only to the Aggregate3 function. where my compiler says that "_mmfloat3" has not been declared. I have the header file copied in the sketch folder. Please any help with this would be appreciated.

Code:
#include <fuzzyadilspeedorignal.h>

#include <Servo.h>

Servo myservo;  //create servo object

int pos = 0;    //servo position
int inputs[] = {0, 45, 90, 135, 180};  //positions (in degrees) to send to the servo
int outputs[] = {0, 0, 0, 0, 0};
int numPositions = 5;
  
void setup()
{
  //control servo via pin 9
  myservo.attach(9, 750, 2550);
  //start serial comm. for debugging
  Serial.begin(9600);
}

// Not Function
float _not(float x)
{
return (float)(1.0-x);
}
// Generates the values in the range [min,max] with increments
// defined by 'step'.
void generate(float minimum, float maximum, float st, float* values,int length)
{
float x = minimum;
int i;
for(i=0;i<length;i++,x+=st)
values[i] = x;
}
// Sets all elements in the array with the same value
void set(float* values,int length,float value)
{
int i;
for(i=0;i<length;i++)
values[i] = value;
}
// Returns the smallest element of an array
float min_array(float* x, int length)
{
    if(length <= 0) return (float)0;
float m = x[0];
int i=1;
for(;i<length;i++)
m = min(m,x[i]);
return m;
}
// Returns the largest element of an array
float max_array(float* x, int length)
{
    if(length <= 0) return (float)0;
float m = x[0];
int i=1;
for(;i<length;i++)
m = max(m,x[i]);
return m;
}
// Centroid of points
void centroid(float* x, float* y, int length, float* Cx, float* Cy)
{
float a = 0;
float tx = 0;
// float ty = 0;
float t = 0;
int i = 0;
        int l = length - 1;
for(;i<l;i++)
{
t = ((x[i] * y[i+1]) - (x[i+1] * y[i]));
                a += t/2;
tx = (x[i] + x[i+1]) * t;
// ty = (y[i] + y[i+1]) * t;
}
*Cx = (tx /(6 * a));
// *Cy = (ty /(6 * a));
}
// Triangular Member Function
float trimf(float x, float a, float b, float c)
{
    return (float)max(min((x - a) / (b - a), (c - x) / (c - b)), 0);
}
// Aggregation code for membership functions that require 3 setting values
void aggregate3(float* rules, int* ruleIndexes, int ruleIndexLength, float* xArr, float *yArr, int resultLength, _mffloat3 mf,float a,float b,float c)
{
int i=0, j=0;
for(;i<resultLength;i++)
{
for(j=0;j<ruleIndexLength;j++)
{yArr[i] = max(yArr[i],min(rules[ruleIndexes[j]],mf(xArr[i],a,b,c)));}
}
}

void fuzzyadilspeedorignal(float* Inputs, float* outputs)
{ // Transformation of inputs to fuzzy inputs.
// Input variable error_e
float Inputs1[7];
// Input term 'NB'for variable 'error_e'
Inputs1[0] = trimf(inputs[0],-1.333,-1,-0.55);
// Input term 'NM'for variable 'error_e'
Inputs1[1] = trimf(inputs[0],-1,-0.55,-0.2);
// Input term 'NS'for variable 'error_e'
Inputs1[2] = trimf(inputs[0],-0.55,-0.2,0);
// Input term 'Z'for variable 'error_e'
Inputs1[3] = trimf(inputs[0],-0.2,0,0.2);
// Input term 'PS'for variable 'error_e'
Inputs1[4] = trimf(inputs[0],0,0.2,0.55);
// Input term 'PM'for variable 'error_e'
Inputs1[5] = trimf(inputs[0],0.2,0.55,1);
// Input term 'PB'for variable 'error_e'
Inputs1[6] = trimf(inputs[0],0.55,1,1.334);
// Build all the conditions.
// Variable to store the condition result
float R[49];
float CondR[1];
// Handle conditions for rule 1
CondR[0] = Inputs1[0];
R[0] = 1 * min_array(CondR,1);
// Handle conditions for rule 2
CondR[0] = Inputs1[0];
R[1] = 1 * min_array(CondR,1);
// Handle conditions for rule 3
CondR[0] = Inputs1[0];
R[2] = 1 * min_array(CondR,1);
// Handle conditions for rule 4
CondR[0] = Inputs1[0];
R[3] = 1 * min_array(CondR,1);
// Handle conditions for rule 5
CondR[0] = Inputs1[0];
R[4] = 1 * min_array(CondR,1);
// Handle conditions for rule 6
CondR[0] = Inputs1[0];
R[5] = 1 * min_array(CondR,1);
// Handle conditions for rule 7
CondR[0] = Inputs1[0];
R[6] = 1 * min_array(CondR,1);
// Handle conditions for rule 8
CondR[0] = Inputs1[1];
R[7] = 1 * min_array(CondR,1);
// Handle conditions for rule 9
CondR[0] = Inputs1[1];
R[8] = 1 * min_array(CondR,1);
// Handle conditions for rule 10
CondR[0] = Inputs1[1];
R[9] = 1 * min_array(CondR,1);
// Handle conditions for rule 11
CondR[0] = Inputs1[1];
R[10] = 1 * min_array(CondR,1);
// Handle conditions for rule 12
CondR[0] = Inputs1[1];
R[11] = 1 * min_array(CondR,1);
// Handle conditions for rule 13
CondR[0] = Inputs1[1];
R[12] = 1 * min_array(CondR,1);
// Handle conditions for rule 14
CondR[0] = Inputs1[1];
R[13] = 1 * min_array(CondR,1);
// Handle conditions for rule 15
CondR[0] = Inputs1[2];
R[14] = 1 * min_array(CondR,1);
// Handle conditions for rule 16
CondR[0] = Inputs1[2];

// Basic output processing
int res = 100;
float step;
float xMin;
float xMax;
float x[res];
float y[res];
float t;
int value[49];
// Output variable Outputcontrol
xMin = -1;
xMax = 1;
t=0;
step = (xMax - xMin) / (float)(res - 1);
generate(xMin, xMax, step, x, res);
set(y, res, 0);
value[0] = 0;
value[1] = 1;
value[2] = 2;
value[3] = 3;
value[4] = 7;
value[5] = 8;
value[6] = 9;
value[7] = 14;
value[8] = 15;
value[9] = 21;
aggregate3(R,value,10,x,y,res,trimf,-1.25,-1,-0.6);
value[0] = 4;
value[1] = 10;
value[2] = 16;
value[3] = 22;
value[4] = 28;
aggregate3(R,value,5,x,y,res,trimf,-1,-0.6,-0.33);
value[0] = 5;
value[1] = 11;
value[2] = 17;
value[3] = 23;
value[4] = 29;
value[5] = 30;
value[6] = 35;
aggregate3(R,value,7,x,y,res,trimf,-0.6,-0.27,0);
value[0] = 6;
value[1] = 12;
value[2] = 18;
value[3] = 24;
value[4] = 31;
value[5] = 36;
value[6] = 42;
aggregate3(R,value,7,x,y,res,trimf,-0.2,0,0.2);
value[0] = 13;
value[1] = 19;
value[2] = 25;
value[3] = 32;
value[4] = 37;
value[5] = 43;
value[6] = 44;
aggregate3(R,value,7,x,y,res,trimf,0,0.27,0.6);
value[0] = 20;
value[1] = 26;
value[2] = 33;
value[3] = 38;
value[4] = 45;
aggregate3(R,value,5,x,y,res,trimf,0.33,0.6,1);
value[0] = 27;
value[1] = 34;
value[2] = 39;
value[3] = 40;
value[4] = 41;
value[5] = 46;
value[6] = 47;
value[7] = 48;
aggregate3(R,value,8,x,y,res,trimf,0.6,1,1.25);
centroid(x, y, res, &outputs[0], &t);
}
void loop()
{
  int i = 0;
  //iterate over positions
  
  fuzzyadilspeedorignal(inputs, outputs);
  for(i = 0; i < numPositions; i++)
  {        
    pos = outputs[i];

    //print debug output
    Serial.println("SETTING:");
    Serial.println(pos);

    //tell servo to set the new position
    myservo.write(pos);

    //wait for two seconds
    delay(2000);
  }

}
Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 615
Posts: 49414
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I have the header file copied in the sketch folder.
Then you are using the wrong symbols on your include statement.

It should be:
Code:
#include "fuzzyadilspeedorignal.h"
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Then you are using the wrong symbols on your include statement.


It should be:
Code:
#include "fuzzyadilspeedorignal.h"

The " " commas still give the same error.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry,
Now it says
error: fuzzyadilspeedorignal.h: No such file or directory

please see the attachment.
Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 615
Posts: 49414
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
please see the attachment.
I didn't see any problem. Or attachment, for that matter.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


I didn't see any problem. Or attachment, for that matter.
Sorry, Can you see it now? is there any thing I am doing wrong? :S


* this.jpg (1133.24 KB, 3688x3056 - viewed 84 times.)
Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 615
Posts: 49414
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

First thing I'm wondering is why the sketch is including Servo.h twice.

Second thing I'm wondering is why the sketch, which gets converted to a cpp file, is named the same as the header file, but with different extension. Try renaming the sketch to something like rutabaga.
Logged

Pages: [1]   Go Up
Jump to: