저가형 DIY 스마트 도어벨

by 조혜인 | 2017-02-28 12:57
arduino doorlock home samrt smart 도어락 스마트 아두이노

재료

  • SD 카드 슬롯 (국내) 1개 (3190원)
  • SD 카드 슬롯 (해외) 1개 (900원)
  • HC-SR505 모션감지센서 (국내) 1개 (2700원)
  • 푸쉬버튼모듈(해외) 1개 (4000원)
  • 아두이노 wemos(국내) 1개 (7100원)
  • 푸쉬 버튼 모듈 (국내) 1개 (3300원)
  • 아두이노 wemos(해외) 1개 (6600원)
  • UART VC0706 카메라모듈 (국내) 1개 (69710원)

첨부파일

조금 더 깔끔한 도어벨 만드는 법을 발견했습니다.(Low Cost Arduino Smart Doorbell) 3D 프린팅 도면이 있어서 훨씬 예쁩니다. 가격도 저렴합니다. 35$ 아래의 재료값으로 만들 수 있다고 합니다. 이 포스팅에선 아두이노 Wemo를 이용해 Wifi로 스마트폰과 통신합니다.


기능은 다음과 같습니다.

- 손님이 도어벨을 누르면 알람이 울린다.
- 동작을 감지합니다.
- 사진을 찍습니다.
- 무선 컨트롤이 가능합니다.



이 프로젝트를 통해서 배울 수 있는 것들은 다음과 같습니다.

- 버튼, 모션센서로 인터페이스 만들기
- 카메라모듈 다루기
- 알람 어플리케이션에서 정보 확인하기


보충해야할 부분

카메라에서 웹서버로 사진을 전송하는 부분은 잘 안나와 있네요. 제가 더 연구해서 보강해야할 것 같습니다.






1. 준비물

해외사이트

- 아두이노 Wemos $8
- VC0706 UART 카메라 $18
- HC-SR505 동작감지센서(Infrared PIR Motion Sensor) $1
- 푸쉬 버튼 $2
- SD Card Slot $2
- 3D Print Parts



총계 : $34



국내사이트

- 아두이노 wemos 7,100원 
- 카메라 모듈 69,710원 (너무 비싸네요..!! 대체할만한 모듈을 찾아봐야겠습니다. )
- HC - SR505 소형 인체감지 센서 모듈 2,700원
- 푸쉬버튼 모듈 3,300원
- SD카드 슬롯 3,190원



총계 : 86,000원
해외구매가랑 2배 이상 차이가 나네요 ㅠ




2. 만드는 과정

STEP 1. 3D 파일 프린팅 하기

STL 파일을 다운로드 합니다. 파일을 첨부해 두었습니다.(DoorBell_STL.rar)
30% 두께(Thickness)로 출력하세요. 




STEP 2. 조립하기

1. 카메라를 카메라 케이스에 넣기
카메라 케이스는 카메라에 꼭 맞아야하며 나사가 필요하지 않습니다.

2. 단추 케이스에 단추 넣기

버튼 케이스의 경우 단추 모듈의 중간 구멍에 맞는 나사를 가져와 케이스에 나사로 고정하십시오
버튼이 케이스에 단단히 고정되어 있는지 확인하세요.



3. 그 동안 조립한 것들(카메라, 버튼)을 스마트초인종 메인 케이스에 윗부분(Top piece)과 합치기

방금 만든 두 개의 새로운 모듈 (카메라 및 버튼)을 스마트초인종 메인케이스 윗부분(Top Piece) 구멍과 합칩니다. 
구멍이 3개가 있습니다. 카메라는 맨 위의 구멍(사진참고), 버튼은 맨 아래 구멍에 맞습니다. 만약 안된다면 세 개의 구멍에 모두 끼워보세요. 카메라에 맞는 구멍이 있습니다.
모듈을 고정하기 위해서 나사를 약 3-4 개 정도 필요합니다. 두 모듈이 모두 고정되어 있는지 확인합니다.


4. 모션센서를 메인케이스 뒷면에 조립하기

모션센서용 구멍은 중간구멍입니다. 안으로 넣어두세요.
모션센서 보드부분을 더 단단하게 고정하고 싶으면 카메라 모듈 아래쪽에 붙여도 좋습니다.


5. SD카드 슬롯을 아랫판(Bottom piece)에 조립하기

SD 카드 슬롯을 아래 사진처럼 스마트도어벨 메인케이스 아래부분(Botom piece)에 붙여주세요.
카드 슬롯 핀이 벽면의 오픈된 구멍쪽으로 향하도록 배치해야 합니다.
2개의 나사로 SD 카드 슬롯을 고정하세요.


6. 아두이노 보드 조립하기
아래 사진과 같이 보드를 배치해 주세요. 마이크로 USB 케이블이 잘 연결되었는지 확인합니다. 나사로 고정하면 좋습니다.




6. 아랫판(Bottom piece) & 윗판(Top piece) 합치기
아랫판과 윗판을 합칩니다. 나사 4개로 고정합니다.




7. 커버(Cover piece) 덮기
2개의 커버부분(Cover piece)을 덮습니다.
하얀 부분이 위쪽, 검정부분이 아래쪽입니다.
이 부분은 딱 들어맞기 때문에 나사가 따로 필요 없습니다.




STEP 3. 안드로이드 어플리케이션 이용하기

메이커가 제공하는 커스텀 앱이 있습니다. 아두이노 Womos에서 정보를 보내는 웹서버와 통신한다고 합니다. 이 앱을 이용해서 초인종 알림 및 날짜 스탬프 로그를 볼 수 있습니다. 또 촬영중인 사진과 도어벨이 눌려졌는지 여부를 확인할 수 있다고 합니다!! 멋지네요.


STEP 4. 회로 연결하기

Arduino Wemos to Camera

D1 -------- TX
D0 -------- RX
5V -------- VCC
GND------ GND
Note : Only use 4 pin, leave unsued pin alone




Arduino Wemos to SD Card Slot

D13----------SCK
D12----------MISO
D11----------MOSI
D10----------SS
5V -----------VCC
GND--------GND






Arduino Wemos to Motion Sensor

D2------------Out

5V--------------5V
GND-----------GND


Arduino Wemos to Digital Button

D12-----------Out
5V-------------5V
GND----------GND


STEP 5. 소스코드 업로드하기

여기서는 버튼, 카메라 , sd 카드 슬롯 및 모션 센서와 함께 Arduino Wemos 인터페이스 만드는 방법만을 간략하게 설명합니다.

Motion Sensor Tester

모션이 시작될 때, 중지될 때 메세지를 인쇄해 주는 코드입니다.

/*
* PIR sensor tester
*/

int inputPin = 16; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status

void setup() {
pinMode(inputPin, INPUT); // declare sensor as input

Serial.begin(9600);
}

void loop(){
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
if (pirState == LOW) {
// we have just turned on
Serial.println("Motion detected!");
// We only want to print on the output change, not state
pirState = HIGH;
}
} else {
if (pirState == HIGH){
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
}
}































Button Tester

버튼이 눌렸을 때 시리얼 창에 "Button Pressed"를 출력해줍니다.

/*
*Button tester
*/
int inputPin = 12; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status

void setup() {
pinMode(inputPin, INPUT); // declare sensor as input

Serial.begin(9600);
}

void loop(){
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
Serial.println("Button Pressed");
}
}


















Camera Tester

버튼을 누르면 카메라가 찍은 후 SD카드에 사진을 저장합니다.

#include <camera_VC0706.h>
#include <SD.h>
#include <SoftwareSerial.h>

#define chipSelect 10
#if ARDUINO >= 100
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif
camera_VC0706 cam = camera_VC0706(&cameraconnection);
void setup() {


#if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
if(chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega
#else
if(chipSelect != 10) pinMode(10, OUTPUT); // SS on Uno, etc.
#endif
#endif

pinMode(7,INPUT_PULLUP);
Serial.begin(9600);
Serial.println("VC0706 Camera test");

if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}

if (cam.begin()) {
Serial.println("Camera Found:");
} else {
Serial.println("No camera found?");
return;
}

char *reply = cam.getVersion();
if (reply == 0) {
Serial.print("Failed to get version");
} else {
Serial.println("-----------------");
Serial.print(reply);
Serial.println("-----------------");
}


cam.setImageSize(VC0706_640x480);

uint8_t imgsize = cam.getImageSize();
Serial.print("Image size: ");
if (imgsize == VC0706_640x480) Serial.println("640x480");
if (imgsize == VC0706_320x240) Serial.println("320x240");
if (imgsize == VC0706_160x120) Serial.println("160x120");

Serial.println("Get ready !");

}

void loop() {

if(digitalRead(7)== 0) {
delay(10);
if(digitalRead(7)== 0) {
if (! cam.takePicture())
Serial.println("Failed to snap!");
else
Serial.println("Picture taken!");
char filename[13];
strcpy(filename, "IMAGE00.JPG");
for (int i = 0; i < 100; i++) {
filename[5] = '0' + i/10;
filename[6] = '0' + i%10;
// create if does not exist, do not open existing, write, sync after write
if (! SD.exists(filename)) {
break;
}
}
File imgFile = SD.open(filename, FILE_WRITE);
uint16_t jpglen = cam.frameLength();
Serial.print(jpglen, DEC);
Serial.println(" byte image");

Serial.print("Writing image to ");
Serial.print(filename);

while (jpglen > 0) {
uint8_t *buffer;
uint8_t bytesToRead = min(32, jpglen);
buffer = cam.readPicture(bytesToRead);
imgFile.write(buffer, bytesToRead);
jpglen -= bytesToRead;
}
imgFile.close();
Serial.println("...Done!");
cam.resumeVideo();
}
}
}





































































































3. 마무리

여기서는 각각 모듈을 제어할 수 있는 소스코드만 제공합니다. 전체를 합친 코드를 만들어야 겠습니다. 웹서버로 사진으 전송하는 기능이 필히 추가되어야 합니다.



댓글 0

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어
저가형 DIY 스마트 도어벨현재글 앱인벤터로 어플리케이션 만들기 이전글