Go Down

Topic: ball and plate con control difuso [solucionado] (Read 319 times) previous topic - next topic

JorgeBravoArce

Nov 12, 2018, 09:51 pm Last Edit: Nov 14, 2018, 12:08 am by JorgeBravoArce
Hola, es mi primer post en la comunidad, y recurro a ustedes porque estoy realizando un ball and plate para la universidad y tengo problemas con el código ya que estoy usando control difuso. Estoy utilizando un arduino uno compatible, el cual me ha funcionado correctamente, una pantalla resistiva de 4 hilos, y dos servos hitec hs-422. Encontré una programación en el foro sobre control difuso para realizar un levitador, y lo modifique a mi gusto para activar un servo.
Al realizar el control difuso con una entrada y una salida, el control funciona perfectamente... el problema va cuando intento agregar una segunda entrada y una segunda salida, ya que son dos ejes los cuales actúan para balancear la bola. Al usar la segunda entrada y salida, y sus respectivas reglas, el control del servo del eje X, el cual funcionaba perfectamente, no funciona para nada, y tampoco hace nada el servo del eje Y. Borre una función en la linea 202 ya que paso a paso descubrí que al añadir la ultima función de membresia, el servo y la comunicación serial se detenía, y al borrarla, funcionaba sin problemas. De todas formas, una vez declaradas todas las reglas del eje Y, el control sobre el servo del eje X deja de funcionar. La pantalla envía correctamente los datos, pero el servo del eje X y lógicamente del eje Y, no funcionan correctamente, simplemente arroja un valor de 0 grados.

Alguien que haya realizado una experiencia parecida que me pueda ayudar con el código ya que he buscado por todos lados algo útil frente a este problema y no he encontrado nada. Muchas gracias de antemano

surbyte

Esto es una barbaridad!!! desde el punto de vista de Arduino

Code: [Select]
void loop()
{
  int Xpos,Ypos; //Variables de X e Y
   //Para el eje X
   pinMode(A1,INPUT); //Se declara A1 como entrada analoga
   pinMode(A3,INPUT); //Se declara A3 como entrada analoga
   pinMode(A0,OUTPUT); //Se declara A0 como salida digital
   digitalWrite(A0,LOW); //Se forza A0 un valor 0
   pinMode(A2,OUTPUT); //Se declara A2 como salida digital
   digitalWrite(A2,HIGH); //Se forza A0 con un valor 1
   Xpos = (analogRead(A1))/(1024/Xresolution); // Valor obtenido de X
   //Para el eje Y
   pinMode(A0,INPUT); //Se declara A0 como entrada analoga
   pinMode(A2,INPUT); //Se declara A2 como entrada analoga
   pinMode(A1,OUTPUT); //Se declara A1 como salida digital
   digitalWrite(A1,LOW); //Se forza A1 un valor 0
   pinMode(A3,OUTPUT); //Se declara A3 como salida digital
   digitalWrite(A3,HIGH); //Se forza A3 con un valor 1
   Ypos = (analogRead(A0))/(1024/Xresolution); //Valor obtenido de Y
 
   // Visualizar valores de X e Y, separados por una coma
   //Serial.print(Xpos);
   //Serial.print(",");
   //Serial.println(Ypos);
   
 set_pointx=100; // Es la distancia donde se quiere estabilizar la pelota.
  ERRORX=set_pointx-Xpos;  //se establece el valor del error restando el set point con la distancia que lee el sensor
  control->setInput(1,ERRORX);   // se asigna al sistema Fuzzy llamado control una entrada con el valor de ERROR
  control->fuzzify();   //Se fuzifica el sistema
  ANGULOX = control->defuzzify(1); // Se des-fuzifica el sistema, guardando la salida en la variable potencia.
  servoMotor2.write(ANGULOX);  //Se establece la potencia del PWM
           //Se deja el pin 6 en cero.
 
  Serial.print("Pelota a: ");
  Serial.print(Xpos);
  Serial.print(" X " );
  Serial.print(" Angulo: ");
  Serial.println(ANGULOX);
   delay(100);
}


En el loop jamás se definen pines digitales como entradas o salidas. Bueno exagero, jamás no pero en este caso tampoco.

Asi que tienes algo muy mal.

Las definiciones deben ir en el setup.

JorgeBravoArce

si, es un detalle que no me he tomado el tiempo de arreglar, pero hasta el momento funciona bien asi, y pasa a ser un problema ínfimo comparado con mi planteamiento :/ alguna idea de porque al ingresar la segunda entrada y salida, con sus respectivas reglas, deja de funcionar incluso el servo del eje X? gracias por la mencion ya que lo arreglare de inmediato

surbyte

#3
Nov 13, 2018, 12:33 am Last Edit: Nov 13, 2018, 01:31 am by surbyte
Para responderte tendria que repasar Control Difuso y hace tiempo que no lo uso, asi que me parece mas bien un problema teoríco y luego su aplicacion práctica.

Luego otro tema es que no has publicado los enlaces de las librerías. Imposible seguirte tal como lo has posteado.
Se que vienes del otro hilo pero aporta la información para que se tome el trabajo de estudiar el tema pueda hacerlo  con la mejor disponibilidad de elementos.

AL indicarlo recuerda usar etiquetas. Cómo o dónde? En las normas del foro la respuesta.

A modo de ejemplo que puede o no servirte mira esto Two inputs Two Outputs Fuzzy Controller


Algo mas. Supongamos que tenemos todo. Como probamos prácticamente el sistema si no disponemos del esquema electrico de como levitar la bola?


Edito: Libreria eFLL (Embedded Fuzzy Logic Library) v1.0.10 [Updated at: 21 august 2016]

JorgeBravoArce

#4
Nov 13, 2018, 07:07 pm Last Edit: Nov 13, 2018, 07:18 pm by JorgeBravoArce
Hola, estoy usando la eFLL, exactamente la que usted ha indicado. La descargue de github la misma que agrego. Esa librería tiene para utilizar dos entradas y dos salidas? Por tema de diseño no he realizado el conexionado, por eso coloque como mención las entradas de la pantalla, y la definición de los servos, eje X en la salida 9 y eje Y en la salida 10.

Intenté utilizar Matlab para el control de los ejes pero me fue imposible por el tiempo que necesitaba implementar el proyecto. Por eso escojí Arduino IDE para realizar todo.

Me ayudaría bastante el encontrar un ejemplo de un control difuso, con sus librerías respectivas y sobre todo, que contenga mas de una entrada y mas de una salida. He buscado algo parecido pero la información obtenida, o es inconclusa, o demasiado compleja y difícil de entender sin alguna reseña o algo por el estilo.

surbyte

Bueno te daré mi opinión y depende de tu dominio de inglés.
Te recomiendo que cierres este hilo y vayas al foro en inglés a la sección indicada (no uses espaÑol) ni siquiera en los comentarios del código y espera ayuda allá.

Darás con alguien que sepa del tema con alguna mejor probabilidad que acá o bien espera y serás atentido, no puedo decirte mas.


JorgeBravoArce

Muchas gracias por la opinión. De todas formas dejaré abierto este hilo unos días mas por si alguien puede aportarme algún dato.

JorgeBravoArce

Muchas gracias por la ayuda. Ya solucione el problema, el cual era bajar las funciones de membresía. Utilice 5 para cada eje y 10 reglas respectivamente. Gracias nuevamente, cierro el hilo.

Go Up