MAGneto: Levitador Magnético Casero con Arduino
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
- Arduino Nano V3. Cualquier Arduino es válido, pero es este el modelo que funciona con nuestro modelo impreso. Si modificáis el modelo, podéis usar cualquier otro.
- Electroimán 12V.
- Sensor de efecto Hall 49E.
- Transistor TIP120 Darlington High Power.
- Resistencia 1K.
- Diodo 1N4007.
- Fuente de alimentación de 12V 1A.
- Breadboard.
- 2x Pulsadores 12mm.
- Cables.
- Conectores de alimentación DC Jack. Necesarios sólo si vuestra unidad Arduino no cuenta ya con uno.
- Imanes de neodimio. Para hacer las pruebas de levitación.
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.
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.
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.