Thứ Sáu, 22 tháng 12, 2017

Phát hiện chuyển động Camera chụp lại ảnh người đi qua sau đó lưu vào thẻ nhớ.

Arduino kết hợp với Camera RS232 PTC06, Cảm biến chuyển động PIR và Module đọc/ghi thẻ nhớ Micro SD.
1. Giới thiệu:
Đề tài: Nghiên cứu và thiết kế thi công mạch điều khiển Camera giám sát bằng Arduino.
Đây cũng là đề tài mình nghiên cứu đồ án môn học, mặc dù không thành công lắm, nhưng vẫn chia sẽ cho mọi người.
***Nhược điểm: Camera chụp ảnh mờ, chứ mô hình hoạt động khá tốt.
2. Thực hiện thôi nào:
Bước 1: Kết nối phần cứng như sơ đồ nguyên lí.

Bước 2: Thư viện hỗ trợ: Các thư viện bên dưới tùy phiên bản IDE có phiên bản sẽ có sẵn, có phiên bản sẽ không có. Nếu không có các bạn tìm trên google và tải xuống thêm vào.
1. Softwareserial
2. Newsoftwareserial
3. SD
4. SPI
Tải thư viện hỗ trợ cho Camera RS232 PTC06 theo link bên dưới:

http://www.mediafire.com/file/tfnpzimuxjst0y6/Adafruit-VC0706-Serial-Camera-Library-master.zip

Bước 3: Copy đoạn code mẫu sau dán vào IDE.
Bươc 4: Biên dịch chương trình và đổ xuống phần cứng chạy thực  nghiệm.

***Chú ý: Nếu Arduino không nhận Camera trên Serial Port máy tính, thì chỉnh lại thư viện trong Cpp.
***Lưu đồ giải thuật:

CODE:
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>      
#define chipSelect 10

SoftwareSerial cameraconnection = SoftwareSerial(2, 3); // 2-tx and 3-rx
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

void setup() {
pinMode(8,INPUT_PULLUP);
pinMode(6,OUTPUT);
#if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  if(chipSelect != 53) pinMode(53, OUTPUT); // CS trên Mega
#else
  if(chipSelect != 10) pinMode(10, OUTPUT); // CS trên UNO
#endif
#endif

  Serial.begin(9600);
  Serial.println("Kiểm tra Camera chụp!");

  // Tìm kiếm thẻ nhớ, nếu thẻ tồn tại có thể khởi tạo
  if (!SD.begin(chipSelect)) {
    Serial.println("Thẻ hỏng hoặc không tồn tại");
  // Nếu thẻ hỏng thì dừng lại
    return;
  }
}


void loop() {

  if ( digitalRead (8) > 0 )
  {
    digitalWrite(6,HIGH);
    // Thử tìm Camera
  if (cam.begin()) {
    Serial.println("Tìm kiếm Camera:");
  } else {
    Serial.println("Không tìm được Camera?");
    return;
  }
  // In thông tin của Camera
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Phiên bản hỏng");
  } else {
    Serial.println("-----------------");
    Serial.print(reply);
    Serial.println("-----------------");
  }

  // Đặt kích thước hình ảnh 640x480, 320x240 hoặc 160x120
  // Kích thước ảnh càng lớn tốn nhiều thời gian truyền tệp

  //cam.setImageSize(VC0706_640x480);        // Lớn nhất
  //cam.setImageSize(VC0706_320x240);        // Trung bình
  cam.setImageSize(VC0706_160x120);          // Nhỏ

  // Đọc kích thước ảnh từ Camera
  uint8_t imgsize = cam.getImageSize();
  Serial.print("Kích thước ảnh: ");
  if (imgsize == VC0706_640x480) Serial.println("640x480");
  if (imgsize == VC0706_320x240) Serial.println("320x240");
  if (imgsize == VC0706_160x120) Serial.println("160x120");

  Serial.println("Chụp trong...");
  delay(250);

  if (! cam.takePicture())
    Serial.println("Chụp hỏng!");
  else
    Serial.println("Ảnh đã được chụp!");

  // Tạo một hình ảnh với tên theo mẫu IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE00.JPG");
  for (int i = 0; i < 100; i++) {
    filename[5] = '0' + i/10;
    filename[6] = '0' + i%10;
    // Tạo nếu không tồn tại, không mở hiện tại, viết, đồng bộ sau khi viết
    if (! SD.exists(filename)) {
      break;
    }
  }

  // Mở file để viết
  File imgFile = SD.open(filename, FILE_WRITE);

  // Nhận kích thước hình ảnh đã chụp
  uint16_t jpglen = cam.frameLength();
  Serial.print("Đang lưu...");
  Serial.print(jpglen, DEC);
  Serial.print(" byte image.");

  int32_t time = millis();
  // Đọc tất cả dữ liệu
  byte wCount = 0; // Đang đếm
  while (jpglen > 0) {
   // Đọc 64 byte ở một thời điểm
    uint8_t *buffer;
    uint8_t bytesToRead = min(64, jpglen); // Thay đổi từ 32 đến 64 cho một tốc độ nhưng có thể không làm việc với tất cả các thiết lập!
    buffer = cam.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    if(++wCount >= 64) {
      Serial.print('.');
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();
  digitalWrite(6, LOW);
  time = millis() - time;
  Serial.println("Xong!");
  Serial.print(time);
  Serial.println(" ms.");// Chụp tốn thời gian bao nhiêu mili giây
}
}
//mail: tranduylinhvlute@gmail.com
Chúc các bạn thành công.

0 nhận xét:

Đăng nhận xét