Celooblohový skener svetelného znečistenia

Projekt riešený na Katedre experimentálnej fyziky FMFI UK

Ovládanie montáže iPANO AllView Pro

Pripojenie montáže k počítaču

Montáž sa pripája k počítaču pomocou sériovej linky (RS232). Keďže moderné notebooky a PC už nemajú sériový port, na pripojenie treba použiť štandardný prevodník USB->RS232, ktorý po pripojení k počítaču vytvorí sériový port. Z dôvodov kompatibility a na základe odporúčania výrobcu montáže sme sa rozhodli pre prevodník s FTDI čipsetom. Nastavenie sériového portu montáže je:

Inštrukčná sada

Kompletná inštrukčná sada je dosť obsiahla, keďže montáž je primárne určená pre snímanie panorám fotoaparátmi. Pre naše účely vystačíme iba s niekoľkými príkazmi pre nasmerovanie montáže a zistenie stavu montáže:

Koncept riadenia montáže

Na ovládanie montáže v jazyku Python sme využili knižnicu pyserial.

Identifikácia montáže

Aby užívateľ nemusel zisťovať, na ktorom sériovom porte je montáž pripojená, využili sme funkciu v knižnici "pyserial" na zistenie zoznamu portov. Potom otvoríme každý z portov s parametrami ako vyžaduje iPANO (s timeout-om 1 s) a požiadame zariadenie príkazom ":01INF#" o identifikáciu. Ak odpovie ":10INF3600#", montáž je pripojená k danému portu. Inak komunikácia skončí na timeout-e a skúsime ďalší sériový port:

myportdevice=''
ports = serial.tools.list_ports.comports(include_links=False)
iPANOfound=False
for port in ports :
     print('Checking '+port.device)
     ser = serial.Serial(port.device,115200, timeout=1) # open serial port
     ser.write(b':01INF#')
     s=ser.read(11)
     if s==b':10INF3600#':
         print('iPANO mount found on '+port.device)
         myportdevice=port.device
         iPANOfound=True
         break
     ser.close()
if iPANOfound==False:
     print('iPANO mount not found')
     quit()

Nasmerovanie montáže a počkanie na dosiahnutie cieľovej polohy

Na nasmerovanie montáže použijeme príkaz GOTO (":01SSLnTTTTTZZZZZ#") a na zistenie, či je ešte montáž v pohybe, príkaz ":01GAS#". To, že montáž je v pohybe, sa prejaví číslom 1 na 18 mieste textu odpovede. Po príkaze GOTO treba chvíľu počkať, kým sa montáž nerozbehne, inak by sme mohli dostať odpoveď, že montáž (ešte) stojí. Smer, kam sa má montáž otočiť, je uložený v premenných "azimut" a "výška":

command=':01SSL+%s%s#' % (str((int)(100*azimut)).zfill(5),str((int)(100*vyska)).zfill(5))
command=command.encode() #prerobit na postupnost 8-bit znakov
ser.write(command) #presun na novu poziciu
ser.read(19) #ignorovať odpoveď
time.sleep(0.1) #aby sa montáž stihla rozbehnúť
ser.write(b':01GAS#') #načítanie pozície a stavu montáže
s=ser.read(19)
while s[17]== ord('1'): #kód jednotky = je v pohybe
     ser.write(b':01GAS#') #načítanie pozície a stavu montáže
     s=ser.read(19)

Ošetrenie výnimiek

Pri meraní v teréne sa ľahko môže stať, že dôjde k výpadku spojenia medzi notebookom a montážou (napríklad pri neopatrnej manipulácii s USB prepojovacími káblami). Keďže niektoré typy meraní môžu trvať až dve hodiny, je kľúčové zabezpečiť, aby sa pri takejto chybe meranie neskončilo, ale aby bola možnosť v ňom po odstránení chyby pokračovať. Naša koncepcia ošetrenia výnimiek je takáto:

  1. Po každom kroku merania sa do súboru "running.txt" zapíše číslo kroku, ktorý sa podarilo ukončiť, spolu s menami súborov (polohy meracích bodov, výsledky meraní, ...). Po skončení celého meracieho cyklu sa súbor "running.txt" vymaže.
  2. Ak došlo k výpadku USB spojenia, v závislosti od okamihu prerušenia dôjde k vyvolaniu jednej z výnimiek "serial.serialutil.SerialException" (nemožnosť zapísať do portu alebo z neho čítať) alebo "IndexError" (chybné dáta - chyba v indexe pri zisťovaní, či sa montáž ešte hýbe). Tieto výnimky program zachytí, upozorní na problém s pripojením montáže výpisom aj akusticky a po odstránení problému s prepojením (užívateľ stlačí kláves na klávesnici) sa akcia zopakuje a pokračuje sa v meraní.
  3. Ak bola oprava spojenia v bode 2 neúspešná, alebo došlo k zlyhaniu merania akýmkoľvek iným spôsobom (výpadok napájania, reset systému, ...), po novom spustení programu sa zistí, že meranie nebolo dokončené (existuje súbor "running.txt"), užívateľ sa môže rozhodnúť, či chce pokračovať v prerušenom meraní, alebo začať nové meranie. Ak chce pokračovať v prerušenom meraní, načítajú sa meracie body, vynechajú sa tie, ktoré už boli zmerané a meranie pokračuje.

Koncept ošetrenia výnimiek v programe:

...
try:
    príkazy komunikácie s portom;
except (serial.serialutil.SerialException,IndexError):
    print('\a')
    print("Connection to the iPANO mount is lost. Reconnect and press any key...")
    input('')
    zopakovanie príkazov komunikácie s portom;
...

Test riadenia montáže

Testovací program načíta postupnosť meracích bodov (deklinácia, azimut) s pripraveného súboru, nasmeruje postupne montáž do jednotlivých smerov, počká jednu sekundu (simulácia merania) a uloží aktuálny smer do výstupného súboru. Keďž počítame zo zabudovaním programu do GUI, na otvorenie súboru a voľbu mena výstupného súboru sme použili funkcie "filedialog.askopenfilename()" a "filedialog.asksaveasfilename()" z knižnice "tkinter".

Celý testovací program: ipano.py