Medida del campo magnético

Ya estamos en condiciones de escribir y subir a la placa el siguiente programa que nos proporciona la lectura del sensor traducida a intensidad de campo magnético. El campo magnético lo expresaremos en gauss, aunque la unidad de inducción magnética en el sistema internacional es el tesla (recuerda que la relación entre tesla y gauss es 1 T = 10410^4 G).

Si las especificaciones de tu sensor son diferentes, o si lo has conectado a otro pin analógico, debes ajustar las líneas de código correspondientes, pero fíjate que los únicos cambios que debes hacer están en las tres primeras instrucciones del programa.

const int PIN_sensor = 0;
const int VALOR_CERO = 550;
const float RESPUESTA = 1.4;

float n = VALOR_CERO * 5.0 / 1023;
float m = RESPUESTA / 1000;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int lectura = analogRead(PIN_sensor);
  float B = ((lectura * 5.0 / 1023) - n) / m;

  if (B > 0) {
    Serial.print("Norte --> ");
  }
  if (B < 0) {
    Serial.print("Sur --> ");
  }

  Serial.print(abs(B));
  Serial.println(" G");

  delay(500);
}

Veamos el significado de cada una de las instrucciones de este programa.

const int PIN_sensor = 0;
const int VALOR_CERO = 550;
const float RESPUESTA = 1.4;

Comenzamos definiendo tres valores constantes. El primero, PIN_sensor, es el pin analógico de Arduino al que hemos conectado el sensor; el pin A0 en nuestro caso. El segundo, VALOR_CERO, es un número entero que representa la lectura del sensor en ausencia de campos magnéticos; como vimos en el apartado anterior, este valor es 550. El tercero, RESPUESTA, es un valor real que nos proporciona la relación lineal entre el voltaje y el campo magnético en milivoltios por gauss; según la hoja de datos del fabricante este valor es 1,4 mV/G.

float n = VALOR_CERO * 5.0 / 1023;
float m = RESPUESTA / 1000;

Calculamos los parámetros n y m de la recta que relaciona V y B. La ordenada en el origen, n, es el valor analógico del sensor en ausencia de campos magnéticos (VALOR_CERO) convertido en voltios. La pendiente, m, es la relación lineal entre el voltaje y el campo magnético (RESPUESTA) expresada en voltios por gauss, de ahí que hayamos dividido entre 1000 para transformar los milivoltios en voltios.

void setup() {
  Serial.begin(9600);
}

Como siempre, en la función setup inicializamos la comunicación serie.

void loop() {
  int lectura = analogRead(PIN_sensor);

Iniciamos la función loop leyendo el valor analógico que mide el sensor y guardando este valor en la variable lectura. El sensor está conectado al pin PIN_sensor.

float B = ((lectura * 5.0 / 1023) - n) / m;

En esta instrucción calculamos el valor del campo magnético B (en gauss) que corresponde al valor analógico lectura medido por el sensor. Para ello transformamos la lectura analógica en voltaje en voltios utilizando la relación voltaje = lecturaAnalogica * 5.0 / 1023. Fíjate que, esta vez, estamos escribiendo 5.0/1023. Lo hacemos porque necesitamos que voltaje sea un número real, no un entero; si hacemos 5/1023 Arduino entiende que debe hacer una división entera, en cuyo caso el resultado es… 0. Finalmente, de la relación V=mB+nV=m·B+n despejamos el campo B (recuerda que la deducción de esta expresión la hicimos anteriormente en el apartado “Relación entre el voltaje y el campo magnético”).

if (B > 0) {
  Serial.print("Norte --> ");
}
if (B < 0) {
  Serial.print("Sur --> ");
}

Analizamos y mostramos por el monitor serie la polaridad del campo magnético: si B es positivo el sensor está detectando un polo norte, y si B es negativo está detectado un polo sur.

Serial.print(abs(B));
Serial.println(" G");

Imprimimos en el monitor serie la intensidad del campo magnético en gauss. Para ello mostramos el valor absoluto del campo B calculado.

delay(500);
}

Por último, esperamos medio segundo antes de tomar la siguiente medida.

Este es el resultado que hemos obtenido, primero en ausencia de campo magnético, luego junto al polo sur de un imán y por último detectando un polo norte:

Last updated