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:
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.#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); }
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.