本装置使用光敏电阻,暗电阻几乎达到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的太阳能板追光太阳跟随装置设计