Hur man gör Arduino-kontrollerade Intelligent Time-Lapse fotografering (3 / 4 steg)
Steg 3: Skriva koden
Installera Arduino IDE från arduino.cc om du inte redan har den. Öppna upp en ny skiss och klistra in denna kod i. Sammanställa det, ladda upp den och testa den.
/*
Ljuskänsligt och justerbar dynamiska Time-Lapse fotografi
Detta program och krets är utformade för att styra fotografering i tidsintervaller
Det är användaren kontrollerbar och lyhörd för omgivande ljuset nivåer.
Belysning på Soluppgång och solnedgång foto skott kan ibland vara svårt
för att förutse, så istället för att hamna med flera hundra helt svart
bilder, ett fotomotstånd sinnen ljusnivåer och därmed slutar eller börjar
fotografin. En potentiometer gör att användaren kan ställa in väntetiden mellan
fotografier och en multi digit seven-segment display visar aktuellt
dröjsmål värde.
Denna krets är utformad att användas med en infraröd fjärrutlösare. Jag
för detta en Nikon D3100, men någon annan DSLR med en fjärrkontroll bör
fungera lika bra. I denna krets fungerar en LED för närvarande som ersättare för
fjärrutlösare, men anpassa den för slutaren är bara en fråga om förbi
knappen på fjärrkontrollen och styra det med Arduino. Eftersom det
svårt att avgöra när en IR-sändare är aktiverad,
sju segment display blinkar varje gång en bild tas att informera den
användare av dess framsteg.
Eftersom många time-lapse entusiaster är intresserade av att lägga ett dynamiska element
till deras skott ingår jag funktioner för en servo-kontrollerade rigg
som kan ge kameran att rotera eller panorera över en scen.
Krets:
* Sju-segmentet displayen styrs av stift 2-8 och 10-12. Displayen
fungerar med varje siffra som en grund och varje segment som positiva bidrag.
Till exempel vill visa ett segment A på siffran 3, skulle Arduino ange pin 2,
som kontrollerar segmentet A till hög och pin 12, som är grunden för siffra 3,
till låg.
* Den LED, eller fjärrutlösare, är ansluten till stift 13 och GND.
* Servo är ansluten till 5V och GND och tar emot en signal från stift 9.
* Den fotomotstånd används i en spänning-dividera krets i samband med en 10kΩ
motstånd, och det läses av pin A0.
* Potentiometern läses av pin A1
Tack:
Firecgun's Instructables post på "Arduino 4 siffrig 7 segment display"
Den 9 december, 2013
av Holden Leslie-Bole
Jag förklarar denna kod allmän egendom.
*/
#include < Servo.h > / / Include servo biblioteket
Servo cameraServo; Skapa ett servo objekt kallas cameraServo
CONST int potPin = A1; Ställa in analoga pin A1 att läsa potentiometern
CONST int photoresistorPin = A0; Ställa in analoga pin A0 att läsa fotomotstånd
int potValue = 0;
Initiera potValue, den variabel som lagrar värdet potentiometer, noll
int photoresistorValue = 0;
Initiera photoresistorValue, den variabel som lagrar värdet fotomotstånd, noll
int shutterDelay = 0; Denna variabel lagrar användar-matas in fördröjningen mellan bilder
lång lastPicTime = 0; Den tid som den sista bilden togs
lång lastServoTime = 0; Tiden som servo senast drivs
lång timeLapseDuration = 900000;
För servo kalibrering - den förväntade tiden för fotograferingen (i millisekunder)
int servoPosition = 0; Servo är position i grader
Detta avsnitt tilldelar pin-koder till olika objekt på displayen
CONST int aPin = 2;
CONST int bPin = 3;
CONST int cPin = 4;
CONST int dPin = 5;
CONST int ePin = 6;
CONST int fPin = 7.
CONST int gPin = 8;
CONST int GND1 = 10;
CONST int GND2 = 11;
CONST int GND3 = 12;
CONST int shutterPin = 13. stift 13 kommer att kontrollera slutaren
int num; Numret som angetts av potentiometern
int dig2Value = 0;
int dig3Value = 0;
int brightnessDelay = 3; En försening av godtycklig kvantitet som styr bildskärmens ljusstyrka
Kör denna metod en gång när Arduino startar
void setup()
{
cameraServo.attach(9); Tilldela servo till pin 9
cameraServo.write(0); Initiera servo till 0
Ställa in displayen och slutartid stiften att produktionen
pinMode (aPin, OUTPUT);
pinMode (bPin, produktionen);
pinMode (cPin, produktionen);
pinMode (dPin, produktionen);
pinMode (ePin, produktionen);
pinMode (fPin, produktionen);
pinMode (gPin, produktionen);
pinMode (GND1, OUTPUT);
pinMode (GND2, OUTPUT);
pinMode (GND3, OUTPUT);
pinMode (shutterPin, produktionen);
Serial.BEGIN(9600); Detta är en användbar bit kod att hålla i för felsökning och testning
}
Kör denna metod kontinuerligt
void loop()
{
osignerade långa currentTime = millis(); Spåra hur länge Arduino har varit runnign
potValue = analogRead(potPin); Läs potentiometern och lagra den i potValue
NUM = karta (potValue, 0, 1023, 99, 0); Justera utdataområdet för att passa förseningen
shutterDelay = num * 1000;
Eftersom Arduinos naturliga time mätning är i millisekunder, konverterar detta num
i en fördröjning mellan bilder i millisekunder
dig2Value = num / 10; Använda heltal trunkering för att dig2Value TEN siffra
dig3Value = num - (dig2Value * 10); Aritmetiska som levererar de siffror
Ange skälen till hög
digitalWrite (GND1, hög);
digitalWrite (GND2, hög);
digitalWrite (GND3, hög);
Visa en d för försening på siffran en
digitalWrite (GND1, låg); Slå på den
d(); Se metod void d()
Delay(brightnessDelay); Vänta 3 ms så att du kan se det
digitalWrite (GND1, hög); Stänga av
digitalWrite (GND2, låg);
Number(dig2Value); Se number(int i) metod
Delay(brightnessDelay);
digitalWrite (GND2, hög);
digitalWrite (GND3, låg);
Number(dig3Value); Se number(int i) metod
Delay(brightnessDelay);
digitalWrite (GND3, hög);
servoPosition = cameraServo.read();
ServoPosition vara vad är för närvarande är i grader
photoresistorValue = analogRead(photoresistorPin); Läs fotomotstånd
IF(photoresistorValue > 100)
Prova olika värden för detta. Jag valde 100 bara baserat på experiment.
{
om (currentTime - lastPicTime > shutterDelay)
Bedöma om slutaren dröjsmål har förflutit sedan den senaste skärmdumpen
{
Ta bilden
digitalWrite (shutterPin, hög);
lastPicTime = currentTime;
Delay(200);
digitalWrite (shutterPin, låg);
}
Bedöma aktivitetens servo
om (currentTime - lastServoTime > timeLapseDuration/180 & & servoPosition < 180)
{
servoPosition ++;
cameraServo.write(servoPosition); Flytta servo
lastServoTime = currentTime;
}
}
}
Denna metod använder switch/fall notation för att anropa metoderna siffrorna i svar till ett heltal ingång
void number(int i) {
Switch(i) {
fall 1: one();
bryta;
fall 2: two();
bryta;
fall 3: three();
bryta;
fall 4: four();
bryta;
fall 5: five();
bryta;
mål 6: six();
bryta;
fall 7: seven();
bryta;
mål 8: eight();
bryta;
mål 9: nine();
bryta;
standard: zero();
bryta;
}
}
Denna metod visar d för försening
void d()
{
digitalWrite (aPin, låg);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, hög);
digitalWrite (ePin, hög);
digitalWrite (fPin, låg);
digitalWrite (gPin, hög);
}
Denna metod visas siffran en
void one()
{
digitalWrite (aPin, låg);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, låg);
digitalWrite (ePin, låg);
digitalWrite (fPin, låg);
digitalWrite (gPin, låg);
}
Denna metod visas siffran två
void two()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, hög);
digitalWrite (cPin, låg);
digitalWrite (dPin, hög);
digitalWrite (ePin, hög);
digitalWrite (fPin, låg);
digitalWrite (gPin, hög);
}
Denna metod visas siffran tre
void three()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, hög);
digitalWrite (ePin, låg);
digitalWrite (fPin, låg);
digitalWrite (gPin, hög);
}
Denna metod visas siffran fyra
void four()
{
digitalWrite (aPin, låg);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, låg);
digitalWrite (ePin, låg);
digitalWrite (fPin, hög);
digitalWrite (gPin, hög);
}
Denna metod visas siffran fem
void five()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, låg);
digitalWrite (cPin, hög);
digitalWrite (dPin, hög);
digitalWrite (ePin, låg);
digitalWrite (fPin, hög);
digitalWrite (gPin, hög);
}
Denna metod visas siffran sex
void six()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, låg);
digitalWrite (cPin, hög);
digitalWrite (dPin, hög);
digitalWrite (ePin, hög);
digitalWrite (fPin, hög);
digitalWrite (gPin, hög);
}
void seven()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, låg);
digitalWrite (ePin, låg);
digitalWrite (fPin, låg);
digitalWrite (gPin, låg);
}
Denna metod visas siffran åtta
void eight()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, hög);
digitalWrite (ePin, hög);
digitalWrite (fPin, hög);
digitalWrite (gPin, hög);
}
Denna metod visas siffran nio
void nine()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, hög);
digitalWrite (ePin, låg);
digitalWrite (fPin, hög);
digitalWrite (gPin, hög);
}
Denna metod visas siffran noll
void zero()
{
digitalWrite (aPin, hög);
digitalWrite (bPin, hög);
digitalWrite (cPin, hög);
digitalWrite (dPin, hög);
digitalWrite (ePin, hög);
digitalWrite (fPin, hög);
digitalWrite (gPin, låg);
}