Levitación magnética con Arduino Nano: guía de piezas y cableado
Componentes y suministros
- Arduino Nano R3 (×1) — el shield está diseñado para Nano, pero sirve cualquier Arduino
- Electroimán 12V 25mm diámetro (×1)
- Sensor Hall lineal 49E (×1) — no usar interruptor Hall
- Transistor Darlington TIP120 (×1)
- Resistencia 1k Ω (×1)
- Diodo 1N4007 alta tensión/corriente (×1)
- Fuente 12V 1A (×1)
- Protoboard genérica (×1)
- Pulsadores 12mm (×2)
- Cables jumper genéricos (×1)
Aplicaciones y servicios en línea
- Arduino IDE
Sobre este proyecto
Levitador magnético con Arduino. Puedes imprimir el cuerpo en 3D o no.
- Fácil impresión y montaje (solo pegamento, sin tornillos).
- Sube el firmware (
Levitator.ino) a la placa Arduino. - No requiere PC tras programar: solo fuente 12V.
- Usa los pulsadores para ajustar posición del imán permanente.
- Monitor serie Arduino para ver valor correcto y grabarlo en el código.
Modelos 3D en Thingiverse:
- Cuerpo levitador: thing:1392023
- Shield Arduino Nano: thing:1392530 o compra en OSH Park
Atención:
- Coloca sensor Hall en la punta inferior (
top_sensor.stl). - Sensor Hall debe estar a ≥5 mm del electroimán.
- Usa sensor Hall lineal (no interruptor).
- Imanes permanentes de neodimio (imanes comunes no funcionan).
- Objetos pesados son más estables.
Código
Levitator.ino (versión simple, sin PID)
//=========================================================|
// Ekobots Innovation Ltda - www.ekobots.com.br |
// Juan Sirgado y Antico - www.jsya.com.br |
//---------------------------------------------------------|
// Program Magnetic Levitator - 2016/02/06 |
// All rights reserved 2016 |
//=========================================================|
int anaPin = 1; // Pin analógico A1 (Hall)
int digPin = 5; // Pin digital 5 (electroimán)
int subPin = 7; // Pin digital 7 (bajar punto levitación)
int addPin = 8; // Pin digital 8 (subir punto levitación)
int anaVal = 0;
boolean digVal = 0;
int levVal = 228; // Punto de levitación
int dlyVal = 250; // Delay µs
void setup() {
Serial.begin(57600);
Serial.println("Levitator by JSyA");
Serial.println("Starting...");
pinMode(digPin, OUTPUT);
pinMode(subPin, INPUT_PULLUP);
pinMode(addPin, INPUT_PULLUP);
Serial.println("Started.");
}
void loop() {
anaVal = analogRead(anaPin);
if (digitalRead(addPin) == LOW) { levVal++; value_log(); delay(250); }
if (digitalRead(subPin) == LOW) { levVal--; value_log(); delay(250); }
if (anaVal < levVal) digVal = LOW;
else digVal = HIGH;
digitalWrite(digPin, digVal);
delayMicroseconds(dlyVal);
}
void value_log() {
Serial.print("anaVal=["); Serial.print(anaVal); Serial.print("]-");
Serial.print("digVal=["); Serial.print(digVal); Serial.print("]-");
Serial.print("levVal=["); Serial.print(levVal); Serial.println("];");
}
Levitator_PID.ino (versión con control PID)
//=========================================================|
// Ekobots Innovation Ltda - www.ekobots.com.br |
// Juan Sirgado y Antico - www.jsya.com.br |
//---------------------------------------------------------|
// Program Magnetic Levitator PID - 2016/10/06 |
// All rights reserved 2016 |
//=========================================================|
int anaPin = 1, digPin = 5, subPin = 7, addPin = 8;
int anaVal = 0, digVal = 0, levVal = 262, dlyVal = 10;
float timVal = 0;
// PID
float setpoint = 0, measured_value = 0, output = 0;
float integral = 0, derivative = 0, error = 0, previous_error = 0;
float dt = 0.1, Kp = 1.0, Ki = 0.1, Kd = 0.01;
void setup() {
Serial.begin(57600);
Serial.println("Levitator by JSyA"); Serial.println("Starting...");
pinMode(digPin, OUTPUT);
pinMode(addPin, INPUT_PULLUP);
pinMode(subPin, INPUT_PULLUP);
setpoint = levVal;
Serial.println("Started.");
}
void loop() {
anaVal = analogRead(anaPin);
measured_value = anaVal;
error = setpoint - measured_value;
integral += error * dt;
derivative = (error - previous_error) / dt;
output = (-Kp * error) + (-Ki * integral) + (-Kd * derivative);
previous_error = error;
digVal += output;
if (digVal < 0) digVal = 0;
if (digVal > 255) digVal = 255;
analogWrite(digPin, digVal);
if (digitalRead(addPin) == LOW) { setpoint++; value_log(); delay(250); }
if (digitalRead(subPin) == LOW) { setpoint--; value_log(); delay(250); }
delayMicroseconds(dlyVal);
}
void value_log() {
Serial.print("anaVal=["); Serial.print(anaVal); Serial.print("]-");
Serial.print("digVal=["); Serial.print(digVal); Serial.print("]-");
Serial.print("setpoint=["); Serial.print(setpoint); Serial.println("];");
}
Esquemáticos
Diagrama Fritzing de conexiones.
Proceso de manufactura
- Construye un reloj Numitron retro con Arduino: Simple, fiable y eficiente energéticamente
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Facilitar la comunicación sordo‑ciego usando 1Sheeld y Arduino
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Integración del sensor de huella capacitivo DFRobot (ID809) con Arduino o ESP8266
- Proyecto HMI Interactivo con Nextion, Arduino Mega y Múltiples Sensores
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
- Levitación magnética repulsiva con Arduino: Circuito simple y guía DIY
- Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet
- Sistema Radar Compacto con Arduino Nano, Sensor HC-SR04 y Pantalla 1.8"