안녕하세요, IoT 프로젝트에 오신 것을 환영합니다. 이 기사에서는 LDR과 서보 모터를 사용하여 이중 축 태양 추적기 아두이노 프로젝트를 단계별로 만드는 방법을 배웁니다.
이 프로젝트에서는 (LDR)과 같은 감광 센서를 사용하여 햇빛을 추적하고 태양 전지판을 효율을 높이는 영역으로 향하게 할 것입니다. 이 글은 7개의 섹션으로 나눴습니다:
이 프로젝트에 필요한 구성 요소
다음 목록은 이 프로젝트에 필요한 모든 구성 요소의 목록입니다:
S.N | Components Name | Description | Quantity | |
1 | Arduino UNO | ARDUINO UNO R3 | 1 | https://amzn.to/2L0iZf2 |
2 | Servo Motor | Micro Servo - SG90 | 2 | https://amzn.to/2NRXXAy |
LDR | LDR ( Photoresistor) Sensor | 4 | https://amzn.to/3kiHz8r | |
3 | Resistors | 10k-ohm resistors | 4 | https://amzn.to/2NTPtsF |
4 | Breadboard | Mini Breadboard | 1 | https://amzn.to/2NP2UKL |
5 | 3D body parts | 3D body parts Design | 1 | https://www.thingiverse.com/thing:2467743 |
6 | Potentiometer | 10k Potentiometer | 2 | https://amzn.to/2MgRMWz |
LDR 센서의 작동 원리
여기서 LDR은 광 검출기 역할을 합니다. 포토 레지스터라고도 합니다. 실제로는 빛에 민감한 장치입니다. 그래프에서 볼 수 있듯이 빛이 내리쬐면 저항이 감소합니다. 이 프로젝트에서는 4개의 LDR을 사용하여 햇빛을 감지합니다. 그리고 아두이노에 신호를 보내면 두 개의 서보 모터가 태양 전지판의 효율을 극대화하기 위해 더 나은 위치에 배치하도록 안내합니다.
프로젝트 시뮬레이션: LDR 및 서보 모터를 사용한 이중 축 태양 추적기
아두이노 프로젝트 여기에서는 이 프로젝트의 전체 개요를 보여드리겠습니다. 나중에 배선 시스템에 대해 설명하겠습니다. 하지만 지금은 이 프로젝트에 박차를 가할 것입니다.
아두이노의 전원을 켜면 모든 센서와 서보 모터가 작동합니다. 위 이미지에서 볼 수 있듯이. 일반적으로 LDR 센서의 빛의 강도를 높이면 신호가 아두이노로 전송됩니다. 따라서 두 개의 서보 모터가 태양광 패널을 더 잘 배치하도록 안내합니다. 효율을 높이기 위해서죠. 실제로 여기에서 서보 모터가 작동할 때 빛의 강도를 높이거나 낮추는 것을 볼 수 있습니다.
이 두 전위차계를 사용하여 서보 모터의 속도도 제어할 수 있습니다. 이에 대해서는 나중에 프로그래밍 섹션에서 설명하겠습니다.
팅커캐드 이중 축 태양광 추적기 아두이노 시뮬레이션 파일
LDR 및 서보 모터를 사용한 이중 축 태양광 추적기 아두이노 프로젝트 인터페이스하기
- 아두이노의 5V 핀을 브레드보드의 아래쪽 수평 행에 연결합니다.
- 마찬가지로 아두이노의 GND 핀을 브레드보드의 두 번째 아래쪽 수평 행에 연결합니다.
- 5V와 GND 행을 각각 브레드보드의 위쪽 수평 행으로 확장합니다.
- 이제 수직 및 수평 서보 모터의 전원 핀을 모두 5V에 연결합니다.
- 마찬가지로 수평 및 수직 서보 모터의 GND 핀을 모두 접지에 연결합니다.
- 이제 수직 서보 모터의 신호 핀을 아두이노의 디지털 핀 10번과 연결합니다.
- 다시 수평 서보 모터의 신호 핀을 아두이노의 디지털 핀 9번과 연결합니다.
- 두 전위차계의 한쪽 단자를 접지에 연결하고 두 전위차계의 다른 쪽 단자를 VCC 5V에 연결합니다.
- 이제 10k옴 저항을 통해 한 단자의 모든 LDR을 5V에 연결하고 다른 단자를 접지에 연결합니다.
- 전위차계-1의 와이퍼 핀을 아날로그 핀 A4에 연결하고 A5를 전위차계-2의 다른 와이퍼 핀에 연결해 봅시다.
- 왼쪽 하단 LDR 전압 분배기를 아두이노의 A1 핀에 연결합니다.
- 다시 왼쪽 상단 LDR 전압 분배기를 아두이노의 A0 핀에 연결합니다.
- 마찬가지로 오른쪽 상단 LDR 전압 분배기를 A2 핀에 연결합니다.
- 마지막으로 LDR의 오른쪽 하단 전압 분배기를 아두이노의 A3 핀에 연결합니다.
2축 태양광 추적기 프로젝트를 위한 아두이노 프로그래밍하기
#include은 서보 헤더 라이브러리 파일을 포함하는 데 사용됩니다.
#include <Servo.h>
수평 서보에 대한 구성입니다. 서보 수평은 180도로 설정됩니다. 신호 값이 높을 때 서보 수평 제한은 175도로 설정됩니다. 다시, 신호 값이 낮을 때의 서보 수평 제한은 5도로 설정됩니다.
Servo horizontal; // horizontal servo
int servoh = 180;
int servohLimitHigh = 175;
int servohLimitLow = 5;
// 65 degrees MAX
수직에 대한 서보 구성입니다 서보 수직은 45도로 설정됩니다. 신호가 높을 때의 서보 수직 제한은 60도로 설정됩니다. 또한 신호 값이 낮을 때의 서보 수직 제한은 1도로 설정됩니다. 서보 수직;
Servo vertical; // vertical servo
int servov = 45;
int servovLimitHigh = 60;
int servovLimitLow = 1;
LDR 핀 연결
- ldrlt는 상단 왼쪽
- ldrrt는 상단 오른쪽
- ldrld는 하단 왼쪽
- ldrrd는 하단 오른쪽입니다.
// LDR pin connections
// name = analogpin;
int ldrlt = A0; //LDR top left - BOTTOM LEFT <--- BDG
int ldrrt = A3; //LDR top rigt - BOTTOM RIGHT
int ldrld = A1; //LDR down left - TOP LEFT
int ldrrd = A3; //ldr down rigt - TOP RIGHT
void setup에서 수직 및 수평 서보 신호 핀을 연결하고 수평 서보 회전은 180도로 설정했습니다. 마찬가지로 수직 서보도 45도로 설정했습니다. 또한 2.5초의 지연을 설정했습니다.
void setup(){
horizontal.attach(9);
vertical.attach(10);
horizontal.write(180);
vertical.write(45);
delay(2500);
}
Void loop() 함수에서는 LDR에 연결된 Arduino의 아날로그 핀 값을 읽은 다음 수직과 수평의 평균을 계산합니다.
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 right
int dtime = 10; int tol = 90; // dtime=diffirence time, tol=toleransi
int avt = (lt + rt) / 2; // average value top
int avd = (ld + rd) / 2; // average value down
int avl = (lt + ld) / 2; // average value left
int avr = (rt + rd) / 2; // average value right
int dvert = avt - avd; // check the diffirence of up and down
int dhoriz = avl - avr;// check the diffirence og left and rigt
IF 및 IF-ELSE 문은 프로그램을 반복하고 각 LDR의 평균값을 계산하도록 정의되어 있습니다. 마지막으로 이 코드는 서보 모터의 각도를 변경하는 데 도움이 됩니다. 그래서 더 효과적일 수 있습니다.
if (-1*tol > dvert || dvert > tol)
{
if (avt > avd)
{
servov = ++servov;
if (servov > servovLimitHigh)
{servov = servovLimitHigh;}
}
else if (avt < avd)
{servov= --servov;
if (servov < servovLimitLow)
{ servov = servovLimitLow;}
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
}
}
else if (avl = avr)
{
delay(5000);
}
horizontal.write(servoh);
}
마지막으로 (dtime)의 지연을 추가했습니다.
delay(dtime);
}
이제 프로그램을 컴파일하고 아두이노 보드에 업로드합니다.
최종 프로그램 코드/스케치
#include <Servo.h>
Servo horizontal; // horizontal servo
int servoh = 180;
int servohLimitHigh = 175;
int servohLimitLow = 5;
// 65 degrees MAX
Servo vertical; // vertical servo
int servov = 45;
int servovLimitHigh = 60;
int servovLimitLow = 1;
// LDR pin connections
// name = analogpin;
int ldrlt = A0; //LDR top left - BOTTOM LEFT <--- BDG
int ldrrt = A3; //LDR top rigt - BOTTOM RIGHT
int ldrld = A1; //LDR down left - TOP LEFT
int ldrrd = A3; //ldr down rigt - TOP RIGHT
void setup(){
horizontal.attach(9);
vertical.attach(10);
horizontal.write(180);
vertical.write(45);
delay(2500);
}
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 right
int dtime = 10; int tol = 90; // dtime=diffirence time, tol=toleransi
int avt = (lt + rt) / 2; // average value top
int avd = (ld + rd) / 2; // average value down
int avl = (lt + ld) / 2; // average value left
int avr = (rt + rd) / 2; // average value right
int dvert = avt - avd; // check the diffirence of up and down
int dhoriz = avl - avr;// check the diffirence og left and rigt
if (-1*tol > dvert || dvert > tol)
{
if (avt > avd)
{
servov = ++servov;
if (servov > servovLimitHigh)
{servov = servovLimitHigh;}
}
else if (avt < avd)
{servov= --servov;
if (servov < servovLimitLow)
{ servov = servovLimitLow;}
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
}
}
else if (avl = avr)
{
delay(5000);
}
horizontal.write(servoh);
}
delay(dtime);
}
결론
마지막으로 LDR 및 서보 모터를 사용한 이중 축 태양광 추적기 아두이노 프로젝트 인터페이싱을 완료했습니다. 이제 이 프로젝트를 사용하여 태양광 패널을 추적하고 효율을 40%까지 높일 수 있습니다.
이 프로젝트가 도움이 되셨기를 바랍니다!궁금한 점이 있으면 아래에 댓글을 남겨 주세요. 최선을 다해 답변해 드리겠습니다.
언제나 그렇듯이 이 프로젝트의 참고 링크를 따라가면 문서를 만날 수 있습니다. 배움을 멈추지 마세요.
문서의 다른 프로젝트 링크
Interfacing Temperature and Humidity Sensor with Arduino
DIY Mobile Phone using GSM Module & Arduino with Nextion Display
Simple Weather station using Arduino & BME280 Barometric Pressure Sensor
RFID Based Attendance System Using NodeMCU with PHP Web App
Capacitive Soil Moisture Sensor with OLED Display & Arduino
ESP8266 based Coronavirus Tracker for your country
NodeMCU ESP8266 Monitoring DHT11/DHT22 Temperature and Humidity with Local Web Server
Home Automation with ESP8266 Web Server & Relay Module Control Appliances from Local Network
Interfacing DHT11 Humidity and Temperature Sensor with Arduino & LCD
IoT Based Flood Monitoring System Using NodeMCU & Thingspeak
더욱 좋은 정보를 제공하겠습니다.~ ^^