Web Development

/ 0评 / 63/ 最后更新:2023-08-21
树莓派4b low voltage warning

需求场景

用的好好的树莓派,有一天连接vnc,发现桌面任务栏一直提示low voltage warning,please check your power supply,看样子是供电不足,可是树莓派的负载并不高啊。

解决方案

搜了一大圈基本都是说电源的问题,电源确实不是官方的,可能质量不太好,可是之前一直没问题,怎么突然就有问题,连一年都没到啊。现在树莓派挂了一个小风扇,一个固态硬盘,负载只有0.2左右。后来终于搜到一个可能的原因。电源长时间充电会导致降压,断电后过一段时间就可以了。我的树莓派已经好几个月通电没关机了,有可能是这个原因。然后我就把树莓派的电源断了一晚睡觉了,第二天再接通,果然问题解决了。掌握了一个小知识啊,电源长时间充电还会降压啊,可能是山寨电源的原因吧

2020-12-30日更新

继上次出现问题解决后,两周后再次出现这个问题,这次又断电睡觉了,第二天都好了。两次都是断电一整晚,第二天就好了。测试过只是通过命令重启树莓派是不能解决的,那到底断电多久是可以恢复的呢?下次遇到再测试一下吧

2021-02-28日更新

再次出现此问题,关闭电源5秒后重启恢复正常。

2021-05-06日更新

由于这个提示只有在连接显示器或vnc连接时才能在gui桌面任务栏看到,如果是ssh登录就看不到了,非常的不方便。最好是能够通过命令判断是否电压不足。具体的脚本详见 https://gist.github.com/maxme/d5f000c84a4313aa531288c35c3a8887
通过此脚本可以查看cpu和电压不足的问题。不过每次登录之后需要手动运行,实在不方面。而且脚本中采用了while循环需要手动中断脚本。所以可以把代码中的while循环去掉,并且在ssh登录的时候执行命令病输出到登录信息上。效果如下,具体方式参考 ubuntu修改ssh登录提示信息
ubuntu修改ssh登录提示信息
修改后的raspberry-power-supply-check.sh代码如下

#!/bin/bash
function throttleCodeMask {
  perl -e "printf \"%s\", $1 & $2 ? \"$3\" : \"$4\""
}
function throttledToText {
  throttledCode=$1
  throttleCodeMask $throttledCode 0x80000 "Soft temperature limit has occurred, " ""
  throttleCodeMask $throttledCode 0x40000 "Throttling has occurred, " ""
  throttleCodeMask $throttledCode 0x20000 "Arm frequency capping has occurred, " ""
  throttleCodeMask $throttledCode 0x10000 "Under-voltage has occurred, " ""
  throttleCodeMask $throttledCode 0x8 "Soft temperature limit active, " ""
  throttleCodeMask $throttledCode 0x4 "Currently throttled, " ""
  throttleCodeMask $throttledCode 0x2 "Arm frequency capped, " ""
  throttleCodeMask $throttledCode 0x1 "Under-voltage detected, " ""
}
temp=$(vcgencmd measure_temp | cut -f2 -d=)
real_clock_speed=$(vcgencmd measure_clock arm | awk -F"=" '{printf ("%0.0f", $2 / 1000000); }' )
sys_clock_speed=$(awk '{printf ("%0.0f",$1/1000); }' </sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)
voltage=$(vcgencmd measure_volts | cut -f2 -d= | sed 's/000//')
throttled_text=$(throttledToText $(vcgencmd get_throttled | cut -f2 -d=))
echo "$temp $sys_clock_speed / $real_clock_speed MHz $voltage - $throttled_text"
63

Leave a Reply

Your email address will not be published. Required fields are marked *