September 22, 2018

디바이스마트 미디어:

[46호]STES Panel

Cap 2017-10-18 13-15-49-260

2017 ICT 융합 프로젝트 공모전 참가상

STES Panel

글 | 동양미래대학교 김성곤, 박준규, 신수민

1. 심사평
칩센 진지하지만 재미있는 발상에서 시작한 작품인 것으로 생각됩니다. 보고서 결론과 같이 1~3%의 효율이 개선되었다면 이 부분은 충분히 유의미한 데이터가 될수 있으리라 봅니다. 다만, 이 작품의 핵심 포인트는 태양광 패널의 표면 상태 유지를 통해 효율을 개선 가능할 것이라는 전제에서 시작한 내용으로 보이므로, 블라인드가 설치된 작품과, 그렇지 않은 작품을 동시 설치하여 일정 기간 이상 실험을 유지하는 것이 필요할 것으로 보여 현재에 보여지는 효율 개선은 신뢰도가 충분하지 않는 것은 사실입니다. 개인적으로 매우 흥미가 있고, 효율 개선의 누적 데이터가 궁금해 지는 작품입니다.
뉴티씨 태양광 추적장비는 많이 만들어왔던 장비기 때문에 예전에 있던것과의 차별성을 두어야 합니다. 모터를 돌렸을 때 동작시 사용되는 전력량 대비 충전량의 효율을 해결하면 좀 더 좋은 작품이 될 수 있을것입니다. 실용적인 측면에서 블라인드로의 태양광 패널 보호 등보다는 주기적으로 자동 세척을 시킨다던가 하는 것이 보다 나았을 것 같습니다. 비가 온다던가 했을 경우도 고려한 제작이 되었으면 좋았을 것입니다.
위드로봇 유사한 상용 제품들이 있는데 차별성을 부각시킬 수 있으면 좋겠습니다.

2. 작품 제목
‘Sun Trackable Efficient Solar Panel‘의 약자로 태양을 추적하며 효율성을 증대시킨 태양광 패널이라는 뜻을 가진다.

3. 작품 개요
현재 우리가 사용하고 있는 전기에너지는 약 95%가 1차 에너지를 통해 발전된다. 그러나 화석연료는 유한하기 때문에 신-재생에너지의 발전 및 개발과 이를 통한 효율적인 발전 솔루션이 필요하다. 본 작품은 이러한 신-재생에너지 중 ‘태양광 에너지’의 발전 효율 개선에 초점을 맞추어 보았다. 먼저 태양을 추적하여 따라 움직임으로써 발전 효율을 높이고 일몰이나 강수 등 발전을 할 수 없을 때 유지보수를 위하여 필요에 따라 작동하며 태양광패널의 청소를 할 수 있는 블라인드를 구현한다면 효율과 함께 패널의 수명 또한 증대시킬 수 있다.

4. 작품 설명
4.1. 주요 동작 및 특징
4.1.1. 주요 동작
4.1.1.1. Sun Tracking
효율적인 태양광 발전을 위해선, 태양에서부터 지구로 오는 광자가 태양광 패널에 수직으로 입사해야 한다. 따라서 CdS 센서 4개를 이용해 1축 회전이 가능한 하드웨어를 제작하고 그를 판별할 수 있는 소프트웨어를 작성하였다.

4.1.1.2. 블라인딩과 패널 청소
태양광 발전을 할 땐, 태양광 패널과 입사되는 광자가 수직을 이루는 것 뿐만 아니라 외부적인 요소로 인한 태양패널의 상태도 중요한 역할을 한다. 이를 보안하기 위해 태양광 패널의 효율이 낮아지거나, 비가 내리거나, 저녁이 되었을 때 외부 충격으로부터의 보호를 위해 패널의 표면에 블라인드가 내려오는 동작을 넣었다. 또한 패널의 파손이 아닌 외부에 쌓이는 이물질에 의한 효율 하강을 막기 위해 패널을 청소해 주는 동작도 넣었다.

4.1.2. 특징
본 작품의 1축 회전에 사용된 모터는 1회전 당 스텝이 513이며 유지 토크는 150g/cm이다. 이를 통해 회전축을 1스텝 당 약 0.7의 제어가 가능하여 기어비를 고려하면 1스텝 당 0.175도의 축 각도 제어가 가능하게 된다. 그러나 모터 출력과 축 회전의 안정성을 위하여 한 번 운동에 6스텝 씩 동작하게 하였다.
또한 센서의 데이터를 정수형 아날로그형식으로 읽어내는 것은 판별하는데 있어서 어려움을 가져옴을 확인하고 이를 맵핑하여 간단하게 판별할 수 있게 하였다.
태양광 패널의 블라인드는 패널의 4모서리에 부착한 CdS센서의 값을 받아서 4개의 센서가 모두 어두울 때의 값을 받으면 블라인드가 내려오는 동작을 하며, 아두이노를 통해 나오는 전압과 전류의 값을 받아서 태양광 패널의 발전이 저조할 때 또한 블라인드가 내려온다.

4.2. 전체 시스템 구성 (전체 알고리즘)
4.2.1. Power Generating System (발전 시스템)

46 feature ict STES PANEL (1)
위 작품은 태양광으로 파워뱅크를 충전하고, 충전된 전력으로 시스템을 구동하는 구조이다.
태양광 패널의 효율은 6.5V, 10.8mA 정도이다.

4.2.2. Efficiency Improvement System (효율 개선 시스템)
위 작품은 태양광 아래에 있어야 한다. 즉 외부에 노출되어 있으므로, 외부적 요소들이 작용을 하게 된다. 몇 가지를 예로 들자면 눈, 비, 먼지 등이 있다. 또한 물리적인 충격도 있는데, 이로 인하여 태양광 패널의 수명이 급격히 줄어들 수 있다.
이를 개선하기 위해 우린 태양광 패널을 필요할 때만 사용하고, 효율이 잘 나오지 않는 저녁이나 흐린 날엔 외부 요소들로부터 패널을 보호해주는 시스템을 만들었다.

4.3. 개발 환경
언어 : C 및 Python
Tool : C 기반의 Arduino IDE, Anaconda(Python)
System : Embedded Board로서 Arduino Uno, 데이터 통신 시 사용된 PC

5. 단계별 제작 과정

46 feature ict STES PANEL (2) 46 feature ict STES PANEL (3)

5.1. 기초 설계 및 센서 테스트
5.1.1 패널 초안 설계

46 feature ict STES PANEL (4)

5.1.2. 전체 구상도

46 feature ict STES PANEL (5)

5.1.3. 센서부 제작 및 테스트

46 feature ict STES PANEL (1)

5.1.4. 초기 1축 회전 장치 기어 설계

46 feature ict STES PANEL (6)

5.2. 1축 회전 장치 및 패널 제작
5.2.1. 1축 회전 장치 제작
초반 : 요구되는 기어의 판매처를 파악할 수 없어 직접 목재로 기어를 제작하려 함

46 feature ict STES PANEL (2)

후반 : 목재 기어 제작의 불가능을 인지하고 아크릴로 재설계 후 제작함

46 feature ict STES PANEL (7)

최종 : 모터 토크 부족으로 인하여 모터 추가

46 feature ict STES PANEL (3)

5.2.2. 패널 제작
블라인드 결합 작업

46 feature ict STES PANEL (4)

하부 프레임 장착을 위한 마운트 조립

46 feature ict STES PANEL (5)

하부 프레임과 결합

46 feature ict STES PANEL (6)

5.2.3. 완성 및 테스트-디버깅
하드웨어 제작 완료

46 feature ict STES PANEL (7)

테스트

46 feature ict STES PANEL (8)

5.2.4. 결과
그래프

46 feature ict STES PANEL (8)

46 feature ict STES PANEL (9)

5.2.5. 종합 전압량

46 feature ict STES PANEL (10)
5.2.6. 결과 분석
시간 간격 당 전압, 전류, 전력의 그래프는 Serial 통신을 통한 데이터를 PC에서 python 코드를 통해 그래프로 시각화하였고 이를 바탕으로 전체 그래프를 그려보았을 때에 블라인드 설치 전과 설치 후의 효율 차이는 대략 1~3% 정도로 나왔다. 이것이 유의미한 지표인지 파악하기에는 어려움이 많지만 블라인드가 유용하지 않다고 단정 짓기에는 이르다는 결론을 내릴 수 있다.
중국과 미국에 존재하는 대규모의 태양광 패널 발전 시설에 이러한 블라인드를 설치한다면 전체 발전 규모 대비 1~3%는 굉장히 큰 규모의 전력이라는 것이 이번 작품 제작을 하면서 느낀 가장 큰 점이다.

6. 기타
6.1. 회로도
6.1.1. 발전부

46 feature ict STES PANEL (11)
6.1.2. 제어부

46 feature ict STES PANEL (12)
6.2. 소스코드
6.2.1. 아두이노 소스코드

#include <Stepper.h>

#define cdsRU A0
#define cdsRD A1
#define cdsLU A2
#define cdsLD A3
#define VoltageSensorPin A4
#define AmpereSensorPin A5
#define endSwitch1 2
#define endSwitch2 3
#define blindmotorAnode 4
#define blindmotorCathode 5
boolean blindmotorStatus;

const int delaytime = 240000;
const int SensorMinValue = 0;
const int SensorMaxValue = 800;

float cdsRUvalue, cdsRDvalue, cdsLUvalue, cdsLDvalue = 0;
float VoltageSensorValue, AmpereSensorValue, PowerValue = 0;

const int stpr = 513;

Stepper st1(stpr, 12, 10, 11, 9);
Stepper st2(stpr, 8, 6, 7, 5);

//————————————————
int ProcessingValue() {
cdsRUvalue = analogRead(cdsRUvalue);
cdsRDvalue = analogRead(cdsRDvalue);
cdsLUvalue = analogRead(cdsLUvalue);
cdsLDvalue = analogRead(cdsLDvalue);

float cdsRUmappingvalue = map(cdsRUvalue, SensorMinValue, SensorMaxValue, 0, 10);
float cdsRDmappingvalue = map(cdsRDvalue, SensorMinValue, SensorMaxValue, 0, 10);
float cdsLUmappingvalue = map(cdsLUvalue, SensorMinValue, SensorMaxValue, 0, 10);
float cdsLDmappingvalue = map(cdsLDvalue, SensorMinValue, SensorMaxValue, 0, 10);

float RUV = constrain(cdsRUmappingvalue, 0.00, 10.00);
float RDV = constrain(cdsRDmappingvalue, 0.00, 10.00);
float LUV = constrain(cdsLUmappingvalue, 0.00, 10.00);
float LDV = constrain(cdsLDmappingvalue, 0.00, 10.00);

if ((RUV + RDV + LUV + LDV)/4 > 8) {
return 1; // blinding
}

else if ((RUV + RDV) > (LUV + LDV)) {
return 2; // turn right
}

else if ((RUV + RDV) < (LUV + LDV)) {
return 3; // turn left
}

else if ((RUV + RDV + LUV + LDV)/4 < 200) {
return 0; // unblinding
}

else {
return 4; // fixed
}
}

void motorcontrol() {
switch(ProcessingValue()) {
case 0:
unblinding();
break;

case 1:
blinding();
break;

case 2:
for(int s=0; s<6; s++) {
st1.step(1);
st2.step(1);
}
delay(500);
break;

case 3:
for(int s=0; s>(-6); s–) {
st1.step(-1);
st2.step(-1);
}
delay(500);
break;

case 4:
delay(500);
}
delay(1);
}

void unblinding() {
if (blindmotorStatus == 1 || endSwitch1 == 0) {
while (endSwitch2 == 1) {
digitalWrite(blindmotorAnode, HIGH);
digitalWrite(blindmotorCathode, LOW);
//delay(3000); // unblinding
}
blindmotorStatus != blindmotorStatus;
}
}

void blinding() {
if (blindmotorStatus == 0 || endSwitch2 == 0) {
while (endSwitch1 == 1) {

digitalWrite(blindmotorAnode, LOW);
digitalWrite(blindmotorCathode, HIGH);
//delay(3000); //blinding
}
blindmotorStatus != blindmotorStatus;
}
}

void GeneratingStatus() {
VoltageSensorValue = analogRead(VoltageSensorPin);
AmpereSensorValue = analogRead(AmpereSensorPin);
PowerValue = VoltageSensorValue * AmpereSensorValue;

Serial.print(“[");
Serial.print(millis());
Serial.print(",");
Serial.print(PowerValue);
Serial.println("]“);
delay(delaytime);
}

void setup() {
Serial.begin(9600);
st1.setSpeed(7);
st2.setSpeed(7);
pinMode(endSwitch1, INPUT_PULLUP);
pinMode(endSwitch2, INPUT_PULLUP);
pinMode(blindmotorAnode, OUTPUT);
pinMode(blindmotorCathode, OUTPUT);
}

void loop() {
motorcontrol();
GeneratingStatus();
delay(delaytime);
}

6.2.2. PC측 Python 소스코드

import serial
form numpy import *
import matplotlib.pyplot as plt

ard = serial.Serial(‘COM11’, 9600)
ard.readline()
ard.flush()

lstX = [] lstY = []

plt.ion()
fig = plt.figure()
sf = fig.add_subplot(111)
plt.xlim([0,43200])
plt.ylim([300,1000])
line1, = sf.plot(arrX, arrY, ‘r’)

while True:
bytesR = ard.readline()
lstR = eval(bytesR[:=2].decode())
timeR = lstR[0]/1000.0

lstX.append(timeR)
lstY.append(latR[1])

line1.set_xdata(lstX)
line1.set_ydata(lstY)

plt.draw(), plt.pause(0.00001)
print(‘time:%.3fs, value:%d’ % (timeR, lstR[1]) )

au.close()

6.3. 참고자료
· https://en.wikipedia.org/wiki/Solar_tracker
· https://solarcellcentral.com/index.html
· ‘밑바닥부터 시작하는 딥러닝’ 사이토 고키

 

 

 

 

Leave A Comment

*