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.
Ofentemperaturregelung mit Rezeptsteuerung (über Stunden) und Steuerung von 8 digitalen Ausgängen (Relais).
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.
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.
Kanäle | Typ | Beschreibung | Verwendung |
---|---|---|---|
Peripherie | |||
4 | DO;AO | Triac-Ausgänge 400 V~ 12 A mit Strommessung (Kurvenformmessung mit 2 kSa/s/Kanal) | Heizwendel |
16 | DO;AO | Digitalausgänge 24 V, Spannung reduzierbar per Software-PWM, Grundfrequenz 100 Hz | Magnetventile |
4 | AO | Analogausgänge 0..5 V (per Bestückungsoption änderbarer Ausgangsspannungsbereich) via Hardware-PWM und Tiefpassfilter | - |
16 | DI | Digitaleingänge TTL, mit Eingangswiderständen vor Spikes geschützt, Pullups für Schalter nach Masse | Starttaste, Gashahnkontakte |
4 | AI | Analogeingänge 0..5 V; liefern jeweils 5 V (Spannungsteiler vorsehen?? Gesonderte Jumper?) | Gassensor MiCS5524 |
4 | AI | Analogeingänge für Thermoelemente | Thermoelemente |
4 | AI | Analogeingänge für Messbrücken; liefern jeweils 5 V (Zur Not auch für Pt100, Pt1000) | Drucksensor |
1 | DIO | Rauchmelder-Anschluss (mehrere Rauchmelder können parallel geschaltet werden); liefert 9 V | Nebelkammer-Rauchmelder |
1 | BUS | I²C-Anschluss: Hardware-I²C; liefert 5 V | Pyrosensor MLX90614KSF |
1 | BUS | OneWire-Anschluss, universell verwendbar: Software-OneWire; liefert 5 V | Temperatursensoren |
1 | BUS | RS485-Anschluss; liefert 5 V | - |
Versorgung | |||
1 | BUS | USB (Das Gerät ist self-powered, USB nur Datenschnittstelle) | Steuer-PC |
1 | PWR | 24-V-Eingang (Gleichspannung! Netzteil je nach Verbrauchern dimensionieren! Dürfen auch 12 V sein.) | Netzteil |
1 | PWR | 400-V-Eingang (Wechselspannung! Sicherung 12 A oder je nach Verbraucher extern vorsehen! Dürfen auch 230 V sein.) | Stromnetz |
Anzahl | Bauteil | Bestellbezeichnung | Lieferant | Preis | Bemerkungen | Gehäuseform | Einsatz |
---|---|---|---|---|---|---|---|
16 | IRLML6344 | IRLML6344 | Reichelt | 0,14 € | n-Kanal-MOSFET 30 V 5 A 1,3 W 0,8 V | SOT-23 (winzig!!) | digitale Ausgänge |
16 | AO6402A | AO6402A | Reichelt | 0,18 € | n-Kanal-MOSFET 30 V 7,5 A 1,3 W 0,8 V | SOT-23-6 (DDGSDD) | |
16 | AOD4148A | Reichelt | 0,28 € | n-Kanal-MOSFET 40 V 50 A | DPAK | ||
16 | B360F | B360F | Reichelt | 0,09 € Sonderangebot | Schottky-Diode 60 V 3 A | SMC | |
16 | B340F | B340F | Reichelt | 0,20 € Alternative | Schottky-Diode 40 V 3 A | SMC | |
4 | ? | Reichelt | ? | Varistor | Triac-Ausgänge | ||
4 | ? | Reichelt | ? | X1-Kondensator 47 nF 375 V | |||
4 | ? | Mouser | ? | Optotriac 800 V 0,1 A beliebige Phase | DIP6 | ||
4 | ? | Reichelt | ? | Snubberless-Triac 800 V 12 A | TO220ISO | ||
1 | LM2575 | LM 2575 T5,0 | Reichelt | 1,25 € | Tiefsetzsteller 5 V 1 A | TO220V5 | 5-V-Versorgung |
1 | MC34063 | MC 34063 ADR | Reichelt | 0,32 € | Schaltregler 1,5 A | SO8 | |
1 | ATmega32U4 | 556-ATMEGA32U4-AU | Mouser | ? | AVR-Mikrocontroller mit USB | TQFP44 |
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:
Position | Funktion | Bauteil | Anmerkung | verwendet |
---|---|---|---|---|
1 | 5-V-Versorgung | LM2574 (DIP8) | 1 A | √ |
LM2576 (DPAK, teuer!) | 3 A (Drossel passt nicht) | |||
2 | LEM-Modul | ? | 3 Pins | √ |
LTS25NP | 4 Pins | √ | ||
? | 3 Pins, versetzt | |||
3 | Triac | BTA8-800CW | 8 A | |
BTA12-800CW | 12 A | √ | ||
4 | MOSFETs | AO6402A (SOT23, 0,14 €) | 5 A | |
AO6402A (SOT23-6, 0,18 €) | 7,5 A | |||
AOD4148A (DPAK, 0,28 €) | 50 A | √ | ||
5 | Thermoelement-Wandler | MAX6675 | 5 V | |
MAX31855 | 3,3 V | √ | ||
6 | Pt100-Wandler | MAX31865 | 3,3 V | vergessen |
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.
Runde | Strommessung | Extra | |||
---|---|---|---|---|---|
0 | i0 ADC4 | i1 ADC5 | i2 ADC6 | i3 ADC7 | j0 = ADC1-ADC0 |
1 | j1 = ADC1-ADC0 | ||||
2 | j2 = ADC1-ADC0 | ||||
3 | j3 = ADC1-ADC0 | ||||
4 | Langsames 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.
Runde | Messung | Unteraufteilung mit IC18 | |||
---|---|---|---|---|---|
0 | OneWire = ADC8 | - | |||
1 | Zusatz = ADC9 | 24-V-Versorgung (12,2:2,2 ≈ 5,55) | DI1 | DI2 | DI3 |
2 | Gas = ADC10 | X25 | X26 | X27 | X28 |
3 | Rauchmelder = ADC11 (2:1) | - | |||
4 | Chiptemperatur | - |
Wie man sieht ergeben sich Fünfergruppen mit folgenden Abtastzeiten und -frequenzen:
Gruppe | Abtastzeit | Abtastrate | Puffergröße |
---|---|---|---|
4× LEM-Strommessung | 104 µs × 5 = 0,52 ms | ≈ 1,9 kHz | 100 |
4× INA126 | 104 µs × 25 = 2,6 ms | ≈ 385 Hz | 20 |
5× langsames | 104 µs × 125 = 13 ms | ≈ 77 Hz | 4 |
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.
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:
Wert | Bedeutung | Periodendauer in ms |
---|---|---|
000xx | Temperatur | 13 |
0y100 | Strommessung i0 | 0,52 |
0y101 | Strommessung i1 | |
0y110 | Strommessung i2 | |
0y111 | Strommessung i3 | |
01000 | INA126 j0 | 2,6 |
01001 | INA126 j1 | |
01010 | INA126 j2 | |
01011 | INA126 j3 | |
100xx | OneWire | 13 |
10100 | 24-V-Versorgung | 52 |
10101 | DI1 | |
10110 | DI2 | |
10111 | DI3 | |
11000 | Gas X25 | 52 |
11001 | Gas X26 | |
11010 | Gas X27 | |
11011 | Gas X28 | |
111xx | Rauchmelder | 13 |
Das letzte freie Bit wird für das Vorzeichen (bei INA126) benötigt. Eine Entscheidung wird noch gefällt.
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:
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!
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.
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.
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.
Datei | Beschreibung |
---|---|
prozess.zip | Firmware (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.zip | Backup LabVIEW-Programm für „alte“ Steuerung (Steuerung wurde in Bestandteile zerlegt) |
Arduino.zip | Backup Arduino-Software (ungenutzt, Teil der alten, zerlegten Steuerung) |
Masterarbeit Geidel.pdf | Ein mittlerweile überholtes Pamphlet |
grafik.llb | LabVIEW-Beispiel zum nicht-überlappenden Platzieren von Text (für Anmerkungen) in einem XY-Graf, LabVIEW 8.5 |
grafik.png | Screenshot des Demo-Programms |
Serial-Win32.vi | LabVIEW-Programm |
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.
Trivial: r = |mousepos - pointpos| = √Math.hypot(mouse.x-point.x,mouse.y-point.y)
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)
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
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.
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 Verwandtschaft besteht mit dem Frequenzmesser zur Durchflussmessung. Der Mikrocontroller generiert an einem freien Ausgang eine Wechselspannung zur Bereitstellung einer negativen Hilfsspannung für den Analogmultiplexer. 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 Messemusterverpackung 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) Abfragekommando zwischen ASCII- und Binärausgabe umgeschaltet werden — sowie die gesamte Historie abgefragt werden. Zudem erscheint das Einstellen der Summenabtastrate sinnvoll.
banksel
aufpassen!
Lieber einmal zuviel verwenden, Platz ist hier reichlich.
subwf
als auch sublw
sind teuflisch!subwf reg,w
entspricht w = reg - w
(invertiert w)
und c = reg >= w
subwf reg,f
entspricht reg -= w
und (genauso) c = reg >= w
sublw k
entspricht w = k - w
(invertiert w,
daher ist sublw 0
eine Negation)
und c = k >= w
addlw -k
!
skpb skpnb brb brnb
.
banksel
und pagesel
generieren
und Sprünge anpassen (bra
durch goto
ersetzen)
ist ein Armutszeugnis für die Assembler,
wobei gpasm durch seine gigantische Größe (über 5 Megabyte mit DLL,
ohne Include-Dateien!) unangenehm auffällt
und mpasmx mit dem Popup-Fenster nervt.
Nirgends ist irpc
implementiert.
Die Makroverarbeitung in der LST-Datei ist unpraktisch:
Wünschenswert wäre die Kombination keine Makroexpansion
aber trotzdem Kodeausgabe.
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.
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.
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.
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:
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.
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!).
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.