Top > Arduino > 0021

Arduino 0021 メモ *

http://arduino.cc/en/Main/Software

公式リリースノート *

http://arduino.cc/en/Main/ReleaseNotes

主観的メモ(0018→0021) *

digitalWrite(), pinMode() *

ビット操作のread-modify-writeオペレーション時に、割り込みを停止するようになった。
ATmega168/328限定だとアトミックなsbi,cbiを使った方が効率が良いはずだが、拡張I/Oレジスタを使うATmega1280/2560対応を考えると仕方がない。

割り込みを使う機会が多いので、この変更は大変ありがたい。

ATmega2560対応関係 *

ソースレベルでは、

#if defined(__AVR_ATmega1280__)

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

こうなってる。

Arduino MEGA アナログ *

ArduinoとArduinoMEGAでは、アナログピンをデジタルピンに使用する場合のピン番号が違っていたので、両対応にするには #if defined(__AVR_ATmega1280__) 等で分岐する必要があった。
A0〜A5を使うことで分岐が不要になる。
ArduinoボードにはA0〜A5のシルクがあるので、ソース上の記述がシルクと一致するのはありがたい。

ソースレベルでは、

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
const static uint8_t A0 = 54;
const static uint8_t A1 = 55;
const static uint8_t A2 = 56;
const static uint8_t A3 = 57;
const static uint8_t A4 = 58;
const static uint8_t A5 = 59;
const static uint8_t A6 = 60;
const static uint8_t A7 = 61;
const static uint8_t A8 = 62;
const static uint8_t A9 = 63;
const static uint8_t A10 = 64;
const static uint8_t A11 = 65;
const static uint8_t A12 = 66;
const static uint8_t A13 = 67;
const static uint8_t A14 = 68;
const static uint8_t A15 = 69;
#else
const static uint8_t A0 = 14;
const static uint8_t A1 = 15;
const static uint8_t A2 = 16;
const static uint8_t A3 = 17;
const static uint8_t A4 = 18;
const static uint8_t A5 = 19;
const static uint8_t A6 = 20;
const static uint8_t A7 = 21;
#endif

ATmega168/328でデジタルピンとして使用できないA6とA7が定義されている。

ArduinoMEGAでは、analogReference()にINTERNALではなく、INTERNAL1V1 or INTERNAL2V56(旧INTERNAL) になっている。
ArduinoMEGAでINTERNALを使用していた場合は、INTERNAL2V56に変更する必要がある。

Arduino MEGA SPI *

ArduinoとArduinoMEGAでは、SPIピンのピン番号が(ry

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
const static uint8_t SS   = 53;
const static uint8_t MOSI = 51;
const static uint8_t MISO = 50;
const static uint8_t SCK  = 52;
#else
const static uint8_t SS   = 10;
const static uint8_t MOSI = 11;
const static uint8_t MISO = 12;
const static uint8_t SCK  = 13;
#endif

そもそもArduinoボード的に出ている場所が違うので、ハードウェアとソフトウェア共に対応していないと意味がない。
新EthernetShieldはD11〜D13を使用せずに、ICSP端子を使用する用になっている。
SPIを使用するShieldがICSP端子を使うのが主流になると、ICSP端子が未実装や位置が違う互換ボードが大変なことになりそう。

HardwareSerialクラス *

HardwareSerialクラスの基底クラスが、PrintクラスからStreamクラスに変更。
peek()メソッドが追加された。

delay() *

delay()関数が、millis()ベースからmicros()ベースでの処理に変更。
これによって割り込み時(または割り込み停止時)での挙動が変わるので注意。
(良い方に働くはず)

shiftIn() *

shiftOut()の入力版のshiftIn()関数が追加。

Stringクラス *

Stringクラスの追加。
PrintクラスのString対応。

SPIライブラリ *

SPIライブラリの追加。
SSポートを制御する専用のメソッドはないため、SSポートはdigitalWrite(SS, bool)を使用する。
begin()内でSSポートは出力に定義されHレベル出力する。SSポート使用しない場合や別のポートを使用する場合は注意するが必要。
割り込みの有効/無効の設定ができるが、現在transfer()が割り込みに対応していない。
1/4clk設定時はtransfer()メソッドは40clkで処理が完了するため、割り込みの有効性はあまり感じない。
割り込みの実装より、非同期処理の実装する方が効率良いかも。

以前のバージョンで同名のヘッダ(SPI.h)を作っている場合、どちらかが動作しない。

Ethernetライブラリ *

EthernetライブラリがSPIライブラリを使用するように大幅に書きかえられている。
Ethernetライブラリを使用していたスケッチは、

#include <Ethernet.h>

#include <SPI.h>
#include <Ethernet.h>

に書き換えが必要。

Ethernet/utilityの中も大幅に書きかえられているので、Ethernet/utilityを使用するスケッチおよびライブラリはほぼ動作しないはず。
EthernetDHCPは、しばらくは0018を使ってくれとのこと。

MEGAでEthernetShieldを使う場合は、SSにD10を使用するようになっている。
SPI標準のSSピン(D53)は使用していなくてもHレベルが出力されるので注意。

Firmataライブラリ *

Firmata.h が、Firmata.h と Boards.h に分割された。

以前のバージョンで同名のヘッダ(Boards.h)を作っている場合、どちらかが動作しない。