×

INDI Library v2.0.7 is Released (01 Apr 2024)

Bi-monthly release with minor bug fixes and improvements

Driver for Raspberry Pi "High Quality Camera?"

  • Posts: 19
  • Thank you received: 1
Hi Lars, can I ask, do you disable DPC (Defective Pixel Correction), otherwise known as the Sony Star Eater algorithm. As this is now possible to disable, eg by running this before starting the camera "sudo vcdbg set imx477_dpc 0". Please see here: www.raspberrypi.org/forums/viewtopic.php?t=277768

Thanks
James
Last edit: 2 years 7 months ago by James.
2 years 7 months ago #75146
The topic has been locked.
  • Posts: 124
  • Thank you received: 13
I do not agree with that.
You can easily disable that by running a script you mentioned(I created startup.sh script that runs few commands that I run before ekos), and sometimes you do not want that disabled, as I am using this camera for plate solving, I want noise to be reduced so I enable DPC.
Also as this is root command it would require entering password every time you start indi, it does not make sense.

I think most important feature needed is implementation of binning, further speeding up of download(binning would help there as well) 

Also i have a weird bug, I first have to take 10 s exposure that takes 5 seconds, and then i have to take 15s to enable long exposures. If I do not do that, every exposure is locked at 5s for some reason. 

I think Lars is too busy now to make any changes on code of rpi camera. 
2 years 7 months ago #75456
The topic has been locked.
  • Posts: 124
  • Thank you received: 13
I was going through the code and noticed this part with comment :

selectSensorConfig(0 /* What ever 0 means */);

That is actually binning mode, as per documentation:
File Attachment:


Just to note this is for high quality camera, different modes are for different cameras. 

Also interesting thing is that zero is "Automatic" but explenation of that part is missing from documentation except this note for all cameras:
Anything output res below 1296 x 976 will use the 2 x 2 binned mode. 

If automatic works then setting resolution to half should activate binning automatically, but I am not sure how to test that. Maybe by picturing fixed long distance target(lamp) with different resolutions but same exposure?

EDIT: i just tried reducing resolution, unfortunately it is only crop in current implementation of driver, but with resolution of 2028x1520, download time is 0.5 seconds. 


Also I am unable to build and test this mode by changing modes "selectSensorConfig" could someone try to change that and try? 
Last edit: 2 years 6 months ago by Outta.
2 years 6 months ago #75722
The topic has been locked.
  • Posts: 124
  • Thank you received: 13
I managed to get binning working with this driver. Beside better sensitivity binning achieves lower download speed that is now around 1s.
Binning is set by changing sensor mode. There are 4 modes, but actually only mode 2 is useful here as it is full res 2x2 binning. Also there is no separate vertical or horizontal binning. I had to make few more little changes here as well to make this working.

Here is difference in non properly focused countertop of my kitchen:
File Attachment:


I did not make pull request as I have no idea how to make this binning to take value from UI so you have to rebuild every time if you want to change binning. In short change is: setSensorConfig(2) in mmalcamera.cpp, in mmaldriver.cpp and raw12tobayer16pipeline.cpp remove resolution checks. In INDI you have to set resolution manually to 1/2 - 2028x1520.
Here is git diff if someone wants to try:
<code>diff --git a/indi-rpicam/mmalcamera.cpp b/indi-rpicam/mmalcamera.cpp
index bbc36f1..2175bc2 100644
--- a/indi-rpicam/mmalcamera.cpp
+++ b/indi-rpicam/mmalcamera.cpp
@@ -38,7 +38,7 @@ MMALCamera::MMALCamera(int n) : MMALComponent(MMAL_COMPONENT_DEFAULT_CAMERA), ca
 
     getSensorInfo();
 
-    selectSensorConfig(0 /* What ever 0 means */);
+    selectSensorConfig(2 /* What ever 0 means */);
 
     configureCamera();
 
diff --git a/indi-rpicam/mmaldriver.cpp b/indi-rpicam/mmaldriver.cpp
index fbb1804..2adf7c2 100644
--- a/indi-rpicam/mmaldriver.cpp
+++ b/indi-rpicam/mmaldriver.cpp
@@ -67,13 +67,13 @@ void MMALDriver::assert_framebuffer(INDI::CCDChip *ccd)
 {
     LOGF_DEBUG("%s()", __FUNCTION__);
     int nbuf = (ccd->getXRes() * ccd->getYRes() * (ccd->getBPP() / 8));
-    int expected = 4056 * 3040 * 2;
+   /* int expected = 4056 * 3040 * 2;
     if (nbuf != expected)
     {
         LOGF_DEBUG("%s: frame buffer size set to %d", __FUNCTION__, nbuf);
         LOGF_ERROR("%s: Wrong size of framebuffer: %d, expected %d", __FUNCTION__, nbuf, expected);
         exit(1);
-    }
+    }*/
 
     LOGF_DEBUG("%s: frame buffer size set to %d", __FUNCTION__, nbuf);
 }
diff --git a/indi-rpicam/raw12tobayer16pipeline.cpp b/indi-rpicam/raw12tobayer16pipeline.cpp
index f78f697..6438494 100644
--- a/indi-rpicam/raw12tobayer16pipeline.cpp
+++ b/indi-rpicam/raw12tobayer16pipeline.cpp
@@ -59,9 +59,9 @@ void Raw12ToBayer16Pipeline::data_received(uint8_t *data,  uint32_t length)
 {
     uint8_t byte;
 
-    assert(bcm_pipe->header.omx_data.raw_width == 6112); 
-    assert(ccd->getXRes() == 4056);
-    assert(ccd->getYRes() == 3040);
+//    assert(bcm_pipe->header.omx_data.raw_width == 6112); 
+//    assert(ccd->getXRes() == 4056);
+//    assert(ccd->getYRes() == 3040);
 
     int maxX = ccd->getSubW();
     int maxY = ccd->getSubH();
</code>
The following user(s) said Thank You: Craig Dobbs
Last edit: 2 years 2 weeks ago by Outta.
2 years 6 months ago #75954
The topic has been locked.
Thank you! If this is well tested and produce the expected results, then it should be incorporated in the driver when the binning is changed.
2 years 6 months ago #75965
The topic has been locked.
  • Posts: 124
  • Thank you received: 13
It should also be tested on IMX219 camera, I saw driver supports that sensor and unit test should be ran, I did not test that as I don't have Gtest. I am actually .net developer so I am kind of out of my league here but managing :D

And of course taking value from GUI should be implemented, as I just hard-coded 2. Programmatically changing resolutiom to 1/2 would be nice to have. 
But for my personal use it can remain hardcoded as I would always use binned mode. 
Last edit: 2 years 6 months ago by Outta.
2 years 6 months ago #75979
The topic has been locked.
  • Posts: 124
  • Thank you received: 13
I finally managed to do a star test, and binned results are impressive. Since it was not mounted stars drifted a bit, I missed a focus a bit as well, and lens is garbage. It is 134mm FL 34mm D, 5s exposure with analog gain 12.

 
File Attachment:


Since 2x2 is hardware binning it has impressive result. And binning is definitely must have as it increases sensitivity and download lasts 1s, so it can be used for guiding as well.


Also very very important note, if you do not set correct resolution in binned mode(2028x1520 or less),it will completly break everything and you need to restart whole RPi, as camera is stuck in exposing mode.
The following user(s) said Thank You: Jasem Mutlaq
Last edit: 2 years 6 months ago by Outta.
2 years 6 months ago #76078
The topic has been locked.
Impressive! Any ideas how can we inquire if binning is supported or not? and the range? Then it would be easy to code in.
2 years 6 months ago #76098
The topic has been locked.
  • Posts: 62
  • Thank you received: 12
Wow, good job! I have to try.

Is there a limit to the max exposure?
The following user(s) said Thank You: Outta
2 years 6 months ago #76106
The topic has been locked.
  • Posts: 124
  • Thank you received: 13
Thanks Tomas. 
EDIT: Just saw this, yes there is 200s exposure limit(although it could possibly go to max of 230)

Jason, I do not think we can get binning data from camera, but it is defined in raspberry documentation: www.raspberrypi.org/documentation/accessories/camera.html.
All 3 cameras support only 2x2 hardware binning, but in different modes. I am not sure does this driver support OV5647 sensor, I doubt it. 
There are lot of modes but I think we are interested only in 2x2 binning at full resolution as we can easily crop image afterwards, and hi speed recording is not intended in this usecase.

We could create mapping class per sensor name (as we do have that information from camera)  and using that class set Sensor mode and Max Resolution (half of max y and x provided by camera). 
File Attachment:
Last edit: 2 years 6 months ago by Outta.
2 years 6 months ago #76111
The topic has been locked.
  • Posts: 124
  • Thank you received: 13
Here is one more result Helix nebula on 60/330 apo in light poluted area: 
File Attachment:

Both 200s gain 12 and I think gain 16 on not binned one(but I do not see difference between 12 and 16. 
New one was not autoguided just tracked, guiding failed for some reason. 

Another issue that i found, and solved by Hardcoding is that "Plate Solving" automatically takes "Max Resolution" in that case it breaks the system, so I hardcoded the use of 2028x1520.
Again, implementation of binning and auto having resolution would solve this problem
The following user(s) said Thank You: Jasem Mutlaq
Last edit: 2 years 6 months ago by Outta.
2 years 6 months ago #76206
The topic has been locked.
Great, now all we need is to adjust the driver to set the correct modes per sensor to achieve this.
2 years 6 months ago #76207
The topic has been locked.
Time to create page: 1.391 seconds