Raspberry Pi och Arduino: bygga tillförlitliga system med WatchDog timer (3 / 6 steg)
Steg 3: Hur du ställer in Arduino inre WatchDog Timer
Sammanfattning: I steg 3 i detta Instructable titta vi på hur du ställer in Arduino inre watchdog timer. Vi också prata om problem med Arduino inre WatchDog Timer och förklara varför en extern WatchDog Timer, är ett bättre val i många men inte alla, system.
Ställa in Arduino inre WatchDog Timer
Arduino är en mycket enklare maskin än en Raspberry Pi. Men är det faktiskt lättare att hänga en Arduino än det är en Raspberry Pi eftersom all kod är enda gängade på Arduino. Single gängade innebär att det finns bara ett program körs med en tid på Arudino (med undantag för avbrott, ett slags tänkande). Det är om du bara har en röd tråd i taget, någon hänga upp på att tråden kommer att stoppa datorn. Naturligtvis finns det andra problem som kan orsaka din kod till krasch och Arduino att låsa upp. Timeout på kringutrustning, driva frågor, RFI, etc., etc. Dålig kod med hjälp av funktionen millis() är ett klassiskt problem. Du behöver för att hantera välta på 49,5 dagar om du inte använder en realtidsklocka.
Hur du använder Arduino inre WatchDog (om du kan få det att fungera)
Först av allt en definition. WTO: S definieras som maximala tiden WatchDog timer kan räkna innan det behöver återställas (med andra ord, när det kommer att starta om datorn om datorn går bort).
Det finns en hel del saker som kommer att hålla den interna vakthund från att arbeta i Arduino, så se upp.
Här är ett sätt att arbeta med interna Arduino WatchDog timer. Först och främst är Wto av alla Arduino modeller högst 8 sekunder. Håll detta i åtanke. Att ha en längre Wto täcker mycket mer synder i min mening (Wto är 16 sekunder på den interna Raspberry Pi vakthund – vilket fortfarande inte är tillräckligt lång för vår smak), så Arduino Wto är lite kort. Vi har ofta seriell processer som kör längre än 8 sekunder i vår design. Ja, du kan införliva klappa in i koden, men när du använder externa bibliotek, som är en smärta.
Om du vill experimentera med din Arduino WDT, bygga en ny skiss i Arudino IDE. Varning: Om du använder en ArduinoMega 2560 eller liknande enhet, kan du "mjuka brick" enheten. Se kommentarerna i avsnittet problem nedan. Min Arduino UNO från SainSmart fungerade bra med denna skiss. Börja med
#include < avr/wdt.h >
#define RESETWATCHDOG
void setup()
{
Serial.BEGIN(57600);
Serial.println("");
Serial.println ("---> Arduino startas");
Serial.println("");
wdt_enable(WDTO_8S);
}
void loop()
{
#ifdef RESETWATCHDOG
wdt_reset();
#endif
Serial.println ("Arduino kör");
Delay(1000);
}
Köra skissen och låt den gå i 30 sekunder eller så. Aldrig bör du se meddelandet "Arduino Rebooted" igen efter omstart. Då, kommentera bort uttrycket RESETWATCHDOG såhär:
#define RESETWATCHDOG
Nu när du kör skissen, om din WatchDog fungerar, sedan ska du se Arduino omstart varje 8 sekunder eller så i följetong monitor.
Problem med interna Arduino WatchDog Timer
Användning av Arduino interna WatchDogTimer är problematiskt i bästa. Arduino WatchDog Timer har en Wto 8 sekunder så om du hämtar en ny skiss och gamla skissen har aktiverat vakthund, då du kan få in i en oändlig pånyttfödd ordnar. Detta kallas "mjuka Murning". Arduino är sedan ganska mycket värdelös (utan mycket arbete), men det är fortfarande igång. WatchDog upphör, bootloader startar, bootload verk ett tag, WatchDog upphör, etc., etc. etc. Vissa stöveln loadersgoogle nu inaktivera vakthund på lämpligt sätt, men se upp det finns en hel del Arduinos ute (som Mega 2560 - där vi är stora fans) som fortfarande fungerar inte. Du kan uppdatera bootloader men det är inte ett lätt jobb. Detta är ett problem vi har stött på flera gånger.
- Den inre Arduino vakthund inte makt cykel systemet. Det omstarter Arduino via återställa linjen. Detta innebär att det inte startar om i alla förhållanden. Särskilt i låg effekt / brownout villkor ofta upplevs med Solar Powered system. Jag har sett detta i Projektet Curacao.
- Det finns problem med bootloader (se ovan)
- Den inre WatchDog Timer är inte helt oberoende av Arduino. Om din kod hoppar till en bit kod inaktiverar WDT, är du klar. Försök skriva över din stack för att se vilka intressanta saker kan hända till kod i ett litet inbäddade system såsom Arduino.
- Den maximala Wto är 8 sekunder. Enkelt kan du i rutiner, till exempel seriell kommunikation för mer än 8 sekunder. Räkna ut alla möjligheterna och att sätta wdt_reset() samtal på rätt plats är svårt och med vissa seriella rutiner, omöjligt.