RF 통신 보드에서 통신이 간헐적으로 끊겼다. 몇 시간 잘 돌다가 갑자기 응답이 없어지고 전원을 껐다 켜면 다시 됐다.
Table of contents
Open Table of contents
간헐적으로 끊기던 통신
UART로 뽑히는 로그를 봤는데 끊기기 직전에 아무 예외도 없이 그냥 멈춰 있었다. 코드가 잘못됐으면 어딘가에 흔적이 남았을 텐데 그것이 없었다.
그래서 RF 부품 자체가 문제라는 생각이 먼저 들었다. 데이터시트를 다시 읽고 설정을 재확인하면서 제조사에 문의할 준비를 하기 시작했다.
준비하다가 잠깐 멈춘 이유는 이 결론이 비싸기 때문이었다. 부품 문제로 확정되면 문의하고 답을 기다리고 교체하고 다시 시험해야 한다.
그러는 동안 다른 원인이었다면 며칠을 그냥 쓰게 된다. 그래서 같은 증상을 낼 수 있는 원인을 먼저 목록으로 적어 봤다. 전원과 발열과 간섭과 RAM 부족까지 다섯 가지가 나왔다.
배제 순서를 확인 비용으로 정한다
목록이 나온 뒤에 어느 것부터 볼지를 정해야 했다. 가능성이 높은 순서로 볼 수도 있지만 그 가능성 자체가 짐작이다.
그래서 확인하는 데 드는 비용으로 순서를 잡았다. 삼십 분이면 확인되는 것을 며칠 걸리는 것보다 먼저 본다. 값비싼 결론일수록 그 앞에 배제해야 할 목록이 길어진다.
로그를 못 남기는 원인
목록을 순서대로 보다가 전원 쪽에서 걸렸다. 순간적으로 전압이 떨어지면 전류를 많이 먹는 RF 쪽이 먼저 멈춘다.
이런 원인은 UART로 나가는 로그에 아무것도 안 남는다. 자기가 죽는 순간을 기록할 수 없기 때문이다. 로그에 흔적이 없다는 것을 코드 문제가 아니라는 근거로만 읽고 다른 가능성을 안 본 것이 처음의 실수였다.
계측은 사고 전에 붙여 둔다
전압을 실제로 재려면 오실로스코프를 붙여 놓고 다음 사고를 기다려야 했다. 간헐적으로 나는 문제라 그 기다림이 며칠 걸렸다.
이후로는 이런 보드에 ADC로 전압을 읽고 I2C 센서로 온도를 읽는 것을 처음부터 붙여 두게 했다. 사고가 난 뒤에 붙이면 그다음 사고까지 아무것도 못 한다. ADC 한 채널을 더 쓰는 비용이 기다리는 비용보다 훨씬 작았다.
정리
- 증상 하나에 원인은 여럿이므로 목록을 먼저 만든다
- 떠오른 것부터 파고들지 않는다
- 배제 순서를 확인 비용으로 정한다
- 삼십 분짜리가 며칠짜리보다 먼저다
- 값비싼 결론일수록 배제 목록을 요구한다
- 전압 강하처럼 로그를 못 남기는 원인이 있다
- 소프트웨어는 자기가 죽는 순간을 기록하지 못한다
ADC전압과I2C온도는 사고 전에 붙여 둔다