본문 바로가기

카테고리 없음

LDR 및 서보 모터를 사용한 2축 태양광 추적기 아두이노 프로젝트

반응형

 

안녕하세요, 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

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^