Symaマルチコプターのカメラの制御方法は、前記事を参照してください。
○回路・配線図
○プログラム(スケッチ)
※FlexiTimer2をインストールしてください。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <FlexiTimer2.h> | |
//the time we give the sensor to calibrate (10-60 secs according to the datasheet) | |
int calibrationTime = 30; | |
//the time when the sensor outputs a low impulse | |
long unsigned int lowIn; | |
//the amount of milliseconds the sensor has to be low | |
//before we assume all motion has stopped | |
long unsigned int pause = 5000; | |
boolean lockLow = true; | |
boolean takeLowTime; | |
int pirPin = 3; //the digital pin connected to the PIR sensor's output | |
int cameraPin = 13; | |
int swPin = 2; | |
bool mode; | |
int pulese; | |
void shootPules() { | |
digitalWrite(cameraPin, LOW); | |
FlexiTimer2::stop(); | |
} | |
//SETUP | |
void setup(){ | |
Serial.begin(9600); | |
pinMode(swPin, INPUT_PULLUP); | |
pinMode(pirPin, INPUT); | |
pinMode(cameraPin, OUTPUT); | |
digitalWrite(pirPin, LOW); | |
// SW ON(HIGH):VIDEO | |
// SW OFF(LOW):STILL | |
if (digitalRead(swPin) == HIGH) { | |
mode = 1; | |
pulese = 500; | |
pause = 30000; // 30sec | |
} else { | |
mode = 0; | |
pulese = 100; | |
pause = 5000; // 5sec | |
} | |
FlexiTimer2::set(pulese, shootPules); | |
//give the sensor some time to calibrate | |
Serial.print("calibrating sensor "); | |
for(int i = 0; i < calibrationTime; i++){ | |
Serial.print("."); | |
delay(1000); | |
} | |
Serial.println(" done"); | |
Serial.println("SENSOR ACTIVE"); | |
delay(50); | |
} | |
//LOOP | |
void loop(){ | |
if(digitalRead(pirPin) == HIGH){ | |
if(lockLow){ | |
digitalWrite(cameraPin, HIGH); | |
FlexiTimer2::start(); | |
//makes sure we wait for a transition to LOW before any further output is made: | |
lockLow = false; | |
Serial.println("---"); | |
Serial.print("motion detected at "); | |
Serial.print(millis()/1000); | |
Serial.println(" sec"); | |
delay(50); | |
} | |
takeLowTime = true; | |
} | |
if(digitalRead(pirPin) == LOW){ | |
if(takeLowTime){ | |
lowIn = millis(); //save the time of the transition from high to LOW | |
takeLowTime = false; //make sure this is only done at the start of a LOW phase | |
} | |
//if the sensor is low for more than the given pause, | |
//we assume that no more motion is going to happen | |
if(!lockLow && millis() - lowIn > pause){ | |
//makes sure this block of code is only executed again after | |
//a new motion sequence has been detected | |
lockLow = true; | |
Serial.print("motion ended at "); //output | |
Serial.print((millis() - pause)/1000); | |
Serial.println(" sec"); | |
// Stop Recording | |
if (mode) { | |
digitalWrite(cameraPin, HIGH); | |
FlexiTimer2::start(); | |
} | |
delay(50); | |
} | |
} | |
} |
スライドスイッチで静止画/動画モードを切り替えます(要リセット)。
0 件のコメント:
コメントを投稿