Astrofotografie & de Nikon D5600 – Astrograaf

Om de eerste stappen op het gebied van de astrofotografie te zetten eerst ook maar eenvoudig beginnen: foto’s maken met een camera van de bewegingen van de sterren rondom de Poolster (waarover later meer). Ik heb het systeempje de Astrograaf genoemd.

Hiervoor maar weer eens de ESP32 C3 Super mini uit de kast gehaald. De module is lekker klein en meer dan voldoende voor de dingen die er gedaan moeten worden. Een OLED aangesloten op de I2C aansluitingen (SDA = GPIO8, SCL = GPIO9), eventueel een paar knoppen, en/of een rotary encoder, voor de bediening (GPIO0 t/m GPIO3) en een pin om de camerasluiter via een optocoupler te bedienen (GPIO5). Het programma moet de volgende functionaliteit bieden.

– bepalen van het aantal foto’s en van de belichtingstijd per foto,
– camera aansturen (Nikon D5600),
– instelmenu tonen op een OLED-scherm, tevens tonen van de resultaten tussendoor.

In het programma van de Stacker zat veel van de functionaliteit die hier gewenst is, dus daarom dat programma maar als basis gebruikt.

De pin-out van de ESP32-C3
Principe schema van de Astrograaf.

In het ontwerp van de Stacker heb ik gebruik gemaakt van een aantal knoppen om door de menu’s te wandelen. Nu wil ik gebruik gaan maken van een rotary encoder (met misschien nog een paar knoppen ernaast).
Voor de aansturing van de camera maak ik, zoals bij de Stacker, gebruik van het kabeltje, inclusief connector, van een MC-DC2-afstandbediening van Nikon. Dit is een bijzonder eenvoudig apparaatje, maar toch heb ik prijzen gezien variërend van €8 tot €44!! Een tijd geleden heb ik er bij Ali twee gekocht voor elk €1,90. Uiteindelijk gaat het alleen om de 8-pins connector: natuurlijk een eigen ontwerp van Nikon. Door het indrukken van de knop op de afstandsbediening worden de pinnen 5 en 6 verbonden met de Gnd (pin 3): het resultaat is dat de sluiter van de camera bediend wordt.

Na bepaling van het aantal te maken foto’s en de belichtingstijd per foto wordt het ‘programma’ gestart. Via GPIO-pin 5 wordt, via de optocoupler EL817 de camera aangestuurd: de samengevoegde zwarte (FOCUS) en rode draad (SHUTTER) worden naar Gnd getrokken.

Afstandsbediening met optocoupler

In bovenstaand schema de juiste weerstand tussen GPIO5 en pin1 van de optocoupler. In eerste instantie had ik per ongeluk een 10K weerstand ingezet. Dat moest een 1K exemplaar zijn. Daarmee werkte het prima.

Testen van de optocoupler: met 1K (i.p.v. 10K) weerstand werkt het!

Ik had bedacht om de bediening nu eens met een rotary encoder te doen, toch maar besloten om vier knopjes te gebruiken om door de menu’s te wandelen.

Deze dus niet gebruikt.
Een OLED 0,91″ – 128×32 pixels en 4 knopjes wél gebruikt.
En het uiteindelijke resultaat.

Met de vier knopjes zijn de menu’s te doorlopen.

  1. Bepaal het aantal foto’s.
  2. Bepaal de belichtingstijd van de foto’s.
  3. Scherm wissen en uitschakelen.
  4. Start fotosessie.

En nu een mooie heldere avond om de sterrensporen te ‘kieken’.

Hieronder voor de volledigheid nog de Arduino sketches van het programma: versie 5 inmiddels.

// Astrograaf 2025
// 

#include "Arduino.h"
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

/*
// Voor de encoder:
#define encoderOutA 20 // CLK
#define encoderOutB 21 // DT
int counter = 0;
int State;
int old_State;
//
*/

#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;

const int sluiterPin = 5;					// GPIO5
int test_num;

// Volgende variabelen t.z.t. opslaan in config-bestand
// Met 200 foto's met elk een belichtingstijd van 30 seconden duurt één sessie: 6000s = 100 minuten
// Met 200 foto's met elk een belichtingstijd van 20 seconden duurt één sessie: 4000s = 66,7 minuten
// Met 50 foto's met elk een belichtingstijd van 20 seconden duurt één sessie: 1000s = 16,7 minuten - goed voor de testfase
// Met 10 foto's met elk een belichtingstijd van 20 seconden duurt één sessie: 200s = 3,3 minuten - goed voor de testfase

int belichtingstijd = 10;                  // duur van de sluiter-puls naar de camera in ses: 20 - 30s
int aantal_fotos = 100;                    // aantal foto's te nemen: 200
int pauze = 2000;                          // aantal ms rust tussen foto's
int j;

// Knoppen voor het menu
int k1_Btn = 0;								// GPIO0
int k2_Btn = 1;								// GPIO1
int k3_Btn = 2;								// GPIO2
int k4_Btn = 3;								// GPIO3
int prog_keuze;


void setup() {
  
  // Buttons
  pinMode (k1_Btn, INPUT_PULLUP);
  pinMode (k2_Btn, INPUT_PULLUP);
  pinMode (k3_Btn, INPUT_PULLUP);
  pinMode (k4_Btn, INPUT_PULLUP); 
  
  pinMode (sluiterPin, OUTPUT);
  digitalWrite(sluiterPin, LOW);
   
  Wire.begin(8,9);								 // SDA = GPIO8, SCL = GPIO9
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.set400kHz();  
  oled.setFont(Adafruit5x7);  
  oled.clear(); 

  oled.print("Astrograaf_v5.ino");
  delay(2000);
  oled.clear();
}

void loop()
{
  // Initialisatie fase - nader in te vullen
  // opstart();      // Bepaal wat er allemaal initieel gedaan moet worden

  // Knop1
  int k1_Status = digitalRead(k1_Btn);
  if (k1_Status == LOW){
    oled.clear();
    oled.print("Knop 1 - ");
    oled.println("Aantal foto's");
    delay(1500);
    bepaalAantalFotos();
  }

  // Knop2
  int k2_Status = digitalRead(k2_Btn);
  if (k2_Status == LOW){
    oled.clear();
    oled.print("Knop 2 - Belichting");
    delay(1500);
    bepaalBelichtingstijd();
  }

  // Knop3
  int k3_Status = digitalRead(k3_Btn);
  if (k3_Status == LOW){
    oled.clear();
    oled.println("Knop 3 - Proefafdruk");
    oled.println("Belichtingstijd is ");
    oled.print(belichtingstijd);
    oled.println(" seconden");
    afdrukken();
    delay(1500);
    oled.clear();
  }
  
  // Knop4
  int k4_Status = digitalRead(k4_Btn);
  if (k4_Status == LOW){
    oled.clear();
    oled.print("Knop 4 - Start programma");
    delay(1500);
    starten();
  } 
}
void afdrukken(){
    // SluiterPin = Aan
    digitalWrite(sluiterPin, HIGH);
	  delay(belichtingstijd*1000);				// Wacht het aantal ms van de belichtingstijd.
    digitalWrite(sluiterPin, LOW);
}


void bepaalAantalFotos(){
  oled.clear();
  oled.println("Aantal foto's ");
  oled.println("+10 = knop 1");
  oled.println("-10 = knop 2");

  oled.println("Bevestig met knop 4");


  int i=0;
  do {
  // Knop 1
  int k1_Status = digitalRead(k1_Btn);
  if (k1_Status == LOW){
    aantal_fotos = aantal_fotos+10;                                        // Verhoog aantal te nemen foto's
    oled.clear();
    oled.print("Aantal foto's is ");
    oled.println(aantal_fotos);
    delay(500);
  }

  // Knop 2
  int k2_Status = digitalRead(k2_Btn);
  if (k2_Status == LOW){
    aantal_fotos = aantal_fotos-10;                                        // Verminder aantal te nemen foto's
    oled.clear();
    oled.print("Aantal foto's is ");
    oled.println(aantal_fotos);
    delay(500);
  }

    // Tweede rij, knop4 - k4
  int k4_Status = digitalRead(k4_Btn);
  if (k4_Status == LOW){
    oled.clear();
    oled.println("Aantal foto's is");
    oled.println("vastgelegd");
    delay(1500);
    oled.clear();
    i=1;                                                  // Keuze is gemaakt
  }
  
  } while (i==0);
  
  delay(200);
}


void bepaalBelichtingstijd(){
  oled.clear();
  oled.println("Bepaal belichtingstijd ");
  oled.println("+1s = knop 1");
  oled.println("-1s = knop 2");

  oled.println("Bevestig met knop 4");

  int i=0;
  do {
  // Knop 1
  int k1_Status = digitalRead(k1_Btn);
  if (k1_Status == LOW){
    belichtingstijd = belichtingstijd+1;                                        // Verhoog aantal te nemen foto's
    oled.clear();
    oled.print("Belichtingstijd is ");
    oled.println(belichtingstijd);
    delay(500);
  }

  // Knop 2
  int k2_Status = digitalRead(k2_Btn);
  if (k2_Status == LOW){
    belichtingstijd = belichtingstijd-1;                                        // Verminder aantal te nemen foto's
    oled.clear();
    oled.print("Belichtingstijd is ");
    oled.println(belichtingstijd);
    delay(500);
  }

    // Tweede rij, knop4 - k4
  int k4_Status = digitalRead(k4_Btn);
  if (k4_Status == LOW){
    oled.clear();
    oled.println("Belichtingstijd is");
    oled.println("vastgelegd");
    delay(1500);
    oled.clear();
    i=1;                                                  // Keuze is gemaakt
  }
  
  } while (i==0);
  
  delay(200);
}


void starten() {
  oled.println("Start programma!");

  oled.print("Er worden ");
  oled.print(aantal_fotos);
  oled.println(" foto's gemaakt.");
  
  oled.print("Belichtingstijd ");
  oled.print("is ");
  oled.print(belichtingstijd);
  oled.println("s");

  oled.print("Sessie duurt ");
  oled.print((aantal_fotos*belichtingstijd)+((aantal_fotos-1)*(pauze/1000)));
  oled.print("s");

  delay(1500);
  
  //Serial.print("Het aantal foto's is ");				// Tijdens testfase
  //Serial.println(aantal_fotos);				        // Tijdens testfase
    
  for (j=1;j<aantal_fotos+1;j++)              
  {
    oled.clear();
    //oled.print("Nog ");
    oled.print(aantal_fotos-j);
    oled.print(" foto's te gaan");
    
    afdrukken();                                  // Bedien sluiter 
    delay(pauze);                                 // in config
    
    int k3_Status = digitalRead(k3_Btn);
    if (k3_Status == LOW){     
      break;                                      //Onderbreekt het programma wanneer knop 4 ingedrukt wordt tijdens het foto's maken
    }
  }
  
  oled.clear();
  oled.println("Programma is gereed");
  oled.println("In totaal ");
  oled.print(j);
  oled.println(" foto's gemaakt");
  
  delay(3000);
  oled.clear();
}

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.