文章程式碼顯示

2018年10月30日 星期二

《進階※應用篇》寫程式Arduino教學 - 20:Arduino Nano 一直閃燈當機? Watchdog 問題 !! 燒 Uno 的 Bootloader 吧 !!

Arduino Nano 因為體積小又自帶 USB Port 的關係,一直以來都是我很愛用的一個開發版,已經買了不下數十片。先前我使用 Arduino Nano 搭配 ESP8266 + Blynk 試圖搭建一個電器耗電統計應用,並且連洞洞板都焊好了如下圖



但最後這個方案難產了


原因在於我的 Nano 開發版三不五時會出現 "死當" 的狀況發生,是真的死當的那種,連按 Reset 鈕都沒有作用,只看到版上的 Led 燈不停的閃個不停,只能整個版子斷電才會回復正常。

我在網上搜尋了很久有關 Arduino Nano LED .. blink fast ... crash ... 等等的關鍵字,發現沒有很多人有過這樣的狀況,就算有,也沒有人順利解決

距離這個專案已經過了接近兩年了,而最近我在別的專案上又使用上 Arduino Nano ,因為穩定性的關係我必須使用 Watchdog

赫然發現, Arduino Nano 只要 Watchdog 一觸發

它就會出現 LED 閃個不停的死當狀況

我這才發現,原來當初會造成這樣的狀態是源自於此


因為 Watchdog 我在 Arduino Uno 用了很久了,也一直沒有問題,而 Nano 版子跟 Uno 版子都是 Atmega328P 的 Core ,我怎樣也想不到為什麼 Uno 版子可以用 Watchdog 而 Nano 卻不行?


後來我經過查詢發現,原來是 Arduino Uno 在出廠時,版載的 Bootloader (作用如同電腦的BIOS) 是新版的;但 Arduino Nano 是舊版的

我覺得很莫名其妙,明明上個月才買的 Nano ,怎麼會是舊版 Bootloader ,而去年買的 Uno 其 Bootloader 都比這個新買的 Nano 還新?

但這很顯然已經不是我該考慮的問題了,因為事實就是如此

證明如下圖



接著我搜尋 "Arduino nano watchdog problem" 後

發現有很多文章都有提到如果 Nano 沒有燒新版的 Bootloader 就使用 Watchdog ,就會使得 Watchdog 被觸發後進入無限循環

其原因在於 Nano 的舊版 Bootloader 在初始化的過程中沒有將 Watchdog 清掉,導致在版子初始化的過程中又觸發一次 Watchdog 。所以才會發生 LED 一直閃的情況

原來我看到的不是當機,而是他一直被 Watchdog 重啟啊 ~~~~


要解決這個辦法的思路很簡單,既然 Arduino Nano 跟 Uno 都是 Atmega328P 的 Core ,那我就把 Nano 的 Bootloader 燒成 Uno 的就好了 !!!!!!!

以前我在使用 Arduino Nano 或 Uno 的時候,版上的 " ICSP " 接腳區從來都沒有被我使用過,這時候他就派上用場了,我們將使用這裡的接腳來替 Arudino Nano 燒寫新版的 bootloader

替 Arduino Nano 燒寫新版 Bootloader 所需材料如下 :

1. 準備一個 Arduino Uno 版(做為燒寫端)

2. 準備一個待燒寫的 Arduino Nano(待寫新Bootloader)

3. 10 uF 電解電容一個

4. 杜邦線數條

替 Arduino Nano 燒寫新版 Bootloader 步驟如下 :

1. 拿出 Arduino Uno 並使用 USB 接上電腦,此時 Arduino Uno 版不要接上任何接線

2. 打開 Arduino IDE  ,開啟範例程式中的 Arduino ISP


3. 編譯並上傳至 Arduino Uno



4. 將 Arduino Uno 的腳位與 Arduino Nano 的 ICSP 腳位連接如下(我參考了以下參考連結的接線)


Arduino Nano 之 USB 位於右方時, ICSP 腳位對應圖如下



註 : 仔細查看 ICSP 接腳後會發現有 MOSI、MISO、SCK 等等的腳位,這很明顯得是 SPI 的腳位名稱。

但我了解了一下發現,一組常見的 SPI 通訊介面腳位應該還需要有 CS (chip select) 腳位,且通常沒有 Reset 腳位

所以我們能說,ICSP 不算是一個完整的 SPI 介面,但他有使用到 SPI 的東西。

5. 將10 uF 的電解電容正端接於 Arduino Uno 的 RST 腳位,副端接 GND

6. 打開電腦中的 Arduino 路徑,進入 avr 資料夾,可參考如下路徑

C:\Program Files (x86)\Arduino\hardware\arduino\avr

7. 將資料夾內的 boards.txt 複製一份備用


8. 下載我修改好的 boards.txt (按此下載)

9. 剪下貼上,覆蓋你原本的 boards.txt

10. 重啟 Arduino IDE

11. 選擇如下開發板選項 " Arduino Nano[bootloader with Uno] "



12. 點選 "燒錄 Bootloader"

13. 完成,此時 Nano 裡面的 Bootloader 就更新為跟 Arduino Uno 一樣新板的了

註 : 爾後要對這個 Arduino Nano 進行檔案的編譯及上傳,開發板都需要選 Arduino Nano[bootloader with Uno]

而 Arduino Nano[Original bootloader] 為針對舊板 bootloader 的 Nano 開發板進行檔案編譯上傳時使用

接著就可以試一下以下的程式碼,發現可以順利讓 Nano 也使用 Watchdog 了

#include "avr/wdt.h"

void setup() {
  wdt_disable();
  Serial.begin(9600);
  Serial.println("Start");  
  wdt_enable(WDTO_8S);
}

void loop() {  
  wdt_reset();
  while(1);
}


程式碼截圖如下



遇過的問題

1. 按下燒錄 Bootloader 後出現 nano avrdude: Device signature = 0x000000 (或是 0xff0000, 0x00ff00, 0x0000ff ...... 等)

此處搞了我兩天,始終不知道為什麼會有這樣的狀況發生。

查詢後有人提到這種東西多半是 "接線不穩定" 造成的

解決辦法 :  可以嘗試換一組杜邦線

再者,有人提到換一個 Uno 試試看

而我最後是用第三種方法解決的,那就是

換一個 Nano .........

因我原有的 Nano 出現這個問題一直困擾我很久,所以我最後想到 "是不是 Nano 有問題? " ,於是我重買了一塊 Arduino Nano 竟然就可以了

我比較了兩塊的不同後發現在 Core 上的字樣不同

不行的 Nano 其 Core 上的字樣如下 ( MEGA328P AU1712)




可以的 Nano 其 Core 上的字樣如下( MEGA328P U-PH 35473D 1810P5J)


↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引