Bluetooth-Steuerung von Timer und Kühlung


Um den Arduino in der Kamera über Bluetooth zu steuern, muss der Arduino mit einem kleinen seriellen Bluetooth-Modul versehen werden. Prinzipiell funktioniert die Kommunikation auch über eine serielle Kabelverbindung, was aber nicht sehr komfortabel ist. 
Die Baudrate für die Kommunikation zwischen Bluetooth-Modul und Arduino ist auf 9600 voreingestellt, was auch für einen HC-05 oder DX-BT04 vorkonfiguriert ist. Das ist zwar nicht berauschend, aber es reicht aus. Was ich am Bluetooth-Modul noch umkonfiguriere, ist der Name, unter dem es sich meldet, also z.B. "2000Daci".
Zur Steuerung mit dem Smartphone oder Tablet benötigt man eine App, die mit Bluetooth-Geräten kommuniziert. Man könnte mit überschaubarem Aufwand eine eigene App dafür zusammenstellen, aber ich habe mich erst mal mit dem "Serial Bluetooth Terminal" begnügt, wobei 'begnügt' eigentlich nicht das richtige Wort ist, denn das ist eine sehr schöne App, die genau das tut, was ich für den Zweck brauche. 
Der Bluetooth-Code auf der Arduino-Seite ist Teil des ShutterEmuEOS Programms und kann bei Bedarf leicht angepasst werden.

Dieser Screen-Shot des Bluetooth-Terminals zeigt in der oberen Hälfte den Output der Hilfefunktion, die aktuellen Einstellungen und den Status der Kamera.

Im unteren Teil bietet das Bluetooth-Terminal ein konfigurierbares 'Tastenfeld'. Hinter jeder Taste steht ein Makro, das man passend einrichten kann. Hier sind die Makros so gestaltet, dass sie jeweils ein Zeichen senden, um die wichtigsten Befehle direkt auszuführen. Einige Befehle erwarten eine Ziffernfolge, die vor dem Befehlszeichen eingegeben wird.

Die Tastenkonfiguration kann man auch in eine Datei exportieren, um sie auf dem Rechner zu bearbeiten oder auf anderen Geräten zu importieren. Eine Kopie davon liegt dem ShutterEmuEOS Programm bei als "serial_bluetooth_terminal_cfg_astroshoot.txt".

Im linken Teil des Tastenfelds befinden sich die Befehle für den Intervall-Timer, der Bildserien mit frei wählbarer Belichtungszeit (und Pausen) auslöst. Man kann die Kamera dazu sowohl im Bulb-Mode als auch mit allen anderen Modi betreiben, in denen die Kamera die Belichtungszeit vorgibt, zum Beispiel um Zeitrafferreihen aufzunehmen.
Unten gibt es dann noch die Taste 'Kühlung', mit der die Anweisungen zur Einstellung der Kühlung abgesetzt werden. So schaltet zum Beispiel die Zeichenfolge '1K', die mit den Tasten '1' und 'Kühlung' gesendet wird, die Kühlung auf niedrigste Stufe, während '8K' den PID-Regler aktiviert, der die Temperatur konstant hält.

Die aktuellen Einstellungen können im EEPROM des Arduino abgelegt werden, damit sie nicht verloren gehen, wenn die Kamera ausgeschaltet wird. 
Hilfe und Info-Funktionen

H : Hilfeübersicht anzeigen
K, E, F, A : Hilfe zu einzelnen Befehlsgruppen anzeigen
? : Den aktuellen Status von Kühlung und Belichtung anzeigen
U : Laufende Status-Updates aus- oder einschalten
D : Anzeige von Debug-Nachrichten ein- oder ausschalten


Intervalltimer

Der Intervalltimer kann die Kamera periodisch auslösen. Für Langzeit-Belichtungen wird an der Kamera der  
Bulb-Mode gewählt und der Intervalltimer bestimmt die Belichtungszeit. 
Wenn die Belichtungszeit von der Kamera vorgegeben werden soll, wird der Intervalltimer durch wiederholte Eingabe von '–' auf den Kurzzeitwert von 0.1 Sekunden eingestellt und löst dann zehn mal pro Sekunde aus ("schnelle Auslösungen").

Start/Stop:

   ! : Belichtungssequenz mit der gewählten Zeit und Dauer starten.
Erneute Eingabe beendet die Sequenz. Eine laufende Belichtungen wird noch abgeschlossen. Währenddessen kann die Sequenz durch ein nochmaliges '!' wieder fortsetzt werden. 

Wenn parallel ein Shutter-Emulator läuft, erhält der Timer von diesem den exakten Auslösezeitpunkt und bezieht darauf die gewählte Belichtungszeit (s.a. Pausen).

Bei Bulb-Auslösungen wird der Fortschritt jeder Auslösung durch eine Folge von 16 Sternen dargestellt. Bei fehlender Reaktion der Kamera auf Auslösungen wird ein Hinweis angezeigt. 
Wenn nach registrierten Shutter-Auslösungen drei aufeinanderfolgende Auslösungen fehlen, z.B. weil die Karte voll ist, stoppt der Intervalltimer und schaltet die Kühlung ab, um ein Beschlagen des unbenutzten, kalten Sensors zu vermeiden. 

Für schnelle Auslösungen wird jede Sekunde ein Punkt ausgegeben, Shutter-Auslösungen werden durch Apostrophen angezeigt.

  # : Startet eine Dauer-Belichtung oder bricht laufende Belichtungen (sofort) ab. 
Zeigt den Fortschritt im Sekundentakt an. 

   ? : Zeigt den aktuellen Status und die Belichtungseinstellungen an.

Belichtungszeit:

  +   : Belichtungszeit stufenweise erhöhen. Die vordefinierten Stufen betragen 
0.1s, 30s, 60s, 100s, 300s, 600s, 20min, 40min, 60min

  –    : Belichtungszeit stufenweise verringern

123s : Belichtungszeit in Sekunden wählen 
123m : Belichtungszeit in Minuten angeben 

123P : Die Pause zwischen zwei Belichtungen in zehntel Sekunden angeben, 0 wählt den Vorgabewert. 
Durch die Wahl einer verlängerten Pause zwischen den Auslösungen kann die Belichtungszeit unabhängig von der Verzögerung durch die Bildspeicherung exakt definiert werden auch wenn kein Shutter-Signal zur Verfügung steht (s.o.). 
Voreingestellt ist eine Pause von 0.2 Sekunden, die aber von der Kamera bei Bedarf verlängert wird, ohne Shuttersignal auf Kosten der nächsten Belichtung. 
Bei zu kurzen Pausen startet u.U. nur jede zweite Auslösung! 
Mit langen Pausen können auch Timelapse-Reihen aufgenommen werden. Dazu muss für den Timer die Belichtungszeit auf mindestens 1 Sekunde gestellt werden. 
Wenn die Kamera die Belichtungszeit vorgibt, können Timelapse-Reihen auch einfach durch lange Belichtungszeit erzeugt werden. (Die Kamera löst erst wieder aus, nachdem der Timer die letzte Belichtung beendet hat.)  
 
  n% : Belichtungszeit um bis zu +/-n Prozent zufällig variieren 

Seriendauer:

   > : Limit für die Seriendauer stufenweise erhöhen. Die vordefinierten Stufen sind 
kein Limit, 16h, 12h, 8h, 6h, 4h, 2h, 1h, 30min, 20min, 10min  
Wenn die maximale Seriendauer erreicht ist, erfolgen keine weiteren Auslösungen mehr und die Kühlung wird ggf. abgeschaltet. 
   < : Limit für die Seriendauer stufenweise verringern. 

123L : Limit für Seriendauer in Minuten angeben, 0 schaltet das Limit ab. 
123N : Limit für Seriendauer als Anzahl von Aufnahmen angeben, 0 schaltet das Limit ab. 
  Berechnet die benötigte Zeit unter Berücksichtigung der gewählten Pausen. 

Aufzeichnung der Auslösungen


Der Intervalltimer nimmt ein Protokoll aller Aufnahmen auf, das die Sensor- und ggf. die Umgebungstemperatur enthält. Es kann im regulären Arbeitsspeicher bis etwa 500 Einträge erfassen.  
Wenn ein externes Flashmodul vorhanden ist, werden bis zu 10000 Einträge gespeichert. Zusätzlich ist dann das Protokoll auch nach dem Ausschalten der Kamera noch verfügbar. Es wird erst gelöscht, wenn ein weiterer Protokolleintrag erzeugt wird und es lässt sich auch in das neue Protokoll integrieren. 

Aufzeichnungsbefehle: 

  A : Aufzeichnungsbefehle anzeigen.
0A : Stoppt die Aufzeichnung der Auslösungen.
1A : Setzt eine angehaltene Aufzeichnung fort.
2A : Löscht die bisherige Aufzeichnung und startet sie neu.
3A : Zeigt die Aufzeichnung an. Mit weiteren "A" kann die Anzeige pausiert werden. 
4A : Übernimmt Aufzeichnungen, die beim Einschalten schon vorhanden waren, als aktuelle 
Aufzeichnung, so dass sie nicht bei der ersten Aufnahme gelöscht werden. 

Kühlung


Voraussetzung für die Kühlungsregelung ist neben dem Peltierelement, das über einen PWM-Ausgang des Arduino geregelt wird, ein Temperatursensor in Wärmekontakt mit dem Bildsensor. 
Wenn vorhanden, wird auch die Fensterheizung an die Regelung der Kühlung angepasst. Die jeweilige Verfügbarkeit der Regelkeise und die Pinbelegung wird zusammen mit den Shutteremulationsanschlüssen in camera.h definiert (s. dazu als Beispiel die Kamera "MY_2000D_2"). 
Wenn ein Umgebungstemperatur- und Feuchtesensor verfügbar ist, wird der Taupunkt berechnet  und in die Regelung einbezogen. 

    K : Befehle zur Kühlung anzeigen.
  0K : Schaltet die Kühlung ab oder, wenn nicht möglich, zumindest auf kleinste Stufe. 
1K..5K : Schaltet die Kühlung ein zwischen minimaler (1) und maximaler Stärke (5). 
1nnnK : Betreibt die Kühlung mit dem PWM-Signal nnn (= 000 bis 255, genau 3 Ziffern). 
(Achtung: Je nach Schaltung kann auch 0 oder 255 die höchste Kühlungleistung bedeuten.)
  7K : Erwartet die Eingabe einer Ziel-Temperatur und startet die PID-Regelung um diese zu erreichen. 
  8K : Startet die PID-Regelung, um die momentane Sensor-Temperatur zu halten. 
  9K : Startet die PID-Regelung nach 10 Minuten, um die dann gemessene Temperatur zu halten. 

 20K : Schaltet die Fenster-Heizung aus. 
21K..25K : Schaltet die Fenster-Heizung zwischen minimaler (1) und maximaler Stärke (5) um. 
 29K : Erweitert die Taupunkt-Kontrolle auf die Fensterheizung. 

Taupunkt-Kontrolle: 

Wenn ein Umgebungstemperatur- und ein Feuchtesensor (z.B. ein AHT20) eingebaut sind, wird der Taupunkt berechnet und angezeigt. Ob die Taupunkt-Kontrolle aktiviert ist, wird durch ein '~' Zeichen nach der PWM-Anzeige angezeigt. Vorgabe ist 'aktiviert' bzw. die im EEPROM abgespeicherte Einstellung
Bei eingeschalteter PID-Regelung passt die Taupunkt-Kontrolle die Zieltemperatur an den Taupunkt an.
Ohne PID-Regelung wird die Kühlleistung reduziert, wenn die Fenstertemperatur unter den Taupunkt fällt. 
Dabei wird die Fenstertemperatur aus der Sensortemperaturmessung abgeschätzt, indem ein Korrekturwert, der mit dem "T" Befehl eingegeben wird, zur Sensortemperaturmessung addiert wird. 
Die Taupunkt-Kontrolle kann mit dem Befehl '29K' auch auf die Fensterheizung erweitert werden. Dann wird die Fensterheizung verstärkt oder reduziert, wenn die Fenstertemperatur unter oder über dem Taupunkt liegt. 
 
10K : Deaktiviert die Taupunkt-Kontrolle. 
11K : Aktiviert die Taupunkt-Kontrolle. 
29K : Erweitert die Taupunkt-Kontrolle auf die Fensterheizung.

Temperaturkorrekturen

 T : Temperaturkorrektur für Sensortemperatur, Umgebungstemperatur oder Taupunkt eingeben.

Die eingegebenen Korrekturwerte werden zu den Messwerten addiert und können im EEPROM des Arduino abgelegt werden. Sie dienen dazu, Ungenauigkeiten auszugleichen, zum Beispiel durch Wärmeabgabe der Kamera auf die Umgebungssensoren. 
Für die Taupunkt-Kontrolle wird die Fenstertemperatur als Sensortemperatur + Korrekturwert angenommen. 


PID-Regelung kalibrieren


Die PID-Regelung der Sensortemperatur arbeitet mit den voreingestellten Parametern recht zuverlässig. Trotzdem können die Regelparameter angepasst werden, entweder durch direkte Eingabe anderer Werte oder durch eine automatische Kalibrierung, die aber meist zu schlechteren Ergebnissen führt. 

 0C : Aktuelle PID-Koeffizienten anzeigen.
 1C : PID-Koeffizienten auf Basiseinstellung zurücksetzen.
 2C : Im EEPROM gespeichert PID-Koeffizienten laden.
 3C : Aktuelle PID-Koeffizienten im EEPROM speichern.
 4C : Gespeicherte PID-Koeffizienten aus dem EEPROM löschen.
 5C : PID-Koeffizienten manuell eingeben.
nnC : PID-Koeffizienten automatisch bestimmen. Dazu das PWM-Signal um 'nn' ändern (nn >= 10).
  C : Kalibrierung abbrechen / beenden.
Nach dem Ende der automatischen Kalibrierung werden die gefundenen PID-Koeffizienten angezeigt und können übernommen oder verworfen werden. 

Einstellungen im EEPROM des Arduino speichern


Damit die aktuellen Einstellungen beim Ausschalten der Kamera nicht verloren gehen, können sie im EEPROM des Arduino gespeichert werden: 

 E : Befehle zu Einstellungen anzeigen.
0E : Zeigt die aktuellen Einstellungen an 
1E : Lädt die Grundeinstellungen, die verwendet werden, wenn im EEPROM nichts gespeichert ist. 
2E : Lädt die im EEPROM gespeicherten Einstellungen erneut. 
 R : Führt einen vollständigen Reset des Arduino aus (nur mit Urboot/Optiboot) 
3E : Speichert alle aktuellen Einstellungen im EEPROM. 
4E : Löscht die im EEPROM gespeicherten Einstellungen.

Software-Updates über Bluetooth

Wenn ein externes Flash-Modul an die SPI-Schnittstelle des Arduino angeschlossen ist, können darüber Updates für den Arduino installiert werden. Außerdem lässt sich eine Sicherungsversion hinterlegen, die vom Watchdogtimmer des Arduino als Update installiert wird, wenn die aktuelle Programmversion nicht reagiert. 

Update-Funktionen:

  F : Update-Funktionen anzeigen.
1F : Erwartet den Upload einer HEX-Datei (via Bluetooth oder serieller Schnittstelle), 
die im externen SPI-Flash ab Adresse 0x000000 abgelegt wird. Die ersten beiden Bytes, die der Bootloader als Aufforderung zur Installation des folgenden Codes interpretiert, werden entfernt und durch 0xFF ersetzt, wodurch die Update-Funktion zunächst blockiert ist. 
2F : Ergänzt die fehlenden ersten beiden Bytes und löst einen Reset aus, so dass Urboot
den Code bis 0x007FFF als Update installiert. Aktiviert die Watchdog-Überwachung (s.u.) für den Fall, dass das Update nicht korrekt funktioniert und keine Updates mehr ausführen kann. 
3F : Kopiert den Upload-Bereich in die zweite Hälfte der ersten Page des externen Flash (0x008000)
und ergänzt die fehlenden ersten beiden Bytes. Diese Sicherungsversion wird bei einem Watchdog-Interrupt zur Installation als Update durch den Bootloader nach 0x000000 umkopiert. 
4F : Installiert die im Flash abgelegte Sicherungsversion als Update. 
0F : Aktiviert oder deaktiviert die Watchdog-Überwachung und speichert diese Einstellung im EEPROM.
Die Watchdog-Überwachung wird bei der Installation eines Updates (mit '2F') automatisch aktiviert. Sie bleibt aber inaktiv, wenn noch keine Sicherungsversion eingerichtet ist.
Sinnvollerweise sollte man sie abschalten, sobald sichergestellt ist, dass das letzte Update weitere Updates ausführen kann. 

Testfunktionen:

5F : zeigt den Anfang des internen Flash (0x0000) als Hex-Dump an. 
6F : zeigt den Anfang des externen Flash (den Upload-Puffer bei 0x000000) als Hex-Dump an. 
7F : Sicherungsversion im externen Flash (0x008000) anzeigen. 
8F : Bereich des Protokoll im externen Flash anzeigen. 
9F : Endlosschleife ausführen, um den Watchdog-Interrupt (nach 4 Sekunden) auszulösen,
so dass die Sicherungsversion installiert wird.

Eingabe von Befehls-Parametern


Einige Befehle benötigen noch einen Eingabewert im Fließkommaformat, also in der Form "+/-1.2e-3". Bei der Aufforderung zur Eingabe wird angezeigt, mit welchem Buchstaben die Eingabe abzuschließen ist, damit die Eingabe als beendet betrachtet und der Wert korrekt zugeordnet wird. 

Beispiel: Der Befehl "7K" erwartet eine Zieltemperatur für den PID-Regler, die mit 'K' (für Kühlung) abzuschließen ist. Eine sinnvolle Eingabe wäre dann z.B.
   "-2.5K" 
oder alles zusammen
  "7K-2.5K"



Zuletzt aktualisiert am 16.02.2025