Ofensteuerung

Von einer „alten“ Ofensteuerung (zum Sintern von Keramik) hin zu einer „neuen großen“ und einer „kleinen“ Steuerung. Alle Steuerungen regeln die Temperatur, fahren eine vorgegebene Temperaturkurve ab rund steuern digitale Ausgänge für Gase und Pumpen.

Wie so üblich wurde zunächst aus dem Matschklumpen eine strukturierte Software geschaffen, dann wurde die Hardware strukturiert — und weil das doch recht schwierig ist — eine Miniausgabe davon erstellt.

„Alte“ Ofensteuerung

Ofentemperaturregelung mit Rezeptsteuerung (über Stunden) und Steuerung von 8 digitalen Ausgängen (Relais).

Features der LabVIEW-Software

Screenshot der derzeitigen LabVIEW-Software

Features des Ofens

Probleme

Neukonstruktion Rauchmelder mit USB

Um „immer mal“ einen Rauchmelder für die Platzierung in Ofennähe parat zu haben, ist es zweckmäßig, diesen mit einem jedermann bekannten USB-Stecker zu versehen und mit HID+WebUSB auszurüsten. Die Geizhalsversion verwendet nicht Arduino, sondern PIC16F1455.

Schaltplan

Die Bereitstellung der Betriebsspannung für den Rauchmelder geschieht über eine Spannungsverdopplerschaltung, dessen Rechteckgenerator ein Ausgang des Mikrocontrollers ist. Das bidirektionale Pin 7 des Melders dient zur Abgabe akustischer Warnungen bei Übertemperatur und Gas, d.h. auch ohne Rauch. Über USB und eine Webseite können die Messwerte abgelesen und Alarm-Grenzwerte eingestellt werden. An Stelle der LED kann auch ein Relais sitzen, welches den Rauchmelder zusätzlich zum Frostwächter macht. In dieser Schaltung dient die LED nur als Hilfe zum Erstellen der Firmware.

R6 ist unbedingt erforderlich, damit der Urlader überhaupt einen Power-On-Reset erkennt (und zur Anwendungsfirmware springt). Verwendet wurde der Urlader bootCDC-lvp.hex. Für den Spannungsverdoppler ist C3 unbedingt ein keramischer Kondensator; für die 47 kHz müssen es 470 nF sein. Bei höherer Taktfrequenz geht auch weniger. Hingegen C4 muss ein ziemlich großer Elko sein, weil der Rauchmelder beim Unterspannungs-Test ziemlich reichlich Strom zieht und dann (bei Spannungseinbruch) der Piepser nervtötend alle 1 min piepsen würde. Bei einigen Rauchmeldern ist D1 und C4 bereits enthalten. Solange der Urlader „läuft“ und der Spannungsverdoppler nicht arbeitet, piept der Rauchmelder alle 1 min.

Erste Schritte

Einschalten der LED — ohne Firmware

„Große“ Steuerbox

Neukonstruktion einer Steuerbox mit folgenden Eigenschaften und Stückliste:
Anschlüsse
KanäleTypBeschreibungVerwendung
Peripherie
4DO;AOTriac-Ausgänge 400 V~ 12 A mit Strommessung (Kurvenformmessung mit 2 kSa/s/Kanal)Heizwendel
16DO;AODigitalausgänge 24 V, Spannung reduzierbar per Software-PWM, Grundfrequenz 100 HzMagnetventile
4AOAnalogausgänge 0..5 V (per Bestückungsoption änderbarer Ausgangsspannungsbereich) via Hardware-PWM und Tiefpassfilter-
16DIDigitaleingänge TTL, mit Eingangswiderständen vor Spikes geschützt, Pullups für Schalter nach MasseStarttaste, Gashahnkontakte
4AIAnalogeingänge 0..5 V; liefern jeweils 5 V (Spannungsteiler vorsehen?? Gesonderte Jumper?)Gassensor MiCS5524
4AIAnalogeingänge für ThermoelementeThermoelemente
4AIAnalogeingänge für Messbrücken; liefern jeweils 5 V (Zur Not auch für Pt100, Pt1000)Drucksensor
1DIORauchmelder-Anschluss (mehrere Rauchmelder können parallel geschaltet werden); liefert 9 VNebelkammer-Rauchmelder
1BUSI²C-Anschluss: Hardware-I²C; liefert 5 VPyrosensor MLX90614KSF
1BUSOneWire-Anschluss, universell verwendbar: Software-OneWire; liefert 5 VTemperatursensoren
1BUSRS485-Anschluss; liefert 5 V-
Versorgung
1BUSUSB (Das Gerät ist self-powered, USB nur Datenschnittstelle)Steuer-PC
1PWR24-V-Eingang (Gleichspannung! Netzteil je nach Verbrauchern dimensionieren! Dürfen auch 12 V sein.)Netzteil
1PWR400-V-Eingang (Wechselspannung! Sicherung 12 A oder je nach Verbraucher extern vorsehen! Dürfen auch 230 V sein.)Stromnetz

Schaltplan.

Stückliste
AnzahlBauteilBestellbezeichnungLieferantPreisBemerkungenGehäuseformEinsatz
16IRLML6344IRLML6344Reichelt0,14 €n-Kanal-MOSFET 30 V 5 A 1,3 W 0,8 V SOT-23 (winzig!!)digitale Ausgänge
16AO6402AAO6402AReichelt0,18 €n-Kanal-MOSFET 30 V 7,5 A 1,3 W 0,8 V SOT-23-6 (DDGSDD)
16AOD4148AReichelt0,28 €n-Kanal-MOSFET 40 V 50 ADPAK
16B360FB360FReichelt0,09 € SonderangebotSchottky-Diode 60 V 3 ASMC
16B340FB340FReichelt0,20 € AlternativeSchottky-Diode 40 V 3 ASMC
4?Reichelt?VaristorTriac-Ausgänge
4?Reichelt?X1-Kondensator 47 nF 375 V
4?Mouser?Optotriac 800 V 0,1 A beliebige PhaseDIP6
4?Reichelt?Snubberless-Triac 800 V 12 ATO220ISO
1LM2575LM 2575 T5,0Reichelt1,25 €Tiefsetzsteller 5 V 1 ATO220V55-V-Versorgung
1MC34063MC 34063 ADRReichelt0,32 €Schaltregler 1,5 ASO8
1ATmega32U4556-ATMEGA32U4-AUMouser?AVR-Mikrocontroller mit USBTQFP44

Von einem Arduino wurde Abstand genommen, da unvorteilhaft: Frisst Platz, muss für Self-Power-Betrieb frisiert werden, teuer. Stattdessen wurde ein ATmega32U4-Chip vorgesehen. Es wurden Bestückungsvarianten freigehalten für:

Bestückungsvarianten
PositionFunktionBauteilAnmerkungverwendet
15-V-Versorgung LM2574 (DIP8)1 A
LM2576 (DPAK, teuer!)3 A (Drossel passt nicht)
2LEM-Modul ?3 Pins
LTS25NP4 Pins
?3 Pins, versetzt
3Triac BTA8-800CW8 A
BTA12-800CW12 A
4MOSFETs AO6402A (SOT23, 0,14 €)5 A
AO6402A (SOT23-6, 0,18 €)7,5 A
AOD4148A (DPAK, 0,28 €)50 A
5Thermoelement-Wandler MAX66755 V
MAX318553,3 V
6Pt100-WandlerMAX318653,3 Vvergessen
Geräteansicht

Ofensteuerungs-Äpp (Silberbox).

231006: Die Äpp und die Firmware wurde auf 32-Bit-Zeistempel mit Millisekunden-Auflösung aufgebohrt. Ziel ist eine Betriebsdauer > 18 h. Sie liegt nun bei 49 Tagen. Die Änderungen sind erheblich, unter anderem weil das Eingabe-Element <input type="time"> nicht für über 24 h funktioniert. (Es ist nur für Uhrzeiten gemacht.)

231010: Die beiden DIL-Schalter der Steuerbox, die schon lange als 2 Tasten verlängert herausgeführt wurden, sind nun in eine extra Box gewandert. Zur Erinnerung, die beiden Knöpfe haben folgende Funktion:

Damit erwiesen sich die DIL-Schalter als weitere Fehlkonstruktion der Silberbox, 2 Taster + 1 Anschluss zum Verlängern sind einfach besser. Neben dem vergessenen ISP-Anschluss und der Huddelei mit dem Thermoelement-Wandler.

Überlegungen zur A/D-Wandlung

Zeitplan des A/D-Wandlers mit Taktung f = 16 MHz / 128 = 125 kHz; T = 13 / 125 kHz = 104 µs
RundeStrommessungExtra
0i0
ADC4
i1
ADC5
i2
ADC6
i3
ADC7
j0 = ADC1-ADC0
1j1 = ADC1-ADC0
2j2 = ADC1-ADC0
3j3 = ADC1-ADC0
4Langsames siehe unten
0..5 V, 25 mV/A, Nullabgleich in Software?

Der Vorteiler 128 ergibt sich aus der Forderung, den A/D-Wandler mit 50..200 kHz zu takten. Der Teiler 13 ergibt sich bei kontinuierlicher A/D-Umsetzung. Somit liegt die Summenabtastrate bei etwa 10 kHz. Die Messstellen mit der höchsten effektiven Abtastrate sind die LEM-Stromwandler, um die Kurvenform des Stroms beim Phasenanschnitt zu erfassen. Schnelle A/D-Wandlung wird auch benötigt für Beschleunigungs- und Kraftmesszellen, die am INA126 angeschlossen sind. Temperaturmessungen sowie Gasdruck sind hingegen nur langsam erforderlich. Dabei läuft die Temperaturmessung für Thermoelemente am A/D-Wandler des ATmega32U4 vorbei und wird parallel dazu im MAX31855 abgewickelt.

Zeitplan der langsamen A/D-Umsetzungen
RundeMessungUnteraufteilung mit IC18
0OneWire = ADC8-
1Zusatz = ADC924-V-Versorgung (12,2:2,2 ≈ 5,55)DI1DI2DI3
2Gas = ADC10X25X26X27X28
3Rauchmelder = ADC11 (2:1)-
4Chiptemperatur-

Wie man sieht ergeben sich Fünfergruppen mit folgenden Abtastzeiten und -frequenzen:

Abtastzeiten und -frequenzen
GruppeAbtastzeitAbtastratePuffergröße
4× LEM-Strommessung104 µs × 5 = 0,52 ms≈ 1,9 kHz100
4× INA126104 µs × 25 = 2,6 ms≈ 385 Hz20
5× langsames104 µs × 125 = 13 ms≈ 77 Hz4

Ergibt eine Gesamtpuffergröße von 4×100 + 4×20 + 5×4 = 500 Samples = 1000 Bytes, bei Doppelpufferung 2000 Bytes, was die RAM-Kapazität des Mikrocontrollers schon „ganz gut ausfüllt“. Dabei diktiert der A/D-Wandler die Abholrate von 52 ms entsprechend ≈ 19 Hz und damit die Aktualisierungsrate der Weboberfläche.

Die Nettodatenrate allein für die A/D-Daten entspricht genau der Summenabtastrate von ≈ 10 kSa/s, somit ≈ 20 kByte/s. Für USB kein Problem.

Nutzung der 6 freien Bits

Um den RAM-Verbrauch zu senken kann man den Datenstrom des 10-Bit-A/D-Wandlers auch ohne Arrayzuordnung zum PC leiten. Damit das Javascript-Programm die Werte auseinanderklamüsern kann, werden die 5 MSB zur späteren Zuordnung genutzt:

Adresszuordnung, y = Nulldurchgangssignal
WertBedeutungPeriodendauer in ms
000xxTemperatur13
0y100Strommessung i00,52
0y101Strommessung i1
0y110Strommessung i2
0y111Strommessung i3
01000INA126 j02,6
01001INA126 j1
01010INA126 j2
01011INA126 j3
100xxOneWire13
1010024-V-Versorgung52
10101DI1
10110DI2
10111DI3
11000Gas X2552
11001Gas X26
11010Gas X27
11011Gas X28
111xxRauchmelder13

Das letzte freie Bit wird für das Vorzeichen (bei INA126) benötigt. Eine Entscheidung wird noch gefällt.

Einbau

3 Jahre nach Entwicklung und Bestückung erfolgte nun endlich die Inbetriebnahme am realen Ofen. Die Umgebungsschaltung, bei der diese Ofensteuerung eingebettet ist, sieht so aus:

Fotos

Dabei ergaben sich folgende Probleme:

Um den Berührschutz bei geöffnetem Ofendeckel zu gewährleisten wäre der Einsatz eines Deckelkontaktes sinnvoll, der das Schütz betätigt. Um dafür Kleinspannung verwenden zu können, Ersatz des Schützes durch eins mit 12 V= Spulenspannung. Es wurden entsprechende Beschriftungen zur Handlungsanweisung angebracht.

Es ist noch angedacht, das HID-Interface unter LabVIEW anzusprechen, um die gewohnte Benutzeroberfläche weiter nutzen zu können. Das bisherige LabVIEW-Programm, die Relaiskarte, ein USB-Hub, ein USB-Seriell-Wandler, eine NI-USB-Messkarte, ein NI-USB-Termoelement-Konverter und eine Menge Starkstrom-Installationsmaterial wurden obsolet: Hinter der Steuertafel sieht es nun richtig aufgeräumt aus!

Mini-Ofensteuerung

Gewissermaßen als Starthilfe für die „große“ Ofensteuerung soll „mal eben schnell“ eine universelle Heizprozess-Steuerung ohne Gassteuerung implementiert werden. Es genügt 1 Thermoelement und 1 Heizungsrelais. Letzteres war bereits in einer Steuerkiste mitsamt 24-V-Netzteil vorhanden. Hinzugefügt wurde ein Arduino Pro Micro von ebay, ein (gefundener) Schaltregler für 5 V (ein MC34063 hätte es für die wenigen mA auch getan) und ein Thermoelement-Modul mit MAX6675. Für das 24-V-Relais und 6 digitale 24-V-Ausgänge der Renner ULN2003.

Fotos

Gesteuert wird der beliebige Ofen per Schwingungspaketsteuerung (allerdings mit mechanischem statt Festkörperrelais) mit 1..4 s Periodendauer, um die Kontakte zu schonen. Zum Festlegen der Regelungsparameter und der gewünschten Temperaturkurve sowie Prozessdauer wird ein PC mit Windows-Programm via USB angeschlossen. Start/Stopp sowie der Heizvorgang an sich läuft unabhängig mit oder ohne PC. Da kein Raspberry verbaut wurde, ist das Ganze sehr zuverlässig auch bei Stromausfällen.

Die gesamte USB-Kommunikation basiert auf der HID-Geräteklasse. So wird kein Treiber benötigt. Die Firmware arbeitet ausschließlich mit Integerzahlen und kommt ohne Flash fressende printf()/scanf() aus. Nein, die Firmware baut nicht aufs Arduino-Framework auf! Sondern macht alles selber.

Der letzte Schrei ist nun die Erweiterung der Firmware um ein WebUSB-Interface und eine Äpp, die im Browser läuft. Geeignete Browser sind derzeit Google Chrome und Microsoft Edge.

Ofensteuerungs-Äpp (Plastebox)

Ausfall Keine USB-Konnektivität. Ursache: USB-Micro-Buchse nochmals von Platine abgerissen, wohl heftig am Kabel gezogen. Reparatur: Diesmal USB-Kabel direkt an den 22-Ohm-Widerständen, am Masseanschluss und an der Sicherung angelötet sowie mit Zugentlastung versehen. Sollte halten, macht jedoch den Pro Micro schwerer austauschbar.

Dateiliste

Dateiliste
DateiBeschreibung
prozess.zipFirmware (fertig, mit WebUSB) und Win32-Software (unfertig)
Eagle.zip„Große“ Ofensteuerung: Schaltplan + Layout
SE.zip„Große“ Ofensteuerung: CAD-Daten Gehäuse-Blechteile, Gesamtansicht
Ofen.zipBackup LabVIEW-Programm für „alte“ Steuerung (Steuerung wurde in Bestandteile zerlegt)
Arduino.zipBackup Arduino-Software (ungenutzt, Teil der alten, zerlegten Steuerung)
Masterarbeit Geidel.pdfEin mittlerweile überholtes Pamphlet
grafik.llbLabVIEW-Beispiel zum nicht-überlappenden Platzieren von Text (für Anmerkungen) in einem XY-Graf, LabVIEW 8.5
grafik.pngScreenshot des Demo-Programms
Serial-Win32.viLabVIEW-Programm

Computer-Algebra

Geometrie-Routinen zur Plotdarstellung sowie zum Maus-Treffertest. Da Drag-und-Drop im Plot nur bei weniger als 100 sichtbaren Punkten funktionieren sollte, sollten nur Grafen (Punktlisten) untersucht werden, die bei aktuellem Zoom auf eine derart reduzierte Punktzahl kommen.

Maus in Punktnähe

Trivial: r = |mousepos - pointpos| = √(mouse.x-point.x)² + (mouse.y-point.y)², in Javascript Math.hypot(mouse.x-point.x,mouse.y-point.y)

Maus in Streckennähe

Nicht so trivial: Sei A = Streckenanfang, B = Streckenende, C = Mausposition:
B -= A, C -= A, r = |B|, also B.x-=A.x; B.y-=A.y; C.x-=A.x; C.y-=A.y; let r=Math.hypot(B.x,B.y);
Distanz zur (unendlichen) Geraden: (B.x*C.y - B.y*C.x)/r
Längsanteil zur Strecke, 0 = Anfang, 1 = Ende, <0 = davor, >1 = dahinter: (B.x*C.x + B.y*C.y)/(r*r)

Temperatur-Logger

Preiswerte Temperaturaufnehmer, die das MCPS (??) und die teure und schwerfällige Yokogawa-Kiste ersetzen. Für USB, treiberlos, etwa 8-kanalig, je 2 Exemplare.

Da sich

in ihrer Anschlusstechnik und Auswertung deutlich unterscheiden, ist es am besten, für jede dieser Gruppen einen eigenständigen Konverter zu bauen. So macht es die Industrie schließlich auch; Universalkonverter wie QuantumX sind sündhaft teuer und mit FireWire oder Ethernet umständlich zu handhaben.

Für Thermoelemente

Steckbrief: 2 Exemplare 8-Kanal-Temperaturlogger für Thermoelemente Typ K, Abtastrate 1 Sa/s/Kanal, Logdauer mehrere Tage; PC-Unterstützung. Daher genügt ein USB-Interface, das Messdaten direkt (ohne zu puffern) zum PC durchreicht. Irgendein Programm (WebUSB = JavaScript, LabVIEW, C++, Python, Matlab …) nimmt die Daten entgegen und speichert als .csv oder (vielleicht besser) Matlab-Matrix (.mat).

Angedachte Realisierung: MAX31855 mit 4051-Analogsignalschalter und irgendein 3,3-V-USB-Mikrocontroller. Dabei genügt ein ATtiny44 mit V-USB und 3,3-V-LDO, typischerweise LP2950-33.

Schaltplan und Layout

Tatsächliche Realisierung: Wenn Datenlogger in Matlab, dann muss es eine serielle Schnittstelle sein (gähn 🥱). Also Full-Speed, kein V-USB. Also PIC16F1454. Das Loggen (ohne Zeitstempel) ginge dann mit einer simplen Kommandozeile: copy com8 Dateiname.csv, Linux 🐈 /dev/ttyS0 > Dateiname.csv oder so ähnlich. Eine Verwandt­schaft besteht mit dem Frequenzmesser zur Durchflussmessung. Der Mikro­controller generiert an einem freien Ausgang eine Wechsel­spannung zur Bereit­stellung einer negativen Hilfs­spannung für den Analog­multiplexer. Mal sehen ob dieser dadurch besser funktioniert. Die LED D1 ist vor allem zum Debuggen, da das Pin 8 = RC2 nicht frei verfügbar ist sondern vom SPI als serieller Datenausgang in Beschlag ist.

Hier kommt das (bereits herumliegende) Hammond-Flanschgehäuse 1590AFL (93×39 mm) zum Einsatz, welches um 9 mm heruntergefräst wird: Gesamthöhe nun 22 mm. Die UNC-Gewinde müssen dazu etwas nachgeschnitten werden, damit die Schrauben noch passen.

Der seltsame Spannungsregler IC4 = LDCL015-33 wurde in einer alten Messe­muster­verpackung gefunden und „musste mal weg“. Er ist pinkompatibel zum bekannteren MIC5219.

Pufferung: Da der eingebaute USB-Seriell-Konverter „weiß“, wann Daten abgeholt werden und wann nicht, kann der Mikrocontroller die bis dahin noch nicht abgeholten Daten in einen (Flash-)Ringpuffer ablegen und „en bloc“ liefern (= sich auskotzen). Das vermeidet Lücken im Protokoll durch Windows-Reboots. Weiterhin kann durch ein (wie auch immer geartetes) Abfrage­kommando zwischen ASCII- und Binär­ausgabe umgeschaltet werden — sowie die gesamte Historie abgefragt werden. Zudem erscheint das Einstellen der Summen­abtast­rate sinnvoll.

8-Thermoelemente-Äpp

Stolpersteine

Dasselbe für Pt100

So einfach ist das nicht! Weil man bei Thermowiderständen besser mit einem Vierdrahtanschluss arbeitet sind diese Sensoren deutlich umständlicher zu handhaben. Pt100 ist ohnehin old-school, wenn möglich sollte man zu Pt1000 (1 kΩ bei 20 °C) umschwenken, weniger Eigenerwärmung, geringerer Stromverbrauch. Diese gibt es in klitzekleinen SMD-Gehäusen, aber man darf sie nicht (wie Dehnmessstreifen) starr aufkleben, da sie sonst einen parasitären Dehnmessstreifen-Effekt zeigen.

Schaltplan, Layout, Foto

Dafür gibt es den maßgeschneiderten Chip MAX31865. Diesen gibt es entweder einzeln im QFN20-Gehäuse mit (IMHO) 0,65 mm Pitch oder als Arduino-Baustein mitsamt Pegelwandler und Spannungsregler. Auch wenn die Lochraster-Verdrahtung irre aufwändig ist, bleibe ich auch diesmal dem Lochraster treu und verwende das Arduino-Teil von Ebay. Diesmal müssen vier Analogmultiplexer 74HC4051 vorgeschaltet werden. Das praktische Konzept mit dem superbilligen Mikrocontroller PIC16F1454 (mit Urlader vorprogrammiert) wird beibehalten.

Hier kommt das Hammond-Flanschgehäuse 1590BFL (112×60 mm) zum Einsatz, welches um 9 mm heruntergefräst wird: Gesamthöhe nun 22 mm. Die UNC-Gewinde müssen dazu etwas nachgeschnitten werden, damit die Schrauben noch passen.

Einfacher für DS18B20

Für einen Temperaturbereich von -55 .. +125 °C tun's auch die viel leichter anwendbaren DS18B20 (parallelschaltbare Temperatursensoren mit A/D-Wandler und OneWire-Interface im TO92-Gehäuse), wenn das Gehäuse klein genug ist. Das ist hier der Fall. Das praktische Konzept mit dem superbilligen Mikrocontroller PIC16F1454 (mit Urlader vorprogrammiert) wird beibehalten.

Schaltplan, Layout, Foto

An den beiden Schraubklemmsteckern können zwei Gruppen von DS18B20 angeschlossen werden, oder mit einer Firmware-Modifikation kann an einem von beiden ein Schaltsignal, bspw. bei Übertemperatur, ausgegeben werden.

Hier kommt das (bereits herumliegende) Hammond-Flanschgehäuse 1590LBFL (51×51 mm) zum Einsatz, welches um 9 mm heruntergefräst wird: Gesamthöhe nun 22 mm. Die UNC-Gewinde müssen dazu etwas nachgeschnitten werden, damit die Schrauben noch passen. Der quadratische Gehäusedeckel kann mitsamt Schaltung um 90° zu den Flanschen gedreht werden, wenn das zum Einbau besser passt.

Eine eventuelle Verpolung der Temperatursensoren wird dadurch erkannt, dass bei Busruhe ein Kurzschluss nach Masse besteht. Dieser wird als solcher erkannt, bevor das betreffende Portpin zum Ausgang umgeschaltet wird. Damit bleibt der Strom vom 4,7-kΩ-Pullup mit 1 mA so klein, dass nichts kaputt geht.

Es ist durchaus eine gute Idee, von den DS18B20 nicht allzu viele parallel zu schalten, da diese nur bei Busruhe (sicher) die Temperatur messen und dafür bei maximaler Auflösung eine knappe Sekunde (!) benötigen.

Wenn man sich umsieht, werden üblicherweise Sensoren mit DS18B20 mit drei Anschlüssen angeboten und (anscheinend) angeschlossen. Dabei verliert man den Verpolungsschutz und gewinnt:

Das habe ich nicht gesehen, da die Sensoren hier selbst angefertigt und Schaltkreise im TO92-Gehäuse verarbeitet werden; Einfachheit der Verdrahtung stand und steht im Vordergrund.

Kamera

Was macht man mit einer ESP32-CAM? Abgesehen von der Verwendung der unveränderten Anwendungssoftware, der WLAN-Kamera (für die Anwendung im Heimnetz) möglicherweise mit „Knipsfunktion“ auf die Mikro-SD-Karte fallen mir immerhin zwei Anwendungsfälle ein, die einen erheblichen Eingriff in die Firmware erfordern:

Ressourcen über hardwarenahe Programmierung sind dünn gesät. ESP32 Bare Metal vielleicht, der Installationsaufwand ist trotzdem riesig. Leider hat sich Espressif auf CMake und Python als zwanghafte Teile der Entwicklungsumgebung festgenagelt, was mich als Makefile-Auskenner elend ausbremst. Für mich ist ESP32 erst dann „Bare Metal“ wenn nur noch gcc und make und ein Flashprogramm (als Echse) nötig sind.

eduroam-Webcam

Entfällt! Genau dafür gibt es das WLAN tuc-special, bei der man den Zugang bei bekannter Ethernet-ID beim URZ beantragt. Damit verhält sich das Universitäts-WLAN etwa so wie ein heimisches.

Trotzdem wäre es hilfreich, den Datenstrom auf WebSocket auszugeben und die feilgebotene Webseite aufzuhübschen. Es wäre nicht schlecht, wenn eine Client-Webseite mehrere derartige Webcams beobachten kann.

Der Videostream erscheint als MJPEG auf http://host:81/stream. Sobald man diesen angestoßen hat. Leider ist das Bild (warum auch immer) kleiner als die ausgewählte Kameraauflösung, sodass die Kamera nicht so recht bewertet werden kann. Auch handelt es sich mit MJPEG nicht um ein modernes Videostream-Format, welches man in den HTML5-<video>-Tag packen kann. Aber es ist bereits eine erhebliche Softwareleistung des ESP32-CAM, jedes Bild als JPEG zu komprimieren.

WebSockets sind also unnötig. Eine Konfiguration der Bildgröße, etwa mittels http://host/?width=1600&height=1200&whitebalance=auto, wäre sinnvoll. Auch unterstützt die Firmware nicht den Output zu mehreren Clients. Wäre das ein Fall für Multicast?

Nach einiger Fummelei entstand dieses Kamera-Projekt im Arduino 2.0.1. Dieses generiert keine Webseite sondern nur den Kamera-Stream als MJPEG. Wiederum nur für 1 Client. Es wird kein PSRAM erkannt. Da ist ein 8-beiniger APS6404L-3SQR (8 MByte via SPI/QSPI) drauf. Die Adresse des WLAN-Routers wird beim Hochlauf oder bei Verbindungsproblem via serielle Schnittstelle erfragt, wobei ein (für Arduino viel zu schicker und unnützer) Zeileneditor zum Einsatz kommt. Idealerweise lässt man auf der seriellen Schnittstelle ein PuTTY laufen. Wie gewünscht werden die WLAN-Zugangsdaten abgespeichert.

Die Kamera ist einsetzbar, läuft aber noch ohne Konfigurationsmöglichkeit (Auflösung + Framerate) und - noch schlimmer - mit angezogener Handbremse (kein PSRAM) und auf halber Kraft (ohne zweite CPU). Für den Zugriff auf tuc-special muss man sich im gleichen Subnetz befinden.

Ich habe etwas durcheinandergeworfen: Einerseits gibt es die (zuerst getestete) Kamera-Äpp, die so elend plump zu bedienen ist, und dann gibt es den reinen VideoBilder-Stream-Generator. Beide Äpps liefern mangels (erkanntem) PSRAM ein zu kleines Bild. Obendrein werde ich von dem Umstand ausgebremst, dass der Firmware-Download mit dem heimischen Dell-Notebook mittendrin versagt. Wacklige Versorgungsspannung? Auf Arbeit funktioniert das mit den dortigen Barebones einwandfrei.

Heute zum Nikolaustag 2022 geht endlich der PSRAM: Nachdem ich das ganze Arduino-Geraffel nochmal unter Windows installiert habe (weil das Linux neuerdings dazu tendiert, immer häufiger abzustürzen und kaum eine Stunde(!) durchhält), gab es weitere Tools-Menüpunkte, u.a. die das Debug-Level und die Flash-Aufteilung betreffen. Ob es daran liegt oder nicht, ich konnte die (meine) Quelle damit übersetzen, flashen, und voilà, es meldet PSRAM vorhanden (juhu) und volle Bildgröße! Angezogene Handbremse gelöst, jetzt noch den zweiten Topf aktivieren und (v.a. für die Bilderkennung) nutzen. Kamera-Konfiguration fehlt auch noch.

Daraufhin habe ich mich mal in das Thema Multicast eingelesen. Einerseits muss die URZ-Infrastruktur (hier: tuc-special) Multicast zulassen. IPv4 oder IPv6 erscheint egal, IPv4 erscheint einfacher. Wie man's für IPv4 in C programmiert steht da auf deutsch beschrieben. Es ist aber zu befürchten, dass man dazu einiges in den Espressif-Sourcen anpassen/einbauen muss, damit das klappt. Interessant ist auch, wie Multicast im Ethernet funktioniert. Leider sieht es auf der Browserseite mau aus, weil per JavaScript kein UDP empfangen werden kann. Schade. Der gängige Umweg dafür ist ein Python-Hilfsprogramm, das die UDP-Pakete in WebSocket eines lokalen Webservers umpackt; das kann dann per JavaScript weiterverarbeitet werden. In jedem Fall muss das Konzept mit dem HTTP-Header aufgegeben werden, da sich Clients (hier: Videobetrachter) jederzeit einhängen können dürfen und eine Modifikation der Bildgröße und Bildrate alle Teilnehmer betrifft (logisch!).

ArUco-Finder

Bisher kommt dafür ein Raspberry Pi mit Weitwinkel-Kamera zum Einsatz. Aber mit dem Raspberry auf einem Fahrzeug fangen die Probleme an:

Hinzu kommt, dass der Raspberry dazu verleitet, vorhandene Software zur Bildverarbeitung unverändert zu nutzen — und dann reinzufallen, etwa mit Genauigkeits- und Latenzproblemen. Besser ist es stets, jeglicher Software auf den Grund zu gehen, noch besser, sie neu zu schreiben: Github ist nicht mehr als eine Softwaremüllhalde. Zur Bewältigung der Datenmenge durchaus in Assembler.

Für ArUco-Erkennung gibt es bereits diese Lösung in JavaScript.