レビュー
Quarkを搭載したIntelの開発ボード「Galileo」を試す(前編)
(2014/1/31 06:00)
Intelが2013年10月に発表した、「Quark X1000」を搭載するArduino互換の開発ボード「Galileo」。国内でも2013年内の発売が予定されていたが、年が明けてようやく販売が開始された。今回、Intelよりサンプルをお借りできたので、数回に渡って試用レポートをお届けしたい。
Galileoは、マイコンボードとしておなじみの「Arduino」と互換性があるという開発ボード。プロセッサにPentium(x86)互換のSoC「Quark X1000」(400MHz)を搭載するほか、Mini PCI Express、Ethernet、microSDカードスロット(SDIO)、USB 2.0(ゲスト/ホスト)、UART、JTAGなどを搭載。メモリは256MB、フラッシュは8MBを搭載。SoC内に512KBのSRAMも統合されている。
Arduino互換ボードとして利用する場合、内部的にはLinux上でArduinoをエミュレートして実行させる形になる。また、LinuxのBSP(Board Support Package)も提供され、Linux上で動作するソフトウェアを使った組み込みボードとして利用できる。マイコンボードとx86ベースの組み込みボードという2面性はGalileoの1つの特徴で、電子工作、組み込みLinuxの両用途に使えて、インターフェイス含めた仕様も充実しているので、はっきりとした目標がない状態からでも使えるモノ、というのが本製品が発表された時の最初の印象だった。
実売は7,000円台で、機能面などを考えるとマイコンボードとしても組み込みLinuxの開発ボードとしても割安感がある。日本では電子部品を扱うスイッチサイエンスなどのほか、意外ながら自作PCショップでも販売されている。
Arduinoマイコンボード、Linux BSPのどちらがGalileoを購入するユーザーによって主流の使い方になるのかは推し量りかねるが、まずは個人的興味もあり、Arduino互換のマイコンボードとして、電子工作的な使い方をしてみたい。ちなみに筆者自身は専らmbedで遊んでおり、Arduinoは未体験。初めての楽しさも味わいつつ、マイコンを使った電子回路のごく初歩的なことから試していく。
まずはパッケージ確認とセットアップ
届いたGalileo開発ボードであるが、国内販売版のパッケージ。表面にはサングラスをかけたガリレオ・ガリレイらしき人物のイメージ、背面にはボードイメージがプリントされている。内容物はシンプルで、本体のほかには各国プラグ対応のACアダプタと保証規定などが書かれた用紙のみ。ACアダプタは5V/2A仕様のものとなっている。
ちなみに、マイコンボードとして利用する場合に、プログラムなどはGalileo本体とPCをUSB接続してデータ転送するが、同じ5VでもACアダプタの接続は必須とされており、IntelのWebサイトで提供されているスタートガイド(英文)や、チュートリアル(英文)でも、「ACアダプタを接続せずに利用するとボードにダメージを与えることがある」旨が、赤く強調して記載されている。よって、接続する際はACアダプタ→PCとUSBの順に接続し、取り外す際はUSB→ACアダプタの順に取り外すのが正しいプロセスということになり、“ボードにダメージを与える恐れがある”ことを考えると、かなり気を遣う必要がある。
ボードは約106.8×72mm(幅×奥行き)で、マイコンボードのイメージからは大きめ。中央にQuark SoC X1000とMicronのDDR3メモリを搭載。インターフェイスは、microSDカードスロット、Ethernet、Micro USBホスト、Micro USBクライアント、UART、JTAG、電源端子などを表面に、裏面にMini PCI Expressスロットを備えている。
I/Oピンは、Arduino Uno R3などと同じArduino 1.0配列に準拠しており、デジタル入出力が14個、アナログ入力が6個、I2C、3.3V出力、5V出力、GND、電力入力(VIN)などを備える。デジタルピンの内、0番と1番はシリアル入出力、3番/5番/6番/9番/10番/11番はPWM出力としても利用できる。Arduino用のShieldも利用可能とされており、対応リストが公開されている。
セットアップは、IntelのWebサイトからArduino IDEのGalileo対応版をダウンロードして利用する。Windows用、Mac OS X用、Linux 32bit用、Linux 64bit用が用意されている。ちなみに筆者はWindows版を利用したが、ルートフォルダ以外に解凍を試みたところ、パス名が長すぎてエラーが出てしまったので、必ずルート上に解凍する必要があるようだ。
また、Galileoを接続した際に必要なドライバも含まれるので、接続前にIDEをインストールすることをお勧めする。
ドライバをインストール後、(この手のマイコンでは基本的なことだが)COMポートの何番に割り当てられているか確認しておき、IDE上で正しいポートを指定する。プログラム(スケッチ)を書いたら、マイコンボードへ転送すれば、自動的にそれが実行される。
ちなみに、GalileoをPCへ再接続した場合、それを認識するのに多少時間がかかる傾向にある。長いときは1分以上も認識しないことがある。その場合、デバイスマネージャから「ハードウェア変更のスキャン」を実行すると、早期に再検出してくれる。
なお、ArduinoのスケッチはC言語に近いもので、IDEには多数のサンプルも収録されているので、プログラムの知識が多少でもあれば、理解はそれほど難しくないだろう。収録されているサンプルに基づいた回路も、Intelが例示(Galileo sketch tutorials)している。
少し不便なのは、電源供給を絶つ(=ACアダプタを外す)と、転送したスケッチが消える点で、電源投入後は必ずスケッチを転送しなければならない。つまり、なんらかのアプリケーションを作ったとしても、そのままではPCがないと想定したものを動作させられないことになる。
【お詫びと訂正】初出時、Intelが例示しているサンプル図へのリンクが誤っておりました。お詫びして訂正いたします。
定番の“Lチカ”とデータ出力の準備
試せる環境が整ったところで、まずはお約束の「Lチカ」(LEDの点滅)を試してみる。ブレッドボードを用いた回路と、スケッチは下記の通り。
void setup() { pinMode(13, OUTPUT); //ピンのモードを設定 } void loop() { digitalWrite(13, HIGH); //LEDを点灯させる delay(500); //500ms待つ digitalWrite(13, LOW); //LEDを消灯させる delay(500); //500ms待つ }
何の特徴もないサンプルをシンプルにまとめ直しただけのスケッチだが、気になったのは、何となくLEDが暗いこと。試しに13番ピンとGNDの間をテスターで測ってみると、2.7V/0.94mAと思ったより低い。差を確認するため急遽「Arduino Uno R3」を購入。こちらも同様の回路で試して見ると4.85V/2.84mAと差は歴然で、LEDの輝度もはっきり差がある。
Galileoも5V出力ピンの方は安定しており、I/Oピンからの電力はそういうものとひとまず認識しておき、必要であれば5V出力を使うということにして、別のことを試していく。
次に試したのはPWM出力だ。3番/5番/6番/9番/10番/11番は内部のPWMを利用した出力を制御でき、例えばLEDであれば輝度をコントロールできる。試しに組んでみたのが、以下の回路とスケッチだ。
int writeValue = 10; //出力する値 int changeValue = 7; //変更量 void setup() { pinMode(13, OUTPUT); //13番ピンのモード設定 digitalWrite(13, HIGH); //13番ピンに接続したLEDを点灯 } void loop() { //出力する値が10未満または250を超えたら変更量の+/-を反転 if (writeValue < 10 || writeValue > 250){ changeValue *= (-1); } writeValue += changeValue; //出力する値を変更 analogWrite(11, writeValue); //指定した値でLEDを点灯させる delay(5); }
スケッチにある通り、PWM出力の際にはanalogWrite関数にピン番号と出力(0~255)を渡す。上記スケッチはぼんやりとした点滅を繰り返すようにしたもの。出力が10未満になったらプラス方向へ、250を超えたらマイナス方向へ、出力を7ずつ変更していくもので、出力変更のときに5msの遅延を挟んでいる。輝度差を見るために、13番ピンには点灯状態のLEDを繋いでおいた。動作結果は下記動画で、想定通りの動きである。
もう1つ、アプローチを変えてデジタルピン出力とトランジスタを使ったPWM制御も試してみた。これはトランジスタのゲートに電流を送ると、ドレイン→ソース間に電力が流れることを使ったもので、Galileo側からの制御で一定間隔でオン/オフを繰り返すことで輝度を調整する手法だ。
使用したのは、電子工作ではおなじみのNPN型トランジスタ「2SC1815」で、回路とスケッチは以下の通り。
int freq = 1000; //周波数をμsecで指定 int ratio = 999; //LEDがオンになる時間をμsecで指定 void setup() { pinMode(13, OUTPUT); //ピンのモード設定 } void loop() { digitalWrite(13, HIGH); //点灯 delayMicroseconds(ratio); //(ratio)μsec待つ digitalWrite(13, LOW); //消灯 delayMicroseconds(freq - ratio); //指定周波数の残りの時間待つ }
結論から言うと、これは思い通りにいかなかった。スケッチは、1サイクルを1,000μs(=周波数1,000Hz)としてfreq変数で指定。点灯→待ち→消灯→待ちを繰り返し、点灯時間と消灯時間の割合をratio変数で指定させるものになっている。ratioで指定するのは点灯する時間。PWMではオン/オフの比率をデューティ比というが、例えばratio変数に500を指定すればデューティ比50%、800を指定すればデューティ比80%といった具合になる。要するにratioの値が小さくなれば点灯している時間が短くなり、見た目には暗くなったように見えるわけである。
だが、数値を変えてもほとんど輝度が変わったように見えない。同じ回路、スケッチをArduino Uno R3でも試したのだが、こちらはちゃんと暗くなったように見える。下記の写真は同じ露出で、ratioの値を999、200、1へ変更した場合の動作結果で、左側がArduino Uno R3、右側がGalileoに繋いでいるものだ。
Galileoでも、freq/ratioの値を大きくする(=周波数を遅くする)と点滅はすることから、delayMicrosecondsのタイミングに合わせて正確にHIGH/LOWを切り替えられていない可能性を考えている。オシロスコープがあれば、もう少し細かく見られるのだが、あいにく所持していないので正確な原因は不明のまま。ここでも1つ謎を作った。
さて、個人的にはいろいろとセンサーを繋いで遊んでみたいと思っているのだが、そのデータを見られるようにしなければならない。
手段の1つは、Arduino IDEに組み込まれているシリアルモニタへデータを送信して表示させる方法がある。これはArduinoのサンプルにもあり、回路もコードも追加することなく利用できる。
さらに、LCDディスプレイでも表示できるようにしておきたい。使用するディスプレイは秋月電子で購入した「SC1602BBWB-XA-GB-G」で、16文字×2行のLCD。バックライト付きの白抜きタイプである。mbedで遊ぶときに使っていたもので、LCDモジュールは外せるようにしているが、基本的には固定したままで、ブレッドボードに挿しやすいようにケーブルを伸ばした状態にしていたもの。バックライトは付けており、コントラストも可変抵抗ではなく5.5KΩの固定抵抗を付けている。
LCDディスプレイの接続については、Arduino IDEのサンプルスケッチをベースに配線。注意が必要なのは、サンプルスケッチに含まれないinit関数を記載する必要がある点。これは、先述したIntelが例示している「Galileo sketch tutorials」に書かれているもので、init関数を記載しないと液晶ディスプレイには何も表示されないままとなる。
その行を含めつつ整理した回路とスケッチが下記である。ここにはシリアルモニタへの出力も行なっているほか、表示した画面を5回点滅させるという処理も入れている。
#include <LiquidCrystal.h> //LCDライブラリの呼び出し LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //LCDのクラスを宣言 void setup() { lcd.init(1,12,255,11,5,4,3,2,0,0,0,0); //LCDの初期化 lcd.begin(16, 2); lcd.clear(); Serial.begin(9600); //シリアル出力の初期設定(速度指定) lcd.print("Hello, world."); //LCDへの文字表示 lcd.setCursor(0,1); //表示する位置の指定 lcd.print("line 2."); Serial.print("Hello, world.\n"); //文字列のシリアル出力 Serial.print("line 2.\n"); for (int i=0; i<5; i++){ //LCD画面のオン/オフを5回繰り返す lcd.noDisplay(); //LCDオフ delay(200); lcd.display(); //LCDオン delay(200); } } void loop() { }
ここでも予想外のことが起こった。「Hello, world.」を表示させる際に、1文字ずつゆっくりと表示されるのである。これはこれで面白い表現方法ではあるのだが、スケッチを見ても分かる通り特にそのような処理は狙っておらず、このようにしか表示できないのは問題になる。やはりArduino Uno R3を持ち出して同じ回路/スケッチを試してみるとタイムラグなく表示される。百聞は一見にしかずなので、下記動画で確認してみて欲しい。
とにかくどんどん試す、という方針の下、結果として、頭の中にハテナマークが積まれていっている状態ではあるが、今回はひとまず、この当たりで一区切りとしたい。あくまで今回の使用範囲内での感想ではあるが、電源を切断するとスケッチが消えるという動きなどを鑑みても、あくまで開発ボードという位置付けで、ある程度は許容する気持ちで接した方がよさそうである。その上で、学習用として学んだり、ホビー用として楽しんだりすべき製品なのだろう。
さて、文中でも触れたとおり、この後はアナログ入力やI2Cを用いたセンサーを繋いで試してみる予定だ。その結果もできればレポートしたいと思っている。