Arduinoで作るカメラタイマー②

Arduinoで作るカメラタイマー(I/Oピン一つで読み取れるキーパッド版)

カメラタイマーを使って星景写真を撮るんだけど、
星景写真を撮る以上、当然暗いわけで、よくあるリモートタイマーだと暗闇で操作しにくいし、そんなに機能は必要ない。
そこで、一番安上がりそうなAruduinoを使ったカメラタイマー作成に挑戦。
HPをググれば同じようなのはいっぱいあるので、備忘録的にUp。

次はしなぷすのハード製作記の「I/Oピン一つで読めるキーパッド」を使ったもの。

これがソースコード、稚拙なのは言いっこなしで!

#include <LiquidCrystal.h>
#include <ResKeypad.h> // キーを読み取るためにResKeypadライブラリを使う

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

const int AIN = A0; // キーの読み取りに使用するアナログ入力ピン
const int KeyNum = 9; // 読み取るキーの個数
PROGMEM const int threshold[KeyNum] = { // 入力電圧の閾値
// 次の数列は、しなぷすのハード製作記の回路設計サービスで計算したものをGUMにより編集
120, 220, 350, 450, 550, 650, 750, 850, 950
};

ResKeypad keypad(AIN, KeyNum, threshold); //以後keypadオブジェクトを使って、スイッチの読み取りができる

unsigned long PreShotTime=3000; //撮影開始の待ち時間(秒)
int ShotNo=5; //撮影枚数(枚)
unsigned long IntTime=5000; //撮影間隔(秒)
unsigned long ShotTime=60000; //撮影時間(秒)
unsigned long TimeS; //開始時間
unsigned long TimeN; //今の時間
unsigned long TimeE; //終了時間
unsigned long InTTN; //今のインターバル時間
unsigned long InTTS; //今のインターバル開始時間
unsigned long InTTE; //今のインターバル終了時間
int SoTN; //今の撮影枚数
int BrkSW=0; //途中やめのフラグ
int SotNoMem=0; //LCD書き換えのためのメモリ
unsigned long SotTMem=0; //LCD書き換えのためのメモリ
unsigned long IntTMem=0; //LCD書き換えのためのメモリ

void setup() {
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);

//Serial.begin( 9600 );

// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(1, 0);
lcd.print(“Interval Timer”);
lcd.setCursor(4, 1);
lcd.print(“v180309”);
delay(3000);
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
}

void loop() {
// 押されたスイッチの番号(0~KeyNum-1)を取得する
// スイッチが押されるまでWaitForKey関数から返ってこない
int key = keypad.WaitForKey();
int key_value = analogRead(0);

BrkSW=0;

switch (key+1) {
case 1: //shot stop
ShutterOFF();
BrkSW=1;
break;

case 2: { //test shutter 30sec
TimeS=millis();
TimeN=millis();
TimeE=TimeS+30000;
BrkSW=0;

ShutterON();
while(TimeN<TimeE){
LcdOut(1, 0,TimeE-TimeN, “TS”, 30000);

key_value = analogRead(0);
if (key_value<120){
ShutterOFF();
BrkSW=1;
break;
}
TimeN=millis();
}
ShutterOFF();
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;
}

case 3: { //shot start

SoTN=1;
BrkSW=0;

InTTS=millis();
InTTE=InTTS+PreShotTime;
InTTN=millis();
ShutterOFF();

while(InTTN<InTTE){
//プレインターバルタイムの処理
LcdOut(ShotNo, InTTE-InTTN, ShotTime, “RP”, ShotTime);
key_value = analogRead(0);
if (key_value<120){
BrkSW=1;
break;
}
InTTN=millis();
}

for(int i=1; i<=ShotNo; i++){ //繰り返し撮影の処理
if (BrkSW==1){
break;
}

TimeS=millis();
TimeN=millis();
TimeE=TimeS+ShotTime;
LcdOut(ShotNo-SoTN+1, IntTime, ShotTime, “RS”, ShotTime);

ShutterON();
while(TimeN<TimeE){ //撮影中の処理
if (BrkSW==1){
ShutterOFF();
break;
}

LcdOut(ShotNo-SoTN+1, IntTime, TimeE-TimeN, “RS”, ShotTime);

key_value = analogRead(0);
if (key_value<120){
ShutterOFF();
BrkSW=1;
break;
}
TimeN=millis();
}

InTTS=millis();
InTTE=InTTS+IntTime;
InTTN=millis();
ShutterOFF();

while(InTTN<InTTE){
//インターバルタイムの処理
if (BrkSW==1){
break;
}
if (ShotNo==SoTN){ //最後の撮影ではインターバルタイムを止める
break;
}
LcdOut(ShotNo-SoTN+1, InTTE-InTTN, ShotTime, “RI”, ShotTime);
key_value = analogRead(0);
if (key_value<120){
BrkSW=1;
break;
}
InTTN=millis();
}
SoTN=SoTN+1;
}

LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;
}

case 4: //shutter time up
BrkSW=0;
if (ShotTime>1 && ShotTime<1000){
ShotTime=1000;
}
else if (ShotTime<10000){
ShotTime=ShotTime+1000;
}
else if (ShotTime<90000){
ShotTime=ShotTime+10000;
}
else{
ShotTime=ShotTime+30000;
}
//Serial.println(ShotTime);
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;

case 5: //shutter time down
BrkSW=0;
if (ShotTime>1 && ShotTime<1100){
ShotTime=50;
}
else if (ShotTime<11000){
ShotTime=ShotTime-1000;
}
else if (ShotTime<120000){
ShotTime=ShotTime-10000;
}
else{
ShotTime=ShotTime-30000;
}

//if (ShotTime<1000){
// ShotTime=100;
//}
//Serial.println(ShotTime);
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;

case 6: //intv up
BrkSW=0;
if (IntTime<20000){
IntTime=IntTime+1000;
}
else
{
IntTime=IntTime+10000;
}

LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;

case 7: //intv down
BrkSW=0;
if (IntTime<30000){
IntTime=IntTime-1000;
}
else
{
IntTime=IntTime-10000;
}
if (IntTime<2000){
IntTime=2000;
}
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;

case 8: //count No up
BrkSW=0;
if (ShotNo<20){
ShotNo=ShotNo+1;
}
else
{
ShotNo=ShotNo+10;
}
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;

case 9: //count No down
BrkSW=0;
if (ShotNo<30){
ShotNo=ShotNo-1;
}
else
{
ShotNo=ShotNo-10;
}
if (ShotNo<1){
ShotNo=1;
}
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;

default:
BrkSW=0;
LcdOut(ShotNo, IntTime, ShotTime, “”, ShotTime);
break;
}
}

void LcdOut(int NoS, unsigned long ItT, unsigned long StT, String MD, unsigned long ShotModeT){
int DisRefSW=0;
if (NoS!=SotNoMem){
DisRefSW=DisRefSW+1;
}

if (int(ItT/1000)!=IntTMem){
DisRefSW=DisRefSW+1;
}

if (int(StT/1000)!=SotTMem){
DisRefSW=DisRefSW+1;
}

if (DisRefSW!=0){
lcd.setCursor(0, 0);
lcd.print(“Shot INT Exp MS”);
lcd.setCursor(0, 1);
lcd.print(” “);
lcd.setCursor(0, 1);
lcd.print(NoS);
lcd.setCursor(5, 1);
lcd.print(int(ItT/1000));
lcd.setCursor(9, 1);
if (ShotModeT<1000){
lcd.print(0.05);
}
else{
lcd.print(int(StT/1000));
}
lcd.setCursor(14, 1);
lcd.print(MD);
SotNoMem=NoS;
IntTMem=int(ItT/1000);
SotTMem=int(StT/1000);
}
}

void ShutterON(){
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
}

void ShutterOFF(){
digitalWrite(5,LOW);
digitalWrite(6,LOW);
}