Este proyecto de arduino para niños resulta apropiado para aquellos hogares que cuentan con una impresora 3D, de ahí que se requiera además la ayuda y supervisión de un adulto.
¿Qué se necesita?
- Una placa de arduino Nano R3 (también puedas usar UNO R3)
- Un electroimán de 12V y 25 mm de diámetro
- Un imán
- Un sensor de efecto Hall 49E
- Un transistor Darlington de alta energía
- Una resistencia de 1k ohm
- Un diodo de alta corriente 1N4007
- 2 pilas de 12V y 1A
- Una protoboard (o placa de pruebas)
- 2 interruptores de botón de 12 mm
- Varios cables de conexión
¿Cómo se construye?
Comenzamos conectando una de las pilas a los pines GND y VIN de la placa de arduino y uniendo el sensor de efecto Hall a la misma a través de los pines 5V, GND y 1.
Ahora agarramos la segunda pila, llevamos el polo negativo al pin GND de la placa de arduino y conectamos el polo positivo al electroimán. El electroimán a su vez estará conectado al diodo y al transistor Darlington mediante la salida C. Utilizaremos la entrada B del transistor para conectar la corriente a la resistencia y ésta a su vez al pin 5 del arduino. Por su parte llevaremos a tierra el pin E del transistor.
Ya sólo queda colocar los interruptores. Los polos positivos los unimos a los pines 7 y 8 y los negativos, a la corriente GND.
CÓDIGO
Código para el juguete de levitación magnética con Arduino.
Fácil (sin PID)
int anaPin = 1 ; // Arduino Analogic Pin 1;
int digPin = 5 ; // Arduino Digital Pin 5;
int subPin = 7 ; // Arduino Digital Pin 7;
int addPin = 8 ; // Arduino Digital Pin 8;
//
int anaVal = 0 ; // Valor de lectura analógica (sensor Hall);
digVal
booleano = 0 ; // Valor de escritura digital (electroimán);
//
int levVal = 228 ; // Valor Poit de levitación;
int dlyVal = 250 ; // Valor de retardo Micro segundos;
// ------------------------------------------------ --------- |
void setup ()
{
// Inicialización de Levitator Begin; De serie .
comenzar ( 57600 );
De serie . println ( "Levitador por JSyA" ); De serie . println ( "Iniciando ..." ); // Configuración del modo de trabajo de pines digitales; pinMode ( digPin , OUTPUT ); pinMode ( subPin , INPUT_PULLUP ); pinMode ( addPin , INPUT_PULLUP ); // Levitator initialization End; De serie . println ( "Iniciado" ); }
// ------------------------------------------------ --------- |
void loop ()
{
// Hall Sensor Read (intensidad del campo magnético); anaVal = analogRead ( anaPin ); // Aumenta el valor del punto de levitación; if ( digitalRead ( addPin ) == LOW ) { levVal ++ ; value_log (); retraso ( 250 ); } // Disminuye el valor del punto de levitación; if ( digitalRead ( subPin ) ==
LOW)
{
levVal--;
value_log();
delay(250);
}
// Check the Levitation Point;
if (anaVal < levVal)
{
digVal = LOW;
}
else // if (anaVal > levVal)
{
digVal = HIGH;
}
//
// Turn ON/OFF The Electromagnet;
// With Base on Sensor Value and the Levitation Point;
digitalWrite(digPin, digVal);
delayMicroseconds(dlyVal);
}
//---------------------------------------------------------|
void value_log()
// Analogic/Digital/Levitation Values Print;
{
// Show the Hall Sensor Value;
Serial.print("anaVal=[");
Serial.print(anaVal);
Serial.print("]-");
// Show the Electromagnet state On=1/Off=0;
Serial.print("digVal=[");
De serie . print ( digVal );
De serie . print ( "] -" ); // Muestra el valor del punto de levitación; De serie . print ( "levVal = [" ); De serie . imprimir ( levVal ); De serie . println ( "];" ); } // =============================================== ========== |
Código para el juguete de levitación magnética con Arduino.
Hard (versión PID)
int anaPin = 1 ; // Pin 1 analógico Arduino
int digPin = 5 ; // Arduino Digital Pin 5
int subPin = 7 ; // Arduino Digital Pin 7
int addPin = 8 ; // Arduino Digital Pin 8
//
int anaVal = 0 ; // Analogic Valie
int digVal = 0 ; // Valor digital
//
int levVal = 262 ; // Valor de levitación
int dlyVal = 10 ; // Valor de retraso
//
float timVal = 0 ; // Valor de tiempo
// -------------------------------------------- ------------- |
// Valores PID
float setpoint = 0;
flotan measured_value = 0 ;
salida
flotante = 0 ;
flotante integral = 0 ;
derivada
flotante = 0 ;
error de
flotación = 0 ;
flotante anterior_error = 0 ;
flotador dt = 0.1 ;
flotación Kp = 1.0 ;
flotador Ki = 0.1 ;
flotador Kd = 0.01 ;
// ------------------------------------------------ --------- |
void setup ()
{
// Inicialización de Levitator Begin; De serie . comenzar ( 57600 ); De serie . println ( "Levitador por JSyA" ); De serie . println ( "Iniciando ..." ); // Configuración del modo de trabajo de pines digitales; pinMode ( digPin , OUTPUT ); pinMode ( addPin , INPUT_PULLUP ); pinMode ( subPin , INPUT_PULLUP
);
// timVal = millis (); punto de ajuste = levVal ; // Levitator initialization End; De serie . println ( "Iniciado" ); } // ----------------------------------------------- ---------- | void loop () // PID { // Hall Sensor Read (Intensidad de campo magnético); anaVal = analogRead ( anaPin ); Cálculos // PID measured_value = anaval ; error = punto de ajuste - valor_medido
;
integral = integral + error * dt ; derivada = ( error - error_ previo ) / dt ; salida = ( - Kp * error ) + ( - Ki * integral ) + ( - Kd * derivada ); anterior_error = error ; // Configuración del valor final digVal + = output ;
// Comprueba el valor del punto de levitación;
if ( digVal < 0 ) digVal = 0 ; if ( digVal > 255 ) digVal = 255 ; // Aumenta / disminuye el valor de Electromagnet; // Con base en el valor del sensor y el punto de levitación; analogWrite ( digPin , digVal ); // Mostrar valores de registro para depuración; // if ((millis () - timVal)> 500) // { // value_log (); // timVal = millis (); //} // Aumenta el valor del punto de levitación; Si
( digitalRead ( addPin ) == LOW )
{ setpoint ++ ; value_log (); retraso ( 250 ); } if ( digitalRead ( subPin ) == LOW ) { setpoint - ; value_log (); retraso ( 250 ); } // Tiempo entre cambios de estado del electroimán; delayMicroseconds ( dlyVal ); } // ----------------------------------------------- ---------- |
void value_log ()
// Valores analógicos / digitales / levitación Print ;
{
// Muestra el valor del sensor Hall; De serie . print ( "anaVal = [" ); De serie . imprimir ( anaVal ); De serie . print ( "] -" ); // Muestra el estado del electroimán On = 1 / Off = 0; De serie . print ( "digVal = [" ); De serie . print ( digVal ); De serie .
print ( "] -" );
// Muestra el valor del punto de levitación; De serie . print ( "punto de ajuste = [" ); De serie . imprimir ( punto de ajuste ); De serie . println ( "];" ); } // =============================================== ========== |
-
Arduino ATmega 2560 R3¡Oferta!
$20.50$19.00 -
Arduino Uno Wifi¡Oferta!
$15.00$13.00 -
Arduino Mini USB Nano V3.0 CH340 Chip Board 5V 16M + Cable¡Oferta!
$9.00$8.50
Buenas! podrías revisar el código por favor? no me da, mil gracias!