amazon

15.10.12

Arduino外部ライブラリイントール時のerror

こちらのサイトを参考にArduinoをSleep.hを使ってスリープしようと試みたときのエラーについて。
環境はMacだ。

ライブラリのインストール先は、
/Applications/Arduino.appで右クリックし「パッケージの内容を表示」した先。
/Applications/Arduino.app/Contents/Resources/Java/libraries/に
SleepとWatchdogというフォルダを作成し、Sleep.h, Sleep.cppとWatchdog.h, Watchdog.cppを移動。

で、参考ページの通りにコードを書いてコンパイルすると次のエラーが出た。
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp: In member function 'void WatchdogClass::enable(uint8_t)':
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:38: error: 'cli' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:43: error: 'sei' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp: At global scope:
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:50: error:
expected constructor, destructor, or type conversion before '(' token
WatchdogClassのenableメソッドで、cli();やsei();が宣言されていないということだ。
cliやseiは割り込みに関するマクロだそうだ。(参考)

そこで、avr/interrupt.hをインクルードする。
Watchdog.hまたはWatchdog.cppに
#include <avr/interrupt.h>
これで先のエラーは消えるが、今度は、
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp: In static member function 'static void SleepClass::powerDownAndWakeupExternalEvent(uint8_t)':
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:56: error: 'LOW' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:56: error: 'attachInterrupt' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:58: error: 'detachInterrupt' was not declared in this scope
となる。

SleepがArduinoで宣言されている定数を認識できていないということだ。

Arduinoの定数の宣言は/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Arduino.hでされているので、
Sleep.hまたはSleep.cppに次のようにヘッダーをインクルードすればよい。
#include <Arduino.h>