안녕하세요.
이번에 아두이노 호환 보드(카피본) 보드를 사용하면서 작동하지 않는 기능을 발견해서 공유해 드립니다.
그것은 watchdog 기능입니다. 이번에 아두이노 프로그램 개발하면서 모든 기능이 다 된다고 생각했고, 신호를 보내다가 가끔 죽을 수도 있다고 생각해서 Watchdog를 설정해 두었는데도 멈추는 현상이 발생했습니다.
고민하다가 가지고 있던 정품으로 동작시켰는데 이상 없이 작동해서 알게 되었습니다.
그렇다고 기타 모든 호환 보드가 동일한 에러가 발생할 거로 생각하지는 않습니다. 제가 동한 제품으로 구매한 호환 보드 3개가 동일하게 Watchdog기능이 작동하지 않았습니다. 가지고 있는 호환 보드 버전은 Arduino NANO V3.0이라고 되어 있습니다. 참고하시어 낭비하는 시간을 줄이셨으면 하는 바람입니다. ~~
1. 워치독 타이머 (WatchDog) 란
"A watchdog timer (WDT) is a hardware timer that automatically generates a system reset if the main program neglects to periodically service it. It is often used to automatically reset an embedded device that hangs because of a software or hardware fault."
(os.mbed.com/cookbook/WatchDog-Timer)
워치독 타이머 (WDT, COP (computer operating properly ) 타이머, 또는 단순히 워치독 )는 컴퓨터의 오작동을 탐지하고 복구하기 위해 쓰이는 전자 타이머이다. 정상 작동 중의 컴퓨터는 시간이 경과하거나 "타임아웃"이 되는 것을 막기 위해, 정기적으로 워치독 타이머를 재가동시킨다. 만약, 하드웨어의 결함 혹은 프로그램 오류로 인해 컴퓨터가 워치독을 재가동하는 데 실패하면, 타이머가 시간을 두고 타임 아웃 신호를 생성한다. 이 타임 아웃 신호는 여러 시정 조치를 취하는 데 쓰인다. 이 시정 조치란 일반적으로 컴퓨터 시스템을 안전한 상태로 유지하는 것과 정상적인 시스템 작동으로 원상 복귀시키는 것을 포함한다. (한마디로 초기화시킨다)
<위키백과>
설명을 덧붙이면 CPU 내부의 별개의 RC 오실레이터에 연결된 타이머입니다. 그렇기 때문에 프로그램 안에서 현재 자신의 시스템이 정상으로 운영되고 있으니 리셋되지 말라고 워치독 타이머에게 계속 리셋(초기화)하라고 명령어(CLRWDT, wdt_reset())를 보냅니다.
그런데 어느 순간 전기적 신호, 소프트웨어 버그 등과 같은 이유로 정해진 시간 동안 워치독에게 리셋 명령을 보내지 못하면 타이머가 종료되는 순간 연결된 프로그램 실행이 됩니다. 그것이 바로 시스템이 리셋이 실행되는 것입니다. 자주 사용되지는 않지만, 자동으로 움직여야 하는 시스템 같은 경우, 버그로 멈추더라도 다시 살아나서 작동해야 하기 때문에 항공우주 쪽에도 사용된다고 합니다.
2. 정품과 비교
정품 아두이노 나노(왼쪽) 같은 경우도 제조된 시기에 따 부품이 조금씩 바뀌는 것 같습니다. 그래서 가지고 계신 아두이노 나노와 칩이 조금 다를 수 있습니다. 왼쪽이 정품 아두이노 나노이고 오른쪽이 나노 호환 보드입니다.
호환 보드다 보니 핀 맵은 동일합니다. 그러나 가격이 3배 정도 차이 나다 보니 부품은 많이 사용되는 SMD 부품을 사용하지 않았나 추측해 봅니다.
3. 아두이노 watchdog 소스 확인
wdt를 사용하기 위해서 라이브러리를 사용해야 합니다. #include <avr/wdt.h>
(칩 내에 레지스터리 설정해 주는 것을 누군가 잘 만들어 놓았기 때문입니다.
워치독 타이머 시간을 설정해 줍니다. 최소는 15ms이고 최대는 8S로 되어 있습니다. 그렇다고 세밀하게 조정되는 것이 아니라 아두이노에서 define 해놓은 것을 사용해야 합니다.
wdt_enable(WDT0_4S); 했다면 4초 동안 워치독 타이머 초기화 명령어가 없다면 초기화됩니다.
코드상에 wdt_reset() 함수를 넣어주면 됩니다. 주의할 것은 연산이 많아서 리셋 명령어까지 오지 못한다면 계속 리셋되는 현상이 발생합니다. 그래서 적정한 타이머 시간을 설정해주어야 합니다.
소스는 1~5까지 출력하고 아무것도 하지 않는 무한 루프에 빠지면 워치독 타이머가 실행되어 다시 리셋되게 하는 프로그램입니다.
#include <avr/wdt.h>
void setup(){
Serial.begin(9600);
Serial.println("Setup started :");
// make a delay before enable WDT
// this delay help to complete all initial tasks
delay(2000);
wdt_enable(WDTO_4S);
}
void loop(){
Serial.println("LOOP started ! ");
for(int i=0; i<=5; i++){
Serial.print("Loop : ");
Serial.print(i);
Serial.println();
delay(1000);
wdt_reset();
}
//infinity loop to hang MCU
while(1){}
}
4. 동작 확인
정품 아두이노 나노 동작 확인
정상적으로 시간에 맞춰 리셋 동작하는 것을 확인할 수 있습니다.
호환 제품 동작 확인
- 리셋되지 못하고 LED 하나가 계속 깜박이는 현상을 보이고 멈춰 있습니다.
5. 결 론
현재까지 아두이노 나노 호환 보드를 사용해 본 결과 기본적인 I/O, PWM, 아날로그 입력, I2C 통신 등에는 특별한 문제가 없었습니다. 그런데 WDT 기능을 사용하면서 문제를 확인하였습니다.
WDT 기능을 필요로 한다면 현시점에서는 정품을 고려 해시는 것이 좋을 것으로 보입니다. 아니면 향후 호환 보드가 업데이트 기다려야 하지 않을까 합니다.
아두이노 나노 정품을 사용하고 있다면 이제 오리지널 나노보다 Arduino NANO Every 버전으로 바꿔 사용하는 것을 추천드려 봅니다. 가격도 나노 정품보다 저렴하고 성능 면에서도 향상되었습니다.
나노와 Every, IoT 버전 스펙 비교는 아래의 참조 사이트의 4번에 "아두이노 나노 신제품 언박싱" 블로그를 참조하시면 도움이 되실 겁니다.
감사합니다.
<참조 사이트>
1. What is Watchdog Timer?
https://create.arduino.cc/projecthub/rafitc/what-is-watchdog-timer-fffe20
2. 워치독 타이머
https://ko.wikipedia.org/wiki/%EC%9B%8C%EC%B9%98%EB%8F%85_%ED%83%80%EC%9D%B4%EB%A8%B8
3. 타이머/카운터
http://vctec.co.kr/article/%EC%9E%90%EB%A3%8C%EC%8B%A4/7/65/
4. 아두이노 나노 신제품 언박싱 - Arduino NANO Every, Arduino NANO 33 IOT
https://devicemart.blogspot.com/2019/08/arduino-nano-every-arduino-nano-33-iot.html
5. avr-libc
www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
'Embedded > Arduino' 카테고리의 다른 글
아두이노(Arduino) Flex Sensor 2.2 (SEN-10264) 테스트 (2) | 2024.04.20 |
---|---|
Arduino Nano IoT 33 Bootloader blocked 된 경우 MKR ZERO로 살리기(실패) (0) | 2024.04.13 |
Arduino Nano 33 IoT Bootloader blocked 된 경우 J-LINK EDU로 벽돌된 것 살리기 (성공후기) (0) | 2024.04.01 |
아두이노 나노를 이용한 압력센서 FSR (QA6P) 테스트 (4) | 2024.03.27 |
Arduino MPU9250(MPU6050) FIFO overflow error 해결하기 (2) | 2024.03.24 |