极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19220|回复: 10

使用 Arduino 打造一个硬件的Watchdog

[复制链接]
发表于 2014-1-16 10:23:36 | 显示全部楼层 |阅读模式


   我的台式机使用梅捷 SY-D2700-U3M 的主板,固化了Intel D2700 Atom CPU。具有零噪音(无风扇),节能环保,扩展丰富等等特点。唯一的问题是:经常硬盘丢失。具体是在使用中忽然BSOD,然后自动重启之后在Setup中无法找到硬盘,重启无效,必须关机一次再开机。从我的经验来看这绝非BIOS问题,并且实验确定不是硬盘问题。有人看守的情况下遇到这样的最多只是郁闷一些,但是作为下载机的时候,上述的问题就变得令人难以忍受。于是,考虑做一个硬件的 WatchDog,当出现问题的时候自动完成关闭开关,再次重启的动作。

   BOM 如下:
  
1.        Arduino UNO
2.        WCH341 USB转串口
3.        面包板
4.        杜邦线+大头针
5.        继电器
   
   说说上面这些东西,最重要的是继电器,就是下面这个东西。



   这是两路的继电器,可以控制2组电路。性能指标是“交流电压最大250V,交流电流最大10A,直流电压最大30V,直流电流最大10A”。有4个输入针脚,分别是VCC GND,1IN 和2IN可以直连Arduino  IO口。上电之后,1IN和2IN可以直接接入到VCC和GND上,应该能听到继电器“啪”的吸合的声音,此时测量受控端的电阻可以得知当前是断开还是链接。
   
[attachimg]16544[/attachimg

   再说一下喂狗的WCH341。 一般来说,Arduino的USB口可以用来取电和串口通讯。实际使用中我关闭台式机后,USB口供电也会随之切断,因此Arduino必须使用外部供电。既然使用了外部供电,串口也只能使用外部输入。刚开始选择的是FDTI 的USB转串口,一直无法正常通讯,最后测量发现它转出来的电压在 6.2v左右(TX/RX)远超过了.预期的5V。WCH341是之前玩单片机的剩下的,测量之后发现它的输出电压能够满足要求,于是就选用之。还有需要注意的是,完整的串口通讯实际上需要3跟线:TX RX和GND.

   引出PowerButton的2个Pin.




    继电器直接控制PowerButton Pin。


   
    绿线接到继电器上进行控制



   Arduino代码:

#include <avr/wdt.h>   //引用库
/*
Simple LED sketch
*/
     
int led = 13; // Pin 13 当连接(相当于按下PowerButton)时点亮,断开时关闭
int cnt = 10; // Pin 10 控制继电器,高时断开,低时连接

unsigned long int elsp=0;  //计算时间

void setup()
{
    pinMode(led, OUTPUT); // Set pin 13 as digital out
    pinMode(cnt, OUTPUT); // Set pin 10 as digital out
    digitalWrite(led, LOW); // off
    digitalWrite(cnt,HIGH); //Cut OFF
   
    // Start up serial connection
    Serial.begin(9600);  //baud rate
    Serial.flush();
    elsp=millis();
   
    wdt_enable(WDTO_8S);  //这是Arduino的看门狗可以更换其他时间值
                                                                //注意,这里是8s,后面的延时不可以直接超过8s
}
     
void loop()
{
     
    // Read any serial input
    while (Serial.available() > 0)
    {
        if ((char) Serial.read() == 'P') {elsp=millis(); }
//当收到”P”时,重置计时器。换句话,我们用字符 “P” 来喂狗
    }

    if (abs(millis()-elsp)>300*1000UL)  //300s =  minutes
    {
          digitalWrite(led, HIGH);  // on
          //关机动作
          digitalWrite(cnt,LOW); //继电器短路,相当于按下PowerButton
          wdt_reset();           //重置Arduino内部看门狗
          delay(6000);    //这里相当于长按PowerButton 6s
          wdt_reset();    //重置Arduino内部看门狗
          digitalWrite(cnt,HIGH); //继电器断路,相当于松开PowerButton
          //松开PowerButton 5s
          delay(5000);
          wdt_reset();    //重置Arduino内部看门狗
          //开机上电     
          digitalWrite(cnt,LOW); //继电器短路,相当于按下PowerButton
          delay(500);    //按下500ms
          digitalWrite(cnt,HIGH); //继电器断路,相当于松开PowerButton
          elsp=millis();

          digitalWrite(led, LOW); // off   
          wdt_reset();   //重置Arduino内部看门狗
    }
    delay(1000);
    Serial.println(millis()-elsp);
    wdt_reset();   //重置Arduino内部看门狗如果loop时间超过时限,系统会重启
}





  除了Arduino的Firmware,PC端喂狗也需要一个程序。选择Delphi编写程序,实现两个功能:1.扫描COM Port找到进行通讯的端口 2.每隔一段时间就进行一次喂狗

  (此处Delphi代码,Console模式)





参考:

1. http://biosren.com/thread-6794-1-1.html 《改动代码提取器》

   
                                                                                                        www.lab-z.com
                                                                                                        Zoologist
                                                                                                        2014/01/16

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-1-16 13:53:13 | 显示全部楼层
你确定不是硬盘问题?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-16 14:21:28 | 显示全部楼层
lyili 发表于 2014-1-16 13:53
你确定不是硬盘问题?

肯定不是硬盘我问题,我更换过硬盘。并且重启之后bios中找到不到硬盘,不是bios问题
回复 支持 反对

使用道具 举报

发表于 2014-1-16 19:48:07 | 显示全部楼层
zoologist 发表于 2014-1-16 14:21
肯定不是硬盘我问题,我更换过硬盘。并且重启之后bios中找到不到硬盘,不是bios问题

我之前也遇过一样的问题,同样是梅杰主板intel CPU,换过硬盘装系统就没事了。那个硬盘再挂上去用一会之后一样会消失。我的结论是硬盘问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-17 08:35:11 | 显示全部楼层
lyili 发表于 2014-1-16 19:48
我之前也遇过一样的问题,同样是梅杰主板intel CPU,换过硬盘装系统就没事了。那个硬盘再挂上去用一会之后 ...

o  你的问题听起来更像是硬盘供电不足的导致的唉
回复 支持 反对

使用道具 举报

发表于 2014-1-17 19:04:04 | 显示全部楼层
。。。还供电不足,故障现象一样你检查是供电不足吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-17 20:59:51 | 显示全部楼层
lyili 发表于 2014-1-17 19:04
。。。还供电不足,故障现象一样你检查是供电不足吗?

我试过ssd 也有这样的现象
回复 支持 反对

使用道具 举报

发表于 2014-1-18 15:45:15 | 显示全部楼层
本帖最后由 lyili 于 2014-1-18 15:55 编辑

...看来问题还真一样我也是SSD,之前还稳定得要死。 现在只能换用普通硬盘。 查了下好像镁光ssd有这个BUG,刷固件大概能解决。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-18 16:18:45 | 显示全部楼层
lyili 发表于 2014-1-18 15:45
...看来问题还真一样我也是SSD,之前还稳定得要死。 现在只能换用普通硬盘。 查了下好像镁光ssd有这个BUG,刷 ...

我试过好几块硬盘的,有普通的也有ssd的。
回复 支持 反对

使用道具 举报

发表于 2014-2-14 16:37:16 | 显示全部楼层
应该是硬盘供电不足,我就这样坏过俩硬盘,直到某天电源坏了换了大功率新电源就再也没出过这种事。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-14 17:33:01 | 显示全部楼层
数字 发表于 2014-2-14 16:37
应该是硬盘供电不足,我就这样坏过俩硬盘,直到某天电源坏了换了大功率新电源就再也没出过这种事。

ssd硬盘不会有供电不足的问题吧?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 05:10 , Processed in 0.045621 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表