えー、前回から1カ月以上も開いてしまってすみません。IDFの取材中はお休みさせていただいたのですが、その後も色々引きずってしまってまるまる一カ月以上開いてしまいました。
ということでchipKITの続き。実のところこの開いている間にMicrochipとDigilentは新シールドを発表するし、本家ArduinoはAtmelと共同で新Arduinoを発表するなどと、色々とArduino自身の32bit化や高機能化が進んでいる感じが強い。ArduinoがchipKitに影響された、という訳ではないだろうが、ホビー用もいよいよ本格的に32bitへの移行を始めたという事をひしひしと感じる。
さてchipKitに話を戻そう。そんなわけで見かけ上は互換であるが、性能あるいは消費電力はどうだろうか? ということで、簡単な測定治具を作ってまずは消費電力の測定である(Photo01)。ちなみに治具は(回路図を紹介するのも恥ずかしいレベルだが)図1の様な具合。要するに5VのACアダプタを直接ArduinoなりchipKitに挿すのではなく、その前にこの治具を入れ、ここにテスターを繋げることで直接消費電流を読み取れるというもの。一応オプションとして電圧も測定可能にしているが、試しに測定したものの今回の場合は消費電力の変動に合わせて電圧降下が起きるレベルではなかった(少なくとも手持ちのテスターで測定できるレベル未満だった)ので、もう純粋に電流値だけを測定しておけば十分だろう。
Photo01: 利用しているテスターはSANWAのPC500(既に生産終了機種:代替機種はPC500a)。一応10Aまでクランプを使わずに直接測定できるので、こういう場合は便利。 |
さて、テスト環境ができたところで、実際に測定。まずはHello world的な簡単なものということで、List 1の様なSketchを両方で走らせて見た。ちなみにSkectchのCompile後のサイズは、
Arduino Uno : 1018 Bytes
chipKit Uno32 : 5336 Bytes
となっている。さて、これを実行すると1秒毎にLEDが点滅する。今回は13番ピンとGNDに、たまたま手元にあったOSPW5111B-QRを装着してSketchを動作させた。動作させると1秒毎に点灯と消灯を繰り返すわけだが、それぞれの状態における消費電流は、
点灯時 | 消灯時 | |
---|---|---|
Arduino Uno | 35mA | 21mA |
chipKit Uno32 | 80mA | 68mA |
といったところ。LEDに流れる電流が12mA~14mAと少ない計算だが、もともとこの製品はばらつきが多い代わりに安いというものなので、まぁこれは不思議ではない。問題は消灯時の電流で、chipKitはArduinoのほぼ3倍といった計算になる。
では、演算性能はどうか? ということで次にList 2の様なSketchを作ってみた。プログラムそのものにはまるで意味がない(90000万回×90000万回で81億回の足し算を、500回繰り返すというもの)だが、Arduino IDEも一応最適化するようで、最後のif文を入れないと、Arduino Uno/chipKit Uno32ともに一瞬で動作が終了してしまう。if文そのものにも意味がない(if節とelse節がまったく同じだからだ)のだが、ifが入ることでループ内の演算に意味があると見做してくれたようだ。ちなみに計算スタートのタイミングでLEDを点灯、計算終了でLED消灯を行い、これで所要時間を求める(要するにLEDの点灯時間を手で測定する)事が出来る。さて、結果であるが、
プログラムサイズ | 所要時間 | 消費電流 | |
---|---|---|---|
Arduino Uno | 1152 Bytes | 10.48秒 | 34mA |
chipKit Uno32 | 5420 Bytes | 3.60秒 | 81mA |
となった。所要時間は一応3回テストを繰り返した平均値ではあるが、±0.5秒程度の誤差はあると思って欲しい。まず消費電力であるが、計算をさせていてもDelay()で待たせていても、あまり差はないようだ。ちなみにテスト終了後はwhile(1);で無限ループさせているわけだが、ここにおける消費電力はArduino Unoが18mA、chipKit Uno32が63mAで、先のList 1の消灯時よりも数mA少なくなっているのがちょっと面白い。
所要時間は概ねArduino Unoが3倍というか、chipKit Uno32が3倍高速だった。これ、もう少しテストの繰り返し数を増やすともう少し差が開くかもしれない。プログラムサイズに関しては、List 1との比較ではArduino Unoが134Byte、chipKit Unoが94Bytesの増加ということで、単にchipKit Unoでは初期設定周りのサイズが大きいだけという気がしなくもない。Flash MemoryのサイズはchipKit Unoが4倍(128KB)だから、多少初期設定ファイルが大きくても支障がないということだろう。
(続く)
List 1:
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
List 2:
#define REPEAT 90000
void setup()
{
pinMode(12, OUTPUT);
}
void loop()
{
unsigned long lpCnt1,lpCnt2,lpCnt3;
unsigned long num;
delay(1000);
digitalWrite(12, HIGH);
for(lpCnt1=0; lpCnt1<500; lpCnt1++)
{
for(lpCnt2=0; lpCnt2