Lab. of Voynich Code
2020年アルゼンチン皆既日食のたくらみ
SDKでNikon Z6を外部制御-4
2019.12.14 Open /2020/02/16Up
 稼働試験にかけたソースコードです。
 3.5時間Windowsタブレットで稼働したところ上手く走りました。

ソースコード

//
// This work is licensed under a Creative Commons Attribution 3.0 Unported License.
// Thomas Dideriksen (thomas@dideriksen.com)
//
// Modified by M_shi@Lab. of Eclips Manuscript
// http://horukeu.web.fc2.com/Exp/2020Trial/Index.html
//

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using Nikon; 
//
// This demo shows how to perform continuous capture and store the images to disk
//

namespace demo_continuouscapture
{
    class DemoContinuousCapture
    {
        int _captureCount = 0;

        NikonDevice _device;
        AutoResetEvent _waitForDevice = new AutoResetEvent(false);
        AutoResetEvent _waitForCaptureComplete = new AutoResetEvent(false);

        int C2hour = 13;
        int C2min = 7;
        int C2sec = 59;

        int Cmaxhour = 13;
        int Cmaxmin = 9;
        int Cmaxsec = 3;

        int C3hour = 13;
        int C3min = 10;
        int C3sec = 5; publicvoid Run()
        {
            int C2 = C2hour * 3600 + C2min * 60 + C2sec;
            int Cmax = Cmaxhour * 3600 + Cmaxmin * 60 + Cmaxsec;
            int C3 = C3hour * 3600 + C3min * 60 + C3sec;

            try { // Create manager object - make sure you have the correct MD3 file for your Nikon DSLR
//Type00##.md3の##が機種によって違う
                NikonManager manager = new NikonManager("Type0024.md3");

                // Listen for the 'DeviceAdded' event
                manager.DeviceAdded += manager_DeviceAdded;

                // Wait for a device to arrive
                _waitForDevice.WaitOne();

                while (true)
                {
                    int NowTime = Now(); //Console.WriteLine(NowTime);//Console.ReadLine();

                    if (NowTime < Cmax - 121 && (Cmax - NowTime) % 120 == 0)
                    {
                        //1EV間隔6段ブラケティング撮像
                        _ = Interval_Capture();
                    }
                    else if (NowTime > Cmax - 120 && NowTime == C2 - 15)
                    {
                        //連写指示のビープ音&連写終了待ち
                        Console.Beep(5000, 300);
                        System.Threading.Thread.Sleep(21000);

                        //多段階AEブラケティング
                        _ = AEBlacket_Capture();

                        //連写指示のビープ音&連写終了待ち
                        Console.Beep(5000, 300);
                        System.Threading.Thread.Sleep(21000);
                    }
                    else if (NowTime > C3 + 5 && (NowTime - Cmax) % 120 == 0)
                    {
                        //1EV間隔6段ブラケティング撮像
                        _ = Interval_Capture();
                    }

                    System.Threading.Thread.Sleep(200);

                }

                // Shutdown
                manager.Shutdown();
            }
            catch (NikonException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        static int Now()
        {
            DateTime dt = DateTime.Now;
            int hour = dt.Hour;
            int minute = dt.Minute;
            int second = dt.Second;
            int x = hour * 3600 + minute * 60 + second;
            return x;
        }

        //2分毎の1EV step 6段階撮像
        public int Interval_Capture()
        {
            //Set Sensitivity 100
            NikonEnum ISOSens = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity);
            ISOSens.Index = 2;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity, ISOSens);

            NikonEnum SpeedMode = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed);

            //1/2000-1/60sec 1EV間隔6段AEブラケティング撮影
            int i = 0;
            for (i = 35; i >= 25; i = i - 2)
            {
                //シャッター速度を指定
                SpeedMode.Index = i;
                _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);

                // Set number of continuous captures - in this case we want 1
                _device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1);

                // Hook up capture events
                _device.ImageReady += _device_ImageReady;
                _device.CaptureComplete += _device_CaptureComplete;

                // Capture
                _device.Capture();

                // Wait for the capture to complete
                _waitForCaptureComplete.WaitOne();
            }

            //set SS 1/500
            SpeedMode.Index = 31;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);


            return 0;
        }

        //多段階AEブラケティング撮像
        public int AEBlacket_Capture()
        {

            // Set shooting mode to 'continuous, highspeed'
            NikonEnum shootingMode = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_ShootingMode);
            shootingMode.Index = (int)eNkMAIDShootingMode.kNkMAIDShootingMode_CH;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShootingMode, shootingMode);

            //Set Sesitivity 800
            NikonEnum ISOSens = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity);
            ISOSens.Index = 8;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity, ISOSens);

            int i = 0;

            NikonEnum SpeedMode = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed);

            // SS2秒で地球照を撮像
            SpeedMode.Index = 11;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
            _device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1);
            _device.ImageReady += _device_ImageReady;
            _device.CaptureComplete += _device_CaptureComplete;
            _device.Capture();
            _waitForCaptureComplete.WaitOne();

            int C3 = C3hour * 3600 + C3min * 60 + C3sec;
            //多段階撮像開始
            while (true)
            {
                // SS 1/4000 - 1sec, 1.5EV step, 9段で多段階撮像する
                for (i = 37; i >= 13; i = i - 3)
                {
                    SpeedMode.Index = i;
                    _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);

                    // Set number of continuous captures - in this case we want 1
                    _device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1);

                    // Hook up capture events
                    _device.ImageReady += _device_ImageReady;
                    _device.CaptureComplete += _device_CaptureComplete;

                    // Capture
                    _device.Capture();

                    // Wait for the capture to complete
                    _waitForCaptureComplete.WaitOne();

                    // 時間調整
                    System.Threading.Thread.Sleep(750);

                }
                // 時刻をピックアップして次の連写に行けるかを判断、16秒以内ならC3用連写
                int NowTime = Now();
                if (NowTime > C3 - 17)
                {
                    break;
                }
            }

            // SS2秒で地球照を撮像
            SpeedMode.Index = 11;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
            _device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1); 
_device.ImageReady += _device_ImageReady; 
_device.CaptureComplete += _device_CaptureComplete; 
_device.Capture(); _waitForCaptureComplete.WaitOne(); 

//ダイヤモンドリング撮像の下準備//set SS 1/500
            SpeedMode.Index = 31;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);

            //Set Sensitivity 100
            ISOSens.Index = 2;
            _device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity, ISOSens);

            return 0;
        }


        void _device_ImageReady(NikonDevice sender, NikonImage image)
        {
            // Save captured image to disk
            string filename = "image" + _captureCount.ToString() + ((image.Type == NikonImageType.Jpeg) ? ".jpg" : ".nef");
            _captureCount++;

            using (FileStream s = new FileStream(filename, FileMode.Create, FileAccess.Write))
            {
                s.Write(image.Buffer, 0, image.Buffer.Length);
            }
        }

        void _device_CaptureComplete(NikonDevice sender, int data)
        {
            // Signal the the capture completed
            _waitForCaptureComplete.Set();
        }

        void manager_DeviceAdded(NikonManager sender, NikonDevice device)
        {
            if (_device == null)
            {
                // Save device
                _device = device;

                // Signal that we got a device
                _waitForDevice.Set();
            }
        }
    }

    class Program { staticvoid Main(string[] args)
        {
            DemoContinuousCapture demo = new DemoContinuousCapture();
            demo.Run();
        }
    }
}
inserted by FC2 system