Lévitation magnétique avec Arduino
Composants et fournitures
| | × | 1 | |
| Électro-aimant 12v 25mm de diamètre. | | × | 1 | |
| Capteur à effet Hall linéaire 49E | | × | 1 | |
| Transistor haute puissance Darlington | | × | 1 | |
| | × | 1 | |
| 1N4007 – Diode haute tension et courant nominal élevé | | × | 1 | |
| | × | 1 | |
| Planche à pain (générique) | | × | 1 | |
| Interrupteur à bouton-poussoir SparkFun 12mm | | × | 2 | |
| Câbles de raccordement (générique) | | × | 1 | |
Applications et services en ligne
À propos de ce projet
Levitator avec Arduino.
Vous pouvez imprimer le corps en 3D ou non.
https://www.thingverse.com/thing:1392023
- Facile à imprimer et à monter (juste un peu de colle, pas de vis).
- Installez simplement le firmware (Levitator.ino) dans la carte arduino.
- Pas besoin d'ordinateur, juste de l'alimentation 12V, après avoir installé le firmware.
- Utilisez les commutateurs pour régler la position de l'aimant permanent.
- Utilisez le moniteur série arduino pour voir la valeur correcte pour vous.
- Vous pouvez coder en dur la valeur correcte dans votre jouet.
Vous pouvez utiliser une protoboard ou fabriquer votre carte (Arduino Nano).
http://www.thingverse.com/thing:1392530
Ou achetez-en un :
https://oshpark.com/shared_projects/kxH3Ak1b
Attention :
- Mettez le capteur à effet hall au bas de la pointe (top_sensor.stl) voir les images ;
- Pour fonctionner correctement, le capteur à effet Hall doit être à au moins 5 mm de distance électromagnétique ;
- Vous pouvez utiliser d'autres capteurs à effet Hall linéaire (ne pas utiliser le interrupteur à capteur Hall );
- Utilisez des aimants permanents en néodyme (cela ne fonctionnera pas avec des aimants communs) ;
- Les objets lourds sont plus stables ;
Voir mes marques dans Thingiverse pour plus de détails et de conseils.
Levitator imprimé en 3D :
https://www.thingverse.com/make:201394
Bouclier pour Arduino Nano :
https://www.thingverse.com/make:201420
C'est facile.
Code
- Levitator.ino
- Levitator_PID.ino
Levitator.inoArduino
Code pour le jouet de lévitation magnétique avec Arduino.
Facile (pas de PID)//=========================================================|// Ekobots Innovation Ltda - www.ekobots.com.br |// Juan Sirgado y Antico - www.jsya.com.br |//- -------------------------------------------------- ------|// Programme Magnetic Levitator - 2016/02/06 |// Tous droits réservés 2016 |//=========================================================|int anaPin =1; // Broche analogique Arduino 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; // Valeur de lecture analogique (capteur Hall) ; valeur booléenne digVal =0 ; // Valeur d'écriture numérique (électroaimant) ; // int levVal =228 ; // Valeur de point de lévitation;int dlyVal =250; // Valeur de retard en microsecondes ; //------------------------------------------ ----------------|void setup(){ // Début de l'initialisation du Levitator ; Serial.begin (57600); Serial.println("Levitator par JSyA"); Serial.println("Démarrage..."); // Configuration du mode de travail des broches numériques ; pinMode(digPin, SORTIE); pinMode(sousPin, INPUT_PULLUP); pinMode(addPin, INPUT_PULLUP); // Fin de l'initialisation du Levitator ; Serial.println("Démarré.");}//------------------------------------- --------------------|void loop() { // Lecture du capteur à effet Hall (intensité du champ magnétique); anaVal =analogRead(anaPin); // Augmenter la valeur du point de lévitation ; if (digitalRead(addPin) ==LOW) { levVal++; valeur_log(); retard (250); } // Diminue la valeur du point de lévitation ; if (digitalRead(subPin) ==LOW) { levVal--; valeur_log(); retard (250); } // Vérifier le point de lévitation ; if (anaVal levVal) { digVal =HIGH; } // // Activer/désactiver l'électro-aimant ; // Avec base sur la valeur du capteur et le point de lévitation ; digitalWrite(digPin, digVal); delayMicroseconds(dlyVal);}//------------------------------------------ ---------------|void value_log()// Impression des valeurs analogiques/numériques/de lévitation ;{ // Affiche la valeur du capteur à effet Hall ; Serial.print("anaVal="["); Serial.print(anaVal); Serial.print("]-"); // Affiche l'état de l'électroaimant On=1/Off=0 ; Serial.print("digVal="["); Serial.print(digVal); Serial.print("]-"); // Afficher la valeur du point de lévitation ; Serial.print("levVal="["); Serial.print(levVal); Serial.println("];");}//=========================================================| Levitator_PID.inoArduino
Code pour le jouet de lévitation magnétique avec Arduino.
Difficile (version PID)//=========================================================|// Ekobots Innovation Ltda - www.ekobots.com.br |// Juan Sirgado y Antico - www.jsya.com.br |//- -------------------------------------------------- ------|// Programme Magnetic Levitator PID - 2016/10/06 |// Tous droits réservés 2016 |//=========================================================|int anaPin =1; // Broche analogique Arduino 1int digPin =5; // Arduino Digital Pin 5int subPin =7; // Arduino Digital Pin 7int addPin =8; // Broche numérique Arduino 8//int anaVal =0; // Valeur analogique digVal =0; // Valeur numérique//int levVal =262; // Valeur de lévitationint dlyVal =10; // Valeur de délai//float timVal =0; // Valeur de temps//-------------------------------------------- -------------|// Valeurs PIDpoint de consigne flottant =0;valeur_mesurée flottante =0;sortie flottante =0;intégrale flottante =0;dérivée flottante =0;erreur flottante =0;erreur_flottante précédente =0;float dt =0,1;float Kp =1,0;float Ki =0,1;float Kd =0,01;//-------------------------- -------------------------------|void setup(){ // Début de l'initialisation du Levitator ; Serial.begin (57600); Serial.println("Levitator par JSyA"); Serial.println("Démarrage..."); // Configuration du mode de travail des broches numériques ; pinMode(digPin, SORTIE); pinMode(addPin, INPUT_PULLUP); pinMode(sousPin, INPUT_PULLUP); // timVal =millis(); point de consigne =levVal; // Fin de l'initialisation du Levitator ; Serial.println("Démarré.");}//------------------------------------- --------------------|boucle vide() // PID{ // Lecture du capteur à effet Hall (intensité du champ magnétique); anaVal =analogRead(anaPin); // Calculs PID valeur_mesurée =anaVal; erreur =point de consigne - valeur_mesurée ; intégrale =intégrale + erreur * dt; dérivée =(erreur - erreur_précédente) / dt; sortie =(-Kp * erreur) + (-Ki * intégrale) + (-Kd * dérivée) ; erreur_précédente =erreur ; // Configuration de la valeur finale digVal +=sortie ; // Vérifier la valeur du point de lévitation ; si (val_dig <0)Val_dig=0 ; si (digVal> 255) digVal=255 ; // Augmenter/Diminuer la valeur pour l'électroaimant ; // Avec base sur la valeur du capteur et le point de lévitation ; analogWrite(digPin, digVal); // Afficher les valeurs du journal pour le débogage ; // if((millis()-timVal)> 500)// {// value_log();// timVal =millis();// } // Augmenter la valeur du point de lévitation; if (digitalRead(addPin) ==LOW) { setpoint++; valeur_log(); retard (250); } if (digitalRead(subPin) ==LOW) { setpoint--; valeur_log(); retard (250); } // Le temps entre les changements d'état de l'électroaimant ; delayMicroseconds(dlyVal);}//------------------------------------------ ---------------|void value_log()// Impression des valeurs analogiques/numériques/de lévitation ;{ // Affiche la valeur du capteur à effet Hall ; Serial.print("anaVal="["); Serial.print(anaVal); Serial.print("]-"); // Affiche l'état de l'électroaimant On=1/Off=0 ; Serial.print("digVal="["); Serial.print(digVal); Serial.print("]-"); // Afficher la valeur du point de lévitation ; Serial.print("setpoint="["); Serial.print(consigne); Serial.println("];");}//=========================================================| Schémas
IDE frit