MAGneto: Levitador Magnético Casero con Arduino

Vaso levitando en el levitador

Introducción

MAGneto se trata de un levitador magnético controlado mediante Arduino creado por unos estudiantes de ingeniería informática de la Universidad Rey Juan Carlos. Se trata de un proyecto ideal para aquellos principiantes en Arduino que estén interesados en la física y en la informática. También es una máquina genial para dejar a tus amigos y compañeros asombrados.

Autores

Materiales

Diseño del Circuito

Vídeo Explicativo

Casos de Uso

La naturaleza del proyecto restringe los casos de uso a uno único, levitar objetos con la ayuda de un imán que permita establecer el campo magnético. Para reproducir nuestros experimentos es necesario utilizar imanes de neodimio, que son más potentes y facilitan la levitación, pueden usarse solos o adheridos a otros objetos livianos, como vasos de plástico, para observar un fenómeno más voluminoso.

Hardware

Para aportar valor añadido pensamos en partir de un modelo 3D a modificar, usando Ultimaker CURA, según nuestra conveniencia y presupuesto para albergar al levitador. Consiguiendo que además de ser un proyecto interesante desde el punto de vista de los componentes, también lo fuera en apariencia.

Tal y como se aprecia en el apartado de costes, el desembolso en este punto ya era elevado y tuvimos que conformarnos con un modelo de dimensiones menores a las deseadas, en las que no entraba ni la placa ni por tanto el diseño de la versión Alpha que ya teníamos desarrollado. Para poder cumplir con las restricciones de este espacio, los módulos sufren pequeñas variaciones a fin de que el espacio que ocupan se vea reducido.

Modelo de impresión 3D

Módulo de encendido

Para suministrar el voltaje de una forma más eficiente se compra una fuente de alimentación de 12 Voltios y 1 Amperio que se conecta a la placa por medio de un conector Jack de corriente continua. Este conector se suelda directamente a la placa usando cables personalizados, pelados y ensamblados, utilizados para ahorrar el espacio que ocupan los que se venden en las tiendas de electrónica.

Módulo de regulación

Está compuesto principalmente por dos botones que permiten ajustar la sensibilidad del campo magnético creado desde el módulo de levitación. Las pulsaciones se procesan como operaciones de incremento o decremento detectadas por los botones, estas se registran como datos de entrada por el Arduino mediante los pines digitales D7 y D8. Las operaciones se realizan sobre números enteros y siempre en valor de una unidad para permitir cambios sutiles que no supongan variaciones drásticas en la levitación. Además, tiene salida a tierra para cerrar el circuito.

Módulo de detección

Este módulo tiene como componente principal a un Sensor de Efecto Hall, este sensor tiene como función detectar la ubicación relativa de un elemento sobre un campo magnético. Este permite recopilar la información necesaria por el módulo de levitación para poder mantener suspendidos los objetos. El circuito está compuesto por el propio sensor y sus conexiones con el Arduino, uno de sus tres pines, necesariamente uno exterior abastece de corriente al sensor por medio de la salida de 5 Voltios desde la placa electrónica; el pin exterior restante es usado para transmitir el valor de la posición leída hacia el Software usando el pin analógico A1; mientras que el pin central cierra el circuito con la toma de tierra. 

Módulo de levitación

Es el módulo más complejo y tiene como propósito usar las entradas proporcionadas por el resto de módulos para lograr que se produzca la levitación. Su componente principal es el solenoide de 12 Voltios y 5 Watios, aunque también está compuesto por un transistor Darlington bipolar (BJT) npn, un diodo especial para altos voltajes y una resistencia de 1K Ohmios. El electroimán se enciende o apaga dependiendo de la salida del pin digital D5, esta señal atraviesa primeramente la resistencia y entra por la base del transistor para regular el estado del mismo. Dependiendo del valor de la señal, es decir, de si esta tiene un valor alto o bajo, el transistor abre el circuito para interrumpir el suministro de voltaje entre el colector y el emisor (caso bajo), o lo cierra para que el solenoide reciba el voltaje necesario para hacer levitar los objetos (caso alto). Cabe destacar que el emisor del transistor se conecta a tierra directamente. Finalmente la función del diodo es proteger el solenoide y el transistor de altos voltajes e impedir que se quemen en casos excepcionales, debido a picos en la corriente entrante o a la mala conexión del circuito por un fallo humano.

Modelo resultante

Software

// Variables del programa
int sensorHall = A1;              // Pin analógico 1 al que está conectado el sensor de efecto Hall

                                  // Pin digital 5 conectado a la base del transistor Darlington Bipolar (BJT) de tipo npn 
int electroiman = 5;              // mediante el cual se consigue que se encienda o se apague el electroiman para producir 
                                  // el efecto de levitacion permitiendo que fluya corriente entre el colector y emisor o impidiendolo
                                
int restaValorLevitacion = 7;     // Pin digital 7 al que se conecta el boton que funcionara como restador para ajustar el punto actual de levitacion hacia abajo (-1)
int sumaValorLevitacion = 8;      // Pin digital 7 al que se conecta el boton que funcionara como sumador para ajustar el punto actual de levitacion hacia arriba (+1)

int deteccionHall = 0;            // Variable entera que almacena el valor de campo magnetico leido por el sensor Hall
boolean estadoElectroiman = 0;    // Variable para controlar el estado del electroiman 0 = OFF / 1 = ON

int puntoActualLevitacion = 228;  // Variable para controlar el punto actual de levitacion del campo magnetico (se puede ajustar en codigo segun el objeto que se 
                                  // quiera hacer levitar y luego ajustar con los botones el valor concreto para arrancar el algoritmo en el loop)
                                  
const int reatrdo = 250;          // Constante del valor de retardo para controlar la salida por consola

// Funcion setup que configura la comunicacion entre Arduino-PC a 9600 baudios para leer los mensajes de la consola e inicializa las los pines digitales como salida y como tipo de entrada (el modo de trabajo de cada uno)
void setup() {
    // Configuracion de la comunicacion a 9600 bits/s 
    Serial.begin(9600);
    // Configuracion de los modos de trabajo de los pines digitales
    pinMode(electroiman, OUTPUT);
    pinMode(restaValorLevitacion, INPUT_PULLUP);
    pinMode(sumaValorLevitacion, INPUT_PULLUP);
}

void loop() {
    // El sensor Hall lee el valor de campo magnetico que detecta
    deteccionHall = analogRead(sensorHall);
   
    // Si se pulsa el boton de suma se sube el punto actual de levitacion
    if (digitalRead(sumaValorLevitacion) == LOW) { puntoActualLevitacion++; mostrar_valores(); delay(reatrdo); }
    // Si se pulsa el boton de resta se baja el punto actual de levitacion
    if (digitalRead(restaValorLevitacion) == LOW) { puntoActualLevitacion--; mostrar_valores(); delay(reatrdo); }
      
    // Con la siguiente estructura de control condicional se compara el punto de levitacion ajustado por nosotros con el valor detectado por el sensor hall para que se genere el efecto de levitacion
    // Si el objeto se aleja demasiado del sensor y del solenoide, el electroiman actuara con mas fuerza y si se acerca demasiado se apagara para que se vuelva a ajustar el campo
    if (deteccionHall < puntoActualLevitacion) estadoElectroiman = LOW;   // Caso en el que el objeto se acerca demasiado al sensor y se manda una señal baja a la base del transistor para que no cierre el circuito del electroiman y se apague
    else estadoElectroiman = HIGH;                                        // Caso en el que el objeto se aleja demasiado del sensor y se manda una señal alta a la base del transistor para que se cierre el circuito del electroiman y se active para volver a tirar del objeto
   
    // Por ultimo se manda el valor que obtenemos como salida de la comparacion anterior a la base del transistor para controlar el modulo de levitacion (abrir/cerrar el circuito del electroiman)
    digitalWrite(electroiman, estadoElectroiman);
    delayMicroseconds(reatrdo);  // Pequeño retardo para ajustar la frecuencia de actualizacion del estado de levitacion
}

// Funcion auxiliar para mostrar los valores por consola y asi poder configurarlo de forma mas sencilla
void mostrar_valores() {
    Serial.print("detHall: { ");
    Serial.print(deteccionHall); 
    Serial.print(" } - ");
    Serial.print("pLevAct: { ");
    Serial.print(puntoActualLevitacion);
    Serial.println(" } - ");
    Serial.print("estadoIman: { ");
    Serial.print(electroiman);
    Serial.print(" } ");
}

Modelo

En función de los componentes que se compren, quizás haya que hacer alguna modificación al modelo. Para ello, nosotros utilizamos el software Ultimaker Cura. También se puede construir el modelo con otros materiales, como madera o metal.

Enlace de descarga del modelo

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *