Portierung auf den XIAO ESP32-C3 (MicroPython)
Die Kette laeuft auf dem Geraet gegen den Mock auf dem Mac. Getestet mit MicroPython 1.28.0 (ESP32_GENERIC_C3): alle Module importieren, Telegrammbau und Koordinaten-Formatierung sind byte-identisch zum Mac (inkl. Gradzeichen), Poll-Schleife 22 Abfragen in 20 s ohne Aussetzer, Ausfall und Reconnect verhalten sich wie vorgesehen. Offen bleibt allein die RS232-Strecke zur Anzeige -- der Steckbrettaufbau mit MAX3232 fehlt noch. Gemeinsamer Kern statt zweier Programme: - displayloop.py: die Poll-Schleife, herausgeloest aus run_display. Mac und ESP32 fahren jetzt denselben Ablauf; drumherum liegt nur die Kommandozeile (run_display.py) bzw. das WLAN-Setup (run_esp32.py). - ticks.py: Timeouts fuer beide Plattformen. time.ticks_ms() laeuft nach ~12 Tagen ueber; das bisherige "jetzt + Timeout" haette eine Warteschleife danach tagelang haengen lassen. Jetzt ueber ticks_diff. - wifi.py, run_esp32.py, wifi_config.py (gitignored, Vorlage dabei), deploy.sh. Pinbelegung aus dem KiCad-Schaltplan uebernommen, nicht geraten: UART1 mit TX=GPIO21 (Pad 7/D6) und RX=GPIO20 (Pad 8/D7) ueber den MAX3232, LDR an GPIO2 (Pad 1/A0). UART0 bleibt die REPL. LDR-Kennlinie ist auf der Platine umgekehrt: der Teiler lautet 3V3-[2k]-A0-[LDR]-GND, die Spannung faellt also mit steigender Helligkeit -- andersherum als beim MSP430, auf den die Schwellen zugeschnitten sind. Wird im Code gespiegelt (config.LDR_INVERTED, brightness.raw_to_ldr). Die Schwellen selbst muessen am realen Aufbau noch nachgemessen werden. Am Geraet gefundene Fehler, die den Attrappen-Tests entgehen mussten, weil CPython sie nicht hat: - MicroPython kennt kein str.ljust (auch kein rjust/center/zfill). display._emit_line fuellt von Hand auf. - NOLINK_LINES hatte 10 Zeichen bei 9 Zeichen Zeilenbreite und erschien als "MONTIERUN". Jetzt "KEIN LINK"/"TELESKOP". Dagegen: TestMicropythonVertraeglichkeit prueft die deployten Dateien statisch auf solche Methoden und auf modulweites argparse/threading und haelt die Dateiliste mit deploy.sh synchron; test_display.py prueft die Breite fester Anzeigetexte. Weitere Portabilitaet: mount_client nutzt getaddrinfo und eine Sendeschleife statt sendall (MicroPython laesst dessen Verhalten mit Timeout offen); argparse in brightness wandert in die Funktion; migra._digits und die Hex-Ausgabe verlassen sich nicht mehr auf %0*d bzw. bytes.hex(). Beides kann 1.28 zwar doch -- am Geraet nachgeprueft, die Kommentare sagen es jetzt richtig. Widerspruch in der Dokumentation bereinigt: die Zeichenbreite stand an vier Stellen als 9 oder 10. Gemessen sind 9; die Erklaerung duerfte sein, dass die Sperrschrift 7 px pro Zelle braucht (9*7 = 63 von 64 px) und nicht 6, wie es eine 5x7-Matrix mit 1 px Luecke waere. Nachgeprueft ist das nicht -- dafuer gibt es jetzt "probe.py pitch", das den Auto-Vorschub gegen feste Pixelabstaende stellt, statt am Umbruch abzuzaehlen. mount_mock.py --lan bindet auf 0.0.0.0 und nennt die einzutragende LAN-IP, damit der ESP32 den Mock erreicht. 92 Tests gruen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,10 +3,10 @@
|
||||
Ansteuerung einer microSYST **migra SC/MC Seriell** LED-Großanzeige mit den
|
||||
Koordinaten (Rektaszension / Deklination) einer 10Micron GM4000 HPS II.
|
||||
|
||||
Endziel ist ein XIAO ESP32-C3, der die Montierung per WLAN abfragt und die
|
||||
Koordinaten über UART/RS232 auf die Anzeige schreibt. **Phase 1** (dieser Stand)
|
||||
ist das Testprogramm auf dem Mac: Koordinaten von Hand übergeben, Ausgabe über
|
||||
einen USB-RS232-Wandler.
|
||||
Zielgerät ist ein XIAO ESP32-C3, der die Montierung per WLAN abfragt und die
|
||||
Koordinaten über UART/RS232 auf die Anzeige schreibt. Entwickelt und getestet
|
||||
wird auf dem Mac (Koordinaten von Hand bzw. von der Montierung, Ausgabe über
|
||||
einen USB-RS232-Wandler); dieselben Module laufen auf dem ESP32.
|
||||
|
||||
## Benutzung
|
||||
|
||||
@@ -27,28 +27,49 @@ python3 mount_mock.py --move # Mock separat starten
|
||||
# Helligkeit aus einem LDR-Wert setzen:
|
||||
python3 brightness.py --ldr 1500 # LDR-Rohwert -> Stufe/Prozent -> senden
|
||||
|
||||
python3 -m unittest test_migra test_lx200 test_brightness # alle Tests
|
||||
python3 -m unittest test_migra test_lx200 test_brightness test_display test_esp32
|
||||
python3 probe.py ruler # Geometrie der Anzeige ausmessen
|
||||
```
|
||||
|
||||
Einzige Abhängigkeit auf dem Mac ist `pyserial`.
|
||||
Auf dem ESP32-C3 (siehe Abschnitt [ESP32-C3](#esp32-c3)):
|
||||
|
||||
```bash
|
||||
cp wifi_config_example.py wifi_config.py # WLAN-Zugangsdaten eintragen
|
||||
./deploy.sh # Dateien auf den ESP32 kopieren
|
||||
mpremote repl # dann: import run_esp32
|
||||
# run_esp32.main()
|
||||
```
|
||||
|
||||
Einzige Abhängigkeit auf dem Mac ist `pyserial`, fürs Übertragen zusätzlich
|
||||
`mpremote`. Auf dem ESP32 laufen die Module ohne jede Fremdbibliothek.
|
||||
|
||||
## Aufbau
|
||||
|
||||
| Datei | Zweck |
|
||||
|---|---|
|
||||
| `migra.py` | Protokoll: Telegrammrahmen, Prüfsumme, ESC-Sequenzen. Ohne Abhängigkeiten, **läuft unverändert unter MicroPython**. |
|
||||
| `transport.py` | UART: `pyserial` (Mac), `machine.UART` (ESP32-C3), `FakeTransport` (Trockenlauf). |
|
||||
| `display.py` | Treiber: Telegramm senden, Antwort auswerten. |
|
||||
| `coords.py` | Koordinaten einlesen und auf die Zeilenbreite formatieren. |
|
||||
| `config.py` | Port, Adresse, Geometrie, Helligkeit — alles an einer Stelle. |
|
||||
| `show_coords.py` | Das Testprogramm (Koordinaten von Hand). |
|
||||
| `brightness.py` | Helligkeitsregelung: LDR-Wert → Stufe/Prozent (portabel + CLI). |
|
||||
| `run_display.py` | Hauptschleife Phase 2: Montierung pollen, anzeigen, Helligkeit regeln. |
|
||||
| `mount_client.py` / `mount_mock.py` | TCP-Client zur GM4000 bzw. Simulator (LX200). |
|
||||
| `lx200.py` | LX200-Kommandorahmen. |
|
||||
| `probe.py` | Testmuster zum Ausmessen von Zeilenbreite und Zeilenposition. |
|
||||
| `test_migra.py` / `test_lx200.py` / `test_brightness.py` | Tests. |
|
||||
Alles, was auf beiden Plattformen läuft, ist bewusst abhängigkeitsfrei
|
||||
gehalten. Was sich unterscheidet, steckt in `transport.py` (UART) und in den
|
||||
beiden Startprogrammen.
|
||||
|
||||
| Datei | Zweck | ESP32 |
|
||||
|---|---|---|
|
||||
| `migra.py` | Protokoll: Telegrammrahmen, Prüfsumme, ESC-Sequenzen. | ✓ |
|
||||
| `transport.py` | UART: `pyserial` (Mac), `machine.UART` (ESP32-C3), `FakeTransport` (Trockenlauf). | ✓ |
|
||||
| `ticks.py` | Timeouts, die unter CPython und MicroPython gleich funktionieren. | ✓ |
|
||||
| `display.py` | Treiber: Telegramm senden, Antwort auswerten. | ✓ |
|
||||
| `coords.py` | Koordinaten einlesen und auf die Zeilenbreite formatieren. | ✓ |
|
||||
| `config.py` | Port/Pins, Adresse, Geometrie, Helligkeit, WLAN — alles an einer Stelle. | ✓ |
|
||||
| `displayloop.py` | Die Poll-Schleife: abfragen, formatieren, anzeigen, Fehler abfangen. | ✓ |
|
||||
| `brightness.py` | Helligkeitsregelung: LDR-Wert → Stufe/Prozent. | ✓ |
|
||||
| `mount_client.py` | TCP-Client zur GM4000 (LX200). | ✓ |
|
||||
| `lx200.py` | LX200-Kommandorahmen. | ✓ |
|
||||
| `wifi.py` | WLAN-Anbindung des ESP32 (verbinden, Verbindung halten). | ✓ |
|
||||
| `run_esp32.py` | Startprogramm auf dem ESP32: WLAN, Anzeige, Schleife. | ✓ |
|
||||
| `wifi_config.py` | WLAN-Zugangsdaten, **nicht im Git** (Vorlage `wifi_config_example.py`). | ✓ |
|
||||
| `run_display.py` | Startprogramm auf dem Mac: dieselbe Schleife mit Kommandozeile. | |
|
||||
| `show_coords.py` | Testprogramm (Koordinaten von Hand). | |
|
||||
| `mount_mock.py` | Simulator der Montierung (LX200) fürs Testen ohne Teleskop. | |
|
||||
| `probe.py` | Testmuster zum Ausmessen von Zeilenbreite und Zeilenposition. | |
|
||||
| `deploy.sh` | Kopiert die ESP32-Dateien per `mpremote` auf das Gerät. | |
|
||||
| `test_migra.py` / `test_lx200.py` / `test_brightness.py` / `test_display.py` / `test_esp32.py` | Tests. | |
|
||||
|
||||
## Protokoll (Kurzfassung)
|
||||
|
||||
@@ -91,14 +112,150 @@ Folgt auf eine ESC-Sequenz ein Online-Text, muss **`0x1F` als Trennzeichen**
|
||||
dazwischen. Data-Unit max. 230 Zeichen. `migra.DataUnit` setzt das Trennzeichen
|
||||
selbst.
|
||||
|
||||
## ESP32-C3
|
||||
|
||||
### Verdrahtung
|
||||
|
||||
Die Pins stammen aus dem Schaltplan (`Hardware/KiCad/Grossanzeige`) und stehen
|
||||
in `config.py`. Am XIAO ESP32-C3 ist UART1 frei zuordenbar; UART0 bleibt für die
|
||||
REPL-Konsole über USB reserviert.
|
||||
|
||||
| XIAO | GPIO | Netz | weiter zu |
|
||||
|---|---|---|---|
|
||||
| Pad 7 (D6) | 21 | TX | MAX3232 `T2IN` → `T2OUT` → J5.3 → Anzeige RxD (Sub-D Pin 2) |
|
||||
| Pad 8 (D7) | 20 | RX | MAX3232 `R2OUT` ← `R2IN` ← J5.2 ← Anzeige TxD (Sub-D Pin 3) |
|
||||
| Pad 1 (D0/A0) | 2 | LDR | Spannungsteiler J2, siehe unten |
|
||||
| Pad 12 | — | 3V3 | MAX3232 `VCC` |
|
||||
| Pad 13 | — | GND | gemeinsame Masse |
|
||||
|
||||
Die Anzeige will RS232-Pegel, der ESP32-C3 kann nur TTL — der MAX3232 dazwischen
|
||||
ist zwingend.
|
||||
|
||||
### Einrichten
|
||||
|
||||
MicroPython für den ESP32-C3 flashen (einmalig; Firmware von
|
||||
[micropython.org/download/ESP32_GENERIC_C3](https://micropython.org/download/ESP32_GENERIC_C3/)):
|
||||
|
||||
```bash
|
||||
pip install esptool mpremote
|
||||
esptool.py --chip esp32c3 --port /dev/cu.usbmodem1101 erase_flash
|
||||
esptool.py --chip esp32c3 --port /dev/cu.usbmodem1101 --baud 460800 \
|
||||
write_flash -z 0x0 ESP32_GENERIC_C3-*.bin
|
||||
```
|
||||
|
||||
Dann die Zugangsdaten anlegen und alles übertragen:
|
||||
|
||||
```bash
|
||||
cp wifi_config_example.py wifi_config.py # SSID und Passwort eintragen
|
||||
./deploy.sh # oder ./deploy.sh /dev/cu.usbmodem1101
|
||||
```
|
||||
|
||||
`wifi_config.py` steht in `.gitignore` — das WLAN-Passwort gehört nicht ins
|
||||
Repository.
|
||||
|
||||
### Starten
|
||||
|
||||
```bash
|
||||
mpremote repl
|
||||
>>> import run_esp32
|
||||
>>> run_esp32.main() # ohne Helligkeitsregelung
|
||||
>>> run_esp32.main(with_ldr=True) # mit LDR über den ADC
|
||||
```
|
||||
|
||||
Bewusst **kein** `main.py`: MicroPython startet eine Datei dieses Namens nach
|
||||
jedem Reset von selbst, und solange am Aufbau gearbeitet wird, ist der manuelle
|
||||
Start angenehmer. Für den Dauerbetrieb in der Sternwarte reicht später eine
|
||||
`main.py` mit den zwei Zeilen von oben.
|
||||
|
||||
### Was auf beiden Seiten gleich läuft
|
||||
|
||||
`displayloop.poll_loop` ist die gemeinsame Hauptschleife — Mac und ESP32 fahren
|
||||
denselben Ablauf, drumherum liegt nur die Kommandozeile (`run_display.py`) bzw.
|
||||
das WLAN-Setup (`run_esp32.py`). Fällt das WLAN aus, zeigt die Anzeige
|
||||
`NOWIFI_LINES`, fällt die Montierung aus, `NOLINK_LINES`; in beiden Fällen läuft
|
||||
die Schleife weiter und verbindet sich neu.
|
||||
|
||||
Stolpersteine, die beim Portieren aufgefallen sind und in den Tests
|
||||
festgehalten sind (`test_esp32.py`, `test_display.py`):
|
||||
|
||||
- **MicroPython hat kein `str.ljust`** (auch kein `rjust`/`center`/`zfill`).
|
||||
Das fiel erst am Gerät auf — auf dem Mac gibt es die Methode, alle Tests
|
||||
waren grün. `display._emit_line` füllt jetzt von Hand auf.
|
||||
`TestMicropythonVertraeglichkeit` sucht solche Aufrufe seitdem statisch.
|
||||
- **`time.ticks_ms()` läuft nach ~12 Tagen über.** Ein einfaches
|
||||
„jetzt + Timeout" ließe eine Warteschleife danach tagelang hängen. `ticks.py`
|
||||
rechnet deshalb über `ticks_diff`, das den Überlauf richtig behandelt.
|
||||
- **Der UART braucht denselben Puffer-Flush wie pyserial.** `UartTransport.write`
|
||||
leert den Empfangspuffer vor jedem Senden, sonst sieht `read_response` alte
|
||||
Störbytes statt der frischen Antwort.
|
||||
- **Feste Anzeigetexte müssen in `CHARS_PER_LINE` passen.** `NOLINK_LINES` hieß
|
||||
zuerst „MONTIERUNG" (10 Zeichen) und erschien als „MONTIERUN"; `_emit_line`
|
||||
schneidet stillschweigend ab. `test_display.py` prüft die Breite jetzt.
|
||||
|
||||
Was MicroPython 1.28 entgegen der Erwartung **doch** kann (am Gerät nachgeprüft):
|
||||
`%0*d` mit dynamischer Feldbreite, `%-11s`, `bytes.hex()`, `str.strip`/`lstrip`,
|
||||
`str.isdigit`.
|
||||
|
||||
Ohne Hardware lässt sich der ESP32-Teil trotzdem weitgehend prüfen:
|
||||
`test_esp32.py` hängt Attrappen für `machine` und `network` ein und fährt die
|
||||
ganze Kette gegen einen echten Mock — UART-Transport, WLAN, ADC-Auswertung,
|
||||
Zeitrechnung und die Poll-Schleife samt Ausfallverhalten.
|
||||
|
||||
### Gegen den Mock auf dem Mac testen
|
||||
|
||||
Solange die Montierung nicht erreichbar ist, spielt der Mock ihre Rolle. Er muss
|
||||
dafür auf allen Schnittstellen lauschen, sonst kommt der ESP32 nicht heran:
|
||||
|
||||
```bash
|
||||
python3 mount_mock.py --lan --move # gibt die IP aus, die einzutragen ist
|
||||
```
|
||||
|
||||
Auf dem ESP32 dann:
|
||||
|
||||
```python
|
||||
import run_esp32
|
||||
run_esp32.selftest(host="192.168.178.26") # Bring-up prüfen
|
||||
run_esp32.main(host="192.168.178.26", fake_display=True) # Dauerschleife
|
||||
```
|
||||
|
||||
`selftest` geht die drei Stufen einzeln durch — WLAN, Montierung, Telegrammbau —
|
||||
und sagt, an welcher es klemmt. `fake_display=True` schreibt die Telegramme nur
|
||||
als Hex in die REPL, es braucht also weder Pegelwandler noch Anzeige.
|
||||
|
||||
Wenn keine Verbindung zustande kommt, obwohl der Mock lauscht: macOS fragt beim
|
||||
ersten Mal, ob `python3` eingehende Verbindungen annehmen darf — das muss
|
||||
erlaubt sein.
|
||||
|
||||
### Am Gerät bestätigt (2026-07-26)
|
||||
|
||||
XIAO ESP32-C3 mit MicroPython 1.28.0 (`ESP32_GENERIC_C3`), gegen den Mock auf dem
|
||||
Mac:
|
||||
|
||||
- Alle zwölf Module importieren auf dem Gerät.
|
||||
- Telegrammbau und Koordinaten-Formatierung sind **byte-identisch** zum Mac,
|
||||
inklusive Gradzeichen über den Zeichensatzwechsel.
|
||||
- WLAN verbindet sich, `selftest` geht durch alle drei Stufen.
|
||||
- Die Poll-Schleife lief 20 s im Sekundentakt, 22 Abfragen ohne Aussetzer.
|
||||
- **Ausfall und Erholung:** Mock gestoppt → „KEIN LINK / TELESKOP" erscheint, die
|
||||
Schleife läuft weiter; Mock zurück → automatischer Reconnect, und der erste
|
||||
Wiedereinstieg löscht einmal das Vollbild, sodass kein Rest stehen bleibt.
|
||||
- UART1 öffnet auf GPIO21/20 mit 19200 8E1, sendet, und der Lese-Timeout greift
|
||||
sauber (kein Hänger) — allerdings noch **ohne Gegenstelle**.
|
||||
- ADC auf GPIO2 mit 11 dB Dämpfung liefert Werte.
|
||||
|
||||
## Offene Punkte
|
||||
|
||||
- **Echte Montierungs-IP:** In `config.py` steht `MOUNT_HOST` noch als Platzhalter.
|
||||
Sobald die GM4000 im Netz erreichbar ist, dort die IP eintragen (Port 3490 ist
|
||||
Vorgabe). Bis dahin läuft alles gegen den Mock (`run_display.py --mock`).
|
||||
- Portierung auf den XIAO ESP32-C3 (MicroPython): `migra.py`, `lx200.py`,
|
||||
`mount_client.py` sind bewusst abhängigkeitsfrei; nur `transport` (UART) und das
|
||||
WLAN-Setup kommen hinzu.
|
||||
- **RS232-Strecke zur Anzeige.** Als einziges Stück der Kette noch nicht am
|
||||
ESP32 erprobt: Der Aufbau mit MAX3232 und Anzeige fehlt. Alles davor ist
|
||||
bestätigt, die Telegramme stimmen byteweise — es geht nur noch um die Pegel.
|
||||
- **LDR-Schwellen nachmessen.** Die Grenzen in `brightness.py` stammen vom alten
|
||||
MSP430-Aufbau. Sobald der LDR am ESP32 hängt, die Rohwerte bei Tag und Nacht
|
||||
ablesen und `HELL_LOW`/`HELL_HIGH`/`HELL_MAX` anpassen. Bis dahin läuft die
|
||||
Anzeige mit fester Helligkeit (`run_esp32.main()` ohne `with_ldr`).
|
||||
- **Netzwerk zur echten Montierung.** Die GM4000 steht in `192.168.1.115`, das
|
||||
Heimnetz des ESP32 ist `192.168.178.x` — der Mac erreicht sie per VPN, der
|
||||
ESP32 so nicht. Muss geklärt werden, bevor es an die echte Montierung geht.
|
||||
- **Dauerbetrieb:** Autostart (`main.py`) und ein Watchdog fehlen noch bewusst.
|
||||
|
||||
## Gradzeichen
|
||||
|
||||
@@ -116,7 +273,28 @@ diese Zelle überschreibt.
|
||||
## Geometrie und Darstellung
|
||||
|
||||
- **9 Zeichen pro Zeile** in Sperrschrift (`CHARSET_SPACED = True`, am Gerät
|
||||
ausgemessen). `probe.py ruler` misst es nach.
|
||||
ausgemessen 2026-07-15).
|
||||
|
||||
Das widerspricht der naheliegenden Rechnung: Die Anzeige ist 64 px breit, und
|
||||
eine 5×7-Matrix mit 1 px Lücke wäre 6 px pro Zelle — das gäbe 10 Zeichen
|
||||
(60 px). Die Erklärung ist vermutlich, dass die Sperrschrift eben sperrt:
|
||||
bei 2 px Lücke sind es 7 px pro Zelle und damit 9 Zeichen (63 von 64 px).
|
||||
Dazu passt auch die Beobachtung, dass die *proportionale* Schrift `ESC Z`
|
||||
rund 11 Zeichen schafft (≈ 5,8 px/Zelle).
|
||||
|
||||
**Nachgeprüft ist das nicht.** `probe.py pitch` entscheidet es direkt, statt
|
||||
am Umbruch abzuzählen: Es schreibt zehn Ziffern einmal mit dem Auto-Vorschub
|
||||
der Anzeige und einmal auf feste Pixelpositionen `x = i·cell`. Ein Unterschied
|
||||
von 1 px summiert sich über zehn Zeichen auf 9 px und ist unübersehbar.
|
||||
|
||||
```bash
|
||||
python3 probe.py pitch 6 # stehen beide Zeilen untereinander -> 10 Zeichen
|
||||
python3 probe.py pitch 7 # ... -> 9 Zeichen
|
||||
```
|
||||
|
||||
Sollten es doch 6 px sein, passt die Deklination mit abschließendem `"` in
|
||||
voller Form (`+38°47'01"`, 10 Zeichen) — `coords.format_dec` wählt sie dann
|
||||
von selbst, es genügt `CHARS_PER_LINE = 10`.
|
||||
- Die Deklination wird deshalb als **9-Zeichen-Form ohne abschließendes `"`**
|
||||
ausgegeben (`+38°47'01`) — Gradzeichen und Bogenminuten bleiben, die Bogensekunden
|
||||
stehen als Ziffern da. `coords.format_dec` wählt automatisch die breiteste Form,
|
||||
@@ -168,9 +346,19 @@ stammen aus dem alten Code**; die obere Grenze `HELL_MAX = 3500` für 100 % ist
|
||||
reale LDR-Wertebereich feststeht. Ein Helligkeitstelegramm wird nur bei
|
||||
**Stufenwechsel** gesendet (`ESC H 2 <ppp>`), wie im Original.
|
||||
|
||||
Der LDR-Wert kommt derzeit per Kommandozeile (`--ldr`); auf dem ESP32-C3 liefert
|
||||
ihn später der ADC. `run_display.py --ldr <wert>` bindet die Regelung in die
|
||||
Hauptschleife ein (`BrightnessController`).
|
||||
Auf dem Mac kommt der LDR-Wert per Kommandozeile (`run_display.py --ldr <wert>`),
|
||||
auf dem ESP32-C3 vom ADC an GPIO2 (`run_esp32.main(with_ldr=True)`).
|
||||
|
||||
**Die Kennlinie ist auf der Platine umgekehrt.** Der Teiler lautet
|
||||
`3V3 —[R2 2k]— A0 —[LDR]— GND`; der LDR wird bei mehr Licht niederohmiger, die
|
||||
Spannung an A0 sinkt also mit steigender Helligkeit — genau andersherum als beim
|
||||
alten MSP430-Aufbau, auf den die Schwellen oben zugeschnitten sind. Der Rohwert
|
||||
wird deshalb gespiegelt: `config.LDR_INVERTED = True`, angewendet in
|
||||
`brightness.raw_to_ldr`. Wer die Hardware lieber umbaut (LDR nach 3V3, R2 nach
|
||||
GND), setzt das Flag auf `False`.
|
||||
|
||||
Die Schwellen selbst sind noch die alten und **müssen am realen Aufbau
|
||||
nachgemessen werden**, siehe Offene Punkte.
|
||||
|
||||
## Antwortleitung (RX)
|
||||
|
||||
@@ -196,6 +384,8 @@ gegeneinander (verschliffener ~3-V-Pegel am Oszi). `loopback.py` grenzt so etwas
|
||||
inkl. echtem Gradzeichen; im `run_display`-Betrieb aktualisieren beide Zeilen
|
||||
laufend, sauber und ohne Flimmern, mit Antwort-Handshake der Anzeige. Protokoll,
|
||||
19200 8E1, Zeichensatz und Zeilengeometrie stimmen.
|
||||
- Schrift: Sperrschrift (`ESC z`, `CHARSET_SPACED = True`), 10 Zeichen/Zeile.
|
||||
- Schrift: Sperrschrift (`ESC z`, `CHARSET_SPACED = True`), 9 Zeichen/Zeile.
|
||||
(Hier stand ursprünglich „10 Zeichen/Zeile" — das war die Annahme vor der
|
||||
Messung vom 15.07., siehe *Geometrie und Darstellung*.)
|
||||
Die schmale `1` wirkt dadurch etwas luftig — Font-Eigenschaft, nur per eigenem
|
||||
Font (microSYST-PC-Software) änderbar.
|
||||
|
||||
Reference in New Issue
Block a user