本帖最后由 sorrypqa 于 2025-6-13 08:57 编辑
这个是为山东大佬制作的太阳自动跟踪控制器,感谢山东大佬的支持!第一版,主要用来验证方案和程序的可行性。
这款控制器的最大特点是免调试,接线简单,不受刮风下雨等任何外部环境的影响,无需外挂一大堆各种玩具级别的光敏、光照传感器,这类传感器平时被日晒雨淋的,最容易出现异常。
它的主要工作原理是通电后,利用GPS获取控制器所在位置的时间和经纬度并储存在控制器里,以便下次开机时直接调用,然后计算出所在位置的太阳方位角和高度角,用来控制方位电机和仰角电机,到目前为止,控制器和程序运行都非常完美。
关闭自动跟踪,它就是个单纯的伺服电机控制器,可以手动或者通过HA的自动化控制任意角度,可以用来控制任意需要使用舵机的设备,比如动物的自动投食等,打开自动跟踪,它就是个太阳自动跟踪控制器
打开自动跟踪功能后,能在太阳低于地平线时自动返回日出位置,可以无网、无HA主机的情况下独立工作、如果由HA集中管理,能方便实现根据天气状况,比如风速大于XX公里/小时自动置于水平状态,减少背风.
内置实时时钟,有没有网络都可以正常工作。
内置直流电压、电流、功率检测,用于实时了解太阳能电池板输出状态
预留了I2C接口的OLED显示屏安装位置,可以用来显示时间、经纬度、电压、电流、功率等
由于使用了LM5164DDAR和LM2576HVS-5.0/TR的DC-DC电源芯片,
所以控制器支持工作电压10-60V,支持控制5V、12-60V的伺服电机。
检测电压0-100V,电流0-30A
GPS模块使用的是大夏龙雀的DX-GP10-A:
目前测试用仰角和方位电机都是180°伺服电机
在完全没有校准的情况下,已经能以很少的误差全程跟踪太阳,而且这误差是来自电机和这支长筒的垂直度
如需要最低成本测试此控制器的自动跟踪功能,可以买个几十元像下图类似的舵机云台:
使用servo组件作为伺服电机控制:
servo:
- id: elevation_servo
output: pwm1_output #伺服器使用的输出组件的ID
min_level: 3% #最小值(-100%)将映射到的PWM占空比。默认为3%。
idle_level: 7.5% #空闲值(0%)将映射到的 PWM 占空比。这也是启动时伺服的状态。默认为7.5%。
max_level: 12% #最大值(100%)将映射到的 PWM 占空比。默认为12.0%。
restore: false #是否在启动时恢复伺服电机的状态。如果您有一个绝对伺服电机并且它在启动时回到其 0 位置,这将很有用。默认为false。
auto_detach_time: 0s #达到目标值后伺服器分离的时间,如果设置为零,伺服器将不会分离。默认为0s。
transition_length: 0s #完成一次完整移动所需的时间(-1.0 到 1.0)。这将有效限制伺服器的速度,值越大,伺服器移动的速度越慢。默认为0s。
- id: azimuth_servo
output: pwm2_output #伺服器使用的输出组件的ID
min_level: 2.5% #最小值(-100%)将映射到的PWM占空比。默认为3%。
idle_level: 7.5% #空闲值(0%)将映射到的 PWM 占空比。这也是启动时伺服的状态。默认为7.5%。
max_level: 12.5% #最大值(100%)将映射到的 PWM 占空比。默认为12.0%。
restore: false #是否在启动时恢复伺服电机的状态。如果您有一个绝对伺服电机并且它在启动时回到其 0 位置,这将很有用。默认为false。
auto_detach_time: 0s #达到目标值后伺服器分离的时间,如果设置为零,伺服器将不会分离。默认为0s。
transition_length: 0s #完成一次完整移动所需的时间(-1.0 到 1.0)。这将有效限制伺服器的速度,值越大,伺服器移动的速度越慢。默认为0s。
使用number组件作为手动的方位和仰角控制:
number:
- platform: template
name: "A1.仰角控制"
id: "elevation_servo_control"
min_value: -100
initial_value: 0
max_value: 100
step: 1
optimistic: true
set_action:
then:
- servo.write:
id: "elevation_servo"
level: !lambda 'return x / 100.0;'
- platform: template
name: "A2.方位控制"
id: "azimuth_servo_control"
min_value: -100
initial_value: 0
max_value: 100
step: 1
optimistic: true
set_action:
then:
- servo.write:
id: "azimuth_servo"
level: !lambda 'return -x / 100.0;'
使用GPS组件获取经度和纬度,
由于GPG需要一定数量的卫星信号,才能获取准确的位置信息,所以利用卫星数量作为条件,只有卫星数量大于6个时,才会把获取到的经纬度保存起来:
gps:
uart_id: gps_uart #指定gps使用的串口
latitude:
name: "C1.纬度"
id: "gps_latitude"
longitude:
name: "C2.经度"
id: "gps_longitude"
satellites:
name: "C3.卫星数量"
id: "gps_satellites"
on_value:
then:
- if:
condition:
- lambda: 'return id(gps_satellites).state > 6 ;'
then:
- lambda: |-
id(sun_latitude_gl) = id(gps_latitude).state;
id(sun_longitude_gl) = id(gps_longitude).state;
id(sun_id).set_latitude(id(sun_latitude_gl));
id(sun_id).set_longitude(id(sun_longitude_gl));
|