向日葵

前言

大学专业是能源相关,对太阳能等新能源比较感兴趣,一直好奇太阳能电池板是如何跟踪阳光的。直到最近在油管上看到一个视频,根据光敏电阻追踪光源,才恍然大悟。趁着回扬州,用了一个晚上和一个上午做了这件比较有趣的装置。

sun (6).jpg

组成简介

主要组成部分如下,Arduino Nano ,四个光敏电阻,四个12KΩ的电阻,太阳能电池板,两个sg90舵机。制作框架的塑料管是折腾机箱水冷时剩下的边角料,放了一年多居然派上用场了。

sun (3).jpg

使用的光敏电阻型号为5516,用万用表测试,正常光照下,电阻为1.6KΩ 左右;用手遮挡光源后,阻值趋于无穷大。

光敏电阻(photoresistor or light-dependent resistor,后者缩写为ldr),常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低,亮电阻值可小至1KΩ以下。光敏电阻对光线十分敏感,其在无光照时,呈高阻状态,暗电阻一般可达1.5MΩ。

正面并联放置了三块5V,200mA输出的太阳能电池板,5V电压可以给手机平板等好多设备充电。选择12KΩ的电阻,是综合考虑了模拟口取样的平滑和灵敏。下图是选择四种不同阻值的电阻时,中间电压值的变化。(5V供电时)根据上文对光敏电阻的描述,x(光敏电阻的阻值,单位KΩ)的取值范围在1到1500之间,由图像可以看出在该范围内,选取串联的电阻阻值越大,曲线越平滑,同时灵敏度下降。所以折中选择10KΩ左右的电阻比较合适。

[站外图片上传中...(image-b66bf9-1559452162883)]

考虑了两种可行的方案,第一种方案即上述的选择四个12KΩ的电阻与四个光敏电阻串联,分别读取四个中间电压值作比较,进行舵机的角度调整。
第二种方案是左右两侧和上下两侧的光敏电阻分别串联,只需要读取两个中间电压值,就可以做出相应的控制。第一种方案接线麻烦些,但是可以实现更多的控制方式。(比如说夜晚中间电压值均小于给定值时,恢复初始状态待机)

方案一接线

sunflower 1.jpg

方案一代码

#include    
Servo servo1;
Servo servo2;
 
int initial1 = 90; 
int initial2 = 90;  //舵机初始角度
  
int LDR1 = A0;         
int LDR2 = A2;
int LDR3 = A4;
int LDR4 = A6;          

int error = 10;         

int servoPin1 = 9; 
int servoPin2 = 10;   //舵机接口    

void setup() {
  servo1.attach(servoPin1); 
  servo2.attach(servoPin2); 
  pinMode(LDR1, INPUT);   
  pinMode(LDR2, INPUT);
  pinMode(LDR3, INPUT);
  pinMode(LDR4, INPUT); 
  servo1.write(initial1);
  servo2.write(initial2);
  delay(2000);           
}  
 
void loop() {
  int R1 = analogRead(LDR1); 
  int R2 = analogRead(LDR2);
  int R3 = analogRead(LDR3);
  int R4 = analogRead(LDR4); //读取四个中间电压值
   
  int diff1= abs(R1 - R2);   
  int diff2= abs(R2 - R1);
  int diff3= abs(R3 - R4);
  int diff4= abs(R4 - R3);
  
  if((diff1 <= error) || (diff2 <= error)||(diff3 <= error)||(diff4 <= error)) {   
  } //设置死区
  else 
  {    
    if(R1 > R2){
      initial1 = --initial1;  
    }   
    if(R1 < R2){ 
      initial1 = ++initial1; 
    }
    if(R3 > R4){ 
      initial2 = --initial2; 
    }
    if(R3 < R4){ 
      initial2 = ++initial2; 
    }
  } 
servo1.write(initial1); 
servo2.write(initial2);  
delay(100);
}

方案二接线

sunflower 2.jpg

方案二代码

#include    
Servo servo1;
Servo servo2;
 
int initial1 = 90; 
int initial2 = 90;  //舵机初始角度 
int LDR1 = A0;         
int LDR2 = A2;    
int servoPin1 = 9; 
int servoPin2 = 10;   //舵机接口    

void setup() {
  servo1.attach(servoPin1); 
  servo2.attach(servoPin2); 
  pinMode(LDR1, INPUT);   
  pinMode(LDR2, INPUT);
  servo1.write(initial1);
  servo2.write(initial2);
  delay(2000);  
}  
 
void loop() {
  int R1 = analogRead(LDR1); 
  int R2 = analogRead(LDR2); //读取两个中间电压值
      
    if(R1 > 400){
      initial1 = ++initial1;  
    }   
    if(R1 < 250){ 
      initial1 = --initial1; 
    }
    if(R2 > 400){ 
      initial2 = ++initial2; 
    }
    if(R2 < 250){ 
      initial2 = --initial2; 
    }  //该处设置的数值是3.3V的数值,5V供电可改成600和400
  
  servo1.write(initial1); 
  servo2.write(initial2);  
  delay(300);
}

测试时用的方案二,图的接线方便。没有理线,看着很乱,本来是想用跳线焊接的,可是焊接水平太差,尝试后选择放弃。

sun (1).jpg

演示视频

演示视频上传在B站上,向日葵

本人菜鸟,如有错误,欢迎指出,谢谢大家。

你可能感兴趣的:(向日葵)