[project]카메라와 자이로/가속도센서로 비밀 보관함 만들기 #3 - 폰으로 사진 전송하기

by ChoiTop | 2016-05-25 15:27
alooh alooh snow 자이로센서 카메라

[project]카메라와 자이로/가속도센서로 비밀 보관함 만들기 #1 - 하드웨어 구성하기
[project]카메라와 자이로/가속도센서로 비밀 보관함 만들기 #2 - 개발환경 구성하기

프로젝트의 다음 과정입니다. 위 프로세스를 모두 완료한 뒤에 개발을 진행해 주세요. 
카메라 모듈 관련 업데이트는 필수적으로 필요합니다. 하단 링크를 통해 꼭 해당 커리큘럼을 진행한 후 이번 프로세스를 진행해 주시기 바랍니다. 
[alooh 커리큘럼 4차] '원격 WiFi 카메라' 만들기

상자를 열었을 때 촬영된 사진이 휴대폰으로 전송되는 과정에 관한 토픽입니다. 

아래 그림과 같이 상자가 열렸을 때 사진을 촬영하고 촬영된 사진데이터를 ALOOH cloud 의 MQTT를 이용하여 스마트폰 어플리케이션으로 전송합니다. 

스마트폰 어플리케이션은 하단 링크에서 다운로드가 가능합니다. 

ALOOH MQTT 어플리케이션 다운로드(안드로이드)

1. MQTT 적용 스크립트
  • 이전 개발환경 구성하기에서 작성된 스크립트 상단에 MQTT 관련 코드를 추가하였습니다. 
  • cambox.js 라는 파일명으로 하단 이미지와 같이 다른 파일들이 설치된 카메라 폴더 하단에 생성합니다. 
  • [alooh 커리큘럼 4차] '원격 WiFi 카메라' 만들기에서 생성한 camera폴더 하단에 생성해야 합니다. 

    console.log("####################################");
    console.log("#    Real Time BOX Monitoring Program    #");
    console.log("#    Version      v1.0                    #");
    console.log("####################################");

    // Turn On The Light
    // 설정이 완료될 때까지 인지하기 위해서 불이 들어옵니다.
    var GPIO = require('snow/gpio');
    var gpio = new GPIO.gpio();
    gpio.open();
    gpio.pinMode(2, 1);
    gpio.digitalWrite(2, 1);
    console.log('Start Program.');

    // Start Camera Process
    // 카메라 프로그램을 시작합니다.
    console.log("Start Camera Process...");
    var camtask = null;
    var child_process = require("child_process");

    camtask = child_process.exec("sh AloohCam.sh", function(err, stdout, stderr) {
        console.log('stderr');
        console.log(stderr);
        console.log('stdout');
        console.log(stdout);
        console.log('err');
        console.log(err);
    });

    /**
     * [사진 촬영 함수]
     * childprocess로 값을 전달하여 명령을 수행하도록 함.
     * @return {} []
     */
    function take(){
        camtask.stdin.setEncoding("utf-8");
        // camtask.stdout.pipe(process.stdout);     //카메라 프로세스의 화면 출력 값을 가져올 수 있음.
        camtask.stdin.write("t\n");//명령어 입력 시 엔터가 필요한 경우 '\n'을 꼭 입력해야 함.
    };

    console.log('Loading Gy521...');
    //자이로 가속도 센서 라이브러리 및 변수 초기화.
    var I2C = require('snow/i2c');
    var i2c = new I2C.i2c();
    var rbuf = new Buffer(12);
    var wbuf = new Buffer(2);
    var ax, ay, az, gx, gy, gz;

    var count = 0;
    var count2=0;
    var x_list =0;
    var y_list=0 ;
    var z_list = 0;
    var x=0;
    var y=0;
    var z=0;

    // 주기적으로 센서를 모니터링하여 침입자 감지 시 사진 촬영.
    // 최초 설정단계에서 10회의 센서 값의 평균을 구하여 일반 상태에서의 값을 설정함.
    // 설정된 값보다 0.3정도의 값의 차이가 발생되면 침입으로 판단하여 사진 촬영 시작.
    // 이때, 사진은 침임 감지한 시점 1회만 촬영.
    // 다시 닫고, 열면 다시 1회 사진 촬영함.
    console.log("Now Setting...")
    setInterval(function() {
        var gy521_data= gy521 ();

        if (count>10 && count<15){    //가속도 평균값 도출(10회의 값을 기반으로 평균)
            x = (x_list/count).toFixed(2)*1;
            y = (y_list/count).toFixed(2)*1;
            z = (z_list/count).toFixed(2)*1;
            count=20;
            count2=1;
            gpio.digitalWrite(2, 0);
            console.log("Setting Complete...");
            console.log("Start Monitoring Mode...");
        }else if(count==20){
            if(gy521_data.x*1 < x-0.3 || gy521_data.x*1 > x+0.3){   //가속도 범위 0.3으로 설정.
                  if(count2){
                        console.log("Someone Open!");
                        console.log("Start To Take A Picture!");
                        take();   //사진 촬영.
                        console.log("Success Took A Picture!");
                        count2=0; //침입 감지 시 1회만 사진 촬영하도록 설정.
                  };
            }else{
                if (count2==0) {
                    count2=1;
                    console.log("Start Monitoring Mode...");
                }
            }
        }else{    //세팅을 위해 센서 값을 수집.
            count++;

            x_list += gy521_data.x*1;
            y_list += gy521_data.y*1;
            z_list += gy521_data.z*1;
        }
    }, 200);

    /**
     * [gy-521 센서 데이터 중 가속도에 해당하는 값을 받아오는 함수.]
     * @return {object} [x, y, z 축의 값을 각각 문자로 object로 반환]
     */
    function gy521 (){
      i2c.open("/dev/i2c-0");
      wbuf[0] = 0x6B; // reg addr
      wbuf[1] = 0x00; // data
      i2c.write(0x68, wbuf);

      wbuf[0] = 0x6C;
      wbuf[1] = 0x00;
      i2c.write(0x68, wbuf);

      rbuf[0]=0;

      rbuf[0] = i2c.read(0x68, 0x3B);
      rbuf[1] = i2c.read(0x68, 0x3C);
      rbuf[2] = i2c.read(0x68, 0x3D);
      rbuf[3] = i2c.read(0x68, 0x3E);
      rbuf[4] = i2c.read(0x68, 0x3F);
      rbuf[5] = i2c.read(0x68, 0x40);
      rbuf[6] = i2c.read(0x68, 0x43);
      rbuf[7] = i2c.read(0x68, 0x44);
      rbuf[8] = i2c.read(0x68, 0x45);
      rbuf[9] = i2c.read(0x68, 0x46);
      rbuf[10] = i2c.read(0x68, 0x47);
      rbuf[11] = i2c.read(0x68, 0x48);

      ax = rbuf[0]<<8 | rbuf[1];
      ay = rbuf[2]<<8 | rbuf[3];
      az = rbuf[4]<<8 | rbuf[5];
      gx = rbuf[6]<<8 | rbuf[7];
      gy = rbuf[8]<<8 | rbuf[9];
      gz = rbuf[10]<<8 | rbuf[11];

      if(ax > 32767)
        ax = ax | 0xFFFF0000;

      if(ay > 32767)
        ay = ay | 0xFFFF0000;

      if(az > 32767)
            az = az | 0xFFFF0000;

      ax = ax /16384;//가속도 x
      ay = ay /16384;//가속도 y
      az = az /16384;//가속도 z
      // var data = ax.toFixed(2)+','+ay.toFixed(2)+','+az.toFixed(2)
      i2c.close();
      return {'x':ax.toFixed(2), 'y': ay.toFixed(2), 'z': az.toFixed(2)};
    }

2.  카메라 작동하기

2-1) ALOOH Dashboard의 terminal에 접속합니다.

2-2) 카메라 관련 파일이 들어있는 해당 폴더로 접근합니다. 

    # cd projects/camera

2-3) 해당 폴더에 저장된 파일을 실행 시킵니다. 이전에 cambox.js로 저장하였습니다. 

   #  node cambox.js

2-4) 해당 코드가 정상적으로 실행되면 하단과 같은 메시지가 나타나며 촬영이 준비됩니다. 

2-5) 새로운 웹창을 열고 기기의 IP주소 뒷자리에 : 8000를 입력하고 이동하면 촬영된 사진을 확인할 수 있습니다. 


3. 원격으로 휴대폰에서 이미지 확인 하기
  • 집밖에서도 실시간으로 촬영된 사진을 확인 할 수 있습니다. 
  • 와이파이가 아닌 3G/LTE 사용시 데이터가 소모됩니다. 

3-1) 하단 링크를 통해 카메라 전용 어플리케이션을 다운로드 받아 설치 합니다(안드로이드용)

3-2) 어플리케이션에 접속해 등록된 아이디로 로그인합니다. 

3-3) 로그인 후 나타난 디바이스와 프로젝트명을 선택합니다. 

3-4) 디바이스를 선택하면 두개의 버튼이 나타나고 Subscribe 버튼을 선택합니다.

3-5) Message 라는 텍스트가 나타납니다. 

3-6) 상자를 열어 테스트 샷을 촬영 합니다. 

3-7) 정상적으로 촬영이되면 테스트샷이 휴대폰에 나타납니다.


댓글 0

Alooh 프로젝트

[project]카메라와 자이로/가속도센서로 비밀 보관함 만들기 #3 - 폰으로 사진 전송하기

by ChoiTop

MADE BY

[Project] 온습도 센서로 가습기 만들기 #2- 개발환경 구성 및 작동 다음글 [project]카메라와 자이로/가속도센서로 비밀 보관함 만들기 #3 - 폰으로 사진 전송하기현재글 [ALOOH]온습도 센서로 가습기 만들기 #1- 하드웨어 구성하기 이전글