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

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

当光线不垂直时,产生阴影。
单向受光挡板阴影
用的板子是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);//恢复初始角度
    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>130){  //限制舵机转动角度
        ud_angle=130;
        }
        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(0);//在测试时,串口数据接收过快,可以适当加延时调整
}

舵机使用SG90,用3D打印的openmv云台支架
在这里插入图片描述
后面我加了锂电池充电模块,电池储能,和5V升压板给板子供电。
成品图
成品图
测试视频,当时对着的是南边的窗户,有太阳光照。

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值