2016年04月28日 | 公開。 |
先日、arduino.orgがArduino IDE 1.7.10をリリースしました。このバージョンで改善された事の内、私が確認できたことについて説明します。また、このバージョンで新たに発生した不具合もありましたので、合わせて報告します。
注:この記事は、Arduino IDE 1.7.10での変更点を網羅的に解説した記事ではありません。
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で動作する事を、当方で確認しました。
機種名 | 備考 |
---|---|
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の名称が使えなくなり、商品名が変更になった。 |
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変換器を使いたい場合は、setup関数の中で
analogReference(AR_DEFAULT);
を呼び出します。
1.7.9以降のArduino IDEでこの呼び出しを行っても、問題となる副作用は発生しませんから、SAMDのArduinoを使う場合は、必ずanalogReference関数で基準電圧を設定する方がいいでしょう。
Arduino IDEのバージョンを示すマクロ定数ARDUINOが、Arduino IDE 1.7.10では107010と6桁の数字になってしまいました。(以前のバージョン、例えばArduino IDE 1.7.8では、10708と5桁の数字になっていました)
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定数を確認したい場合は、次のスケッチを実行し、シリアルモニタで出力を観察するのが簡便です。
void setup() { while(!Serial); // マイコンで直接USBシリアル変換を行っている機種への対応 Serial.begin(9600); // 9600bpsでシリアルインターフェース(UARTまたはUSBシリアル)を初期化 } void loop() { Serial.println(ARDUINO); // ARDUINO定数をシリアル出力 }
なお、Arduinoの機種によっては"Serial"を適切な名称に書き換える必要があります。Arduino M0の場合は、 "Serial"を全て"SerialUSB"に書き換えてください。