Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Codigo para comparar valores

Estas en el tema de Codigo para comparar valores en el foro de C/C++ en Foros del Web. Buenas tardes a todos: Es mi primer comentario en estos foros y aprovecho esta oportunidad para saludar a usuarios y moderadores y aradecer este espacio ...
  #1 (permalink)  
Antiguo 07/08/2014, 12:50
 
Fecha de Ingreso: agosto-2014
Mensajes: 2
Antigüedad: 9 años, 8 meses
Puntos: 0
Codigo para comparar valores

Buenas tardes a todos:
Es mi primer comentario en estos foros y aprovecho esta oportunidad para saludar a usuarios y moderadores y aradecer este espacio Web de programación.
Jubilado tras muchos años de trabajar en “hardware”, siempre he querido dedicar un tiempo a las cuestiones de “software” pero solo ahora dispongo de tiempo para ello.
Mi primer intento es elaborar un dispositivo que me ayude a la navegación a vela a la que soy aficionado.
Para ello he adquirido el hardware necesario (placa Arduino Mega y un sensor de Magnetismo y Aceleración). Los parámetros de funcionamiento del sensor (magnetismo+aceleración) ya los tengo en mi poder y he logrado modificar rutinas en C++ para presentar en el puerto COM el dato de RUMBO (diferencia en grados entre el Norte Magnetico y la posición del sensor.
El código de la rutina es el siguiente:
Código:
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303_U.h>

/* Compatibilizacion Unificada de identidad de sensores */
Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(54321);
Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345);

void setup(void) 
{
  Serial.begin(9600);
  
  /* Inicializacion de sensores*/
  if(!mag.begin())
  {
    /* Comprobacion de cableado */
    Serial.println("Bueno… :No detecto el sensor...Comprobar cables !");
    while(1);
  }
}

void loop(void) 
{
  /* Detectar evento del sensor*/ 
  sensors_event_t event; 
  mag.getEvent(&event);
  
  float Pi = 3.14159;
  
  // Calcular angulo de vectores X,Y
  int heading = (atan2(event.magnetic.y,event.magnetic.x) * 180) / Pi;
  
  // Normalizar angulo de 0-360
  if (heading < 0)
  {
    heading = 360 + heading;
  }
  Serial.print("RUMBO: ");

  Serial.println(heading);
  delay(500);
}
Mi propósito el de ampliar la rutina anterior de modo que accionando en cualquier momento un pulsador, se pueda retener el valor de rumbo existente, y de lugar a una comparación de los valores siguientes con el almacenado. Si el valor retenido fuese por ejemplo de 170º , si el rumbo (real) aumentase/disminuyese un valor establecido de Xº quisiera llevarlo a un generador PWM capaz mover un motor DC en un sentido u otro para corregir el desvío (o diferencia) entre el valor retenido y el existente posteriormente.
Obviamente y para reducir al máximo los componentes de hardware, una segunda pulsacion del pulsador pretendo que "borre" el valor guardado y quedar listo para una nueva secuencia.
En las librerías de Arduino he leido casi todo lo referente control de robotica pero apenas hay nada dedicado a lo que he explicado mas arriba.
Un saludo a todos y gracias de antemano por cualquier sugerencia de cómo acometer mi pequeño proyecto.
  #2 (permalink)  
Antiguo 07/08/2014, 13:18
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Codigo para comparar valores

Buenas,

Puedes declarar una variable con el valor previo en un scope global de tu programa.
http://arduino.cc/en/Reference/scope

De esta forma, podrás comparar el valor existente con el nuevo valor de rumbo y actuar en consecuencia.

Código C:
Ver original
  1. #include <Wire.h>
  2. #include <Adafruit_Sensor.h>
  3. #include <Adafruit_LSM303_U.h>
  4.  
  5. /* Compatibilizacion Unificada de identidad de sensores */
  6. Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(54321);
  7. Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(12345);
  8.  
  9. /* Valor existente */
  10. int existing_heading = 0;
  11.  
  12. void setup(void)
  13. {
  14.   Serial.begin(9600);
  15.  
  16.   /* Inicializacion de sensores*/
  17.   if(!mag.begin())
  18.   {
  19.     /* Comprobacion de cableado */
  20.     Serial.println("Bueno… :No detecto el sensor...Comprobar cables !");
  21.     while(1);
  22.   }
  23. }
  24.  
  25. void loop(void)
  26. {
  27.   /* Detectar evento del sensor*/
  28.   sensors_event_t event;
  29.   mag.getEvent(&event);
  30.  
  31.   float Pi = 3.14159;
  32.  
  33.   // Calcular angulo de vectores X,Y
  34.   int heading = (atan2(event.magnetic.y,event.magnetic.x) * 180) / Pi;
  35.  
  36.   // Normalizar angulo de 0-360
  37.   if (heading < 0)
  38.   {
  39.     heading = 360 + heading;
  40.   }
  41.  
  42.   //Logica a incluir
  43.   if(existing_heading == XXX && heading = YYY) {
  44.      //TODO
  45.   }
  46.   Serial.print("RUMBO: ");
  47.  
  48.   Serial.println(heading);
  49.  
  50.  //Actualizamos heading existente
  51.  existing_heading = heading;
  52.   delay(500);
  53. }


Un saludo
  #3 (permalink)  
Antiguo 08/08/2014, 22:56
 
Fecha de Ingreso: agosto-2014
Mensajes: 2
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Codigo para comparar valores

Hola de nuevo..
En primer lugar mi agradecimiento a Profesor_Falken por su ayuda.
Y ahora una pequeña variación a mi proyecto que creo mas sencillo y elimina botones, displays y accesorios al resultado.
Para ello usaré un "H-Bridge" como el que se muestra a continuacion que permite el control de giro del motor (M) controlado por dos de las salidas PWM de mi Arduino MEGA 2560.
http://i1221.photobucket.com/albums/dd477/quintamala/hbridgemod_zpsff4e96b9.png
Debo decir que en reposo los BC182 han de estar en LOW. El que reciba un HIGH hará girar el motor en un sentido. NO pueden recibir un HIGH ambos en ningun momento.
Visto así , en el sketch que puse en el primer mensaje, solo hace falta un botón que al ser pulsado retuviese el valor angular del sensor LSM303 en el momento de la pulsacion que guardado en una variable (int) me serviría para ver si los valores posteriores aumentan/disminuyen.
A partir de ahí si el valor posterior del sensor fuese mayor que el retenido habría de enviar desde el Arduno una señal PWM que iria incrementando no solo el sentido de giro... Sino tambien un valor de voltage creciente.

Resumiendo: Establezcamos un valor de 0 a 9 de margen entre el valor angular guardado y el que continúa llegando del LSM303 de forma que 1 grado sea muy "lento" y al llegar a 9 grados de diferencia sea tan alta la frecuencia que al BC182 afectado le suponga un HIGH "pleno/max. velocidad de giro"... imperceptible que hará girar el motor al máximo.
Si lo anterior ocurrió porque el valor angular guardado era mayor, solo hay que hacer que si fuese menor actuase al BC182 contrario (y del mismo modo).
Ahora bien... Con mis achacosos conocimientos de programación creo que voy a necesitar alguna ayuda.
Esta tarde, leyendo las caracteristicas de mi placa me dí cuenta de que tiene una docena al menos de pines con capacidad PWM y me dió por darle la vuelta y simplificar.. (aparte de que el cambio de velocidad en aumento/descenso es la guinda del proyecto de mi proyecto).
He "pescado" esta rutina...
Código:
void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  digitalWrite(13, HIGH);
  delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz
  digitalWrite(13, LOW);
  delayMicroseconds(1000 - 100);
}
Se usa el pin 13 (un PWM del MEGA 2560) y es algo muy "manual" pero que permite variar la salida (ON/OFF) las veces que se desee. Solo hay que asociar ese numero de veces a lo valores (0-9) que haya de diferencia entre el angulo obtenido con el unico pulador y el que lea el LSM303 a partir de ese momento.
Definitivamente voy a ponerme manos a la obra. Seguro que consigo armar el hardware antes de tener listo el programita... pero es que.. lo mío ha sido siempre el soldador y los chips...
Y pensar que cuando empecé con todo esto allá por los 70, los ordenadores que reparaba eran analógicos o como mucho de memoria con nucleos de ferrita y los programas se escribian en cintas y tarjetas perforadas. ¡Que tiempos!
Saludos y perdonad por mis historias de viejo "cebolleta".
Muchas gracias a todos

Última edición por fgarbu3; 09/08/2014 a las 06:51

Etiquetas: funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:15.