Arduino太阳能跟踪器

Arduino太阳能跟踪器

    • 介绍
    • 组件和耗材
    • 应用和平台
    • 项目描述
    • 代码

介绍

开放式硬件/软件测试台,用于带有虚拟仪器的太阳能跟踪器。
在这里插入图片描述

组件和耗材

1-Arduino UNO
1-迷你太阳能电池板
2-按钮开关,按钮
1-旋转电位器(通用)
2-SG90微型伺服电机
4-电阻器 330 欧姆
4-LDR

应用和平台

Arduino IDE

项目描述

该项目展示了一个用于太阳能跟踪器的开放式硬件/软件测试台。所提出的原型基于由Arduino Uno控制的双轴太阳能跟踪器,Arduino Uno是一个基于易于使用的硬件和软件的开源原型平台。太阳能跟踪器可以在光相关电阻器(LDR)传感器的帮助下自动控制,也可以使用电位计手动控制。此外,该测试台提供基于Excel的虚拟仪器,其中可以记录和显示其太阳能跟踪器数据。使用的硬件被选择为便宜,紧凑和多功能。拟议的测试台旨在帮助学生发展对控制理论及其应用的理解。

建议的测试台如图1所示。它基于太阳能跟踪器,可以在四个LDR传感器和两个伺服电机(SM1和SM2)的帮助下自动旋转以跟踪太阳,或使用电位器手动。要在两种模式(自动和手动)之间切换,使用按钮。另一个按钮用于将SM1(上下伺服电机)或SM2(左右伺服电机)连接到电位计以控制其运动。此外,计算机用作虚拟仪器,根据MS Excel中的时间可视化光伏电池板的模式和电流,电压和功率。Arduino Uno 板用于实现系统的所有软件要求。

在这里插入图片描述机械设计
如图2所示,在CATIA中设计了太阳能跟踪器的计算机辅助设计(CAD)三维模型。它由PV面板,左右和上下伺服电机以及四个LDR传感器组成。对于水平轴,轴承与上下伺服电机平行固定,以获得更好的灵活性。太阳能跟踪器设计有两个自由度,从东到西由左右伺服电机和从南到北由上下伺服电机。LDR传感器放置在光伏电池板的四个角,并放置在顶部带有小孔的暗管中,以检测太阳的照明。这些暗管也被认为是辐射的聚光器,用于增加太阳能跟踪器的鲁棒性。
在这里插入图片描述硬件系统
图3显示了所提出的测试平台的电子电路。对于自动模式,微控制器将LDR传感器(引脚A0至A3)的模拟值转换为数字。然后,它使用两个脉宽调制(PWM)信号(引脚5和6)控制两个伺服电机(上下和左右)来跟踪太阳。旋转运动发生在两个轴上,根据每日太阳的路径从东到西的方位角,根据季节性太阳的路径从南到北的高程。对于手动模式,电位计(引脚A4)用于控制两个伺服电机的运动,部署一个按钮(引脚11)将电位器连接到上下伺服电机或左右伺服电机。此外,另一个按钮(引脚12)用于在两种模式之间切换。此外 PV电压通过Arduino的模拟引脚A5测量,然后计算PV电流,因为负载的电阻器已经知道。接下来,PV电流,电压和功率与时间和实际模式的关系被发送到计算机,以便在MS Excel上实时显示它们。
在这里插入图片描述LDR传感器电路设计为分压器电路。光强度的变化与分压器输出电压的变化成正比。分压器的顶部为5 V,接地为0 V,分压器的输出连接到模拟输入( 一个 例如 0)的微控制器。随后,微控制器的模数转换器(ADC)转换读取的模拟值 一个 0转换为0到1023之间的数字值,因为ADC以10位编码,根据该值,可以知道光的水平。分压器中使用的电阻值为330 Ω。

使用两个180度伺服电机。伺服电机(MG996R)根据纵轴控制太阳能跟踪器,即左右伺服电机。而微型伺服电机(SG90)则根据水平轴控制太阳能跟踪器,即上下伺服电机。伺服电机的优点是,我们可以使用直接连接到微控制器输出的单根低电流线来控制其停止、运行、旋转方向和速度,而无需任何驱动器。使用的伺服电机由Arduino UNO板通过3芯电缆控制,如图3所示,两根电线用于供电,一根用于PWM的电线来控制其位置。
嵌入式软件设计
嵌入式软件是将嵌入硬件(Arduino Uno)中以控制和监视太阳能跟踪器测试台的部分。嵌入式软件旨在满足以下要求:

  1. 试验台有两种模式:手动和自动。按钮连接到引脚 12,可在两种模式之间切换。

  2. 如果手动模式处于活动状态,电位器可以左右电机从东到西控制伺服电机,对于上下电机,从南到北控制伺服电机。一个按钮连接到引脚 11,用于在两个电机之间切换电位器,它可以控制左右伺服电机或上下伺服电机。

  3. 如果自动模式处于活动状态,则将执行图 4 中所示的算法。后者使用LDR传感器返回的模拟值。例如,考虑方位角或垂直轴,比较两个右LDR和两个左LDR的平均值,如果左组LDR接收到更多的光,太阳能跟踪器将通过左右伺服电机向该方向移动。后者将继续旋转,直到差异结果在 [−10, 10] 范围内。该范围用于稳定控制器,一旦太阳能跟踪器垂直于太阳,就不再进行进一步的控制。另一方面,如果右组LDR接收到更多的光,则太阳能跟踪器通过左右伺服电机沿该方向移动,并将继续旋转,直到差异结果在[-10,10]范围内。 高程轴也使用相同的方式。此外,我们还确定了四个LDR传感器之间的平均辐射,以及该值是否小于一点值(8:经过实际调整和测试的值,当辐照为零时返回)。也就是说,夜晚已经到来。在这种情况下,太阳能跟踪器必须返回到太阳的上升位置。例如,如果在左右伺服电机中设置0度,在上下伺服电机中设置30度可以达到太阳的上升位置。这可以通过C函数“servox”轻松完成。write(angle)“由Arduino IDE提供。 经过实际调整和测试的值,当辐照为零时返回)。也就是说,夜晚已经到来。在这种情况下,太阳能跟踪器必须返回到太阳的上升位置。例如,如果在左右伺服电机中设置0度,在上下伺服电机中设置30度可以达到太阳的上升位置。这可以通过C函数“servox”轻松完成。write(angle)“由Arduino IDE提供。 经过实际调整和测试的值,当辐照为零时返回)。也就是说,夜晚已经到来。在这种情况下,太阳能跟踪器必须返回到太阳的上升位置。例如,如果在左右伺服电机中设置0度,在上下伺服电机中设置30度可以达到太阳的上升位置。这可以通过C函数“servox”轻松完成。write(angle)“由Arduino IDE提供。

  4. 必须处理通过模拟引脚A5获取的PV电压,并用于计算PV电流和功率。然后,所有这些数据和实际模式必须通过USB电缆发送到计算机,然后在MS Excel中显示它们。
    这 PLX-DAQ Excel Macro用于从Arduino微控制器到Excel电子表格的数据采集。我们只需要下载它。安装后,将在PC上自动创建一个名为“PLX-DAQ”的文件夹,其中有一个名为“PLX-DAQ电子表格”的快捷方式。然后,要建立电路板和Excel之间的通信,我们只需要打开电子表格并在PLX-DAQ窗口中定义连接设置(波特率和端口)(图5)。 此后,单击“连接”后,输出数据将被收集并实时显示在Excel电子表格上
    在这里插入图片描述图6显示了处于分离和组装状态的太阳能跟踪器。如前所述,整个结构是使用木板制造的,很明显,所有提到的组件都已用于构建具有手动和自动模式的太阳能跟踪器(LDR 传感器、Arduino Uno、伺服电机、电位计、按钮和小型光伏面板)。

在这里插入图片描述图7显示了整个测试台,带有虚拟仪器的太阳能跟踪器,以及可以暴露光线以测试太阳能跟踪器的人造灯。太阳能跟踪器和计算机通过USB电缆连接。一旦获取了PV电压,控制器就会处理此信息并使用它来计算PV电流和功率。然后,所有这些数据都被发送到计算机,以在MSExcel中呈现它们。从图5和图6可以清楚地看出,所提出的测试台体积小、灵活且易于使用。它可以使学生,研究人员和工程师在继续实施大型太阳能跟踪设备之前以简单的方式应用他们的算法。
在这里插入图片描述

代码

//Servo motor library
#include 
//Initialize variables
int   mode = 0;
int axe = 0;            
int buttonState1 = 0;    
int buttonState2   = 0;   
int prevButtonState1 = 0;
int prevButtonState2 = 0; int ldrtopr=   0;                // top-right LDR                          
int ldrtopl = 1;                // top-left LDR                          
int ldrbotr = 2;               //   bottom-right LDR                     
int ldrbotl = 3;               // bottom-left   LDR                   
int topl = 0;
int topr = 0; 
int botl = 0;
int   botr = 0;//Declare two servos
Servo servo_updown;
Servo servo_rightleft;int   threshold_value=10;           //measurement sensitivityvoid setup()
{Serial.begin(9600);                                //serial connection setup  //opens   serial port, sets data rate to 9600 bpsSerial.println("CLEARDATA");                       //clear   all data that’s been place in alreadySerial.println("LABEL,t,voltage,current,power,Mode");    //define the column headings (PLX-DAQ command)pinMode(12, INPUT);              //Mode   switch ButtonpinMode(11, INPUT);              //Axis switchpinMode(A4,   INPUT);              //Potentiometer for right-left movement and for up-down movementservo_updown.attach(5);             //Servo motor up-down movementservo_rightleft.attach(6);           //Servo motor right-left movement
}void loop()
{
//  pv_power();
char   Mode;float volt = analogRead(A5)*5.0/1023;float voltage = 2*volt;                 //  Volt=(R1/R1+R2)*Voltage / R1=R2=10Ohms  => voltage=2*volt)float current = voltage/20;            //  I=voltage/(R1+R2) float power   = voltage*current;Serial.print("DATA,TIME,"); // PLX-DAQ commandSerial.print(voltage);     //send the voltage to serial portSerial.print(",");Serial.print(current);     //send the current to serial portSerial.print(",");Serial.print(power);   //send the power to serial portSerial.print(",");//    Serial.println(Mode);       buttonState1 = digitalRead(12);if (buttonState1 != prevButtonState1)   {if (buttonState1 == HIGH) {//Change mode and ligh up the correct   indicator  if (mode == 1) {mode = 0;} else {mode = 1;}}}prevButtonState1 = buttonState1;delay(50); // Wait for 50 millisecond(s)if (mode == 0) {Mode='M';Serial.println(Mode);   //send Mode "Manual" to serial port    manualsolartracker();} else { // mode automaticMode = 'A';Serial.println(Mode);      automaticsolartracker(); //send Mode "Automatic" to serial port} 
}void   automaticsolartracker(){//capturing analog values of each LDRtopr= analogRead(ldrtopr);         //capturing analog value of top right LDRtopl= analogRead(ldrtopl);         //capturing analog value of top left LDRbotr= analogRead(ldrbotr);         //capturing analog value of bot right LDRbotl= analogRead(ldrbotl);         //capturing analog value of bot left LDR// calculating averageint avgtop = (topr + topl) / 2;     //average   of top LDRsint avgbot = (botr + botl) / 2;     //average of bottom LDRsint avgleft = (topl + botl) / 2;    //average of left LDRsint avgright   = (topr + botr) / 2;   //average of right LDRs//Get the different   int diffelev = avgtop - avgbot;      //Get the different average betwen   LDRs top and LDRs botint diffazi = avgright - avgleft;    //Get the different   average betwen LDRs right and LDRs left//left-right movement of   solar trackerif (abs(diffazi) >= threshold_value){        //Change   position only if light difference is bigger then the threshold_valueif   (diffazi > 0) {if (servo_rightleft.read() < 180) {servo_rightleft.write((servo_updown.read()   + 2));}}if (diffazi <  0) {if (servo_rightleft.read()   > 0) {servo_rightleft.write((servo_updown.read() - 2));}}}//up-down movement of solar trackerif (abs(diffelev) >= threshold_value){    //Change position only if light   difference is bigger then thethreshold_valueif (diffelev > 0) {if   (servo_updown.read() < 180) {servo_updown.write((servo_rightleft.read()   - 2));}}if (diffelev <  0) {if (servo_updown.read()   > 0) {servo_updown.write((servo_rightleft.read() + 2));}}}       }  void manualsolartracker(){buttonState2   = digitalRead(13);if (buttonState2 != prevButtonState2) {if (buttonState2   == HIGH) {//Change mode and ligh up the correct indicator  if   (axe == 1) {axe = 0;} else {axe = 1;}}}prevButtonState2 = buttonState2;delay(50); // Wait for 50   millisecond(s)if (axe == 0) {     //control right-left movementservo_rightleft.write(map(analogRead(A4),   0, 1023, 0, 180));} else { // //control up-down movementservo_updown.write(map(analogRead(A4),   0, 1023, 0, 180));} 
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部