1カ月集中講座
Intelの開発ボード「Galileo 2」の楽しみ方 第1回
~Galileo初代モデルとGen.2は何が違うのか?
(2014/10/9 06:00)
Intelが今年(2014年)1月に発売した開発ボード「Galileo」に搭載されているQuark SoC X1000(以下、X1000)は、IntelのIoT戦略の足回りを支える製品となる。センサーからのデータ収集などAtomシリーズでも処理能力が余るようなアプリケーションにはX1000のような軽量なSoCが適しており、それだけにIoT戦略の中でも重要な製品に位置付けられる。
そして今年8月、そのX1000を搭載する開発ボードGalileoの新しいリビジョンとなる「Galileo Gen.2」が発売された。本稿では4回に分けてGalileo Gen.2を取り上げていく。初回は「初代とGen.2で何が変わったのか」を重点的に取り上げていくことにしたい。
Galileo Gen.2は初代モデルの改善版
Galileoの位置付けや基本的な特徴は初代とGen.2に全く変わりはない。GalileoはX1000を搭載する開発ボードで、外部入出力が「Arduino Uno R3」と互換性を持ち、Arduino IDEを用いた開発も可能という特徴は、そのままGen.2に受け継がれている。
また、X1000の動作クロックは400MHz、メインメモリ256MBでストレージとしてオンボードに8MBのNOR型フラッシュとmicroSDカードスロットによる外部ストレージをサポートするという点も変わりがない。新バージョンに高性能化、あるいはメモリやストレージの強化といったあたりを期待した人にとっては、やや肩すかしかもしれない。
従って、Galileoとは何で、何が可能なのか、といったあたりについては初代について書かれた記事……例えば1月に掲載された記事などが、そのまま通用する。ただ、もちろん何も変わりがなければGen.2を出す意味はないわけで、変わっている部分はもちろんある。詳しくは後述するが初代からGen.2への変更点の多くは、初代に見られた問題点の修正や改善となっている。
そこで、まずは外見上の違いから分かる変更点から取り上げていくことにしたい。
一見して分かるのが基板サイズの違いで、初代モデルは114×72mm(幅×奥行き、実測、突起など含まず)に対してGen.2は122×72mm(同)と幅が8mmほど大きくなった。初代もGen.2も部品の実装密度が高いというわけではないので、無理に小型化しようとは考えていないようだ。基板が大きくなった理由はmicroSDカードスロット付近にある数多くの小さなチップのパターンの引き回しが原因のようだが、これらについては後で述べたい。
外部入出力用のピンヘッダはArduino Uno R3などと互換性があるArduino 1.0仕様で、初代とGen.2に大きな変化はないが、USBポートなどGalileo固有のコネクタ類には変更がある。例えばUSBポートのコネクタが変わっている。
GalileoにはUSBクライアントポートとUSBホストポートがそれぞれ1基ずつ装備されている。初代では双方にMicro USB(メス)が使われていたが、Gen.2ではホストポートの方がフルサイズのUSB Aタイプ(メス)に切り替えられている。初代は双方のUSB形状が同じであるためシルク印刷でしか区別できず間違えやすかったので、区別しやすくしたのだろう。
そしてもう1つ、外見から分かる違いがシリアルコンソール用のシリアルポートだ。初代ではEthernet端子横の3.5mm径ピンジャックがシリアルポートになっていた。このピンジャックからはオンボードに載っているRS-232Cレベルコンバータを介してRS-232Cレベルのシリアルが出ていたので、3.5mm径ピンジャックと9ピンD-Subの変換ケーブルを自作する(または購入する)ことでPCのシリアルポートに直結できた。
それはそれで便利だったのだが、Gen.2では大きく変更された。Gen.2ではオンボードのRS-232Cレベルコンバータが省略され、TTLレベルのシリアルがEthernet端子横の6ピンヘッダに出力されている。
この6ピンヘッダは、Future Technology Devices International(FTDI)製のシリアル-USB変換ケーブルと互換性を持つピンアサインになっていて、直結が可能だ。FTDIのシリアル-USB変換ケーブルは日本では秋月電子通商が取り扱っているため入手は比較的容易だ。もちろん、TxDやRxDを6ピンヘッダから引き出して、レベルコンバーターを介してPCのシリアルポートに接続するような変換ケーブルなどを自作してもいいだろうが、手間を考えるとFTDIのケーブルを買ってしまう方がコストパフォーマンスがいいかもしれない。
外部との接続を行なうコネクタでは、そのほかにJTAGポートのコネクタがGen.2では基板裏に切り替えられているのが異なっている。
基板上のジャンパは、Gen.2でVINジャンパとI2Cアドレス選択用のジャンパ(初代のEthernet端子横)が廃止になった。
VINジャンパはArduino互換のピンヘッダから電源を与える際に使うジャンパだったが、Gen.2ではジャンパの切り替えなしにVINを与えることができるようだ。一方のI2Cアドレス選択用のジャンパの廃止は、次に説明するGPIOエキスパンダが変更されたために廃止になったようだ。
Galileo Gen.2の最大の目玉はGPIOの高速化
IntelがGalileoのGen.2を出さなければならなかった理由の1つと考えられるのがGPIOだ。というのは初代GalileoはGPIOが極めて遅かったからだ。先に示した初代Galileoを取り上げた記事ではキャラクタLCDを初代Galileoに接続しているが、その際にも低速さが指摘されている。
GPIOが低速だった理由ははっきりとは断言できないものの、2つの原因が考えられる。
1つはGalileoではファームウェアにLinuxを採用しており、Arduino IDEで作成したアプリケーションがLinuxのユーザーランドで動作するアプリケーションに過ぎないという点だ。LinuxはマルチタスクのOSなのでユーザーランドのプロセスがCPUを専有できない。従って、ArduinoのようにCPUを専有するいわゆるマイコンプログラムとは異なり、厳密なタイミングの制御といったことは難しい。
ただし、Gen.2も引き続きファームウェアにLinuxを採用しており、基本的な仕組みは変えていない。従って、Linuxに起因するGPIOの制御の問題については大枠としては初代とGen.2であまり変わっていないと考えられる。
もう1つの原因に、初代ではユーザーに開放されているGPIOの大半をI2C接続のGPIOエキスパンダが受け持っていたということが挙げられる
先の基板の写真から、初代ではmicroSDカードスロット付近に大型のフラットパッケージのLSIが載っていることが分かると思う。このLSIはCypressのI2C接続GPIOエキスパンダで、ユーザーに開放されているGPIOの大半を、このLSIのGPIOが受け持っていた。
I2Cを通じてコマンドでGPIOを制御する関係で、SoCネイティブのGPIOよりはオーバーヘッドが大きく低速になる。さらに、このGPIOエキスパンダはI2C標準モード(100kbps)で動作するので余計にオーバーヘッドが大きいと考えられる。
初代のGPIOがどの程度低速だったのか具体的な例を見ておきたい。次のようなコードで初代のGalileoでウェイトなしでGPIOをオン/オフしたときのDigital 9端子の変化をオシロスコープで見たのが次の図である。
リスト(テストコード)
void setup() { pinMode(9, OUTPUT); } void loop() { digitalWrite(9, HIGH); digitalWrite(9, LOW); }
画面1の横軸は、点線で示された目盛りが1ms間隔となっており、オン/オフの区間が2ms強あることが分かる。ウェイトなしでも約2ms以下では切り替えられないというのはとてつもない無い遅さであり、先述の初代Galileoの記事でLCDの表示が遅かったのは無理もない。
ただ単に遅いというだけでなく、ここまで低速だとArduinoのスケッチとの互換性にも問題が生じるだろう。例えば、ArduinoではSPIデバイスをGPIOを使って駆動するといったことが行なわれているが、これでは、初代GalileoにおいてはSCLKに250Hz以下のクロックしか与えることができない。データ転送に時間がかかりすぎるとデータの信頼性が低下するセンサー類などのSPIデバイスは珍しくはなく、そのようなデバイスはGalileoでまともに扱うことが難しいかもしれない。
いずれにしても、このGPIOの速度は大きな問題で、当然Intelとしても認識はしていたようだ。従って、Gen.2では大幅な高速化が図られている。
具体的にはDigital 0~6およびDigital 9~13までの合計12本が、X1000内蔵のGPIOコントローラによる入出力に切り替えられている。それ以外のGPIOはネイティブではないが、少なくともこの12本のGPIOについては初代に比べて極めて高速になった。
実際にどの程度の高速化が行なわれたのか、先とまったく同じコードをGen.2で動作させDigital 9端子の変化を見たのが次の画面だ。
こちらの画面の横軸は、点線で示された目盛りが1μs間隔で、オン/オフの区間は1μs強となっている。つまり初代に対してGPIOが2,000倍程度は速くなった格好だ。もっとも、初代が異常に遅すぎるので、高速になったというより、まともになったという言い方の方がいいかもしれない。
さらに、詳しくは次回以降で説明するが、Gen.2ではGPIOの低レベルアクセスを行なう専用のライブラリ関数がArduino IDEに追加されており、それを利用するとGPIOを使って約1MHz以上の周波数を出力できる。
GPIOの高速化のため、初代モデルに実装されていたCypressのI2CエキスパンダはGen.2では廃止された。Gen.2のmicroSDカードスロット周りにある小さなチップは、表面実装のロジックICと5VのI/O電圧に引き上げるレベルコンバータで、X1000ネイティブのGPIOを利用するために追加されているようだ。これらのおかげで基板面積が少し大きくなったわけだ。
なお、先に挙げた12本以外のGPIOはNXP SemiconductorのGPIOエキスパンダ「PCAL9535A」が受け持っている。PCAL9535Aは、初代に使われていたエキスパンダと違いI2CのFastモードに対応できる。
そのため、Gen.2ではI2Cを初代より高速な動作モードに設定できるようになったという利点も生じる。初代モデルではI2CをFastモードに設定するとGPIOが使えなくなってしまっていたが、それが解消されたわけだ。
以上のように、GPIOが大きく変えられたため、Linux上で使用されるGPIO番号、すなわち“/sys/class/gpio/”以下で使われるGPIO番号と端子の対応も大きく変わってしまっている。Arduino IDE上のArduino言語によるコードレベルの互換性は維持されているが、出力されたスケッチのバイナリレベルでは初代とGen.2に互換性がない。
Galileo Gen.2でも引き続きArduino IDE 1.5.3が利用されているが、今IntelがGalileo向けに配布しているIDEには、ボードの選択メニューが用意されている。このメニューで「Intel Galileo Gen2」をあらかじめ選択しておかないと、Gen.2で動作するスケッチが出力されない(ただしスケッチの転送自体は正常に行なわれる)。この点は注意が必要になる。
また、あまりないかもしれないが、Linux上でGPIOなどを操作するスクリプトを使っている場合も、sysfsのGPIO番号と端子の対応が変わっているため書き換えが必要になるだろう。
その他の変更・改善点
最後にそのほかの変更点をまとめておきたい。
・PWMの強化
初代GalileoではCypressのGPIOエキスパンダに内蔵されているPWMコントローラが使用されていたが、GPIOエキスパンダの変更に伴って新たにNXP Semiconductor製PWMコントローラのPCA9685が導入されている。その関係でPWMの機能がやや強化された。
具体的にはanalogWrite()に設定できるデューティー比が、初代では8bit(これはArduinoの標準でもある)だったのに対して、Gen.2では12bitの精度で設定できるようになっている。
・電源周りの改良
Gen.2では電源回路が改良されACアダプタ端子は7~15Vという幅広い電圧に対応できるようになった。また、Gen.2ではPower over Ethernet(PoE)に対応しているので、対応するEthernet Hubがある環境ならACアダプタを省略することが可能になる。
以上、Galileo初代とGen.2の違いをまとめてみた。次回はGen.2とArduino IDEを使って簡単な作例を紹介する予定だ。