まずは簡単にスペックの比較。Arduino UnoにはATmega328、chipKIT Uno32にはPIC32MX320F128がそれぞれ搭載されている。同様に、Arduino Mega 2560にはAtmega2560が、chipKIT Max32にはPIC32MX795F512Lが搭載されている。で、それぞれの搭載MCUのスペックを大雑把にまとめたのが表1である。

■表1
ボード Arduino Uno Arduino Mega 2560 chipKIT Uno32 chipKIT Max32
搭載MCU ATmega328 Atmega2560 PIC32MX320F128 PIC32MX795F512L
最大動作周波数 20MHz 16MHz 80MHz 80MHz
搭載CPU 8bit AVR 8bit AVR 32bit PIC32 32bit PIC32
Flash Memory 32KB 256KB 128KB 512KB
SRAM 2KB 8KB 16KB 128KB
EEPROM 1KB 4KB No
I/Oピン 23 86 53 85
外部割込 24 32 5
DMA No No No 8ch
USB No No No USB2.0 OTG
SPI 2 5 2 4
I2C 1 1 2 5
UART 1 4 1 6
CAN 0 0 0 CAN2.0b×2
Ethernet 0 0 0 10/100BASE-T
ADC Channels 8ch 16ch 16ch 16ch
ADC Resolution (bits) 10cit 10bit 10bit 10bit
ADC Speed (ksps) 15K 15K 10K 10K
Analog Comparators 1 1 2 2
温度範囲 -40℃~85℃ -40℃~85℃ -40℃~105℃ -40℃~105℃
I/O入出力電圧 1.8V~5.5V 1.8V~5.5V 3.3V/5V 3.3V/5V
動作電圧 1.8V~5.5V 1.8V~5.5V 2.3V~3.6V 2.3V~3.6V
Timers 3 6 5 5
Output Compare channels 6 16 5 5
Input Capture Channels 1 4 5 5
PWM Channels 6 15 5 5
RTC 32KHz 32KHz 32KHz+8MHz 32KHz+8MHz
ピン数 32 100 64 100

コアの性能そのものはATmega系がどちらも1MIPS/MHz(≠1 DMIPS/MHz)、一方PIC32系は1.56 DMIPS/MHzである。ATmegaの方は、要するに1命令の処理がほぼ1cycleで完了するので、1MHz駆動の場合に1M命令を処理できる(1MIPS)という話である。「そんなもんは当たり前では?」と思われるかもしれないが、8bit MCUではこうなっていないMCU(特にMicrochipの古いPIC14系)が多く、1命令/cycleで実行できることが一つの大きな差別化の要因になっていたという話である。一方のPIC32はMIPS M4Kコアなので、シンプルな32bitのパイプラインではあるが、一応MIPS 32命令に加えてMIPS 16e命令もサポートしたもので、こちらは1.56 DMIPS/MHzという性能になっている。

もっともこうしたコアの性能よりもむしろ問題なのはI/Oや通信系である。I/Oピンの総数は、ある意味パッケージのピン数にほぼ依存する部分で、そう考えればATmega328がやけに少ないとは言いにくい部分である。ただPIC32の方はUnoのフォームファクタだと明らかに使っていないI/Oピンが多いため、その分ソケットを内側に拡張して利用できるピン数を増やしたと思われる。

差が大きいのは周辺回路系である。大雑把に言えば、PIC32の方が通信系は充実しており、その反面I/Oは微妙に弱い。例えばA/D Converterのサンプリング速度はAVRが毎秒15K Sampleなのに対し、PIC32は10K Sampleとか、PWMがAVRは6/15個あるのに、PIC32は5個のみといったあたりだ。また見逃せないところでは、電圧の違いもある。AVRは5Vで動作をするので、I/Oに関しても普通に5Vの出力が可能だ。ところがPIC32は3.3V動作のMCUなので、デフォルトでは3.3Vのみがサポートされる。つまり5V入出力が出来ない訳だ。もっともこれに関してはMicrochipも理解しており、I/Oピンのいくつかは5V Torelantとなっている(Photo01)。ただしI/O Pinを5V対応にするためには、MCUの「外部」にプルアップ抵抗を設ける必要がある。このため、chipKITでは基板上にプルアップ抵抗を配して(Photo02)おり、Arduinoと互換のピンについては5Vの入出力を可能にしている。

Photo01: これはPIC32MX320F128のデータシートより抜粋。黒く塗られたピンが5V Torelant。

Photo02: Arduinoで言えばAnalog/Digitalの入力ピン(A0~A5)の内側にプルアップ抵抗が配されているのが判る。A6~A11は拡張入力。

もっともPWMだけはどうしようもない。例えばArduino Unoでは2/5/6/9/10/11の6pinがPWM出力可能になっているが、chipKIT Uno32では2/5/6/9/10のみで11は利用できない。またpin 10については、JP4でDigital I/OかPWM Outかを設定するようになっており、このあたりは互換性を取りきれなかったようだ。

ちなみにchipKIT Uno32では、Arduino Duemilanoveと同じくFTDIのFT232を使ってSerial変換を行っている。そのためドライバはArduino Duemilanoveと同じものがそのまま使えた。

さて、IDEについてだが、既存のArduino用のIDE(最新版はArduino-0022)を使ってスケッチを適当に作ってコンパイル→アップロードを掛けると、一見正常にコンパイルが終了し、そのままアップロードも終わるのだが、しばらく経ってからこんなエラーが出てくる(Photo03)。これはアップロード後の同期に失敗したというだけなのでこのまま使い続ける事も可能だが、正常に動く場合はともかくとしてデバッグ中などはちょっと大変である。これについては、DigilentがArduino IDEを元に開発したMulti-Platform Version(Photo04)を既に配布しており、こちらを使うことで解決する(Photo05)。

Photo03: Arduino IDEの中で転送後に相手と同期を取るところで、ボードからの返答の中にArduino IDEが知らないIDが入っている模様。

Photo04: 現在はArduino-0022をベースにしたものが配布中。こちらもArduino自身のバージョンにあわせてアップデートしてゆく模様。

Photo05: Multi-Platform版の対応ボード一覧。他にも細かく手が入っている。

ところで早速だがchipKIT Uno32のバグを見つけてしまった。現時点で確認しているのは、

  • PIN 12とPIN 11のAssingがひっくり返っている。
  • JP4(PIN 10をDigital I/OにするかPWM Outにするかの設定)の説明がボードと逆。

の2つ。まだちょっと触っただけでこれだけ出てくるので、これで全部ではなさそうな気がする。さすが初物、といったところか。Max32はまだ触ってないので、こちらも楽しみだ。

(続く)