• 검색 결과가 없습니다.

1. 개요

N/A
N/A
Protected

Academic year: 2022

Share "1. 개요"

Copied!
36
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

1. 개요

□ 연구 환경

○ 과학중점학교인 과천중앙고에는 몇 개의 과학관련 동아리가 있음

○ 허브 등 특이 식물 기르기 및 분자생물학 관련 실험을 해온 생물 동아리

○ 스마트폰 관련 앱 및 인터넷 게임도 개발할 수 있는 역량을 가진 컴퓨터 동아리

○ 물리 관련 실험 및 융합과학 성격의 다양한 로봇을 제작하는 물리 동아리

□ 연구 목적

○ 과학상자와 아두이노를 이용하여 식물의 상태를 원격으로 모니터링하며 자동으로 햇빛과 물을 공급할 수 있을 뿐만 아니라 원격으로 조정할 수 있는 “다이나믹 플랜트”을 제작하고자 함

2. 연구주제 선정

□ 문제의 착안점

○ 생물 동아리에서 여름방학 전에 허브 등 다양한 식물들을 학교에서 기르고 있었음

○ 방학이 지나자 대부분의 식물들이 죽어있었고, 이것을 해결할 수 있는 방법이 없을까 고민하게 되었다.

○ 이 사실을 다른 동아리에 알리자 컴퓨터 동아리, 물리 동아리 기장이 관심 을 가지게 되었고 생물+물리+컴퓨터 동아리가 모여서 문제에 대한 해결책 을 찾기 시작함

(2)

- 2 -

- 내가 신경 쓰지 않고도 식물들에게 알맞은 햇빛과 물을 자동으로 공급해 주었으면 좋겠다.

- 그럼에도 불구하고 식물에게 무슨 일이 생기면 어떡하지? 예를 들어, 갑자 기 열린 창문으로 바람이 심하게 불어 장애물이 생겼을 때 장애물을 피해서 움직이는 것을 원격으로 제어하고 싶다.

○ 원격 모니터링

- 온도센서, 습도센서, 조도센서, 물 감지센서를 식물 주위에 배치해야 함.

- 이러한 센서를 자유롭게 배치하기 위해서는 자유롭게 구조를 설계해서 설치할 수 있는 기계적인 도구가 필요함

- 기계적인 도구로 과학상자를 선정

- 과학상자는 독일의 아이텍과 프랑스의 메카노의 장점을 따온 국산 제품으 로 많은 구멍과 볼트 및 너트가 있어서 다양한 확장성과 창의적인 작품을 구현할 수 있는 재료임.

- 센서를 이용해서 측정된 데이터를 근거리에 있는 컴퓨터에 송신하고 다시 컴퓨터에서 인터넷 망을 이용하여 특정 사이트에 실시간 공지하거나 스마 트폰과 연계해서 식물 주위에 다양하게 배치된 온도센서, 습도센서, 산소센 서, 조도센서 등에서 측정된 값을 간단히 알 수 있게 함

- 센서로부터 얻은 자료를 디지털로 변환해주거나 증폭해주어서 근거리 컴 퓨터에 블루투스 나 WIFI 로 전송해주는 인터페이스가 필요

- 인터페이스로 오픈 하드웨어인 아두이노(Arduino)를 선정

- 아두이노는 윈도우, 리눅스, 매킨토시등 멀티플랫폼을 지원하며 컴파일이 쉽고, USB로 간단히 컴파일도 하고 업로드도 가능함.

- 아두이노는 블루투스 쉴드를 장착할 경우, 스마트폰과의 연동을 구현할 수 있고, 외부전원 부착이 쉬워, 개발자들에게 매우 편리함

- 과학상자는 일반 로봇과 달리 프로그램을 심어서 원격으로 조정하는 것이 불가능한 단점을 아두이노를 통해서 해결 가능

- 과학상자에 연결된 모터에 아두이노를 연결하면 다양한 작동이 가능

○ 햇빛과 물의 자동 조절

- 식물에게 가장 필요한 것이 햇빛과 물이다. 따라서 햇빛 및 물의 양을 조절할 수 있는 자동 조절 장치가 필요함

- 학교 교실은 시간에 따라 태양이 이동하면서 그늘진 영역이 많이 생기기

(3)

때문에 식물들에게는 적절한 햇빛을 받기에 비좁은 장소임.

- 2시간 간격으로 적당한 햇빛을 찾아서 자동으로 움직이는 플랜트를 설계할 계획

- 과학상자는 DC모터가 1개밖에 없기 때문에 앞뒤 이동은 가능하지만 좌우 이동은 불가능한 상태임

- 아두이노를 장착하고 DC모터를 추가하면 앞뒤좌우 이동이 가능한 로봇형 과학상자 가능

- 2번째로 식물에게 필요한 것이 적당한 수분이다. 따라서, 토양 습도 센서를 이용하여 2시간 간격으로 적정 습도 이하로 토양의 습도가 낮아졌을 때 자동으로 물을 공급하는 장치 개발예정

○ 원격 조정

- 식물을 키우는데 비상사태가 발생하는 경우를 예상해서 원격으로 플랜트 를 조절 할 수 있는 장치를 만들 필요가 있음

- 가장 기본적인 것이 플랜트의 상태를 파악할 수 있도록 사진을 찍어서 원격으로 송신하는 장치가 필요.

- 이를 위해서는 플랜트에서의 영상을 모니터링 할 필요 있음.

- 영상을 모니터링해서 원격으로 식물을 이동시켜야 할 경우, 일련의 해당 이동 명령어들을 스마트폰에서 입력하여, 근거리 컴퓨터를 거쳐, 아두이노 로 전송시킬 필요 있음 (전송되는 명령어들은 사전에 정의된 코드와 값들로 구성됨).

상황설정: 온도, 습도, 조도 자료 등을 원격으로 받아보니 온도와 조도가 해가 떠 있는 시간에도 측정값이 올라가지 않는 상황이 발생했다. 원격 화상카메라를 통해서 확인해 보 니 옆에 있던 쓰레기통이 쓰러지면서 다이나믹 플랜트가

(4)

- 4 -

3. 연구 내용 및 방법

□ 연구방법

○ 원격모니터링

- 플랜트형태를 유지하면서 센서 부착과 아두이노 및 모터연결이 가능한 과학상자 구성 설계 및 구상

- 아두이노와 직접 호환되는 온도, 토양습도, 조도센서 조사 - 아두이노에 블루투스가 가능한 쉴드를 선정 및 부착

- 근거리 컴퓨터와 아두이노와의 데이터 송수신을 위한 프로그램 작성 ü 필요시, 외부 전문가(자문)의 지원을 통해 시리얼 통신 예제 확보

후, 자체적으로 코드를 수정하여 사용함

- 근거리 컴퓨터에서 원격으로 있는 스마트폰으로 자료를 송신하는 프로그 램 알고리즘 구상 및 작성

ü 필요시, 외부 전문가(자문)의 지원을 통해 TCP/IP 통신 예제 확보 후, 자체적으로 코드를 수정하여 사용함

- 스마트폰에서 모니터링을 할 수 있도록 전용 애플리케이션 개발 ü 기존 동아리 활동을 통해 구현된 스마트폰용 앱 개발 기술 활용 - 근거리 컴퓨터 내에 플랜트의 측정값을 저장하고, 사용자와 연결해주는

데이터베이스 서버 기능 구현

- 현재 플랜트 내의 환경을 분석해서, 각 수치 값의 이미지에 나쁨-빨간색 보통-노란색 좋음-초록색으로 간단히 알려주는 설정 추가

전문가 상담결과: 시리얼 및 TCP/IP 통신은 고등학생들이 쉽게 접 근하기 어려운 컴퓨터 공학적인 기술이라고 판단되어 (전) 마이크로소프트사에서 프로그래머로 근무했으며 현재 목원 대학교 객원교수로 있는 전문가(김영준)에게 문의한 결과, 현재 TCP/IP 통신 분야에서 개발된 라이브러리와 예제를 잘 분석하여 그 소스를 일부 변형해서 사용할 수 있는 기 술을 터득하면 고등학생들도 가능할 것이라는 조언을 받음.

그리고 이번 연구에 참여하는 컴퓨터 동아리 학생들은 각 종 프로그램과 어플을 개발해온 경험이 있기 때문에 장기 적으로 연구하면 원격모니터링과 원격조정이 가능할 것으 로 기대

(5)

○ 햇빛과 물의 자동 조절

- 햇빛 자동조절을 위해서 DC모터 2개를 과학상자에 연결하는 설계 구상 - 플랜트의 앞과 뒤에 조도센서를 장착해서 1초 간격으로 조도센서의 차이를 조사하여 특정값 이상의 차이가 나면 모터를 이동시켜 자동으로 적절한 햇빛이 많은 곳으로 이동시키는 장치 설계

- 이것을 통하여 햇빛이 많은 곳으로 자동으로 이동하는 다이나믹 플랜트 구현 가능

- 2시간 간격으로 토양습도를 측정하여 물을 자동으로 분사하는 장치 설계 - 일반 가정에서 분수 제작에 사용되는 DC 모터 기반의 펌프를 확보하여

물 공급 장치 설계

- 만약 물 공급장치의 물이 모두 떨어져 자동으로 수분 공급이 불가능하다면, 경보 알림이 울려 근처의 사용자가 물을 보충할 수 있게 설계함.

- 원격으로 접속한 상황이라면, 스마트폰 어플리케이션에서 물 부족 이라는 문구를 띄우도록 설계

○ 원격 조정

- 원격 화상카메라를 이용하여 필요할 때 다이나믹 플랜트의 상태를 파악할 수 있는 장치가 필요

- 다이나믹 플랜트의 상태가 쓰레기통에 의해서 막혀있는 상태를 가정 - 원격으로 프로그램을 작성해서 쓰레기통을 피하기 위해서 뒤로 30cm 후진,

좌로 50cm이동 다시 앞으로 30cm이동하는 프로그램을 원격으로 송신하는 프로그램 개발.

- 장애물의 인지는 플랜트에 장착된 소형 카메라를 사용.

- 이 프로그램을 다이나믹 플랜트 옆에 있는 근거리 컴퓨터(서버)로 송신을 한 후 근거리 컴퓨터에서 다시 블루투스로 아두이노로 전송하는 프로그램 개발(서버 이용)

(6)

- 6 -

□ 세부계획

○ 원격모니터링

- 식물의 잎 주위에 온도센서 1개, 식물의 토양 속에 토양습도센서 1개, 다이 나믹 플랜트의 4모서리에 조도센서 4개를 설치할 수 있는 과학상자 설계 - 아두이노와 직접 호환되는 온도, 토양습도, 조도센서 선정예정

센서

종류 온도 측정 센서 토양 습도 센서 조도 센서

센서 사양

▶ 아날로그 센서

▶ -40도 ~ 100도 사이의 온도 측정

▶ 아날로그 센서

▶ 0 ~300 : dry soil

▶ 300~700 : humid soil

▶ 700~950 : in water

▶ 아날로그 센서

▶ 0 ~ 255 밝기 측정

사진

- 아두이노에 블루투스 쉴드 부착

- 근거리 컴퓨터와 아두이노와의 데이터 송수신을 위한 프로그램 작성 - 근거리 컴퓨터에서 원격으로 있는 스마트폰으로 자료를 송신하는 프로그

램 알고리즘 구상 및 작성

- 원격으로 사용자가 직접 모니터링을 하려면 다이나믹 플랜트를 컨트롤 하고 있는 아두이노 보드와 통신절차가 필요

- 아두이노 보드에 확장 가능한 블루투스 모듈을 장치하여, 통신 할 수 있는 능력을 부여해 주고, 아두이노에서 전송된 값들을 저장 할 수 있는 DB 서버 기능을 근거리 컴퓨터에 구축예정

- DB 서버 기능은 아두이노 에서 전송된 값들을 저장 할 수도 있고, 아두이노

(7)

에 사용자의 명령을 전달 할 수 있음

- 컴퓨터로는 직접 웹을 이용하여 서버에 접속해 각각의 센서들로부터 측정 된 값을 확인할 수 있음

- 스마트 폰에서는 어플리케이션을 통한 제어를 통하여 미리 구축해 놓은 서버에서 값들을 불러와 어플리케이션 안에서 식물의 상태를 시각적인 이미지로 표현할 수 있음

-아래는 다이나믹 플랜트 원격모니터링의 개념도임

(8)

- 8 -

○ 햇빛과 물의 자동조절

- 다음은 다이나믹 플랜트의 평면도 임

- 햇빛 조절은 다이나믹 플랜트를 위에서 보았을 때 앞과 뒤쪽에 조도센서 한 개씩 총 2개를 설치

- 조도센서 2개의 값을 비교해서 특정 위치의 조도 값이 큰 경우 큰 방향으로 이동 한 후 다시 센서의 값을 비교하는 로직을 구현할 예정. 예를 들어, 조도 D의 값이 다른 값보다 큰 경우 조도 D에 밝은 햇빛이 있다는 것을 의미함. 따라서 조도 D를 향하여 이동한 후 다시 조도 값을 측정한다.

조도 값이 비슷해 질 때까지 이동한 후 멈춤. 그리고 이러한 로직을 반복함.

조도센서 두 개를 보드와 연결하여 위에서 설명한 로직을 구현.

(9)

- 과학상자는 앞뒤로만 움직이기 때문에 DC 모터를 2개를 부착해서 앞뒤좌 우로 움직이는 로직을 구현

- 토양습도 센서 값을 읽어와서 특정값 이하가 되면 물을 분출하는 장치 개발. 이를 위해서 가정용 분수 장치의 기능을 일부 응용할 예정.

-자동으로 물을 분출하다, 만약 물이 부족하여 분출 할 수 없는 상황이 되면, 원격 모니터링 시스템을 이용하여 사용자에게 물이 부족 하다는 메시지를 전송함

-수분의 원활한 흡수를 위해 물을 일정량으로 나눠서 분출함 ex. 60ml의 물을 분출할 때, 1초당 5ml 씩 12초간 공급

○원격 조정

- 원격 화상카메라를 이용하여 사용자가 원할 때 직접 식물과 주위환경을 보고 상태를 파악 할 수 있게 한다.

- 원격으로 프로그램을 작성해서 쓰레기통을 피하기 위해서 뒤로 30cm 후진, 좌로 50cm이동 다시 앞으로 30cm이동하는 프로그램을 원격으로 송신하는 프로그램 개발

- 이 프로그램을 다이나믹 플랜트 옆에 있는 근거리 컴퓨터로 송신을 한 후 근거리 컴퓨터에서 다시 블루투스로 아두이노로 전송하는 프로그램 개발 (외부 전문가의 자문을 통해 간단한 예제 확보 후, 소스를 수정하여 프로젝트에 적용)

(10)

- 10 -

(원격조종의 예)

- 웹캠과 스마트폰을 연동시켜 웹캠이 찍는 영상을 실시간으로 볼 수 있음.

이러한 인터페이스를 구축하여 사용자가 직접 상황을 보고 명령을 내릴 수 있게 함

(11)

4. 연구 결과

□ 연구 활동 및 과정

○ 조도 센서 구현 완성: 양쪽 모서리에 조도센서를 설치하여 일정 시간 간격으로 움직이도록 설정함. 다음은 작성된 프로그램의 일부임

if(sensorValue1 > 700 || sensorValue2 < 100) // 빛의 범위 설정

{

servoLeft.attach(3); //연결된 핀번호 servoRight.attach(2);

servoLeft.writeMicroseconds(1300);

servoRight.writeMicroseconds(1700);

delay(600);

// 모터 동작 }

else (300 < sensorValue1 < 650);

{

servoLeft.detach(); // 모터의 작동 중지 servoRight.detach();

}

(12)

- 12 -

○ 습도 센서 구현 완성: 토양습도가 부족하면 자동으로 물을 분사하도록 함. 다음은 작성된 프로그램의 일부임

void Motor1Write(int power);

void Motor1Write(int power) {

int v = abs(power);

if (v > 255) v = 255;

if (power >= 0)

digitalWrite(4, LOW);

else

digitalWrite(4, HIGH);

analogWrite(5, v);

}

//모터 작동 정의

if(sensorValue3 < 300 )

// 습도의 범위 정의

{

Motor1Write(256);

// 모터 작동

delay(600);

}

else(sensorValue3 > 300);

//범위밖으로 벗어날시

{

// 모터작동 중지

Motor1Write(0);

}

(13)

○ 원격 모니터링 구현 완성: 원격으로 토양의 조도, 온도, 습도 및 영상을 확인함.

다음은 작성된 프로그램의 일부임

byte s[] = {0, 0, 0, 0, 0 };//5개의 값 정의 s[0] = sensorValue1;

s[1] = sensorValue2;

s[2] = sensorValue3;

s[3] = sensorValue4;

s[4] = analogRead(tempPin);

Serial.write(s, 5);

delay(100);

}

(14)

- 14 -

○ 원격 제어 구현 완성: 원격으로 물을 분사하거나 플랜트를 이동시킴. 다음은 작성된 프로그램의 일부임

int a = Serial.read();

if (a == 1) {

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1300);

servoRight.writeMicroseconds(1700);

delay(600);

servoLeft.detach();

servoRight.detach();

}

300 )

(15)

#include <Arduino.h>

#include <Servo.h>

#include <SPLLib.h>

#include <SoftwareSerial.h>

Servo servoLeft;

Servo servoRight;

int sensorValue1, sensorValue2; // 각각 앞쪽과 뒤쪽의 조도센서 int voltage, voltage2;

int sensorPin = A0; // 습도센서 1 int sensorPin1 = A1; // 습도센서 2 int sensorValue3 = 0;

int sensorValue4 = 0;

int tempC;

int tempPin = A2; // 온도센서 void Motor1Write(int power);

void serviceSerial();

void Motor1Write(int power) // dc모터에서 사용할 출력 전압 범위 설정 {

int v = abs(power);

if (v > 255) v = 255;

if (power >= 0)

digitalWrite(4, LOW);

else

digitalWrite(4, HIGH);

analogWrite(5, v);

}

void Motor2Write(int power) {

int v = abs(power);

if (v > 255)

○다이나믹 플랜트 전체 소스

(16)

- 16 - void setup()

{

Serial.begin(115200);

//BTSerial.begin(115200);

servoLeft.attach(3);

servoRight.attach(2);

}

void loop() {

char a = Serial.read();

if (Serial.available()) if (a == 1)

{

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1300);

servoRight.writeMicroseconds(1700);

delay(600);

servoLeft.detach();

servoRight.detach();

}

if (a == 'w') {

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1300);

servoRight.writeMicroseconds(1700);

delay(600);

servoLeft.detach();

servoRight.detach();

} if (a == 5) {

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1700);

servoRight.writeMicroseconds(1300);

delay(600);

servoLeft.detach();

(17)

servoRight.detach();

}

if (a == 's') {

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1700);

servoRight.writeMicroseconds(1300);

delay(600);

servoLeft.detach();

servoRight.detach();

}

if (a == 2) {

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1300);

servoRight.writeMicroseconds(1300);

delay(600);

servoLeft.detach();

servoRight.detach();

}

if (a == 'a') {

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1300);

servoRight.writeMicroseconds(1300);

delay(600);

servoLeft.detach();

servoRight.detach();

}

if (a == 4) {

(18)

- 18 - {

servoLeft.attach(3);

servoRight.attach(2);

servoLeft.writeMicroseconds(1700);

servoRight.writeMicroseconds(1700);

delay(600);

servoLeft.detach();

servoRight.detach();

}

if (a == 3) {servoLeft.detach();

servoRight.detach();

}

if (a == 'x') {servoLeft.detach();

servoRight.detach();

} loop 구문 - 원격 제어

sensorValue1 = analogRead(A3);

voltage = sensorValue1 * (5.0 / 1023.0);

sensorValue2 = analogRead(A4);

voltage2 = sensorValue2 * (5.0 / 1023.0);

if(sensorValue1 >= 700 && sensorValue2 >= 700) // 밝은 곳에서 플랜트를 정지시킴 { sensorValue1 = 101;

sensorValue2 = 101;

}

if(sensorValue1 < 50 && sensorValue2 < 50) { sensorValue1 = 101;

sensorValue2 = 101;

}

if(a == 1) // 여기서부터 시작되는 코드들은 자동 제어 시스템을 무시하고 {sensorValue1 = 101; // 사용자의 원격 제어를 강제로 활성화 시키는 구문.

sensorValue2 = 101;

delay(1000);

}

(19)

if(a == 'w') // 사용자의 입력이 자동제어 시스템을 무시함.

{sensorValue1 = 101;

sensorValue2 = 101;

delay(1000);

}

if(a == 2)

{sensorValue1 = 101;

sensorValue2 = 101;

delay(1000);

} if(a == 's')

{sensorValue1 = 101;

sensorValue2 = 101;

delay(1000);

} if(a == 3)

{sensorValue1 = 101;

sensorValue2 = 101;

delay(1000);

}

if(a == 'a')

{sensorValue1 = 101;

sensorValue2 = 101;

delay(1000);

} if(a == 4)

{sensorValue1 = 101;

sensorValue2 = 101;

delay(1000);

} if(a == 's')

{sensorValue1 = 101;

sensorValue2 = 101;

delay(1000);

(20)

- 20 -

}

else (300 < sensorValue1 < 650);

{

servoLeft.detach();

servoRight.detach();

}

if(sensorValue2 > 700 || sensorValue1 < 100) // 조도센서 측정값의 범위 { // 뒤쪽의 밝기가 앞쪽보다 밝으면 servoLeft.attach(3); // 뒤쪽으로 0.6 초간 후진

servoRight.attach(2);

servoLeft.writeMicroseconds(1700);

servoRight.writeMicroseconds(1300);

delay(600);

}

else ( 300 < sensorValue2 < 650);

{

servoLeft.detach();

servoRight.detach();

} loop 구문 - 자동 조도 제어

(21)

// sensor of soil

sensorValue3 = analogRead(sensorPin); // 토양습도센서의 측정치

// Value3의 센서는 식물의 습도센서 // 건조한 토양의 센서 값 = 0 ~ 300 // 촉촉한 토양의 센서 값 = 300 ~ 700 // 물 속에 센서가 있을때의 값 = 700 ~ 950

// 물통 안 의 토양 습도 센서 sensorValue4 = analogRead(sensorPin1); // 센서 값의 예시

// 건조한 토양의 센서 값 = 0 ~ 300 // 습한 토양의 센서 값 = 300 ~ 700 // 물 속의 센서 값 = 700 ~ 950

if(sensorValue3 < 300 ) // 식물의 습도센서 값의 범위

{ // 화분의 토양이 건조한 토양 일 경우 Motor1Write(255); // 모터를 작동시켜 물을 분사

delay(600);

}

else(sensorValue3 > 300);

{

Motor1Write(0);

}

//loop 구문 - 자동 습도 제어

(22)

- 22 -

byte s[] = {0, 0, 0, 0, 0};

s[0] = sensorValue1; // 아두이노 보드에서 측정한 5개의값 s[1] = sensorValue2; // 5개의 값을 컴퓨터의 서버로 전송 s[2] = sensorValue3;

s[3] = sensorValue4;

s[4] = tempC;

if (Serial.available()) Serial.write(s, 5);

Serial.println(Serial.write(s, 5));

delay(100); // 주기 0.1초

} // loop 구문 - 서버로 센서 측정값 전송

int main(void) {

init();

#if defined(USBCON) USB.attach();

#endif

setup();

for (;;) { loop();

if (serialEventRun) serialEventRun();

} return 0;

} //loop 구문 - 종료

(23)

○다이나믹 플랜트 제작 과정

① 몸체를 제작하기 위하여 설계대로 폼보드 (우드락)을 자르고 나사가 들어갈 부분에 구멍을 뚫는다.

② 탑재될 아두이노 보드의 덮개를 제작한다.

덮개의 위쪽부분엔 화분에 물을 공급할 물통이 위치함.

덮개에 구멍을 뚫어 DC모터가 물통에 들어갈수 있도록 함.

(24)

- 24 -

③ 자동 조도 제어를 위하여 서보모터를 폼 보드에 장착하고, 원격제어 시 방향 제어를 위해 보드의 앞부분에 캐스터를 장착.

(서보모터에 바퀴를 장착한 모습.)

(25)

④ 모든 기능의 제어 및 수행을 담당하는 아두이노 보드 장착.

화분을 앞쪽에 두기에 물이 넘치거나, 새는 경우를 대비하여 아두이노 보드를 기둥을 사용하여 폼 보드 의 지면에서 떨어지게 함.

⑤ 전력의 공급을 위하여 건전지를 장착.

추후에 충전이 가능한 리튬이온 배터리로 교체할 예정.

(26)

- 26 -

⑥ 이동시 화분의 흔들림과, 온도센서 장착을 위하여 양 옆면에 벽을 설치.

⑦ 센서 연결

서보모터 2개, DC모터 1개,온도센서 1개 ,습도 센서 2개, 조도센서 2개를 보드에 연결.

디지털 단자 - 흰색 선의 서보모터

모터 입력 단자 - 노란색 선의 DC 모터

아날로그 입력 단자 - 좌측으로부터 각각 조도 센서 2개,

습도 센서 2개 (갈색 선은 길이를 늘린 온도센서의 선)

( 온도센서가 멀리 떨어져 선 2개를 사용함.)

(27)

⑧ 마무리 작업.

연결한 센서들을 정리하여 각자 알맞은 위치로 이동시키고, 물통을 올릴 덮개를 장착.

⑨ 완성

위와 같은 작업을 거쳐 여러 번의 수정과 재설계를 통해 다음과 같은 다이나믹 플랜트를 완성함.

(28)

- 28 -

#include <Servo.h> // include Servo library Servo horizontal; // 수평 제어 모터

int servoh = 90; // 수평으로 초기화

Servo vertical; // 수직 제어 모터 int servov = 90; // 수직으로 초기화

// LDR pin connections // name = analogpin;

int ldrlt = 0; //좌측 상단의 조도센서

int ldrrt = 1; //우측 상단의 조도센서

int ldrld = 2; //좌측 하단의 조도센서

int ldrrd = 3; //우측 하단의 조도센서

void setup() {

Serial.begin(9600);

// servo connections // name.attacht(pin);

horizontal.attach(9);

vertical.attach(10);

}

void loop() {

int lt = analogRead(ldrlt); // top left int rt = analogRead(ldrrt); // top right int ld = analogRead(ldrld); // down left int rd = analogRead(ldrrd); // down rigt

int dtime = analogRead(4)/20; // 변위 차계 입력 int tol = analogRead(5)/4;

5. 추가 연구 결과

□ 추가 연구의 필요성

○ 조도센서를 이용하여 다이나믹 플랜드 전체가 좌우로 이동하는 것이 에너 지 소모적인 측면이 강하다는 전문가의 평가의견이 있었음

○ 추가 조사 결과 태양을 따라 전체가 이동하지 않고 각도만 변하는 솔라 트래킹 기능이 에너지 효율적인 측면에서 좋다는 사실을 알게 됨

○ 따라서, 다이나믹 플랜트에 솔라트래킹 기능을 추가하는 것이 적절하여 추가 연구를 실시함

□ 솔라트래킹을 구현한 아두이노 소스

(29)

int avt = (lt + rt) / 2; // 상단 조도센서의 값의 평균 ( 좌측상단 + 우측상단)

int avd = (ld + rd) / 2; // 하단 조도센서의 값의 평균 ( 좌측하단 + 우측하단)

int avl = (lt + ld) / 2; // 좌측 조도센서의 값의 평균 ( 좌측상단 + 좌측 하단)

int avr = (rt + rd) / 2; // 우측 조도센서의 값의 평균 ( 우측상단 + 우측하단)

int dvert = avt - avd; // 수직 - 상단과 하단에서의 센서의 차이

int dhoriz = avl - avr; // 수평 - 좌측과 우측에서의 센서의 차이

if (-1*tol > dvert || dvert > tol) // 값의 차이가 허용 오차범위 안에 있는지 확인, 그리고 수직의 각

//도 변경 {

if (avt > avd) {

servov = ++servov;

if (servov > 180) {

servov = 180;

} }

else if (avt < avd) {

servov= --servov;

if (servov < 0) {

servov = 0;

} }

vertical.write(servov);

}

if (-1*tol > dhoriz || dhoriz > tol) // 값의 차이가 허용 오차범위 안에 있는지 확인, 그리고 수평의

//각도 변경 {

if (avl > avr) {

servoh = --servoh;

if (servoh < 0) {

servoh = 0;

(30)

- 30 - else if (avl == avr)

{ }

horizontal.write(servoh);

}

delay(dtime);

}

□ 솔라트래커 제작 과정

① 몸체 제작.

만들어진 몸체 위에는 솔라 트래킹을 위한 센서 및 요소가 탑재될 예정.

( 조도센서 4개와, DC모터 2개, 영역을 나눌 구조물)

② 만들어진 몸체위에 탑재될 조도센서와, 영역을 나누기 위한 구조물 제작.

( 구조물로 조도센서 4개의 영역 나눔, DC 모터 2개를 이용한 수직, 수평 방향의 회전 구현. 각각 180도씩 회전 가능)

(31)

③ 구조물 조립.

모터 두 개와 조도값의 영역을 나누기 위한 구조물을 합치고, 합쳐진 구조물을 받침대에 연결한다.

(32)

- 32 -

④ 완성 및 배선

글루건을 이용하여 구조물에 조도센서와 DC 모터 장착.

(조도센서 4개는 아두이노 보드의 아날로그 입력 단자, DC모터 2개는 디지털 입력 단자에 연결.)

(33)

#include <Servo.h>

#include <Arduino.h>

#include <SPLLib.h>

void setup();

void loop();

Servo servo7;

int deg = 90; // 모터의 값을 초기에 90도로 설정

void setup() {

servo7.attach(7);

servo7.write(90);

}

void loop() {

int c1 = analogRead(3); //c1 = 오른쪽의 조도센서

int c2 = analogRead(4); //c2 = 왼쪽의 조도센서

if (c1 < 300 && c2 >= 300) // 조도센서에서의 값의 범위 설정 {

deg = deg + 1; // deg는 앞에서 선언한 각도 변수 1도씩 증가함

if (deg > 110) // 화분이 너무 기울어 지면 안되기 때문에

deg = 110; // 각도의 범위 설정 110도 이상 기울어지면 110도로 고정

}

else if (c1 >= 300 && c2 < 300) {

deg = deg - 1; // 각도가 1씩 감소

if (deg < 80) // 각도가 80도 미만이 되면

deg = 80; // 80도로 각도 고정

□ 발전 - 솔라트래커 탑재.

위에서 개발한 솔라 트래커를 다이나믹 플랜트에 탑재 하였다.

다음은 솔라트래커를 다이나믹 플랜트에 탑재한 아두이노 소스이다.

(34)

- 34 -

○ 솔라트래커를 탑재한 다이나믹 플랜트

오른쪽이 더 밝을때의 사진

양쪽의 밝기가 같을때의 사진

왼쪽이 더 밝을때의 사진

(35)

○ 구현된 다이나믹 플랜트

(좌) 초기 버전의 플랜트. (우) 새로운 버전의 플랜트

솔라트래킹 시스템을 추가한 다이나믹 플랜트.

(36)

- 36 -

6. 연구 결과 및 향후 계획

□ 연구 결과

○ 다이나믹 플랜트의 기능 수행 완료

○ 각도를 조절하는 솔라트래킹 추가 완료

○ 플랜트의 몸체를 폼보드로 구성 했는데 벌어지고 휘어지는 문제 해결 필요

○ 블루투스 통신 때 자주 발생하는 에러 제거 필요

□ 홍보 및 사후 활용

○ 사회적 돌봄이 필요한 동물, 장애아, 노인 및 중증 환자 등의 돌봄 관리시 스템에도 일부 적용될 수 있을 것으로 기대

□ 참고문헌

홍선학 외 저, (2012), “ 아두이노 따라하기”

채진욱 외 저, (2011), “ 아두이노 인터렉티브 뮤직 ” 윤성우 외 저, (2012), “ 열혈 c 프로그래밍 ”

고경희 외 저, (2012), “ Do it HTML 5 & CSS3"

정재곤 외 저, (2012), “ DO it 안드로이드 앱 프로그래밍”

참조

관련 문서

관리 (Control).. 설비종합효율 &amp; Loss 분석.. ☆ 주어짂 기능을 발휘하기 위해 필요, 충분조건을 충족하고 있는 상태를 본연의 모습이라 한다. 4)

동일한 무게를 반복해서 들 수 있는 횟수가 많거나, 동일한 상태를 유 지하면서 계속해서 들 수 있는 시간이 길수록. 근지구력이

SigmaNEST 펀칭 파워팩 제품 관리, 자동 다이나믹™ 배 열 및 펀칭 툴 관리를 갖춘 터렛 펀칭 프로그래밍을 위한 가장 완벽하고 최적화된

생활에 갑작스러운 위기가 닥쳤을 때 주택문제로 어려움을 겪을 때 재정적인 도움이 필요할 때.. 일상의 불편함, 부족함을

또한 수광량의 변화도 순간적으로 추적할 수 있어, 최 적의 투광 상태를 항상 유지할 수 있도록 투광량 조정 기 능에 새로운 알고리즘을 탑재했습니다(특허

hasSensorType String 차량 센서 Type을 표현. hasState String 클래스

본 논문에서는 기존에 사용되고 있는 렌즈 대신에 레이저 빔의 주사 시 직선 이송을 하는 대물렌즈를 적용한 다이나믹 포커싱 스캐너를 사용하여 레이저가

본 논문에서는 가소 알루미나 입도에 따른 아크 전기로의 전력 사용량 및 전 극봉의 소모 상태를 실제 운전 실험과 각종 측정 장비를 이용하여 시행하였고,