65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Digispark Attiny85 构建树莓派电源

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (7投票s)

2016 年 12 月 26 日

CPOL

3分钟阅读

viewsIcon

42174

downloadIcon

465

树莓派的开机、安全关机和断电

引言

树莓派是一个令人惊叹的设备,将如此强大的功能 packed 在一个很小的外形中,而且成本很低廉。

不幸的是,它没有自带电源。关机涉及运行关机命令并拔掉 USB 电源。

可以在 这里 找到关于该实现的视频演示。

设计

此电源由以下部分组成

  1. 按钮 - 触发开机、关机和强制关机功能
  2. LED 灯 - 显示状态,开 (亮起),关机中 (闪烁),关 (灯灭)
  3. 继电器 - 使用 Attiny85 驱动电源进入树莓派 (5V USB 电源)
  4. 晶体管 x 2 (2N2222 或任何类似的 NPN 晶体管)
    • 一个用于驱动继电器向树莓派供电
    • 一个用于触发树莓派的关机命令 (在这个例子中使用 GPIO12 / 引脚 32)
  5. 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)
  • 在树莓派中运行关机脚本 (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==34。 下面触发树莓派并运行关机命令,并将 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 模式运行它,以便它消耗最少的电量。
  • 这个项目可以很容易地改进,通过红外遥控树莓派的电源。让我知道你的想法!
使用 Digispark Attiny85 构建树莓派电源 - CodeProject - 代码之家
© . All rights reserved.