[TUT] Magnetische Levitation

      [TUT] Magnetische Levitation

      1.) Einleitung:

      Ihr wolltet schon immer einmal einen Gegenstand in der Luft schweben lassen, eure Feunde mit einer Bastelei beeindrucken oder sucht einfach ein Projekt für das nächste Wochenende?
      Dann seid Ihr hier genau richtig!




      In diesem Tutorial möchte ich euch mein letztes Projekt vorstellen und euch zeigen, wie Ihr eure eigene "Levitationsmaschine" bauen könnt. Genauer gesagt geht es darum, einen Permanentmagneten mit Hilfe eines Elektromagneten schweben zu lassen.

      Ich habe versucht, den Aufbau sowie die Regelung für dieses Tutorial so einfach wie möglich zu halten. Dadurch ist das System natürlich nicht perfekt, es soll aber verständlich und auch nicht zu teuer sein. Außerdem könnt Ihr so auch selbst noch etwas experimentieren und den Aufbau sowie die Steuerung verbessern.

      Für die Programmierung des Mikrocontrollers (ich verwende einen ATtiny84) habe ich mich für die Arduino-IDE mit dem ATtiny-Core entschieden. Das macht es einfacher und den Code sehr überschaubar.

      Um Frustration zu vermeiden möchte ich darauf hinweisen, dass Grundkenntnisse in Sachen Elektronik, Mikrocontroller und Programmierung (C++) sicherlich nicht schaden können.
      Außerdem solltet Ihr Euch schon etwas mit der Arduino Plattform auskennen und die Funktionsweise der Hardware und Software verstehen um ggf. Anpassungen vornehmen zu können.

      Da das Thema recht umfangreich ist, werde ich nicht auf jeden einzelnen Schritt eingehen.

      Für Eure Kurzschlüsse, Brände, Explosionen, Personenschäden, Weltuntergänge usw. seid Ihr übrigens selbst verantwortlich :D .


      2.) Was wird benötigt?

      1x ATtiny84 (oder andere Microcontroller wenn Ihr die Schaltung, Software anpasst/selbst schreibt)
      1x 5V Spannungsregler (z.B. LM7805)
      2x Elko 10µf
      1x linearer Hall-Sensor (z.B. 3503 linear Hall Effect Sensor)
      1x N-Kanal MOSFET (z.B. IRLZ34N)
      1x Optokoppler (z.B. EL817)
      3x Widerstand 330Ω
      1x Widerstand 1kΩ
      1x Schottky Diode
      1x 10kΩ Poti
      2x LED
      1x Kupferlackdraht für den Elektromagnet
      1x Eisenkern
      1x Permanentmagnet (am besten ein Neodym-Magnet)
      1x Netzteil ca. 12V
      1x Lötzeug
      1x ISP-Programmer oder Arduino as ISP +Arduino IDE mit ATtiny-core
      1x Lochrasterplatine (optional)
      1x 3D Drucker (optional)


      3.) Die Theorie:

      Um einen Gegenstand schweben zu lassen, muss die Wirkung der Erdanziehungskraft "aufgehoben" werden. Da wir diese ja nicht einfach abschalten können, werden wir hier zu einem Elektromagneten greifen.
      Dieser soll der Erdanziehungskraft entgegen wirken und so unseren Permanentmagneten zum schweben bringen.

      Da wir die Anziehungskraft des Elektromagneten und die der Erdanziehung niemal exakt ausgleichen können, würde der Permanentmagnet entweder herunterfallen oder am Elektromagneten kleben bleiben.
      Deshalb brauchen wir eine Regelung für den Elektromagneten.

      Wir haben nun 2 Möglichkeiten:

      1.) Wir beobachten die Position des Permanentmagneten und steuern den Elektromagneten immer genau so stark an, dass er den Permanentmagneten weder zu weit an sich heranzieht, noch ihn fallen lässt. Wir müssen also die Stromstärke regeln, die durch unseren Elktromagneten fließt und damit auch die Stärke des Magnetfeldes.

      2.) Auch hier beobachten wir die Position des Permanentmagneten. Hat dieser sich zu weit von dem Elektromagneten entfernt, so schalten wir ihn ein. Kommt der Permanentmagnet zu nahe an den Elektromagenten heran, so schalten wir ihn wieder ab.
      Wir lassen unseren Magneten also fallen und fangen ihn dann wieder auf. Tun wir dies schnell genug, dann bleibt er durch seine Trägheit in der Luft "hängen".

      Für dieses Tutorial habe ich mich für die 2. Variante entschieden. Diese funktioniert gut genug und ist deutlich einfacher umzusetzen was die Software betrifft (ich habe bereits beide gebaut).


      4.) Die Hardware:

      Mein Grundaufbau sieht so aus:




      Als Steuereinheit verwende ich einen ATtiny84 Mikrocontroller. Diesen könnt Ihr als einen kleinen Rechner betrachten. Er wird die Position des Permanentmagneten bestimmen und den Elektromagneten steuern.

      Um die Position des Magneten zu bestimmen, wird ein linearer Hall-Sensor verwendet. Dieser ändert je nach magnetischer Feldstärke seine Ausgangsspannung. Diese kann mit dem Mikrocontroller gemessen werden. Der Hall-Sensor ist an die 5V Spannungsversorgung angeschlossen und an Pin 13 des Mikrocontrollers. Der Hall-Sensor wird direkt unter dem Elektromagneten angebracht.

      Da die Ausgänge des Mikrocontrollers viel zu schwach sind um den Elektromagneten direkt anzustern wird ein N-Kanal MOSFET zur Verstärkung des Stroms verwendet.
      Der Source Pin ist mit GND verbunden, der Drain-Pin mit dem Elektromagneten.
      Der andere Pol des Elektromagneten wird mit der Spannungsversorgung verbunden.
      Um den MOSFET vor dem "Kickback" des Elektromagneten zu schützen, wird eine Schottky Diode paralell zu diesen geschaltet.

      Der Gate-Pin des MOSFETs ist an den Emitter des Optokopplers angeschlossen und außerdem mit einem 1kΩ Widerstand mit GND. Der Collector des Optokopplers wird mit der Spannungsversorgung verbunden.
      Die Anode wird über einen 330Ω Widerstand mit Pin 6 des Mikrocontrollers verbunden, die Kathode kommt an GND.
      Der Optokoppler dient zum Schutz der Schaltung.

      Zur Spannungsversorgung des" Mikrocontrollerschaltkreises" ist noch ein 5V Spannungsregulator verbaut. Zur Glättung der Spannung werden 2 Kondensatoren benötigt. Anderenfalls beginnt der Spannungsregulator zu schwingen.

      Das Potentiometer dient zum Einstellen des Abstandes zwischen Permanentmagnet und Elektromagnet. Es ist mit der 5V Spannungsversorgung, mit GND sowie Pin 12 des Mikrocontrollers verbunden.

      Die Kathoden der beiden LEDs sind an GND angeschlossen, die Anoden sind durch 330Ω Widerstände mit Pin 10 und Pin 11 des Mikrocontrollers verbunden.


      5.) Die Funktionsweise:

      Als erstes stellt uns der Spannungsregler eine 5V Spannung für unseren Mikrocontrollerschaltkreis zur verfügung.
      Da der Gate-Pin des MOSFETs durch den 1kΩ Widerstand auf Massepotential gezogen wird, ist dieser hochohmig.

      Der Elektromagnet ist ausgeschaltet.

      Der Mikrocontroller misst mit Hilfe des Hall-Sensors den Abstand zu einem Permanentmagneten. Die Spannung des Ausgangspins des Hall-Sensors bewegt sich zwischen GND (0V) und VCC (5V) je nach Stärke und Richtung des Magnetfeldes. Diese Spannung wird von Mikrocontroller gemessen.

      Ist die Entfernung zu groß, so wird Pin 6 des Mikrocontrollers auf High-Pegel (5V) gesetzt. Die Collector-Emitter-Strecke des Optokopplers wird niederohmig. Dadurch wird der Gate-Pin des MOSFETs zum Positiven Pol unserer Spannungsversorgung gezogen. Dieser wird niederohmig und der Elektromagnet ist eingeschaltet.

      Kommt der Permanentmagnet dem Elektromagneten (bzw. Hall-Sensor) zu nahe, dann schaltet der Mikrocontroller Pin 6 auf den Low-Pegel (GND). Die Collector-Emitter-Strecke des Optokopplers wird wieder hochohmig und der Gate-Pin des MOSFETs wird durch den 1kΩ Widerstand auf Massepotential gezogen. Der MOSFET wird damit auch hochohmig und der Elektromagnet ist ausgeschaltet.


      6.) Die Software:

      C-Quellcode: Levitation.ino

      1. //--------------------------------------------------------------
      2. /*
      3. Beschreibung: Schwebeprogramm für ATtiny
      4. Author: Benjamin Yüksel (Benni @ wii-homebrew.com)
      5. Datum: 10.01.2017
      6. Zeit: 18:29
      7. */
      8. //--------------------------------------------------------------
      9. #define COILPIN 3
      10. #define HALLPIN A0
      11. #define POTIPIN A1
      12. #define LEDPIN1 7
      13. #define LEDPIN2 8
      14. #define FREQUENCY 2 //kHz
      15. #define CUTOFFDISTANCE 10
      16. #define LEDBLINKFREQUENCY 500 //ms
      17. #define ACTIVATIONTHRESHOLD 10
      18. //--------------------------------------------------------------
      19. uint16_t hallValue = 0;
      20. uint16_t potiValue = 0;
      21. uint64_t cycleTime = 0;
      22. uint64_t ledTimer = 0;
      23. byte mode = 0;
      24. //0 = aus
      25. //1 = Standby
      26. //2 = Levitation
      27. //--------------------------------------------------------------
      28. void setup()
      29. {
      30. //Pins initialisieren
      31. pinMode(COILPIN, OUTPUT);
      32. pinMode(LEDPIN1, OUTPUT);
      33. pinMode(LEDPIN2, OUTPUT);
      34. pinMode(HALLPIN, INPUT);
      35. pinMode(POTIPIN, INPUT);
      36. }
      37. //--------------------------------------------------------------
      38. void loop()
      39. {
      40. //Poti auslesen
      41. potiValue = (analogRead(POTIPIN) * 0.3) + 212;
      42. //Zustandssteuerung
      43. if (mode == 0 && analogRead(HALLPIN) < potiValue - ACTIVATIONTHRESHOLD)
      44. {
      45. //Standby-Modus einschalten
      46. mode = 1;
      47. return;
      48. }
      49. else if (mode == 1 && analogRead(HALLPIN) < potiValue)
      50. {
      51. //Schwebemodus einschalten
      52. mode = 2;
      53. return;
      54. }
      55. else if (mode == 2)
      56. {
      57. //Magnet schweben lassen
      58. HandleLevitation();
      59. //Levitation beendet
      60. mode = 0;
      61. }
      62. //LEDzustand anzeigen
      63. HandleLED();
      64. }
      65. //--------------------------------------------------------------
      66. bool HandleLevitation()
      67. {
      68. while (1)
      69. {
      70. //Startzeit erfassen
      71. cycleTime = micros();
      72. //Poti auslesen
      73. potiValue = (analogRead(POTIPIN) * 0.3) + 212;
      74. //Elektromagnet abschalten bevor der Hallsensor gelesen wird
      75. digitalWrite(COILPIN, LOW);
      76. //Hall-Sensor lesen
      77. hallValue = analogRead(HALLPIN);
      78. //Wenn zu weit entfernt oder heruntergefallen
      79. if (hallValue > potiValue + CUTOFFDISTANCE)
      80. {
      81. //Elektromagnet abschalten
      82. digitalWrite(COILPIN, LOW);
      83. //Ende
      84. break;
      85. }
      86. //Wenn Magnet zu nahe an Elektromaget
      87. else if (hallValue < potiValue)
      88. {
      89. //Elektromagnet abschalten
      90. digitalWrite(COILPIN, LOW);
      91. }
      92. //Wenn Magnet zu weit entfernt von Elektromagnet
      93. //und innerhalb der Reichweite
      94. //Elektromagnet anschalten
      95. else
      96. {
      97. //Elektromagnet anschalten
      98. analogWrite(COILPIN, HIGH);
      99. }
      100. //LEDzustand anzeigen
      101. HandleLED();
      102. //Laufzeit bestimmen
      103. cycleTime = micros() - cycleTime;
      104. //Frequenz regeln
      105. delayMicroseconds((1000.0f / FREQUENCY) - cycleTime);
      106. }
      107. }
      108. //--------------------------------------------------------------
      109. void HandleLED()
      110. {
      111. //LED Timer verwalten
      112. if (ledTimer == 0)
      113. {
      114. ledTimer = millis();
      115. }
      116. //Statusleds setzen
      117. if (mode == 2 && millis() - ledTimer > LEDBLINKFREQUENCY ) //Levitation
      118. {
      119. //Blaue LED blinken
      120. digitalWrite(LEDPIN1, !digitalRead(LEDPIN1));
      121. //Andere abschalten
      122. digitalWrite(LEDPIN2, LOW);
      123. //Timer zurücksetzen
      124. ledTimer = 0;
      125. }
      126. else if (mode == 0 && millis() - ledTimer > LEDBLINKFREQUENCY )
      127. {
      128. //Blaue LED abschalten
      129. digitalWrite(LEDPIN1, LOW);
      130. //Rote LED anschalten
      131. digitalWrite(LEDPIN2, HIGH);
      132. //Timer zurücksetzen
      133. ledTimer = 0;
      134. }
      135. else if (mode == 1 && millis() - ledTimer > LEDBLINKFREQUENCY )
      136. {
      137. //Blaue LED einschalten
      138. digitalWrite(LEDPIN1, HIGH);
      139. //Rote LED abschalten
      140. digitalWrite(LEDPIN2, LOW);
      141. //Timer zurücksetzen
      142. ledTimer = 0;
      143. }
      144. }
      145. //--------------------------------------------------------------
      Alles anzeigen

      Wie bereits gesagt benötigt Ihr die Arduino IDE mit installierten ATtiny-core und einen ISP-Programmer oder einen "Arduino as ISP" um das Programm auf den Mikrocontroller zu laden.
      Da der Quellcode sehr einfach und gut kommentiert ist, werde ich diesen nicht weiter erklären. Kopiert ihn einfach in die Arduino IDE und passt ihn Euren Bedürfnissen an oder schreibt euch
      eine eigene Software.


      7.) Das Programm hochladen:

      Um das Programm auf den Mikrocontroller zu laden müsst Ihr diesen zuerst mit einen ISP-Programmer verbinden.
      Beim ATtiny84 ist Pinbelegung wie folgt:


      ATtiny84 Pin
      Pin 9SCK
      Pin 8MISO
      Pin 7MOSI
      Pin 4Reset


      Dabei werden die Pins so durchnummeriert:




      Nachdem Ihr den ATtiny84 korrekt verbunden habt, startet Ihr die Arduino IDE und führt folgende Schritte durch:

      1.) Wählt unter Werkzeuge->Programmer Euren Programmer aus.
      2.) Wählt under Werkzeuge->Board Euren Mikrocontroller aus (ATtiny84 @ 8MHz).
      3.) Brennt den Bootloader mit Werkzeuge->Bootloader brennen
      4.) Schreibt das Programm oder kopiert es von mir.
      5.) Klickt auf Upload/Hochladen

      Sollten Dabei Fehler auftreten, so solltet Ihr die Verkabelung überprüfen.

      Hinweis: Es ist beim weiteren Aufbau notwendig, den Mikrocontroller erneut umzuprogrammieren, falls Ihr Anpassungen am Quelltext vornehmen wollt/müsst.
      Deshalb würde ich davon abraten, den Mikrocontroller direkt fest einzulöten. Er sollte vor der Programmierung immer aus der Schaltung entfernt werden.


      8.) Der Elektromagnet

      Jeder Stromdurchflossene Leiter wird von einem Magnetfeld umgeben. Dabei gilt: je höher die Stromstärke, desto stärker ist auch das Magnetfeld.
      Gleichzeit erhitzt sich aber auch der Draht schneller. Fließt über eine zu lange Zeit ein zu hoher Strom, so wird der Draht/Wicklung überhitzt und evtl. zerstört.

      Da ein einfacher stromdurchflossener Draht aber ein viel zu schwaches Magnetfeld erzeugt, wickeln wir ihn zu einer Spule und platzieren einen ferromagnetischen (Eisen oder Ferrit) Kern in der Mitte.

      Ich habe für den Elektromagnet einen Kupferlackdraht mit einem Durchmesser von 0,5mm verwendet und ca 75-100 Windungen auf einem Eisenkern aufgebracht (nicht gezählt :patsch: ). Das sieht dann so aus:




      Mit diesem Elektromagnet kann ich meinen Neodymmagnet problemlos schweben lassen bzw. sogar 3 davon mit 5 5ct Stücke.


      9.) Die Schaltung:

      Die Schaltung kann auf verschiedene Arten aufgebaut werden. Dabei bietet es sich an, den ersten Aufbau zu Testzwecken auf einem Breadboard zusammenzustecken.
      Das erleichtert das Umprogrammieren des Mikrocontrollers, falls dies während des Aufbaus nötig ist.

      Je nach Aufbau Eures Elektromagneten kann der MOSFET ohne Kühlkörper warm bis sehr heiß werden. Ihr solltet ihn also besser auf einen kleinen Kühlkörper schrauben.

      Wenn Eure Schaltung dann funktioniert, könnt Ihr sie sehr schön auf einer Lochrasterplatine aufbauen. Sollte Euch das zu aufwändig sein könnt Ihr auch einfach alles mit Kabel verbinden.
      Die Sauberste Lösung bleibt jedoch die Lochrasterplatine.

      Die Profis unter Euch können sich auch selbst eine Platine ätzen. Mir persönlich war das für dieses projekt zu aufwändig.

      Meine Schaltung auf der Lochrasterplatine sieht so aus:






      10.) Das Gehäuse (optionaler Schritt):

      Das Gehäuse habe ich mit Hilfe meines 3D Druckers hergestellt und anschließend noch 3 Löcher für die LED's und das Poti gebohrt.
      Solltet Ihr keinen 3D Drucker besitzen, dann könnt Ihr euch auch ein schönes Gehäuse aus Holz aufbauen. Eine weitere Alternative wären auch Legosteine.
      Damit habe ich den ersten Versuchsaufbau realisiert.

      Diejenigen unter Euch, die einen 3D Drucker besitzen können mein 3D Modell hier herunterladen, falls sie das möchten.





      11.) Der erste Test:

      Nachdem Ihr alles aufgebaut habt, wollt Ihr den Aufbau sicherlich gleich testen.
      Ich Empfehle Euch am Anfang erst einmal die Strombegrenzung des Labornetzteils zu aktivieren falls Ihr soetwas besitzt. Alternativ bietet sich auch eine 9V Blockbatterie an. Diese liefert nicht so sehr viel Strom.
      Solltet Ihr etwas falsch gemacht haben, kann das Eure Schaltung retten.

      Wenn Ihr mein Programm verwendet, dann müsst Ihr den Magneten solange näher an den Elektromagneten bewegen, bis die zweite LED beginnt zu blinken. Dann bewegt Ihr den Magneten langsam nach unten
      bis sich der Elektromagnet einschaltet. Ihr müsst dabei jedoch beachten, welcher Pol des Magneten nach oben zeigt.

      Sollte der Aufbau mit verschiedenen Potistellungen nicht funktionieren, solltet Ihr den Hall-Sensor umdrehen und es erneut versuchen.

      Habt Ihr die ersten Versuche erfolgreich durchgeführt, solltet Ihr ein stärkeres 12V Netzteil (je nach Elektromagnet) nutzen. Bei meinem Aufbau kann ich die Spannung auf bis zu 20V erhöhen.
      Je höher die Spannung ist, desto höher ist auch der Strom der durch euren Elektromagneten fließt. Das erhöht dann wieder die Stärke des des Magnetfeldes wodurch Ihr schwerere Magnete schweben lassen oder den Abstand mit dem Poti erhöhen könnt.
      Ich rate euch jedoch davon ab, die Schaltung mit mehr als 12V zu betrieben. Das Limit des IRLZ34N liegt in dieser Schaltung bei 16V (Gate-to-Source Voltage). Die Grenze des LM7805 ist bei 25V erreicht.

      Nach einiger Zeit solltet Ihr auch einmal die Temperatur des MOSFETs und des Elektromagneten kontrollieren. Es gibt keine temperaturgesteuerte Abschaltung! Deshalb ist diese Schaltung auch nicht
      für den unbeaufsichtigten Betrieb geeigent.




      Ich wünsche Euch viel Erfolg falls Ihr euch für einen Nachbau entscheidet :thumbsup: !
      Wenn Ihr Fehler entdeckt, Anmerkungen, Verbesserungsvorschläge oder Fragen habt, schreibt einfach.
      Wenn Ihr das Projekt erfolgreich nachgebaut habt, teilt doch euer Ergebnis mit den anderen.

      LG Benni

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Benni ()