나는 혼자 산다. 지금 직장을 다니면서 훈자살기 시작했다. 처음 2년은 풀옵션 원룸에서 월세로 살기 시작 했었다. 그리고 얼마전에 주택 2층으로 이사를 하게 되었다. 요즘 원룸은 시설이 아주 좋은것 같았다. 기본적인 전자제품들도 포함되어 있고 화장실도 좋고, 현관, 전등들이 훌륭했다.

하지만 주택으로 이사하니 시설이 원룸에 비해 열악했다. 기본적인 전자제품과 가구들도 새로 구매를 했고 나만의 공간을 새롭게 꾸몄다.

생활하다보니 몇가지 불편한 점을 느꼈다. 집대문으로 들어와서 계단을 올라가야 우리집 현관이 나오는데 밤에는 정말 어두워서 핸드폰 전등을 이용해서 계단을 조심히 올라가고, 집안으로 들어가도 전등 스위치가 거실 안쪽에 있어서 핸드폰 전등을 사용해야 했었다.

이런 것들이 너무 불편했다.

그래서!!!!!!!!! 내가 집에 왔을때 불을 밝혀줄 무언가를 만들어야 겠다는 생각을 했다. 그것이 auto LED 이다.

간단한 원리는 사람의 움직임을 인식하면 불을 키는 LED 등이다. 그리고 새로운것을 배우고 싶어서 mbed를 이용해서 만들고 홈네트워크를 꾸미고 싶어서 Ethernet 이나 WiFi를 연결해 보려곤 한다. 최종목표는 auto Scott's House 이다.

이제부터 auto LED를 어떻게 만들었는지 한번 보자.


하드웨어 만들기.

우선 어떻게 구성을 해야하는지 생각을 해보았다. mbed 보드를 사용하고 센서가 달려 있고 LED 등을 구동시키는 Shield를 제작하고, W5500 Ethernet Shield를 사용해야 겠다고 생각했다. 내가 자체적으로 제작한 Shield를 auto LED Shield라고 이름을 지었다.

mbed 보드는 FRDM-KL25Z 선정했고, auto LED Shield에 들어갈 부품은 PIR센서, 1W Power LED, LED Driver, CDS 센서이다.

  • PIR센서 - 알리익스프레스에서 구매, 1100원
  • 1W Power LED - 알리익스프레스에서 구매, 300원
  • LED Driver - 회사 재고
  • CDS 센서 - 회사 재고

위 부품들을 사용해서 회로를 그려보았다.

이 회로를 토대로 Shield 형태로 만든 만능기판에 납땜을 해보았다.

뚝딱뚝딱 납땜을 해서 완성했다.  mbed 보드에 장착을 해보자

이제 mbed로 코딩을 해보자.


펌웨어 만들어 보기.

나는 mbed를 처음 시작하는 거니 차근차근 해보았다.

https://developer.mbed.org/  에  접속해서 "Compiler"  버튼을 클릭하면 아래와 같은 페이지에   접속 하게 된다. Web 브라우저에서 코딩이 가능한 개발 환경이다.

"Nwe" 버튼을 클릭해서 새로운 프로그램을 생성한다.

내가 사용하는 플랫폼과 빈 템플릿을 선택하고 프로그램 이름을 입력하고 OK를 클릭한다.

새로운 프로그램이 생성되고 우클릭을 해서 새로운 파일을 생성한다.

파일 이름은 "mian.cpp"로 입력하고 OK를 클릭한다.


"main.cpp" 파일이 생성이된다. 그다음에는 mbed 라이브러리를 Import해야한다. 좌측 상단의 "Import"를 클릭한다.

로딩이 끝나면 가자 위에 mbed 라이브러리가 보이는데 그것을 선택하고 우측 상단의 "Import" 버튼을 클릭한다.


Import되는 경로를 확인 하고 "Update"  부분을 체크하고 OK를 클릭한다.

이제 mbed 라이브러리가 추가 된것을 볼수 있다.


main.cpp에 코딩을 해보았다. 간단한 프로그램이다.

CDS 센서와, PIR 센서, Power LED를 이용해서 어두울때 움직임이 감지되면 LED를 키는 프로그램이다.

코딩이 완료 되면 "Compile"을 클릭하면 된다. 코드에 이상이 없으면 Compile이 완료되고 bin파일이 다운로드 된다.


<코드>

#include "mbed.h"
Timer t;

DigitalOut ledR0(LED_RED);
DigitalOut ledG0(LED_GREEN);
DigitalOut ledB0(LED_BLUE);

DigitalOut led0(D5);
DigitalOut led1(D6);

DigitalIn PIR(D8);
AnalogIn CDS(A0);

Serial pc(USBTX, USBRX);

#define PLED_ON      led0 = led1 = 1
#define PLED_OFF     led0 = led1 = 0

int CDS_data;
int PIR_sensor;

int CDS_check()
{
    CDS_data = CDS.read()*1000;
    //CDS_vol = CDS_data*3.3;
    
    if(CDS_data > 600){
        //ledG0 = 1;
        return 1;
    }
    else {
        //ledG0 = 0;
        return 0;
    }
}

int PIR_check()
{
    PIR_sensor = PIR;
    return PIR_sensor;
}

int main()
{
    ledR0 = ledG0 = ledB0 = 1;
    PLED_OFF;
    unsigned char flag = 1;
    int csd_int = 2;
    int pir_int0 = 2;
    int pir_int1 = 2;
    int pir_status = 0;
    
    pc.baud(115200);
    wait(0.5f);
    pc.printf("Hello mbed!\n\r");
    pc.printf("===========================================\n\r");
    
    while (true) {
        if(CDS_check()){
            if(csd_int != 0){
                pc.printf("Dark now.\r\n");
                csd_int = 0;
            }
            ledG0 = 0;
            flag = 1;
            while(flag){
                if(PIR_check()){
                    if(pir_int0 != 0){
                        pc.printf("The movement is detected.\r\n");
                        pc.printf("Power LED is turned on.\r\n");
                        pc.printf("===========================================\n\r");
                        pir_int0 = 0;
                    }
                    t.stop();
                    t.reset();
                    t.start();
                    pir_status = 1;
                    ledR0 = 0;
                    PLED_ON;
                }
                if(pir_status == 0) {
                    flag = 0;
                }
                if(t.read_ms() > 5000 && pir_status == 1){
                    if(pir_int0 != 1){
                        pc.printf("The movement is not detected.\r\n");
                        pc.printf("Power LED is turned off.\r\n");
                        pc.printf("===========================================\n\r");
                        pir_int0 = 1;
                    }
                    t.stop();
                    t.reset();
                    pir_status = 0;
                    ledR0 = 1;
                    PLED_OFF;
                    flag = 0;
                }
            }
        }
        else{
            if(csd_int != 1){
                pc.printf("Brighter now.\r\n");
                csd_int = 1;
            }
            
            ledG0 = 1;
            if(PIR_check()){
                if(pir_int1 != 0){
                    pc.printf("The movement is detected.\r\n");
                    pir_int1 = 0;
                }
                ledB0 = 0;
            }
            else{
                if(pir_int1 != 1){
                    pc.printf("The movement is not detected.\r\n");
                    pir_int1 = 1;
                }
                ledB0 = 1;
            }
        }
        
        //pc.printf("===========================================\n\r");
        //ledB0 = !ledB0;
        //wait(1);
    }
}


다운로드 된 bin 파일을 이동식디스크로 잡힌 "MBED"에 복사해 넣으면 펌웨어 다운로드가 완료 된다.

그리고 내가 짠 코드를 다른 사람들에게 공유도 해보았다. 프로그램을 선택하고 우측의 Publish를 클릭한다.

아래와 같이 입력하고 OK를 누르면 Publish가 완료 되고 다른 사람들에게도 공유가 된다.



내가 공유한 코드 URL

https://developer.mbed.org/users/nanjsk/code/Auto_LED/


아래 동영상은 동작이 되는 영상이다.



+ Recent posts