I am testing a ASI 183 MM Pro in the lab. I am taking exposures of a stable light source and vary the exposure time. I expect to see the signal on the sensor increasing linearly. This works for exposure times shorter than 1s. If the exposure time is longer than 1s it looks like the exposure time is increasing in steps of 0.2s.


The upper panel shows the signal increasing with exposure time (blue) as measured of the images.
I am increasing the exposure time in steps of 0.01s and the light source is a LED (it is on for more than 1h so that the output is stable) feeding into an integrating sphere.
The orange dots are my first attempt to correct for the steps in exposure time.
The green line is a linear fit to the corrected orange dots.

The lower panel shows the deviation of the measured points (blue) from the linear fit.
The orange points show the deviation from the linear fit using a step size of 0.2s for the exposure time and a time offset of 0.095s.
You see that for some points the correction does not work.

Also for short exposure times I find a deviation from linearity.
The camera is operated at -10°C.

I am using a raspberry pi 3b+ with Ubuntu Mate and pyindi to control the camera.
Pyindi_client 0.2.3
Indi Library 1.8.0

Is this a feature or a bug?
In case it is a feature, where do I find the precise size of the steps and an possible offset?
Why do I not find this modified exposure time in the header of the fits images?

Thanks a lot in advance.

Read More...

Daniel replied to the topic 'Cooling of CCD via pyindi' in the forum. 6 years ago

Hello Together,

fehlfarbe ( indilib.org/support/community/2262-fehlfarbe/profile.html ) helped me to get the temperature control working.

To read the device temperature I changed the "def newProperty()" function, it looks now like this:

  def newProperty(self, p):
        self.logger.info("new property "+ p.getName() + " for device "+ p.getDeviceName())
        if self.device is not None and p.getName() == "CONNECTION" and p.getDeviceName() == self.device.getDeviceName():
            self.logger.info("Got property CONNECTION for CCD Simulator!")
            # connect to device
            self.connectDevice(self.device.getDeviceName())
            # set BLOB mode to BLOB_ALSO
            self.setBLOBMode(1, self.device.getDeviceName(), None)
        if p.getName() == "CCD_TEMPERATURE":
            temp = self.device.getNumber("CCD_TEMPERATURE")
            print(temp[0].value)
            self.disconnectServer()
so it waits until the property "CCD_TEMPERATURE" is available and prints its value.

To change the temperature set-point one can use the following:
    def newProperty(self, p):
        self.logger.info("new property "+ p.getName() + " for device "+ p.getDeviceName())
        if self.device is not None and p.getName() == "CONNECTION" and p.getDeviceName() == self.device.getDeviceName():
            self.logger.info("Got property CONNECTION for CCD Simulator!")
            # connect to device
            self.connectDevice(self.device.getDeviceName())
            # set BLOB mode to BLOB_ALSO
            self.setBLOBMode(1, self.device.getDeviceName(), None)
        if p.getName() == "CCD_TEMPERATURE":
            temp = self.device.getNumber("CCD_TEMPERATURE")
            temp[0].value=np.float(1)                        ### new temperature to reach
            self.sendNewNumber(temp)
            self.disconnectServer()

This sets the temperature to 15°C and sends this new set-point to the server.
The temperature is then regulated internally to the new set-point.
With the first example of "newProperty()" you can watch the temperature drop and finally stabilize at the new temperature.

Thanks.

Read More...

Daniel created a new topic ' Cooling of CCD via pyindi' in the forum. 6 years ago

Hello Together,

it is my first post here and I have a few questions about the usage of pyindi.

My setup is a Raspberry Pi 3 B with Ubuntu Mate,
I followed the tutorial on indilib.org/develop/indi-python-bindings.html

To obtain a proper installation I had to install libz3-dev, libcfitsio-dev and libnova-dev.
A symbolic link from /lib/arm-linux-gnueabihf/libz.so.1 to /lib/arm-linux-gnueabihf/libz.so was needed
otherwise I had the error message ld can not find lz

The following code is working with a "Atik 383L+ CCD" and with a "ZWO CCD ASI120MC"
and is close to the example: indilib.org/develop/tutorials/151-time-l...ith-indi-python.html :

import sys, time, logging
import PyIndi
import numpy as np

exp_time=sys.argv[1]
name=sys.argv[2]
  
class IndiClient(PyIndi.BaseClient):
 
    device = None
 
    def __init__(self):
        super(IndiClient, self).__init__()
        self.logger = logging.getLogger('PyQtIndi.IndiClient')
        self.logger.info('creating an instance of PyQtIndi.IndiClient')
    def newDevice(self, d):
        self.logger.info("new device " + d.getDeviceName())
        if d.getDeviceName() == "Atik 383L+ CCD":
            print ("found Atik 383L+ CCD")
            self.logger.info("Atik 383L+ CCD")
            # save reference to the device in member variable
            self.device = d
        '''
        if d.getDeviceName() == "ZWO CCD ASI120MC":
            print ("found ZWO CCD ASI120MC")
            self.logger.info("ZWO CCD ASI120MC")
            # save reference to the device in member variable
            self.device = d
        '''
    def newProperty(self, p):
        self.logger.info("new property "+ p.getName() + " for device "+ p.getDeviceName())
        if self.device is not None and p.getName() == "CONNECTION" and p.getDeviceName() == self.device.getDeviceName():
            self.logger.info("Got property CONNECTION for CCD Simulator!")
            # connect to device
            self.connectDevice(self.device.getDeviceName())
            # set BLOB mode to BLOB_ALSO
            self.setBLOBMode(1, self.device.getDeviceName(), None)
        if p.getName() == "CCD_EXPOSURE":
            # take first exposure
            self.takeExposure()
    def removeProperty(self, p):
        self.logger.info("remove property "+ p.getName() + " for device "+ p.getDeviceName())

    def newBLOB(self, bp):
	    #self.logger.info("new BLOB "+ bp.name)
	    # get image data
	    img = bp.getblobdata()
	    import io
	    # write image data to StringIO buffer
	    blobfile = io.BytesIO(img)
	    # open a file and save buffer to disk
	    with open("/home/user/Desktop/"+name+".fit", "wb") as f:
	        f.write(blobfile.getvalue())
	    # start new exposure for timelapse images!
	    # self.takeExposure()
	    # disconnect from server
	    self.disconnectServer()

    def newSwitch(self, svp):
        self.logger.info ("new Switch "+ svp.name + " for device "+ svp.device)
    def newNumber(self, nvp):
        self.logger.info("new Number "+ nvp.name + " for device "+ nvp.device)
    def newText(self, tvp):
        self.logger.info("new Text "+ tvp.name + " for device "+ tvp.device)
    def newLight(self, lvp):
        self.logger.info("new Light "+ lvp.name + " for device "+ lvp.device)
    def newMessage(self, d, m):
        #self.logger.info("new Message "+ d.messageQueue(m))
        pass
    def serverConnected(self):
        print("Server connected ("+self.getHost()+":"+str(self.getPort())+")")
    def serverDisconnected(self, code):
        self.logger.info("Server disconnected (exit code = "+str(code)+","+str(self.getHost())+":"+str(self.getPort())+")")
    def takeExposure(self):
        self.logger.info(">>>>>>>>")
        #get current exposure time
        exp = self.device.getNumber("CCD_EXPOSURE")
        exp[0].value = np.float(exp_time)
        # send new exposure time to server/device
        self.sendNewNumber(exp)
  
logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO)
 
# instantiate the client
indiclient=IndiClient()
# set indi server localhost and port 7624
indiclient.setServer("localhost",7624)
# connect to indi server
print("Connecting to indiserver")
if (not(indiclient.connectServer())):
     print("No indiserver running on "+indiclient.getHost()+":"+str(indiclient.getPort())+" - Try to run")
     print("  indiserver indi_simulator_telescope indi_simulator_ccd")
     sys.exit(1)
  
# start endless loop, client works asynchron in background
while True:
    time.sleep(1)

So now I have a program, which takes an exposure of specified length and generate a file at the Desktop, but how do I control the cooling of the camera via python.
Do I just need to set the CCD_TEMPERATURE and the camera is taking care of the control loop, or do I have to monitor the CCD_TEMPERATURE and then switch the CCD_COOLER on and off? Is there some example code for this, especially with some syntax example?

Read More...