Mikroskop-Fokus

USB-Mikroskop am Raspberry Pi 5, Servo an Hardware-PWM · Prof. Dr.-Ing. Ralph Wystup M.Sc. und Claude (Anthropic, Claude Code) — gemeinsam erstellt · Fassung 4, 18.10.2026
–
 
 
 

Hardware-PWM · Haltung im Stand wählbar · jedes Ziel wird von 5° darunter angefahren · Schritte mit kurzem Rütteln · Autofokus: Suchlauf ≈ 25 s, Stapel ≈ 20 s, Anfahrt ≈ 10 s · Nachfokus: nur Stapel ±8° um die jetzige Stellung ≈ 30 s · Ergebnis = Schärfe am Ende gegen die Parabelhöhe des Stapels (100 % = berechnete Spitze).

Der Aufbau

Ein einfaches USB-Mikroskop (Wandler Genesys Logic 05e3:f12b, 640 × 480 Bildpunkte, 30 Bilder/s, YUYV) hat ein Rändelrad zur Handverstellung der Schärfe. Dieses Rad wird nicht mehr von Hand gedreht, sondern von einem Modellbauservo über ein Zahnradpaar. Die Halterung ist im 3D-Druck gefertigt und trägt Mikroskop, Servo und beide Zahnräder in festem Abstand.

TeilAngabe
RechnerRaspberry Pi 5 Model B, 4 GB, Raspberry Pi OS 12 (bookworm), Python 3.11, OpenCV 4.6; Name im Netz mikroskop
KameraUSB-Mikroskop an USB 2.0, /dev/video0; Regler: Helligkeit, Kontrast, Gamma, Schärfe (bleiben auf Vorgabe)
ServoModellbauservo, Stellbereich 0–180° bei Impulsen von 0,40 bis 2,40 ms, 50 Hz; Signal an GPIO 18 (Hardware-PWM, PWM0-Kanal 2), Versorgung 5 V, Masse gemeinsam mit dem Pi
GetriebeKleines Zahnrad auf der Servowelle, großes Zahnrad auf der Welle, die das Rändelrad des Mikroskops mitnimmt: Untersetzung 1 : 2. Ein Grad am Servo sind 0,5° am Mikroskoprad.
Halterung3D-Druck; Zahnräder und Mitnahme am Rändelrad sind die Stellen, an denen das gemessene Spiel von 4,6° (am Servo) entsteht

Verschaltung

Raspberry Pi 5 USB 2.0 → MikroskopGPIO 18 (Pin 12) → Servo Signal5 V (Pin 2) → Servo +GND (Pin 6) → Servo −Ethernet/WLAN → Heimnetz, Port 8090 Servo Signal: Puls 0,40–2,40 msalle 20 ms (50 Hz)0° … 180°kleines Zahnrad auf der Welle Mikroskop (USB) großes Zahnrad (1 : 2) auf der Wellezum Rändelrad der HandverstellungBild 640 × 480, 30 Bilder/sProbe unter dem Objektiv 3 Adern Zahnräder 1 : 2 USB: Bilder zurück zum Pi — der Regelkreis schließt sich über die Schärfe im Bild Hardware-PWM: /boot/firmware/config.txt → dtoverlay=pwm-2chan; GPIO 18 = /sys/class/pwm/pwmchip0/pwm2 (Periode 20 000 000 ns, Tastdauer in ns)

Was das Getriebe für die Regelung bedeutet

Die Untersetzung halbiert die Bewegung: 0,3° Servoschritt sind 0,15° am Rändelrad. Die Halbwertsbreite des Schärfegipfels von 1,4 bis 3° am Servo entspricht 0,7 bis 1,5° am Rad. Das Spiel von 4,6° am Servo (2,3° am Rad) ist größer als der Gipfel; darum muss jede Anfahrt aus derselben Richtung kommen, sonst landet der Servo neben dem Gipfel, obwohl der Befehl stimmt. Die Rückstellkraft, die den Servo im Stand knurren lässt, kommt aus Mikroskopmechanik und Zahneingriff; sie ist mit dem gewählten Aufbau nicht zu beseitigen, nur zu beherrschen (Haltung wählbar).

Was das Programm ist

Auf dem Raspberry Pi läuft autofokus4.py als Dienst (mikroskop-fokus.service, startet beim Hochfahren). Es liest das USB-Mikroskop (640 × 480, 30 Bilder/s), berechnet für jedes Bild ein Schärfemaß, fährt den Servo über die Hardware-PWM des Pi 5 und liefert diese Seite unter http://mikroskop:8090 aus. Der Browser zeigt nur an und schickt Befehle; alles Messen und Regeln geschieht im Programm.

Die Bedienelemente

ElementWas es tut
LivebildBild der Kamera mit Schärfezahl, Servowinkel und dem grünen Messfenster (ROI, mittlere 33 % jeder Kante).
AutofokusVoller Ablauf: Suchlauf über den ganzen Bereich, Stapel, Anfahrt, Ergebnis. Etwa 70 s.
NachfokusNur Stapel ±8° um die jetzige Stellung und Anfahrt. Etwa 30 s. Für kleine Änderungen, wenn der Gipfel schon in der Nähe liegt.
StoppBricht den laufenden Ablauf ab; der Servo bleibt, wo er ist.
+ 0,3° / − 0,3°Ein Handschritt. Beide Richtungen fahren erst 5° nach unten und kommen von unten auf den neuen Wert (etwa 9 s), damit das Getriebespiel immer auf derselben Seite liegt.
Haltung im Standstromlos: still, das Getriebe hält durch Reibung, etwa jeder zehnte Handschritt geht daneben. Puls an: der Servo hält aktiv, trifft 12 von 12, knurrt dabei.
Fahre nachFährt einen eingegebenen Winkel an, von unten.
Befund für die KI bündelnSchreibt Zustand, die letzten 60 Protokollzeilen, die letzte Kurve und das aktuelle Bild nach ~/Desktop/messung/befund_<Zeit>/. Das ist das Paket, das die KI zur Analyse liest (Reiter Zusammenarbeit).
KurveSchärfe über dem Winkel aus dem letzten Suchlauf oder Stapel; der rote Strich ist der berechnete Gipfel.
ProtokollJede Meldung des Programms mit Uhrzeit; dieselben Zeilen stehen in ~/Desktop/messung/autofokus4_<Datum>.log, alle Messpunkte in der .csv daneben.

Der Ablauf „Autofokus"

  1. Suchlauf. Der Servo fährt auf 0°, dann gleichmäßig mit 8°/s bis 180°. Alle 0,3° wird die Schärfe notiert. Das Maximum dieser Kurve nennt die Gegend des Gipfels; wegen des Nachlaufs von Servo und Kamera liegt der wahre Gipfel einige Grad darunter. Ist das Maximum kleiner als das Dreifache des Medians (Fuß), gibt es keinen Gipfel und der Lauf endet mit Meldung.
  2. Stapel. Der Servo fährt 12° unter die Gegend und steigt in Schritten von 0,3°. Jeder Schritt: Puls an, 150 ms Rütteln ±0,6°, Ziel setzen, 250 ms Ruhe, Schärfe als Mittel aus zwei Bildern. Sobald die Schärfe nach dem Maximum unter 40 % gefallen ist, endet der Stapel. Durch die sieben Punkte um das Maximum wird eine Parabel gelegt; ihr Scheitel ist der Gipfelwinkel, ihre Höhe die Bezugsgröße 100 %.
  3. Anfahrt. Der Servo fährt 5° unter den Gipfel und steigt von dort, zuerst in 0,3°-, nahe dem Ziel in 0,2°-Schritten. Er hält an, sobald die gemessene Schärfe mindestens 92 % der Parabelhöhe erreicht. Fällt die Schärfe stattdessen nach dem Überschreiten von 60 % wieder unter 70 % des bisher Besten, ist der Gipfel überfahren; dann ein zweiter Versuch.
  4. Ergebnis. Die Haltung wird eingestellt (stromlos oder Puls an), nach 0,4 s wird die Schärfe aus sechs Bildern gemittelt und als Anteil der Parabelhöhe gemeldet. Ab 85 % heißt es BESTANDEN, sonst NICHT ERREICHT mit der ehrlichen Zahl.

Warum so und nicht einfacher

Alle Regeln stammen aus Messungen am Gerät am 18.10.2026 (Reiter Messungen): Software-PWM zittert, darum Hardware-PWM. Das Getriebe hat 4,6° Spiel, darum immer von unten. Kleine Schritte aus dem Stand bleiben hängen, darum das Rütteln. Der Servo läuft dem Befehl nach, darum 250 ms Ruhe vor jeder Messung und die Trennung von Suchlauf und Stapel. Der befohlene Winkel ist nie die Ist-Lage, darum entscheidet am Ende nur die gemessene Schärfe.

1 · Das Schärfemaß

Ein scharfes Bild hat steile Kanten, ein unscharfes flache. Das Maß dafür ist die Energie des Bildgradienten. Im Messfenster (ROI) wird das Graubild I(x,y) mit den Sobel-Kernen gefaltet:

Gx = I ∗ [[−1 0 1],[−2 0 2],[−1 0 1]] ,   Gy = I ∗ [[−1 −2 −1],[0 0 0],[1 2 1]]

und das Tenengrad-Maß ist der Mittelwert der quadrierten Gradientenlänge:

S = (1/N) · ΣROI ( Gx² + Gy² )

Es wird nicht normiert und nicht begrenzt. Das frühere Programm teilte durch 15 000 und schnitt bei 1,0 ab; dadurch wurde der Gipfel zu einem Plateau von mehr als 10° Breite, in dem der Regler das Maximum nicht sehen konnte. Pertuz, Puig und García (Pattern Recognition 46, 2013) vergleichen 36 Schärfeoperatoren; Tenengrad gehört zu den dreien mit dem besten Verhältnis von Empfindlichkeit zu Rauschfestigkeit. Gemessen am Gerät: Streuung von Bild zu Bild ohne Bewegung 0,7 bis 2,6 % des Mittelwerts, Fuß (weit außerhalb des Fokus) etwa 200, Gipfel etwa 9 000, also ein Verhältnis von 45 : 1.

2 · Die Form des Gipfels und die Parabel

Die Schärfe über dem Servowinkel a hat bei dieser Probe einen einzigen Gipfel mit Halbwertsbreite 1,4 bis 3° und einem Fuß von 16 bis 20° (ab 5 % der Höhe). Nahe dem Scheitel ist jede glatte Kurve durch ihre Taylor-Entwicklung zweiter Ordnung beschrieben, also eine Parabel:

S(a) ≈ p0 a² + p1 a + p2 ,   a* = −p1 / (2 p0) ,   S* = S(a*)

Die Koeffizienten kommen aus der Methode der kleinsten Quadrate über die sieben Stapelpunkte um das gemessene Maximum (drei links, drei rechts). Gültig ist die Anpassung nur für p0 < 0 (nach unten offen); sonst bleibt das gemessene Maximum der Gipfel. Der Scheitel liegt zwischen den Rasterpunkten und ist genauer als der Rasterabstand 0,3°; die Höhe S* ist die Bezugsgröße, auf die das Ergebnis in Prozent bezogen wird. Deshalb kann ein Ergebnis knapp über 100 % liegen, wenn die Anfahrt zufällig näher an der wahren Spitze hält als die Parabel schätzt.

3 · Der Servo und seine Ansteuerung

Ein Modellbauservo stellt den Winkel nach der Breite eines Impulses, der alle 20 ms (50 Hz) wiederholt wird. Für diesen Servo gilt die lineare Zuordnung

tPuls(a) = 0,40 ms + (a / 180°) · 2,00 ms ,   a ∈ [0°, 180°]

also 11,1 µs je Grad. Die Impulse erzeugt die Hardware-PWM des RP1-Bausteins (GPIO 18 = PWM0-Kanal 2, Freigabe über dtoverlay=pwm-2chan); Periode und Tastdauer werden in Nanosekunden geschrieben, die Auflösung ist damit weit feiner als der Totbereich des Servos. Software-PWM aus dem Benutzerraum (RPi.GPIO über lgpio) hat Impulsbreitenschwankungen im Bereich einiger Mikrosekunden, die der Servo als Sollwertänderungen von Bruchteilen eines Grads deutet und dauernd nachregelt: gemessen ±47 bis 63 % Schärfeschwankung im Stand gegenüber ±0,7 bis 0,9 % mit Hardware-PWM. Mit der Untersetzung 1 : 2 wird aus 11,1 µs je Servograd 22,2 µs je Grad am Rändelrad.

4 · Spiel, Hysterese und die Regel „immer von unten"

Zwischen Servoabtrieb, Zahnradpaar und Rändelrad liegt Spiel. Modell: die Ist-Lage aist folgt dem Befehl a um einen richtungsabhängigen Betrag b versetzt,

aist = a − b↑ beim Aufwärtsfahren ,   aist = a + b↓ beim Abwärtsfahren ,   b↑ + b↓ ≈ 4,6°

Gemessen als Abstand der Gipfel im langsamen Hin- und Rücklauf: 4,6° (Hardware-PWM, 0,2° je 150 ms). Rütteln während der Fahrt verringert den Wert nur auf 3,2°; es ist mechanisches Spiel. Wird jedes Ziel ausschließlich aufwärts angefahren, ist b konstant und fällt aus allen Differenzen heraus: Gipfelwinkel und Anfahrt sind dann im selben Koordinatensystem. Das ist die Regel von Knapper et al. (Journal of Microscopy 2022) für das OpenFlexure-Mikroskop, dort mit 137 Schritten Spiel am Schrittmotor. Darum beginnt jede Anfahrt 5° unterhalb des Ziels, und auch der Handschritt „−0,3°" fährt 5° hinunter und kommt von unten.

5 · Haftreibung und das Rütteln

Ein kleiner Schritt aus dem Stand muss die Haftreibung überwinden, die größer ist als die Gleitreibung (Stick-Slip). Gemessen mit Hardware-PWM: ein Schritt von 0,2° bewegt das Bild in 1 von 6 Fällen, 0,3° in 3 von 6, erst 0,5° in 6 von 6. Wird der Sollwert während 150 ms alle 25 ms zwischen a + 0,6° und a − 0,6° gewechselt und dann auf a gesetzt, bricht der Servo los und folgt: 0,2° in 6 von 6, 0,1° in 5 von 6 Fällen. Die Rüttelamplitude bleibt unter dem Spiel, darum ändert sie die Richtung der Vorspannung nicht. Eine Ausnahme ist gemessen: Rütteln am Gipfel, nachdem das Getriebe von unten gespannt wurde, ließ es in einem Schritt um sein Spiel zurückschnappen (Schärfe 8 813 → 193). Seitdem rüttelt kein Schritt mehr an der Stelle, jeder Handschritt nimmt den Umweg von unten.

6 · Nachlauf und Messzeitpunkt

Servo und Kamera folgen dem Befehl verzögert. Im schnellen Lauf (6°/s, 0,25° je 40 ms) erschien der Gipfel hin bei 140,75° und zurück bei 136,0°; im langsamen Lauf mit Software-PWM an derselben Stelle. Der Unterschied von 4,75° war Nachlauf, kein Spiel: Der Befehl war dem Servo voraus, die Kamera dem Bild um ein bis zwei Bilder hinterher. Daraus folgt: nach jedem Schritt 250 ms Ruhe, dann zwei Bilder verwerfen, dann messen; und der schnelle Suchlauf liefert nur die Gegend, nie den Gipfel. Die Umkehrprobe bestätigte es: nach 0,2°-Schritten im 120-ms-Takt stand der Servo 1,4° hinter dem Befehl.

7 · Der Regler als Ganzes

Die Aufgabe ist, das Maximum einer unbekannten, eingipfligen Funktion S(a) mit einem Stellglied zu finden, dessen Ist-Lage nicht messbar ist. Der Suchlauf tastet S grob über den ganzen Bereich ab (Kosten: 25 s, Gewinn: keine Annahme über die Lage). Der Stapel misst S im Fuß des Gipfels auf dem 0,3°-Raster und liefert über die Parabel Scheitel und Höhe. Die Anfahrt schließt den Kreis über die Messgröße selbst: Sie endet nicht am berechneten Winkel, sondern dort, wo S ≥ 0,92 · S* gemessen wird. Damit ist das Ergebnis gegen Spiel, Nachlauf und Streuung der Ist-Lage unempfindlich, denn alle drei wirken nur auf den Winkel, nicht auf die Schärfe. Zahlen vom 18.10.2026: sechs Läufe hintereinander, Ergebnis 93 bis 105 % der Parabelhöhe, Gipfelwinkel 139,6 bis 140,1°, Dauer 70 s. Nachfokus 30 s.

8 · Halten im Stand

Nach dem Fokus bleibt eine Rückstellkraft auf dem Getriebe. Mit Puls hält der Servo dagegen und regelt hörbar nach (Knurren), die Stellung bleibt: 60 s ohne Sprung, 12 von 12 Handschritten getroffen. Stromlos hält nur die Reibung: 20 s Streuung 0,7 %, aber gelegentlich rutscht das Getriebe um sein Spiel ab, und der nächste Handschritt geht von einer falschen Stellung aus (1 von 10). Beide Haltungen sind auf der Seite wählbar; der Autofokus fährt immer mit Puls und schaltet erst am Ende um.

Quellen

Messungen vom 18.10.2026, Probe Fadenalgen

MessungErgebnis
Einzelschritte, Software-PWM, Puls aus (altes Programm)0,1° 1/6 · 0,2° 2/6 · 0,5° 4/6 · 1° 5/6 · 2° 5/6 wirksam
Einzelschritte, Software-PWM, Puls an0,1° 3/6 · 0,2° 6/6 · 0,5° 6/6
Schärfekurve schnell (0,25° je 40 ms)Gipfel hin 140,75° / zurück 136,0°, Halbwertsbreite 2,5°, scheinbare Hysterese 4,75° (Nachlauf)
Schärfekurve langsam, Software-PWMGipfel 138,0° in beiden Richtungen, Halbwertsbreite 1,4° hin, 4,8° zurück (Zittern verdeckt das Spiel)
Halten mit Software-PWM, Puls anSchärfe ±47 bis 63 %
Hardware-PWM, Halten, Puls an±0,9 % (15 s), 60 s ohne Sprung ±0,7 %
Hardware-PWM, Halten, stromlos±0,7 % (20 s)
Hardware-PWM, Hysterese langsam4,6°; mit Rütteln ±0,3/0,6/1,0°: 4,2 / 3,8 / 3,2°
Hardware-PWM, Einzelschritte aus dem Stand0,1° 0/6 · 0,2° 1/6 · 0,3° 3/6 · 0,5° 6/6; mit Rütteln ±0,6°: 0,1° 5/6 · 0,2° 6/6 · 0,3° 6/6
Autofokus 4, sechs Läufe93 bis 105 % der Parabelhöhe, Gipfel 139,6 bis 140,1°, 70 s
Handschritte, Puls an12 von 12 auf dem Hang, dreimal 139,93°: 8964 / 8989 / 8955
Handschritte, stromlos9 von 10 (ein Abrutschen um das Spiel)

Rohdaten: ~/Desktop/messung/ — kurve_*.csv, fein_*.csv, schritte_*.csv, hw_fein_*.csv, dither_*.csv, autofokus4_*.csv, schaerfekurve_2026-10-18.png, BEFUND_2026-10-18.txt.

Wie die KI zugeschaltet wird

Die KI (Claude in Claude Code) läuft auf einem Server außerhalb des Heimnetzes und hat keinen eigenen Weg zum Pi. Der Weg führt über den Arbeitsrechner des Auftraggebers: Dort läuft die Brücke (C:\Bruecke), ein Programm, das Befehle vom Server abholt, ausführt und die Antwort zurückgibt. Für den Pi liegt daneben pi.py, das per SSH mit Schlüssel (kein Passwort gespeichert) einen Auftrag aus pi_auftrag.txt auf dem Pi ausführt und dessen Ausgabe zurückbringt. Alles, was die KI am Pi tut, geht durch diese zwei Dateien und ist dort nachlesbar.

Struktur der Zusammenarbeit — wer wo läuft und was wohin fließt Server (Claude Code) Claude: liest Protokolle, misst,rechnet, schreibt ProgrammeArbeitskopie: /workspace/Mikroskop_Pi5Gedächtnis über das Projektkein Zugang ins Heimnetz Arbeitsrechner (Windows) C:\Bruecke\bruecke.py — holt Befehlevom Server, führt sie ausC:\Bruecke\pi.py — SSH zum Pipi_auftrag.txt — der Auftragpi_key — der SchlüsselBrowser: http://mikroskop:8090 Raspberry Pi 5 „mikroskop" Dienst mikroskop-fokusautofokus4.py: Kamera, Schärfe,Servo (Hardware-PWM), Seite :8090~/Desktop/messung: Protokoll, CSV,Befund-PaketeUSB-Mikroskop · Servo GPIO 18 Brücke (Internet, Abholung) SSH, Schlüssel Ablauf einer Zuschaltung 1. Der Auftraggeber beschreibt das Problem im Chat und drückt auf der Seite „Befund für die KI bündeln" (oder die KI holt sich Protokoll und CSV selbst). 2. Die KI liest über Brücke und pi.py: Protokoll, Messpunkte, Bild, Zustand des Dienstes. Sie bewegt den Servo nur, wenn der Auftraggeber es erlaubt hat. 3. Analyse mit Zahlen: Was ist gemessen, was daraus folgt, was offen bleibt. Literatur und bekannte Lösungen vor eigenen Ansätzen. 4. Eine Änderung wird zuerst in der Arbeitskopie geschrieben, dann als Datei auf den Pi gebracht (cat-Heredoc über pi.py), der Dienst neu gestartet. 5. Nachmessen am Gerät, die Zahlen ins Protokoll, auf diese Seite (Reiter Messungen) und ins Gedächtnis der KI. Erst dann gilt die Änderung. Was die KI nie tut: Passwörter speichern (der Schlüssel ersetzt es), Dateien löschen ohne Wort, am Pi etwas installieren oder neu starten ohne Wort.

Was die KI sieht und was nicht

Sichtbar für die KINicht sichtbar
Protokoll und CSV des Dienstes, jedes Einzelbild auf Anforderung (als Datei, kein Livestrom), Zustand über /status, die Kurven, alle Messskripte und ihre Ergebnisse in ~/Desktop/messungDer Bildschirm des Pi, Geräusche des Servos, die Mechanik, der Browser des Auftraggebers. Darum sind Beobachtungen wie „es knurrt" oder „es zischt" wichtige Messwerte, die nur der Mensch liefern kann.

Wie eine Korrektur abläuft, konkret

  1. Im Chat: „Bei Minus springt er" — oder „Befund bündeln" auf der Seite drücken.
  2. Die KI holt befund_<Zeit>/ vom Pi (Zustand, Protokoll, Kurve, Bild), liest und vergleicht mit den Messungen auf dieser Seite.
  3. Bei Bedarf eine gezielte Messung (eigenes Skript in ~/Desktop/messung, Servo bewegt sich — nur mit Erlaubnis).
  4. Änderung in autofokus4.py oder seite.html, auf den Pi, Dienst neu starten: sudo systemctl restart mikroskop-fokus.
  5. Nachmessen, Zahlen hier eintragen. Der Auftraggeber prüft am Gerät.

Dateien auf dem Pi

OrtInhalt
~/Desktop/autofokus4/autofokus4.py, seite.html, autofokus4.out (Konsole des Dienstes)
/etc/systemd/system/mikroskop-fokus.serviceder Dienst; systemctl status mikroskop-fokus
~/Desktop/messung/Messungen, Protokolle, CSV, Bilder, Befund-Pakete
~/.config/autostart/mikroskop-fokus.desktopöffnet die Seite beim Anmelden als Firefox-Fenster auf dem Desktop (auch bei Remote-Desktop; Chromium bleibt dort weiß)
/boot/firmware/config.txtdtoverlay=pwm-2chan für die Hardware-PWM (Sicherung config.txt.vor_pwm_2026-10-18)
~/.ssh/authorized_keysder öffentliche Schlüssel der Brücke (Zeile „bruecke")