Go Down

Topic: ¿Sensor para controlador de rotor de antenas? (Read 4720 times) previous topic - next topic

GO_zalo

puede ser usado en ambientes fuertemente magneticos, lo que no dice es que siga indicando el norte, sino que apuntara al campo magnetico fuerte, a diferencia de los que no lo soportan, este en retirar el campo magnetico fuerte vuelve a apuntar al norte, los otros se quedan magnetizados en dirección al campo fuerte y el terrestre no es lo bastante fuerte para quitar ese magnetismo remanente

es como si acercamos un iman a brújula normal de aguja, a la mierda la brújula ya la puedes tirar

maxid

bueno,yo te averigüé esto.
El HMC6352 es un sensor que puede servirte, sus especificaciones dicen soportar hasta 10.000 Gauss o sea que en presencia de fuernte campos magnéticos aún trabaja correctamente.
Creo que tenemos un punto de partida.

Rescato lo que esta relacionado solamente:

- Sensor Can Be Used in Strong Magnetic Field Environments
Max. Exposed Field: 10000 gauss No permanent damage and set/reset function restores performance.
 
por aca conseguí el HMC5883L, pero me saltó un error nuevo


cuando pongo la libreria Wire.h me da esto

Code: [Select]
Library can't use both 'src' and 'utility' folders. Double check C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire

Error compiling for board Arduino/Genuino Uno.


parece que es un bug
El que pregunta aprende, el que responde aprende a responder.

surbyte

Sigamos con el debate... a ver como interpretas esto Go_zalo, ahora nos movemos al HMC5883L.

Hoja de datos del HMC5883L

Sensors Can Be Used in Strong Magnetic Field Environments with a 1° to 2° Degree Compass Heading Accuracy

Parece ser que la brújula inicialmente se desvía pero si efectúas la autocalibración que ocurrre durante el power up (encendido) compensa el campo magnetíco externo presente y vuelve a indicar bien.
Digo parece porque no tengo un magnetómetro y no puedo probarlo.

ratpenat

Buenas noches (aquí).

Una idea: un giroscopio de estado sólido como: ÉSTE es barato, lleva incorporada la comunicación serie y le sobran dos ejes.

Saludos

PeterKantTropus

Es necesario girar la antena energizada? porque en ese caso no importa donde apunte en funcionamiento de la antena.
"Si no entra como tornillo, entra como clavo"

maxid

#20
Apr 15, 2016, 07:45 pm Last Edit: Apr 15, 2016, 07:49 pm by maxid
Bueno, ya tengo el prototipo uso el magnetometro y comunicacion 1 hilo con la llibreria PJON

@SurByte en los ejemplos que vi hacen correccion por declinacion segun la zona geografica.

@PeterKantTropus no es necesario mover mientras se transmite, en mi caso. digo en mi caso porque si fuera una comunicacion satelital debes seguir la orbita y en ese caso no andaria o no se todavia.
En fin ese será otro proyecto.
Se me ocurre tambien poner una salida para alimentarlo solo cuando va a efectuar el movimiento. Porque la parte logica si va a estar protegida de la radiación

Aca el video

Mañana voy a colcar el prototipo a unos 50 cm de la antena para ver como se comportan la comunicacion y el magnetometro. Me queda averiguar como distribuye la tension y corriente la antena que tengo ahora para ver donde es mas probable la falla.


El que pregunta aprende, el que responde aprende a responder.

surbyte


Quote
@SurByte en los ejemplos que vi hacen correccion por declinacion segun la zona geografica.
Correccion por declinación es una cosa.
Y que no marque el norte por la presencia de un campo fuerte es otra.
El manual me parece que dice que no se ve afectado por campos fuertes pero si le pones un campo fuerte yo coincido con Go_zalo que va a marcar mal, y entonces lo reinicias y se autocalibra con precisión 1 o 2 grados como dice la hoja de datos.

maxid

Correccion por declinación es una cosa.
Y que no marque el norte por la presencia de un campo fuerte es otra.
El manual me parece que dice que no se ve afectado por campos fuertes pero si le pones un campo fuerte yo coincido con Go_zalo que va a marcar mal, y entonces lo reinicias y se autocalibra con precisión 1 o 2 grados como dice la hoja de datos.
Ahora que volvió el sol voy a retomar las pruebas. pero hasta el momento no logro que marque el norte bien. Y por lo que lei soporta campos fuertes.

encontre una libreria que hace una calibracion importante.
la de Adafruit no me convence del todo
El que pregunta aprende, el que responde aprende a responder.

surbyte

Quote
Ahora que volvió el sol voy a retomar las pruebas. pero hasta el momento no logro que marque el norte bien. Y por lo que lei soporta campos fuertes.
No logras que marque en presencia de campo o sea con antena activa o desactivada?
Que buen aporte el enlace de la calibración.

maxid

No logras que marque en presencia de campo o sea con antena activa o desactivada?
Que buen aporte el enlace de la calibración.
si marca pero es muy erratico la lectura en general. Ese sensor tiene un "defecto" que ante cuanquier inclinacion cabia la letura magnetica y hay que compensarlo.

Si lo pongo boca abajo me marca el norte bien y mal el sur y si lo pongo normal el norte me da cerca del oeste y bien el sur. Muy loco como funciona.

Estoy pensando usar un hall por pulsos o el potenciometro que no encuentro engranaje para tomar el giro de la corona.
El que pregunta aprende, el que responde aprende a responder.

surbyte

Vamos por partes.
Cuando lo tienes en tu mesa de trabajo marca bien? Y cuando lo llevas al sitio de medicion, ahi falla?

maxid

Vamos por partes.
Cuando lo tienes en tu mesa de trabajo marca bien? Y cuando lo llevas al sitio de medicion, ahi falla?
aca en mi trabajo lo pongo y marca bien.
En mi casa a unos 20km como el diablo!!

este es el codigo que uso, no se si la estoy pifiando en algo

Transmisor

Code: [Select]
#include <PJON.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>


// network(Arduino pin used, selected device id)
PJON network(3, 45);
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);


void setup() {

  //pinMode(A0,INPUT);
  Serial.begin(115200);
  network.set_error(error_handler);

  Serial.println("Magnetometro HMC5883 Test");
  Serial.println("");
 
  /* Inicializamos el sensor */
  if(!mag.begin())
  {
    // Si hay algun problema con el HMC5883 sale el aviso de que revise las conexiones
    Serial.println("Ooops, no se ha detectado el HMC5883 ... revisa las conexiones!");
    while(1);
  }
 
  // Muesta la información básica del sensor
  displaySensorDetails();
}

void error_handler(uint8_t code, uint8_t data) {
  if(code == CONNECTION_LOST) {
    Serial.print("Connection lost with device id ");
    Serial.println(data);
  }
}

void displaySensorDetails(void)
{
  sensor_t sensor;
  mag.getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("ID unica:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Valor Maximo:    "); Serial.print(sensor.max_value); Serial.println(" uT");
  Serial.print  ("Valor Minimo:    "); Serial.print(sensor.min_value); Serial.println(" uT");
  Serial.print  ("Resolucion:   "); Serial.print(sensor.resolution); Serial.println(" uT"); 
  Serial.println("------------------------------------");
  Serial.println("");
  delay(500);
 
}


unsigned long time = millis();

void loop() {

  if(millis() - time > 1000)
  {
    time = millis();
    //int temperature = analogRead(A0);

// Hacemos que el sensor tome una nueva muestra
  sensors_event_t event;
  mag.getEvent(&event);
 
  /*
     Sostenga el módulo de manera que Z está señalando arriba y se pueda medir con el título X e Y
     Calcular la medida cuando el magnetómetro esté nivelado, y luego corregir los signos de eje
  */
 
  float muestra = atan2(event.magnetic.y, event.magnetic.x);
 
  /* Una vez tengamos la muestra tomada, a continuación debemos agregar el "ángulo de declinación"
    el ángulo de declinación es el "error" del campo magnético en su ubicación.
  Puedes encontrar el tuyo aquí: http://www.magnetic-declination.com/
   Si no encuentras tu ángulo de declinación, comenta las dos línias siguientes, la brújula estará 
  ligeramente desviada*/
 
  float declinacionAngulo = -0.091338935; //5 grados=0,0872665 14 min= 0,004072435
  muestra += declinacionAngulo;
 
  // corrige los valores negativos
  if(muestra < 0)
    muestra += 2*PI;
   
  // Comprueba si hay error debido a la adición de la declinación.
  if(muestra > 2*PI)
    muestra -= 2*PI;
   
  // Convierte los radianes a grados
  int muestraangulo = muestra * 180/M_PI;
    //Send a "T", break the int in two bytes
    char analogvalue=map(analogRead(A0),0,1023,0,255);
    char content[3] = {'G', muestraangulo >> 8, muestraangulo & 0xFF};
    network.send(44, content, 3);

    MostrarPosicion(muestraangulo);
    //Serial.print("Analog:");
    //Serial.println(analogvalue,DEC);
 
  }

  network.update();
}


void MostrarPosicion(int muestraangulo)
{
 if (muestraangulo > 350)
  {
      Serial.print("N      ");
      Serial.println(muestraangulo);
  }
 
  if (muestraangulo <= 15)
  {
    Serial.print("N      ");
    Serial.println(muestraangulo);
  }
  if (muestraangulo > 15 && muestraangulo <= 75)
  {
    Serial.print("NE    ");
    Serial.println(muestraangulo);
  }
 
  if (muestraangulo > 75 && muestraangulo <= 105)
  {
    Serial.print("E      ");
    Serial.println(muestraangulo);
  }
 
   if (muestraangulo > 105 && muestraangulo <= 165){
    Serial.print("SE    ");
    Serial.println(muestraangulo);
  }
 
  if(muestraangulo > 165 && muestraangulo <= 195){
    Serial.print ("S    ");
    Serial.println(muestraangulo);
   
  }
 
  if(muestraangulo > 195 && muestraangulo <= 255){
    Serial.print ("SW    ");
    Serial.println(muestraangulo);
  }
 
  if(muestraangulo > 255 && muestraangulo <= 285)
  {
    Serial.print ("W    ");
    Serial.println(muestraangulo);
  }
 
  if(muestraangulo > 285 && muestraangulo <= 350)
  {
    Serial.print ("NW    ");
    Serial.println(muestraangulo);
 
  } 

}


Receptor

Code: [Select]

#include <LiquidCrystal.h>
#include <PJON.h>

// network(Arduino pin used, selected device id)
PJON network(3, 44);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);           // select the pins used on the LCD panel
 
void setup(){
   Serial.begin(115200);
   network.set_receiver(receiver_function);
   lcd.begin(16, 2);               // start the library
   lcd.setCursor(0,0);             // set the LCD cursor   position
   lcd.print("TIME:");  // print a simple message on the LCD
   lcd.setCursor(0,1);             // set the LCD cursor   position
   lcd.print("POSITION:");  // print a simple message on the LCD
}
 
void loop()
{
   network.receive(1000);
   lcd.setCursor(7,0);             // move cursor to second line "1" and 9 spaces over
   lcd.print(millis()/1000);       // display seconds elapsed since power-up
   lcd.setCursor(0,1);             // move to the begining of the second line
}


void MostrarPosicion(int muestraangulo)
{
  lcd.setCursor(10,1);             // set the LCD cursor   position
  if (muestraangulo > 350)
      lcd.print("N     ");
 
  if (muestraangulo <= 15 )
      lcd.print("N     ");

  if (muestraangulo > 15 && muestraangulo <= 75)
      lcd.print("NE    ");
 
  if (muestraangulo > 75 && muestraangulo <= 105)
     lcd.print("E     ");
 
  if (muestraangulo > 105 && muestraangulo <= 165)
     lcd.print("SE    ");
 
  if(muestraangulo > 165 && muestraangulo <= 195)
    lcd.print ("S     ");
 
  if(muestraangulo > 195 && muestraangulo <= 255)
    lcd.print ("SW    ");
 
  if(muestraangulo > 255 && muestraangulo <= 285)
    lcd.print ("W     ");
 
  if(muestraangulo > 285 && muestraangulo <= 350)
    lcd.print ("NW    ");
 
  lcd.setCursor(13,1);
  lcd.print(muestraangulo);

}

void MostarAnalog(byte a)
{
  lcd.setCursor(13,0);
  lcd.print("   ");
  lcd.print(a,DEC);
 
}


void receiver_function(uint8_t length, uint8_t *payload) {
 if((char)payload[0] == 'G')
 {
    int v= payload[1] << 8 | payload[2] & 0xFF;
   // byte a= payload[3];
    //MostarAnalog(a);
    MostrarPosicion( v );
    // Get back the original integer from the 2 separate bytes
    Serial.println(payload[1]);
 }

}

El que pregunta aprende, el que responde aprende a responder.

surbyte

Y ese PJON que usás por donde transmite? 1 cable?

maxid

Si anda genial, hasta 30 mtrs aprox. Estoy colaborando con ellos.
El que pregunta aprende, el que responde aprende a responder.

maxid

Visto que no me convence el modo en que funciona el magnetometro, voy por el camino de la lectura de pulsos. Tambien porque la coloacion de un potenciometro es asi imposible por el poco espacio interno y el acople a la corona es muy dificil.

Tengo un engranaje que lo puedo ubicar en la segundo engranaje que me da 4 pulsos por vuelta del primer engranaje, o mas abajo que da menos pulsos.

Tengo un efecto hall para probar.

Proximamente etré poniendo avances
El que pregunta aprende, el que responde aprende a responder.

Go Up