原文地址:https://circuitdigest.com/microcontroller-projects/arduino-solar-panel-tracker
参考:

  1. 太阳能板追光装置
  2. 智能采光实时追日的电能管理系统,此文章在设计上有科学的依据。
  3. DIY创意家庭:实现LED台灯的智能化,提供软硬件解决方案的设计细节

使用Arduino的太阳追踪太阳能电池板

ARDUINO的

经过**穆罕默德·阿奇布(Muhammad Aqib)** 2017年1月12日25

使用LDR和伺服电机的基于Arduino的Sun Tracking Solar Panel项目使用LDR和伺服电机的基于Arduino的Sun Tracking Solar Panel项目

在本文中,我们将使用Arduino制作一个太阳追踪太阳能电池板,其中我们将使用两个LDR(取决于光的电阻器)感应光,并使用一个伺服电机自动将太阳能电池板朝着太阳光的方向旋转。该项目的优势在于,太阳能电池板将始终跟随太阳光,始终始终面对太阳以保持充电状态,并可以为电源提供最大的功率。该原型非常易于构建。在下面,您将找到有关其工作原理和原型制造方式的完整说明。

Arduino Solar Tracker的必需组件:

以下是使用Arduino构建太阳能跟踪系统所需的组件,大多数组件应在您当地的商店中可用。

  • 伺服马达(SG90)
  • 太阳能板
  • Arduino Uno
  • LDR的X 2(光敏电阻)
  • 10K电阻器X 2
  • 电池(6至12V)

单轴太阳能跟踪器如何工作?

在此项目中,LDR用作光检测器。在详细介绍之前,我们将必须了解LDR的工作方式。**LDR(光敏电阻)**也称为光敏电阻,是一种光敏设备。当光落在其上时,其电阻会降低,这就是为什么它经常在黑暗或光探测器电路中使用的原因在此处检查基于LDR的各种电路

两个LDR放置在太阳能电池板的两侧,而伺服电机用于旋转太阳能电池板。伺服器会将太阳能电池板移向电阻较低的LDR,即朝着光线下降的LDR移动,这样它将一直跟随光线。如果两个LDR上都照射有少量光,则伺服器将不会旋转。伺服器将尝试将太阳能电池板移动到两个LDR都具有相同电阻的位置,这意味着两个电阻上的光量会相同,如果其中一个LDR的电阻发生变化,则它将朝较低电阻旋转LDR。查看本文末尾的演示视频

光敏电阻的检测

A、用一黑纸片将光敏电阻的透光窗口遮住,此时万用表的指针基本保持不动,阻值接近无穷大。此值越大说明光敏电阻性能越好。若此值很小或接近为零,说明光敏电阻已烧穿损坏,不能再继续使用。

B、将一光源对准光敏电阻的透光窗口,此时万用表的指针应有较大幅度的摆动,阻值明显减些此值越小说明光敏电阻性能越好。若此值很大甚至无穷大,表明光敏电阻内部开路损坏,也不能再继续使用。

C、将光敏电阻透光窗口对准入射光线,用小黑纸片在光敏电阻的遮光窗上部晃动,使其间断受光,此时万用表指针应随黑纸片的晃动而左右摆动。如果万用表指针始终停在某一位置不随纸片晃动而摆动,说明光敏电阻的光敏材料已经损坏。

如何使用Arduino构建旋转的太阳能电池板:

要制作原型,您将必须执行以下步骤:

步骤1:

首先,取一小块硬纸板,并在其一端打一个孔。稍后,我们将螺丝插入其中以使用伺服器将其固定。
在这里插入图片描述
第2步:

现在,借助胶水或热风枪将两小块纸板彼此固定为V形,然后将太阳能电池板放置在其上。
在这里插入图片描述

第三步:

然后将V形的底面连接到小纸板的另一端,在第一步中在小纸板上打了一个孔。
在这里插入图片描述

第四步:

现在,将螺丝插入您在卡板上制作的孔中,并将其穿过该孔插入伺服器中。购买时,伺服电机随附螺钉。
在这里插入图片描述
步骤5:

现在,将伺服器放在另一块纸板上。硬纸板的尺寸应足够大,以便您可以在其上放置Arduino Uno,面包板和电池。
在这里插入图片描述
步骤6:

借助胶水将LDR固定在太阳能电池板的两侧。确保您已将电线与LDR的支脚焊接在一起。稍后,您将必须将它们与电阻器连接。
在这里插入图片描述

步骤7:

现在,将Arduino,电池和面包板放在纸板上,并按照下面的“电路图”和“说明”部分所述进行连接。最终的原型如下所示。
在这里插入图片描述

电路图和说明:

下面显示了太阳能跟踪arduino项目的完整电路图。如您所见,该电路非常简单,并且可以借助小型面包板轻松构建。
在这里插入图片描述
在此Arduino Solar Panel Tracker中,Arduino由9V电池供电,而所有其他部件均由Arduino供电。Arduino建议的输入电压为7到12伏,但是您可以在6到20伏的范围内为它供电(这是极限)。尝试在建议的输入电压范围内为其供电。因此,将电池的正极线连接到Arduino的Vin,将电池的负极线连接到Arduino的地。

接下来, 将舵机连接到Arduino。将伺服的正极线连接到Arduino的5V,并将接地线连接到Arduino的地线,然后将Servo的信号线连接到Arduino的数字引脚9。伺服器将帮助移动太阳能电池板。

现在将LDR连接到Arduino。将LDR的一端连接到10k电阻器的一端,然后将该端连接到Arduino的A0,然后将该电阻器的另一端接地,并将LDR的另一端连接到5V。同样,将第二个LDR的一端连接到另一个10k电阻器的一端,并将该端连接到Arduino的A1并将该电阻器的另一端接地,并将LDR的另一端连接到5V Arduino的。

使用Arduino代码的单轴太阳能跟踪器:

基于Arduino的Solar Panel Tracker的代码很简单,并通过注释进行了很好的解释。首先,我们将包括伺服电机库。然后,我们将初始化伺服电机初始位置的变量。之后,我们将初始化变量以从LDR传感器和伺服读取。

#include <Servo.h>      //including the library of servo motor 
Servo sg90;                   //initializing a variable for servo named sg90
int initial_position = 90;    //Declaring the initial position at 90
int LDR1 = A0;                //Pin at which LDR is connected
int LDR2 = A1;                //Pin at which LDR is connected
int error = 5;                //initializing variable for error
int servopin=9;

*sg90.atach(servopin)*命令将从Arduino的引脚9读取Servo。接下来,我们将LDR引脚设置为输入引脚,以便我们可以从传感器读取值并据此移动太阳能电池板。然后,将伺服电机设置为90度,这是伺服的初始位置。

void setup() 
{ 
  sg90.attach(servopin);  // attaches the servo on pin 9
  pinMode(LDR1, INPUT);   //Making the LDR pin as input
  pinMode(LDR2, INPUT);
  sg90.write(initial_position);   //Move servo at 90 degree
  delay(2000);                   // giving a delay of 2 seconds
}

然后,我们将从LDR中读取值,并将其保存在R1和R2中。然后,我们将使两个LDR之间存在差异,以相应地移动伺服器。如果它们之间的差为零,则意味着两个LDR上的光量相同,因此太阳能电池板将不会移动。我们使用了一个名为error的变量,其值为5,该变量的用途是,如果两个LDR之间的差异小于5,则伺服机构将不会移动。如果我们不这样做,那么伺服将继续旋转。如果差值大于误差值(5),则伺服器将使太阳能电池板朝LDR方向移动,在LDR方向上光线会朝着该方向移动。查看下面的完整代码和演示视频。

  int R1 = analogRead(LDR1); // reading value from LDR 1
  int R2 = analogRead(LDR2); // reading value from LDR 2
  int diff1= abs(R1 - R2);   // Calculating the difference between the LDR's
  int diff2= abs(R2 - R1);
  
  if((diff1 <= error) || (diff2 <= error)) {
    //if the difference is under the error then do nothing
  } else {    
    if(R1 > R2)
    {
      initial_position = --initial_position;  //Move the servo towards 0 degree
    }
    if(R1 < R2) 
    {
      initial_position = ++initial_position; //Move the servo towards 180 degree
    }
  }

这样便可以构建一个简单的Solar Panel Tracker,它将自动朝着像向日葵一样的光线移动。在这里,我们使用了低功率太阳能电池板来减轻重量,如果您打算使用高功率或重型太阳能电池板,则需要相应地选择伺服电机。

代码

/*

Arduino solar tracker code

www.circuitdigest.com

*/

#include <Servo.h>      //including the library of servo motor 
Servo sg90;             //initializing a variable for servo named sg90
int initial_position = 90;   //Declaring the initial position at 90
int LDR1 = A0;          //Pin at which LDR is connected
int LDR2 = A1;          //Pin at which LDR is connected
int error = 5;          //initializing variable for error
int servopin=9;
void setup() 
{ 

  sg90.attach(servopin);  // attaches the servo on pin 9
  pinMode(LDR1, INPUT);   //Making the LDR pin as input
  pinMode(LDR2, INPUT);
  sg90.write(initial_position);   //Move servo at 90 degree
  delay(2000);            // giving a delay of 2 seconds
}  
 
void loop() 
{ 
  int R1 = analogRead(LDR1); // reading value from LDR 1
  int R2 = analogRead(LDR2); // reading value from LDR 2
  int diff1= abs(R1 - R2);   // Calculating the difference between the LDR's
  int diff2= abs(R2 - R1);
  
  if((diff1 <= error) || (diff2 <= error)) {
    //if the difference is under the error then do nothing
  } else {    
    if(R1 > R2)
    {
      initial_position = --initial_position;  //Move the servo towards 0 degree
    }
    if(R1 < R2) 
    {
      initial_position = ++initial_position; //Move the servo towards 180 degree
    }
  }
  sg90.write(initial_position); // write the position to servo
  delay(100);
}

基于Arduino的太阳能板追光装置设计(二)

原文链接:https://blog.csdn.net/weixin_43999167/article/details/103191387

本装置使用光敏电阻,暗电阻几乎达到1MΩ,强光条件下只有几百Ω,因此我们串联1K可调电阻进行限流分压,否则光敏电阻电阻过低近似导通会烧坏东西吧
为了适应环境的变化,我采用了可调电阻。而且光敏电阻可能因为你放的不够平,会使接收到的数据不一样,你感觉没对着太阳,你就可以调分压电阻调节。
AD采集数据把Arduino把5V对应0-1023的整数值,约等于每个单位0.049V。通过测试,在正常阳光条件下,可调电阻为500Ω,采集数据在800-900之间,根据各个光敏电阻的电压不同,可以判断四周分布光源强弱。
本来我想着直接使用光敏电阻判断即可,用手电筒测试还好,但是在阳光下由于阳光大小相同,并不能正常工作,于是我加了挡光板,只有光线垂直才会同时接收到光线,当光线不垂直时会产生阴影,造成部分光敏电阻接收不到光线。下面是纸板模型。

1

当光线不垂直时,产生阴影。
在这里插入图片描述

用的板子是Arduino nano和配套的扩展板,因为要用到舵机,用扩展板方便。

这些是全部程序:

#include <Servo.h>
Servo lr_servo;//定义左右旋转舵机名称
Servo ud_servo;//定义上下旋转舵机名称

int lr_angle = 90;//设置初始角度为90度
int ud_angle = 0;//设置初始角度为0度,让太阳能板水平朝上,检测太阳光最强点
int l_state = A0;//定义光敏电阻模拟电压输入
int r_state = A1;
int u_state = A2;
int d_state = A3;

int lr_servopin = 3;//定义舵机控制信号引脚
int ud_servopin = 5;

void setup() {
  Serial.begin(9600); //定义串口波特率
  lr_servo.attach(lr_servopin);  // 设置舵机控制针脚
  ud_servo.attach(ud_servopin);  // 设置舵机控制针脚
  pinMode(l_state, INPUT); //设置引脚类型
  pinMode(r_state, INPUT);
  pinMode(u_state, INPUT);
  pinMode(d_state, INPUT);

  lr_servo.write(lr_angle);//恢复初始角度
  delay(1000);
  ud_servo.write(ud_angle);
  delay(1000);

}

void loop() {
  int L = analogRead(l_state);//读取传感器模拟电压值,0-1200
  int R = analogRead(r_state);
  int U = analogRead(u_state);
  int D = analogRead(d_state);
  int error = 9;//定义误差范围,防止抖动
  int m_speed = 20;//设置舵机速度
  /**********************左右调节程序**********************/
  // abs()是求绝对值函数
  if (abs(L - R) > error && L > R) { //判断误差是否在允许范围内,否者调整舵机
    lr_angle--;//调小角度
    if (lr_angle < 0) { //限制舵机转动角度
      lr_angle = 0;
    }
    lr_servo.write(lr_angle);  //输出舵机角度
    delay(m_speed);

  }
  else if (abs(L - R) > error && L < R) { //判断误差是否在允许范围内,否者调整舵机
    lr_angle++;//调大角度
    if (lr_angle > 180) { //限制舵机转动角度
      lr_angle = 180;
    }
    lr_servo.write(lr_angle);  //输出舵机角度
    delay(m_speed);

  }
  else if (abs(L - R) <= error) { //判断误差是否在允许范围内,在范围内,舵机静止,角度不做调整
    lr_servo.write(lr_angle); //输出舵机角度
  }
  /**********************上下调节程序**********************/
  if (abs(U - D) > error && U >= D) { //判断误差是否在允许范围内,否者调整舵机
    ud_angle--;//调小角度
    if (ud_angle < 0) { //限制舵机转动角度
      ud_angle = 0;
    }
    ud_servo.write(ud_angle);  //输出舵机角度
    delay(m_speed);

  }
  else if (abs(U - D) > error && U < D) { //判断误差是否在允许范围内,否者调整舵机
    ud_angle++;//调大角度
    if (ud_angle > 95) { //限制舵机转动角度
      ud_angle = 95;
    }
    ud_servo.write(ud_angle);  //输出舵机角度
    delay(m_speed);

  }
  else if (abs(U - D) <= error) { //判断误差是否在允许范围内,在范围内,舵机静止,角度不做调整
    lr_servo.write(lr_angle);  //输出舵机角度
  }



  //串口显示光敏电阻阻值和舵机角度
  Serial.print(" L ");
  Serial.print(L);
  Serial.print(" R ");
  Serial.print(R);
  Serial.print(" U ");
  Serial.print(U);
  Serial.print(" D ");
  Serial.print(D);
  Serial.print(" ud_angle ");
  Serial.print(ud_angle);
  Serial.print(" lr_angle ");
  Serial.println(lr_angle);
  delay(1000);//在测试时,串口数据接收过快,可以适当加延时调整
}

舵机使用SG90,用3D打印的openmv云台支架
在这里插入图片描述

后面我加了锂电池充电模块,电池储能,和5V升压板给板子供电。
成品图
在这里插入图片描述

测试视频,当时对着的是南边的窗户,有太阳光照。

制作 基于Arduino的太阳能板追光太阳跟随装置设计

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐