« ココログで arduino sketchソースコード を少し見やすくするには・・・ | Main | Fritzing で使うBread board はインスペクターでサイズ変更できる »

04/09/2017

VC0706 で撮影し SDカード に記録する Arduino camera

VC0706シリアルカメラで撮影し、マイクロSDカードに記録するArduino Cameraが出来た。
Img_20170409_205846 Arduino_camera_with_vc0706_and_sdca
Arduinoのシールド基板に小さなブレッドボードを貼り付けて、その上に部品を配置してテストした(左の写真)が、Fritzingのブレッドボードで描いてみると右側の絵のようになる。
(注記:カメラの所にある2本の抵抗は、絵では220Ωになっているが、僕がFritzingを使いこなせないために、間違った表記になっている。この抵抗の値は2本とも10kΩである。)

これで撮影した写真は、上下逆転している!


Sketchは、Photo Spy Cam using Arduinoのものが大変参考になった。
各パーツとArduinoとの接続は下記のようになっている。
Arduino 
部品数が少ないので、Arduinoのシールドボードの上にミニブレッドボードを貼り付けて、部品を配置し左表のように結線した。

ここでVC0706は、秋月電子で購入した部品
micro-SDカードは、Amazonで購入


ここでは写真サイズを 640x480 としたが、このサイズにするとSDカードへの記録時間が極端に長くなるので注意を要する。テストの際は、320x240 ぐらいで始めるのが良いのではないだろうか。

.

/**
 * 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
 */

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

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

const int chipSelect = 9; // CS : connected to pin 9 of arduino
int photoSize = 2; // 0 -> 160x120 / 1 -> 320x240 / 2-> 640x480
unsigned long mainStartTime, mainEndTime, startTime, endTime;

void setup()
{
//activate 5V for the SD Card shield
  pinMode(8, OUTPUT);    // VCC : connected to pin 8 of arduino
  digitalWrite(8, HIGH); // SD Card power ON

  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(2500);

  Serial.println("Info: getting last pic num for the created files...");
  num = getNewSDFileNum();

  Serial.println("Info: Setup is DONE!");
}

void loop()
{
  mainStartTime = millis();
  takePic();
  mainEndTime = millis();
  Serial.print("Info: Main elapsed time (in secs): ");
  Serial.println((mainEndTime - mainStartTime) / 1000);
}

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
  cam.takePicture();
  delay(50);

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

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

// Create file
  testFile = SD.open(filename, FILE_WRITE);
//if it opens ok
  if (testFile)
  {
//save to file
    Serial.print("Info: Saving photo to SD: ");
    Serial.println(filename);
    
    startTime = millis();
    numOfBytes = cam.readData(testFile);
    endTime = millis();

    Serial.print("Info: Elapsed time (in secs): ");
    Serial.println((endTime - startTime) / 1000);

    Serial.print("Info: Bytes for photo: ");
    Serial.println(numOfBytes);
  }
  else  //else it didn't open ok
    Serial.println("Error: Error opening file on SD,");

//must close file to finish writing.
  testFile.close();
}

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;
}


《撮影した写真》
Pic_392逆さまに撮影されていた・・・








《参考にしたブログ》

1)Photo Spy Cam using Arduino
  このブログは同じVC0706カメラと、同じmicro-SDカードを使った事例だったので、大変勉強になった。
 この事例と私の場合のPin接続は違っているのでもし参考にされる場合には、その点を注意してください。

2)オッサンとバイエル、ピアノ等 「カメラで遊んでみる

 このブログも大変参考にさせて戴いた。



《使用部品》

1)小型TTLシリアルJPEGカメラ VC0706 
  [adafruit PRODUCT ID: 1386] 秋月電子で購入
2)

« ココログで arduino sketchソースコード を少し見やすくするには・・・ | Main | Fritzing で使うBread board はインスペクターでサイズ変更できる »

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


Listed below are links to weblogs that reference VC0706 で撮影し SDカード に記録する Arduino camera:

« ココログで arduino sketchソースコード を少し見やすくするには・・・ | Main | Fritzing で使うBread board はインスペクターでサイズ変更できる »

July 2019
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

無料ブログはココログ