Laser sind an sich ja schon etwas faszinierendes. Auch ich kann mich dem nicht entziehen und daher hab ich mal darüber nachgedacht, ob ich so eine Art Hologramm oder Display-Kugel machen kann. Dazu braucht es allerdings etwas Vorbereitung und ein paar Machbarkeits-Versuche. Davon handelt dieser Beitrag heute.

Weiter lesen? Klicke die Headline um den ganzen Artikel zu sehen!

Teile

Bis jetzt habe ich folgende Teile verwendet:

Alles zusammen für unter 33,- EUR (keine Ahnung was so ein Motor kostet, aber unter 10,- EUR).

Die Idee

Ich dachte darüber nach, dass ich mit einem kleinen Spiegel auf einer Motorqelle einen Laserstrahl um 360° rotieren lassen kann. So entsteht eine Linie quer durch den Raum. Wenn ich jetzt die Drehzahl der Motorwelle kennen würde, könnte ich den Laser so ein- und ausschalten, dass ich theoretisch an jedem Punkt auf der Linie einen Punkt erzeugen kann. Also ein beliebiges Muster auf der gesamten Linie. Wenn das geht, könnte ich diese Apparatur wiederum rotieren und damit eine kugelförmige Fläche abdecken.

Allerdings habe ich Zweifel daran ob sowas überhaupt mit einfachen Mitteln machbar ist. Also wird ein etwas hemdsärmeliger Versuch gestartet.

Mechanischer Aufbau

Der Testaufbau sieht jetzt so aus:

undefined undefined

Man sieht im linken Bild links den Motor. Auf diesem Habe ich eine Pappscheibe gesteckt die einen Ausschnitt für den Drehzahlsensor hat. Unten sieht man den Sensor mit seiner Gabellichtschranke. Rechts ist der Laser montiert. Es ist wichtig, dass er exakt mittig zur Motorwelle positioniert ist.

Im rechten Bild kann man den Laser nochmal genauer sehen und auch wie der Spiegel mit einem 45° Winkel auf der Motorachse positioniert ist. Ich habe dazu mit einem Heißluftföhn etwas Kunststoff-Masse heiss gemacht und damit den Spiegel fixiert.

Im Prinzip ist das auch schon der ganze mechanische Aufbau.

Schaltung

Die Schaltung ist extrem einfach. Der Motor ist direkt an einem PWM-PIN des Teensy angeschlossen. Der liefert max 250mA, was lässig ausreicht. Ich nutze aktuell auch nicht das volle Tempo.

Den Laser steuere ich auch über einen Teens-PIN an. Aber da der nur 3,3V liefert, ist das zu schwach. Also habe ich die Ansteuerung über einen TIP120 Transistor gemacht, den ich mit einem 1.5KOhm Wiederstand an der Basis anspreche und am Collector mit 5V beaufschlage.

Der Drehzahl-Sensor ist einfach an die 3,3V am Teensy angeschlossen und seine Ausgang auf einen Eingangs-PIN vom Teensy.

undefined

Das war's auch schon.

Der Code

Bei meinen ersten Tests hab ich einfach nur geschaut ob es eine Linie gibt. Dann hab ich angefangen die Zeit je Umdrehung zu messen. Dazu nutze ich die Arduino-Funktion micros(), denn Millisekunden sind nicht genau genug für so etwas.

Ich denke darüber nach, ob ein Interrupt nicht evtl. genauer wäre, aber interessanterweise klappt es so schon ganz gut. Hier ist mein aktueller Stand. Er macht ein Muster und lässt mich die Auflösung testen. Mein Ziel ist erstmal eine Schaltung je Grad, also 360 Unterteilungen einer Rotation. Das klappt sogar ganz hervorragend.

int pin_laser = 0;
int pin_sensor = 1;
int pin_motor = 10; // Must have PWM support!
int divisor = 360; // 1 degree steps

int period = 0; // holding the time for one rotation in microseconds
static unsigned long lastTime = micros(); // holds the last time the rotation started
int mod = 0; // variable for doing some demo movement

void setup() {
  Serial.begin(38400);
  pinMode(pin_laser, OUTPUT);
  pinMode(pin_sensor, INPUT);
  pinMode(pin_motor, OUTPUT);

  analogWrite(pin_motor, 210); // motor speed
  digitalWrite(pin_laser, LOW);
}

void loop() {
  static int lastState = 0;
  int state = 0;

  // calculate rotation time
  // (maybe interrupts are better?)
  state = digitalRead(pin_sensor);
  if (state != lastState) {
    lastState = state;
    if (state == 1) {
      period = micros() - lastTime;
      lastTime = micros();
    }
  }
  
  Output(); // Output and movement every second
  Job(); // Do LED stuff
}

void Output() {
  static unsigned long nextOut = millis() + 1000;
  if (millis() < nextOut) {
    return;
  }
  // Here once a second
  nextOut = millis() + 1000;
  Serial.println(period); // tell me microsecons per rotation

  // Do some movement
  mod = mod + 1;
  if (mod >= 15) { mod = 1; }
}

void Job() {
  float steps = period / divisor; // Microsecons per divisor
  float since = micros() - lastTime; // Time since 0° (rotation start)
  int curr = since / steps; // calculate the current step
  
  // Do some movement. Use current step with a modul on 'mod'
  if (curr % mod) {
    digitalWrite(pin_laser, LOW);
  } else {
    digitalWrite(pin_laser, HIGH);
  }
}

Das Programm variiert jede Sekunde den Abstand der Linien, so dass sich ein wechselndes Muster ergibt. So kann man gut testen.

Mir ist aufgefallen, dass, wenn ich den Teensy auf 120Mhz übertakte, die Qualität etwas besser wird. Aber auch mit den üblichen 72Mhz klappt es gut.

Bilder

Hier noch ein paar Bilder aus meinen Experimenten:

undefined undefined

Fazit

Man kann rechts im Bild sehen, wie es aussieht wenn ich bei jeder ungeraden Position Ein- und bei den geraden Ausschalte. Was soll ich sagen, es hat überraschend gut funktioniert! Ich erhalte eine saubere und stehende gestrichelte Linie. Alle 2 Grad mit je 1 Grad länge.

Man merkt an einer Stelle des "Rings" allerdings ein leichtes Schwanken zwischen den Linien. Das ist der Punkt an dem neu gemessen wird. Da der Motor nie ganz gleichmäßig läuft, entsteht so eine leichte Ungenauigkeit. Diese ist aber recht gering.

Weiterhin hat mich interessiert, wie weit die Auflösung geht. Ich konnte problemlos auf 1/10 Grad gehen (also den Divisor auf 360*10 setzen). Ich konnte also den Kreis in 3600 Teile unterteilen und diese zuverlässig ansteuern. Bei einer Projektionsfläche in der Nähe kann man das kaum noch erkennen. In 1,5 Meter Entfernung sind die Teile aber noch gut erkennbar.

Alles in allem war das ein sehr erfolgreiches Experiment. Inzwischen gehen meine Gedanken eher in Richtung eines kleinen Laserprojektors. Es bräuchte dazu noch eine zweite Dimestion in der der Laser abgelenkt wird. Im Prinzip wäre es dann wie in einem Röhrenfernseher. Nur könnte ich es in den ganzen Raum projizieren. Damit könnte man sicher schöne Lightshows in ein Zimmer werfen. Wenn der Laser dann noch grün wäre und evtl. 10MW hätte...

Für Ideen bin ich offen. Schreibt mir doch was Ihr Interessant finden würdet.

Wenn ich da noch was mache, wird es in einem weiteren Artikel veröffentlicht :-)

Video

Hier noch ein Video in Aktion. Erst filme ich den Aufbau. Dann halte ich ein Blatt Papier drüber und am Ende filme ich die Wand hoch an die Decke des Raumes.