Arduino IDE 1.7.10で解決した不具合、発生した不具合

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
2016年04月28日 公開。

先日、arduino.orgがArduino IDE 1.7.10をリリースしました。このバージョンで改善された事の内、私が確認できたことについて説明します。また、このバージョンで新たに発生した不具合もありましたので、合わせて報告します。

注:この記事は、Arduino IDE 1.7.10での変更点を網羅的に解説した記事ではありません。

目次

1. SAMD用SPIライブラリに関する改善 … 1ページ
2. SAMDのA/D変換器の基準電圧に関する改善(Arduino IDE 1.7.9での改善) … 1ページ
3. マクロ定数ARDUINOに関する不具合 … 1ページ

1.SAMD用SPIライブラリに関する改善

SAMDプロセッサを内蔵したArduino(表1)用のSPIライブラリでは、これまでSPISettings関数、beginTransaction関数、endTransaction関数、usingInterrupt関数が使えませんでした。(ArduinoでグラフィックLCDを動かす(AQM1248A編)(3)の記事後半のコラムを参照) Arduino IDE 1.7.10で、これらの関数がSPIライブラリに実装されました。

これらの関数の内、SPISetting関数、beginTransaction関数およびendTransaction関数を使ったスケッチがArduino用ヘッダシールドの製作(3) の記事に出てきますが、このスケッチがArduino M0で動作する事を、当方で確認しました。

表1、SAMDプロセッサを内蔵したarduino.org管轄のArduino
機種名 備考
Arduino M0 秋月電子で3,240円で売っている、安価で高性能なCortex M0搭載Arduino。
Arduino M0 Pro Arduino M0の機能拡張版で、デバッガが使用できる。秋月電子では5,670円で販売
Arduino Zero Pro 販売終了機種。中身はArduino M0 Proと全く同じだが、arduino.ccとの間の大人の事情で、Arduino Zero Proの名称が使えなくなり、商品名が変更になった。

2.SAMDのA/D変換器の基準電圧に関する改善(Arduino IDE 1.7.9での改善)

1.7.8以前のArduino IDEを使うと、SAMDプロセッサを内蔵したArduinoでは、起動時にはA/D変換の基準電圧(フルスケール電圧)が1.65Vに設定されてしまう不具合がありました。これが、基準電圧が3.3Vになるように修正されました。

注:この改善は、一つ前のArduino IDE 1.7.9で行われた模様です。(私はArduino IDE 1.7.9を使っていませんが、Arduino IDEの変更履歴には、1.7.9での改善項目に挙がっています)

【コラム】1.7.8以前のArduino IDEで正しくA/D変換を行う方法

1.7.8以前のArduino IDEで正しくA/D変換器を使いたい場合は、setup関数の中で

analogReference(AR_DEFAULT);

を呼び出します。

1.7.9以降のArduino IDEでこの呼び出しを行っても、問題となる副作用は発生しませんから、SAMDのArduinoを使う場合は、必ずanalogReference関数で基準電圧を設定する方がいいでしょう。

3.マクロ定数ARDUINOに関する不具合

Arduino IDEのバージョンを示すマクロ定数ARDUINOが、Arduino IDE 1.7.10では107010と6桁の数字になってしまいました。(以前のバージョン、例えばArduino IDE 1.7.8では、10708と5桁の数字になっていました)

【コラム】マクロ定数ARDUINOについて

Arduinoでスケッチやライブラリをコンパイルする際に、ARDUINOというマクロ定数があらかじめ定義された状態でコンパイルが行われます。このARDUINOという定数は、Arduino IDEのバージョンを区別するために設けられています。

Arduino IDE 1.0.X(Xは任意の数字)では、ARDUINO定数は3桁の数字でした。例えばArduino IDE 1.0.5では、ARDUINO定数は105と定義されます。

Arduino IDE 1.6.Xおよび1.7.Xでは、ARDUINO定数は5桁の数字に変更になりました。例えばArduino IDE 1.7.8では、ARDUINO定数は10708と定義されます。

ARDUINO定数はスケッチやライブラリをコンパイルする際に、Arduino IDEのバージョンの違いが問題になる際の対応に利用されます。

例えば、Arduino IDE 1.0.X(およびそれ以前)と、新しいArduino IDE 1.6.Xや1.7.Xで、一部処理を変えたい場合は、

#if ARDUINO<=109
  // Arduino IDE 1.0.Xとそれ以前の場合の処理
#else
  // 1.0.Xよりも後のバージョンのArduino IDEの場合の処理 
#endif

という具合に条件コンパイルする事で対応できます。

また、Arduino IDE 1.0.X(およびそれ以前)では使えないスケッチを作る場合は、スケッチの先頭で

#if ARDUINO<=109
  #error "This sketch cannot be compiled on Arduino IDE 1.0.X or earlier."
  // 注:上のエラーメッセージ日本語で書くと、エラーメッセージが文字コードで表示され、意味が分からなくなる。
#endif

という具合にエラーチェックしておけば、非対応のArduino IDEでうっかりコンパイルしてしまったユーザーに、適切なエラーメッセージを提示できます。

さらに、Arduinoでも、その他のマイコンボードでも使えるようなライブラリの制作をしている場合は、Arduinoを使う場合に特に実行したい処理がある場合なら、

#ifdef ARDUINO
  // Arduinoを使う場合に特に実行したい処理
#endif

と、定数ARDUINOが定義されているかどうかを条件に、条件コンパイルすれば対応できます。

Arduino IDE 1.7.Xのみで処理したいコードは、例えば

#if (ARDUINO>=10700 && ARDUINO<10800)
  // Arduino IDE 1.7.Xの場合のみの処理
#endif

と記述できますが、Arduino IDE 1.7.10でARDUINOが107010と6桁で定義されてしまうため、上記のコードは正しく動作しなくなりました。仮にこの様な条件コンパイルのあるスケッチやライブラリがあれば、Arduino IDE 1.7.10では正常に動作しない可能性があります。

なお、実際にARDUINO定数を確認したい場合は、次のスケッチを実行し、シリアルモニタで出力を観察するのが簡便です。

リスト1、ARDUINO定数を確認するためのスケッチCOPY
void setup() {
  while(!Serial); // マイコンで直接USBシリアル変換を行っている機種への対応
  Serial.begin(9600); // 9600bpsでシリアルインターフェース(UARTまたはUSBシリアル)を初期化
}

void loop() {
  Serial.println(ARDUINO); // ARDUINO定数をシリアル出力 
}

なお、Arduinoの機種によっては"Serial"を適切な名称に書き換える必要があります。Arduino M0の場合は、 "Serial"を全て"SerialUSB"に書き換えてください。

このページで使われている用語の解説

関連ページ

Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。