使用 Digispark Attiny85 构建树莓派电源






4.89/5 (7投票s)
树莓派的开机、安全关机和断电
引言
树莓派是一个令人惊叹的设备,将如此强大的功能 packed 在一个很小的外形中,而且成本很低廉。
不幸的是,它没有自带电源。关机涉及运行关机命令并拔掉 USB 电源。
可以在 这里 找到关于该实现的视频演示。
设计
此电源由以下部分组成
- 按钮 - 触发开机、关机和强制关机功能
- LED 灯 - 显示状态,开 (亮起),关机中 (闪烁),关 (灯灭)
- 继电器 - 使用 Attiny85 驱动电源进入树莓派 (5V USB 电源)
- 晶体管 x 2 (2N2222 或任何类似的 NPN 晶体管)
- 一个用于驱动继电器向树莓派供电
- 一个用于触发树莓派的关机命令 (在这个例子中使用 GPIO12 / 引脚 32)
- Attiny85 (我使用 Digispark USB 开发板进行开发) - 主控制器
以下是开关的设计工作方式
当接通电源时,attiny85 上电,继电器处于 OFF 状态,树莓派未通电。 attiny85 正在等待按钮被按下。
- 当按下按钮时,继电器被接通。树莓派通电并启动。
- 当再次按下按钮时,程序向树莓派发送一个信号以关机。树莓派运行一个 python 脚本,监听 GPIO 端口上的信号。当接收到信号时,树莓派将运行关机命令。
- 程序等待,直到树莓派通过监控 GPIO14 (UART TX) (电压 <0.1) 完全关机。
- 确认树莓派完全关机后,程序将继电器设置为 OFF,树莓派的电源将被切断。
电路图
- 电路图也已附上
- digispark 的 P0 驱动继电器为树莓派供电
- digispark 的 P1 驱动状态 LED
- digispark 的 P2 接收来自按钮的输入,用于开/关机按钮
- digispark 的 P3 通过 GPIO12 触发树莓派关机
- digispark 的 P4 通过 GPIO14 (UART TX) 检测树莓派是否关机
Using the Code
- 将草图安装到 attiny85 中。我正在使用 Digispark USB 开发板 (
sketch_pi_switch.ino
)- 这是一个 Digispark 入门指南。
- 在树莓派中运行关机脚本 (ShutdownDetect.py)
关注点
int SHUTDOWN_PIN = 3;
int RELAY_PIN = 0;
int BUTTON_PIN = 2;
int LED_PIN = 1;
powerstatus
变量用于跟踪树莓派的电源状态。
int powerstatus = 0;
//Power Toggle Mode
// 0 Power off
// 1 Powering On (not used for now)
// 2 Powered on
// 3 Powering off
// 4 Waiting for Safe Shutdown to finish
// 5 Hard Shutdown
每个循环延迟 50 毫秒,使计时更容易 (例如,按钮被按下的时间长短)。
如果按钮被长时间按下 (60 * 50ms) = 3 秒,则强制关机。
if(buttondowncount>=60 && buttonupcount >2)
{//Long Pressed Button
buttondowncount = 0;
buttonupcount = 0;
powerstatus = 5;
}
如果按钮被短时间按下 (3 * 50ms) = 150ms。从关机 (powerstatus
0 变为 1) 或启动关机序列 (powerstatus
2 变为 3)。
else if(buttondowncount>=3 && buttonupcount >2)
{//Button Pressed
buttondowncount = 0;
buttonupcount = 0;
if(powerstatus==0)
powerstatus=2;
else if(powerstatus==2)
powerstatus=3;
}
代码的下一部分是针对每个 powerstatus
的操作。
//Switch on relay to power on
if(powerstatus==2)
{
digitalWrite(SHUTDOWN_PIN, LOW);
digitalWrite(LED_PIN, HIGH);
digitalWrite(RELAY_PIN, HIGH);
}
else if(powerstatus==3)
{
//Start Shutdown Sequence
//Trigger shutdown script in Pi
digitalWrite(SHUTDOWN_PIN, HIGH);
delay(100);
digitalWrite(SHUTDOWN_PIN, LOW);
powerstatus=4;
checkOffCount = 0;
}
else if(powerstatus==4)
{
//Waiting for fully power off signal in TX pin
//Blink LED to signal powering off
digitalWrite(LED_PIN, LOW);
delay(300);
digitalWrite(LED_PIN, HIGH);
delay(200);
//Check if it's off 5 times before shutting down
if(checkPiOff())
checkOffCount = checkOffCount + 1;
else
checkOffCount=0;
if(checkOffCount==10)
{
//It's really off
digitalWrite(LED_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
powerstatus = 0;
checkOffCount = 0;
}
}
else if(powerstatus==5) //Hard shutdown
{
digitalWrite(LED_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
powerstatus = 0;
checkOffCount = 0;
}
最有趣的部分是 powerstatus==3
和 4
。 下面触发树莓派并运行关机命令,并将 powerstatus 设置为 4
(等待安全关机完成)。
digitalWrite(SHUTDOWN_PIN, HIGH);
delay(100);
digitalWrite(SHUTDOWN_PIN, LOW);
powerstatus=4;
然后在 powerstatus == 4
中,它闪烁 LED 灯并监视树莓派是否完全处于关机状态。
else if(powerstatus==4)
{
digitalWrite(LED_PIN, LOW);
delay(300);
digitalWrite(LED_PIN, HIGH);
delay(200);
//Check if it's off 5 times before shutting down
if(checkPiOff())
checkOffCount = checkOffCount + 1;
else
checkOffCount=0;
if(checkOffCount==5)
{
//It's really off
digitalWrite(LED_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
powerstatus = 0;
checkOffCount = 0;
}
}
关注点
- 即使树莓派已关机,Digispark 也会消耗一些电量。我正在以 1Mhz 模式运行它,以便它消耗最少的电量。
- 这个项目可以很容易地改进,通过红外遥控树莓派的电源。让我知道你的想法!