« PIRで検知しVC0706で撮影、Ethernet ShieldのmicroSDに記録 | Main | TVリモコンを使ってArduinoに喋らせる »

04/28/2017

Deek-RobotのData logging shield V1.0を使ってArduino Spyカメラ

Ethernet Shield を使った通信がうまく行かないので、Deek-Robot の Data logging shield V1.0 を使ってこのシステムの小型化を図ってみた。写真のようにコンパクトに出来上がっているが、基本的な回路図は、前回のEthernet Shield を使ったものとほぼ同じで、違っているのは Deek-Robot の Data logging shield V1.0 の CSピンが10 なので、この変更を行っている。
4c4dcb61529951a4016055086123b004 Img_20170428_125755 Img_20170428_125816 Img_20170428_125902 コンパクトに納めるために、僕はシールドの中ほどに写真のように棚を設けて部品を配置した。



Img_20170428_205246 Img_20170428_205416Img_20170428_204948_2 一番下の階層は、Arduino UNOで、第二階層が Deek-Robot の Data logging shield V1.0 で、その空いたボード部分に、PIRセンサ(SainSMART製Pyroelectric Infrared PIR Motion Sensor Detector Module for Arduino)(保持時間:約8秒~15分以上、半固定抵抗[Tx]で調整、最大検知距離:7m(気温等の環境条件による)、半固定抵抗[Sx]で調整)、小型TTLシリアルJPEGカメラ(NTSCビデオ出力付 いわゆる VC0706 )[adafruit PRODUCT ID: 1386]、電子ブザー(PB04-SE12HPR)、LEDを配置した。


LEDについて、
写真左側の青いLEDは、PIRが検出中に点滅し、検出した際には点灯する。右側の赤いLEDはSDカードにデータを書き込み中に点灯する。書き込みが終われば消灯する。
半田付けしてから気づいたが、LEDの取付けはカメラの向く方向に足を曲げられるように配置すべきだった。また、電流が多く流れる為明るいが、少し省エネを狙い、10kΩの抵抗を入れた。後で直しておこう。


写真のファイル名称
は、
 PIC_X.JPG という名前で保存される。
 システムが稼働して第1枚目の写真が撮れない。タイミングの問題か?
 

SDカードは、
 手持ちの下記カードで書き込みOK
  microSD
 2GB
  SDHC ⑩ 4GB, 8GB
   
  で撮影出来た。
 写真の1枚当たりの容量は、320x240サイズの場合 約12KBである。



Img_20170519_161530 Img_20170519_162101左の写真のように、100均ショップでお弁当箱を購入してここにシステムとバッテリーを合わせて入れた。
当初、前述の写真にあるようにシステム全てを弁当箱の中に入れたが、このケースの蓋は約3㎜の厚みが有り、PIRセンサーが稼働してくれなかった。そのため、弁当箱の蓋の部分に穴を明けて、センサーの樹脂ドームのみ顔を出すように改造した。電池は18650 3200mA 2本を直列にして自立型で左写真の右側のように設置した。しかし、5~6時間ほど経過した後で設置場所を確認に行くと、検出ランプが停まってしまった。
システムに流れている電流値を測定すると、約135mAあり、約0.7Wの消費電力にあることがわかった。これでは約5時間しか持たなかったことが理解できる。このシステムで続ける場合、電源の容量をアップする必要がある。AC電源からとるようにするか、大容量のバッテリーに繋ぐか・・・検討する必要がありそうだ。


<<Sketch上の注意点>>

①Deek-Robot の Data logging shield V1.0のピン配置
  D10 - Chip Select これに合わせて前回のスケッチを修正した。
  D11 - SPI MOSI
  D12 - SPI MISO
  D13 - SPI SCK

②スケッチで読み込むライブラリーは、下記のみを「library」の中に置く事とする。
 ・JPEGCamera
     このライブラリーは、ここにあるので、zipファイルでダウンロードしてくること。
③シリアルモニターの通信速度(シリアルモニターの画面右下部)は、38400bpsに設定すること。

④Warningメッセージは出るが放置。システムの稼働には問題無いようだ・・・。

⑤僕が使っているPIRは、前述したものだが、SxとTxの調整によっては、このスケッチで旨く動かない可能性もある。
 僕は、Sxを右一杯近くまで回し、抵抗値は凡そ620kΩの辺りに、ただし、検出できる距離がどの程度になっているかは、調べることが出来なかった。
 Txはセンサーの保持時間を決めるもので、Tx ≒ 24567×R10×C6(=0.01μF) の計算式で計算できる。僕は半固定抵抗を左回りにほぼ一杯近くまで回して、約820Ωの値にした。Txは約0.2秒になる。

それで、下記のスケッチのPIRによる検出部分周辺を一部書き直した。(2017/05/21)


<<Skech>>
/**
 * VC0706 Camera Module Arduino Compatible:
 *  + cvbs: N/A
 *  + 5V: connected to arduino => pin 5V0
 *  + TX (OUT): connected to the RX (IN) of arduino => pin 2
 *  + RX (IN): connected to the TX (OUT) of arduino => pin 3
 *  + GND: connected to the GND
 *  set the serial monitor 38400bps when use it
 *  PIR sensor: connected to arduino => pin 6 
 */

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>
#include <JPEGCamera.h>

const int chipSelect = 10;  // I changed this CS value
int pirPin     =  6;  // PIR sensor
int pirState =  LOW;  // states of PIR at the initial
int buzzerPin  =  5;
int ledPin1    =  8;  // PIR LED Flashing(ready) ⇒ Lighting(detected)
int ledPin2    =  7;  // SD Light off ⇒ Lighting(busy)

File testFile;
SoftwareSerial s(2, 3);
JPEGCamera cam(s);
char filename[15];
int num = 0;
int numOfBytes;

int photoSize = 1; // 0 -> 160x120 / 1 -> 320x240 / 2-> 640x480
unsigned long mainStartTime, mainEndTime, startTime, endTime;

void setup()
{
//activate 5V for the SD Card shield
  Serial.begin(38400);
  Serial.println("Start of SPY Camera SetUp");
  pinMode(   pirPin,  INPUT); 
  pinMode(  ledPin1, OUTPUT); 
  pinMode(  ledPin2, OUTPUT); 
  pinMode( buzzerPin,OUTPUT);
  digitalWrite(ledPin1, LOW);       // LED:OFF
  digitalWrite(ledPin2, LOW);       // LED:OFF
  
  Serial.begin(38400);
// Wait for the serial port to be opened
   while (!Serial) delay(25);
 
//check SD card
  while (!SD.begin(chipSelect))
    {
      Serial.println("Error: SD initialization failed. Is SD card in the card folder?");
    }
      Serial.println("Info: SD Initialization complete,");

// Serial port connected to the cam
    s.begin(115200); //for VC0706 cam
    delay(50);

    Serial.println("Info: Reseting cam...");
// reset cam and wait.
    cam.reset();
    delay(3000);

    Serial.println("Info: Changing baud rate...");
// change baud rate to work at 3.3v
    cam.chBaudRate(2);// 0 -> 9600 / 1 -> 19200 / 2 ->  38400 / 3 -> 57600 / 4 -> 115200
    delay(50);
  
//change serial to match new camera baud rate
    s.end();
    s.begin(38400);
    delay(50);

  Serial.println("Info: Changing picture size...");
//change picture size
  cam.chPictureSize(photoSize);
  delay(50);

  Serial.println("Info: getting last pic num for the created files...");
  num = getNewSDFileNum();
  Serial.println("Info: Setup is DONE!");
  Serial.println("Start Detecting");
}

void loop()
{
  while(digitalRead(pirPin) == LOW )
  {
    digitalWrite( ledPin1, HIGH);
    delay(100);
    digitalWrite( ledPin1,  LOW);
    delay(100);
  }

  pirState = digitalRead(pirPin);   // read the state of PIR sensor
   digitalWrite(  ledPin1, HIGH);   // LED :ON
   digitalWrite(buzzerPin, HIGH);   // Warnig Buzzer ON                         
   Serial.println("Some movements were detected!");
   takePic();
}

void takePic()
{
  Serial.println("Info: Preparing to take new photo.");

// must call stopPictures before a new photo is taken.
  cam.stopPictures();
  delay(50);

// take photo
  digitalWrite(buzzerPin,  LOW);   // Buzzer OFF
  digitalWrite(  ledPin1,  LOW);   // LED:OFF 
  cam.takePicture();
  delay(50);

  num++;
  sprintf(filename, "PIC_%i.JPG", num);

  if (SD.exists(filename)) {
    SD.remove(filename);
  }

// Create file
  digitalWrite( ledPin2, HIGH);     // LED :ON  
  testFile = SD.open(filename, FILE_WRITE);
  
//save to file
    Serial.print("Info: Saving photo to SD: ");
    Serial.println(filename);
    
    numOfBytes = cam.readData(testFile);

    Serial.print("Info: Bytes for photo: ");
    Serial.println(numOfBytes);

//must close file to finish writing.
  testFile.close();
    digitalWrite( ledPin2,  LOW);     // LED:OFF
    Serial.println("Info: saved picture that detected!");
}

int getNewSDFileNum() {
  File root = SD.open("/");
  int n = getFileLastNumForDirectory(root);

  root.close();
  return n > 0 ? n : 0;
}

int getFileLastNumForDirectory(File dir) {
  int n = 0;
  int fn = 0;

  while (true) {
    File entry =  dir.openNextFile();

    if (!entry) {
// no more files
      break;
    }

    fn = 0;

    if (entry.isDirectory()) {
      //fn = prepareFileLastNumForDirectory(entry);//no need to be recursively
    }
    else {
      String name = String(entry.name());

      if (name.startsWith("PIC_") && name.endsWith(".JPG")) {
        int pos = name.indexOf(".JPG");
        name = name.substring(4, pos);

        if (isValidNumber(name))
          fn = name.toInt();
      }
    }

    if (fn > n) {
      n = fn;
    }

    entry.close();
  }

  return n;
}

boolean isValidNumber(String str) {
  if (str && str.length() > 0) {
    for (byte i = 0; i < str.length(); i++)
    {
      if (!isDigit(str.charAt(i))) return false;
    }
    return true;
  }
  return false;
}

« PIRで検知しVC0706で撮影、Ethernet ShieldのmicroSDに記録 | Main | TVリモコンを使ってArduinoに喋らせる »

PC and PC troubles」カテゴリの記事

Comments

Post a comment

Comments are moderated, and will not appear on this weblog until the author has approved them.

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/540128/65208969

Listed below are links to weblogs that reference Deek-RobotのData logging shield V1.0を使ってArduino Spyカメラ:

« PIRで検知しVC0706で撮影、Ethernet ShieldのmicroSDに記録 | Main | TVリモコンを使ってArduinoに喋らせる »

October 2017
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Recent Trackbacks

無料ブログはココログ