Einfach schweben / Just float

Abstract: In this device, the distance from the floating object to the electromagnet is not measured continuously. Nevertheless, this distance is optimized. For this purpose, the distance between the object and the sensor under it is measured. Based on this, the electromagnet is controlled accordingly and the object is made to float.

Vorhaben

Ein paar YouTube-Videos – "Schwebende Weltkugel" und "Die schwebende Kugel" –  haben mich auf eine Idee gebracht und inspiriert, etwas ähnliches, aber weniger aufwendiges zu bauen. Diese neue Einrichtung habe ich vor, später nicht für die Demonstrationszwecke, sondern praktisch zu nutzen. Trotz der Tatsache, dass die schwebende Objekte schon massenhaft produziert und verkauft werden, möchte ich für meine zukünftige Experimente etwas eigenes, einfaches und flexibles entwickeln. 

Kritik 

Obwohl ich das Prototyp-Projekt mit "Mag ich" bewerten würde, gefallen mir bei ihm (und bei dem anderen, ganz ähnlichen Video) mehrere Sachen nicht besonders. Zum Beispiel, finde ich nicht optimal, die Solarzelle und die Taschenlampe zu verwenden, um die Position von schwebenden Objekten zu ermitteln. Diese Teile beeinflussen negativ die Nutzungsbedingungen der gesamten Einrichtung: alles soll bei gedämmter Beleuchtung laufen oder die Solarzelle vom Außenlicht abschirmen; sonst würde sie die verfälschte Werte senden. Außerdem verkompliziert die Verwendung der Solarzelle die ganze Schaltung, da ein zusätzlicher Operationsverstärker für die Signalbearbeitung eingefügt werden soll.

Vorschlag-Aufbau

Meine Einrichtung, die Objekte zum schweben bringt, ist prinzipiell nicht viel anders aufgebaut. Aber statt Solarzelle, Taschenlampe, Regler-Potentiometer und zusätzlichen Operationsverstärker benutze ich nur einen reflektierenden optischen Sensor CNY70 mit zwei Widerständen dazu. Im Gehäuse von CNY70 befinden sich ein Infrarot-Emitter (Leuchtdiode) und ein Phototransistor.

Im Gegensatz zum Prototyp-Projekt wird der Sensor axial zu dem Elektromagnet und auf einem in vertikaler Richtung beweglichen Tischchen unter einem schwebenden Objekt positioniert.

Die Erfahrung zeigt, dass der von mir ausgewählte Sensor auch nicht vorbildlich funktioniert: er ist ein bisschen auf die äußere Beleuchtung empfindlich. Außerdem reagiert dieser Sensor auf die Objekte ungleich, wenn sich ihre reflektierenden Charakteristiken deutlich unterscheiden. 

Die Spule habe ich von einem irgendwann gekauften Elektromagnet genommen, anstatt sie selbst aufzuwickeln. Die notwendige Leistung bekommt der Elektromagnet auch nicht vom Motortreiber (wie beim Prototyp), sondern durch Darlington-Transistor BD677A.

Die Steuerung ist, wie auch im erwähnten Video, auf dem Arduino-Uno-Board aufgebaut.

Der Schaltplan meiner Einrichtung sieht so aus:

Die mechanische Komposition der Einrichtung (Sensor unten) hat auch ihre Tücken. Die sind einerseits dadurch bedingt, dass der Abstand zwischen hängendem Objekt und CNY70 konstant bleiben soll, sogar wenn das Objekt schaukelt. Deswegen hat es unten die kugelförmige Rundung mit dem Radius der Objekt-Höhe. Andererseits ist ein bewegliches Tischchen benötigt. Mit dem stellt man optimalen Abstand sowohl zwischen dem Objekt und Magnet, als auch dem Objekt und Sensor.

Physikalische Überlegungen

Ganz allgemein formuliert, um das ferromagnetische Objekt schweben zu lassen, muss man die Gewichtskraft des Objekts durch Magnet-Anziehungskraft kompensieren. Mit einem Dauermagnet geht es nicht. Es soll ein Elektromagnet sein, der mit Berücksichtigung der Position des Objekts (Abstand zum Magnet) gesteuert wird. Die Steuerung kann durch Pulsweitenmodulation (PWM) erfolgen. Die damit manipulierte Anziehungskraft des Magnetes soll das Objekt auf die vom sein Gewicht abhängige Entfernung zum Magnet automatisch zum Schweben bringen.

Aus dem Bild ist ersichtlich, dass die Wirkung von Erdanziehungskraft und Magnetanziehungskraft auf das Objekt – in Bezug auf den Abstand zu ihm – vollkommen unterschiedlich ist. Deswegen soll die PWM-Zahl bei Annäherung des Objekts zum Magnet stark (von 255 bis zu 0) gesenkt werden. Die resultierende oder geregelte Magnetanziehungskraft fällt dann auch zu Null.

Rahmenbedingungen und Steuerungsprinzip

Generierung von Steuerimpulsen ist abhängig von aktueller Position des Objekts und seiner Bewegungsrichtung. Das heißt, wenn das Objekt sich schon dank dem elektrischen Impuls auf Magnet nach oben bewegt, hat es kein Sinn, ihm noch einen weiteren Impuls zu schicken; falls es aber fällt, soll dann der Impuls kommen.

Der optische Sensor CNY70 misst die Entfernung zum Objekt im Bereich 0…10 mm. Der 10 Bits AD-Wandler von Arduino gewährleistet dann die Mess-Genauigkeit ungefähr 10 Mikrometer (eher im mittleren Teil des Sensors-Messbereichs). 

Das Objekt, das zu fallen beginnt, sinkt binnen erster Millisekunde auf 5 Mikrometer (h = gt²/2 ), nach zwei Millisekunden –  auf 20 Mikrometer. Das bedeutet, dass die Objekt-Positionsmessungen und deswegen auch die Steuerimpulse mit einem Takt nur über ungefähr zwei Millisekunden sinnvoll erscheinen. Die kürzeren Zeitintervalle werden nicht erlauben, zuverlässig die Position des Objekts mit CNY70 zu ermitteln.

Die maximale Frequenz der mit Ardino-Uno pulsweitenmodulierten Impulsen entspricht 980 Hz (z.B. auf Pin 5), die Periode ist dann gleich etwa einer Millisekunde. Daraus folgt, dass nach der Abstandsmessung mit eventuell folgendem Steuerimpuls erwünscht wäre, bis zur nächsten Messung noch etwa eineinhalb Millisekunden zu warten. Dafür spricht auch die Trägheit des Objekts: nach dem Impuls bewegt es sich noch eine Weile nach oben bevor es wieder fallen beginnt.

Arduino-Sketch

Für die richtige Interpretation der auf die Objektposition bezogenen Codezeilen muss man beachten, dass sich der Sensor unter dem Objekt befindet und zu ihm den Abstand misst. Aber entscheidend und ausschlaggebend ist der Abstand vom Objekt zum Magnet.

Der Code selbst sieht so aus:

int pos_akt=0;

int SCHWELLE=800;

int pos_vorher=0;

int magnet_pin=5;

int sensor_pin=A0; 

int pwm=0;

void setup()

  pinMode(sensor_pin,INPUT);

  pinMode(magnet_pin, OUTPUT);

  pinMode(led_pin, OUTPUT);

}

void loop() {

  pos_vorher=pos_akt;                        //Position aus loop-Vorlauf speichern

  pos_akt=analogRead(sensor_pin);    //Aktuelle Position messen

  if(pos_akt<SCHWELLE){                  //Wenn Abstand zum Sensor kleiner als SCHWELLE ist

    if(pos_akt-pos_vorher<-1){            //Wenn Objekt fällt

      pwm=SCHWELLE-pos_akt;         //Pulsdauer berechnen

      if(pwm>255)pwm=255;               //Pulsdauer in zulässigen Grenzen halten

      if(pwm<0)pwm=0;                        //-"-

      analogWrite(magnet_pin, pwm);  //Steuerimpuls ausgeben 

      delayMicroseconds(1300);           //Intervallwert optimieren

    }else{                                                  //Wenn das Objekt nicht fällt

      analogWrite(magnet_pin, 0);        //Impuls ohne Wirkung

      delayMicroseconds(1000);           // Intervallwert optimieren

    }}}

Meiner Ansicht nach ist der Code gewissermaßen universell in Bezug auf das Gewicht des Objekts, das zum Schweben gebracht werden soll. In einigen von mir angeschauten im Internet Videos wurden die Probleme mit leichten Objekten erwähnt und gezeigt: die Gegenstände pendelten um der Gleichgewichtsposition nach oben und nach unten.

Ich behaupte nicht, dass mein Code optimal ist. Es gibt eine Menge von Verbesserungsmöglichkeiten. Man kann z.B. die pwm-Dauer feiner bezüglich aktueller Objektposition definieren (statt einfach pwm = SCHWELLE - pos_akt zu schreiben) oder pwm-Dauer und Intervallwert abhängig von Differenz pos_akt - pos_vorher machen.

Es war nicht mein Absicht, ein "hoch komplexes" Programm zu erstellen (wie es in dem Video "Ein raffinierter Magnet-Schweberegler" mit Stolz angekündigt wurde; man hat aber das erreicht, was auch nur mit einigen Codezeilen geht). Das Ziel war, so einfach, wie möglich, die Objekte zum Schweben zu bringen. Und das ist das Resultat:


Das gleiche Video findet man auch auf YouTube


Kommentare