これは Intel Galileo というIT技術者も、そうでないヒトにもお勧めできるボードコンピューターを使って試作機を作ってみる記録である。
Intel Galileo ってどんなもの?何に使えるの?
まずは、Intel Galileo についてQ&A形式で紹介していきましょう。
Q1 Intel Galileo とは?
A1 x86 SoCを搭載した x86ボードです
Q2 Galileoの特徴は?
A2 つぎの3つです。
・Pentium 32bit コードが使える 低消費電力 Intel Quark SoC X1000 を搭載
・豊富なペリフェラル
・Arduino互換 (Arduino IDE, Arduino ピン仕様 1.0)
Q3 何に使えるの?
A3 簡単にハードウェアを使ったシステムを作れる Arduinoと互換性をもちながら、ネットワークやUSBデバイスが使えるボードコンピュータなのですが、低消費電力と引き換えに処理能力は低く、AT互換デバイスをかなりもち、UEFIで起動する仕掛けですが、GPUがないことから、なにかしらのシステムコントローラでしょう。
Q4 Intel Quark SoC X1000 とは何?
A4 ATOM系 SoCより低消費電力 (TDP 2.2W)の32bitコードを実行でき、AT互換を維持するために必要なレガシーインターブロックと、AMBAインターコネクトで接続されている AMBA Fabricを備えた システムオンチップで、ウェアラブルコンピューティングなどの用途での活用を目指しているようです。
http://ark.intel.com/ja/products/79084/Intel-Quark-SoC-X1000-16K-Cache-400-MHz
Q5 どんなインターフェイスを持っているの?
A5
mini PCIe x1
100BASE-TX (AMBA Fabric)
SDIO (micro仕様)
USB 2.0 x2
UART
JTAG
I2Cバス
SPIバス
GPIO (16本)
UART (NS16550互換)
Arduino 1.0 インターフェイス (3.3V/5.0V)
Q7 ところで Arduinoってなに?
A7 Wikipedia の言を借りるなら、「AVRマイコン、入出力ポートを備えた基板、C++風のArduino言語とそれの統合開発環境から構成されるシステム」
AVRマイコンは
・プログラム用 FLASHメモリ
・設定保存に使うEEPROM
・プログラム用 SRAM
・マルチチャンネルのADコンバータ
・タイマ
・GPIO
を備えた小規模の組み込み用で、リッチなOSなど入る余地はありませんが、自分のプログラムが直接I/Oを操作し、全プロセス時間を消費する使い方をするMPUです。
Arduinoは、シングルタスクでAVRマイコンのもつインターフェイスを直接操作することで、拡張性に制限がありますが、実時間処理を簡単に実現できます。
クラシカルな組み込み環境と違って、Arduino IDEによるプログラムの開発と実行プログラムのアップロード、再起動を可能にしたことで、組み込みソフトウェア技術者でなくとも、ちょっとしたハードウェア知識があれば、システムを作ることができることが魅力なのです。
しかしAtmel ATmega系よりパワーが必要な状況もありますので、Atmel SAM3X8E のように ARM:Cortex-M3を搭載したArduino Due もリリースされています。
Q8 Arduinoと Galileo はどう違う?
A8 Arduinoは OSなしでリアルタイム操作に向いていますが、ネットワークサービスやUSBデバイスなどを使いたいとすると、リッチなOSがあった方が都合がよいということになります。
x86 32bitカーネルのLinuxが動作しているおかげで豊富なデバイスドライバのサポートがある、Galileo はまさにそういう用途に向いています。
Galileo で何を試作するの?
今回のレビューへの応募にあたってのテーマですが、
「自宅を測候所にしたり、農作物の温度管理支援を行うシステムの原型を試作する」です。
この2つは別物ですが、技術的には類似してて環境センサからの情報を集約するテレメタリング技術を使ったシステムといえます。
ただし、
自宅測候所:有線伝送が可能なケースあり、無線伝送は可能、外部電源可
温度管理: 農地での多点測定を行う場合、無線伝送が必須、自律電源必須
という違いがありますので、自宅を測候所に絞って試作をすすめます。
自宅測候所
測候所と言うとちょっと難しく聞こえますが、気温、湿度、気圧、風向、風速、雨量などを無人で長期記録、可視化してくれるものが欲しいということです。
昔学校で百葉箱を見たという方は結構いらっしゃると思いますが、百葉箱の中には通常 乾球、湿球温度計が入っていて、記録者が定時に温度計の指示値の差から表を使って相対湿度を求めて気温、湿度として記録していたわけです。
人間が定期的に計測しつづけるのは大変なので、無人で長期観測できるようにバイメタル式などの温度記録計などあります。
それらの機器は高価で、美術館、博物館などの所蔵品保護、食品管理などで重要な場所で使用されており、個人で使用するには敷居が高いものでしたが、この10年でMEMSと呼ばれる半導体センサーが大幅に進歩したおかげで、近年では生活温度帯で±0.5度の誤差以内の温湿度センサーが安価に手に入るようになりました。
今ではより高精度(0.1℃)に校正済みのものも存在しています。
いまや目覚まし時計にもMEMSによる温湿度表示がついてたりします。
ところで、自宅で気象気候観測するニーズは多少なりとも存在しており、既製品が存在します。
国内では、佐藤商事 ウェザーステーション気象観測計 2355という風速、風向、雨量計を遠隔配置できて液晶コンソールに表示、およびPCへ接続できる商品があります。
海外製ではスマートフォンからアクセスできる フランスNetatmo ウェザーステーション NET-OT-000001のようにワイヤレス仕様(屋内、屋外設置 WiFi接続)のものがあります。
海外製で本格的なものは DAVIS社の設置にも気を使った商品群が既に展開されています。
http://www.davisnet.com/weather/products/vantage-connect/remote-weather-data.asp
価格が10万以上になりますが、個人でもこれらを使用されている方もおられるようですが、今回測候所をローコストに実現するアマチュア的なアプローチとして、Intel Galelio と Arduino を使ってシステム構築を行います。
1)次の環境センサーからデータを収集
・温度
・湿度
・気圧
・風力
・風向
・雨量
・照度
2)収集したデータを小電力無線で伝送する
3)伝送したデータを可視化する
となってます。
ハードウェアシステム構成はこんな感じです。
ソフトウェア構成は現在検討中ですが、可視化は Galileoが担当します。
どうやって作るの?
今回実現するための技術課題が3つありますので、ひとつずつ紹介します。
課題0) プログラミング
Arduinoを動作させるプログラムはスケッチと呼ばれていて、C++風言語で記述します。
Arduinoでは、Aruduino IDEとよばれる実行形式への変換、Arduinoへの書き込み、ライブラリの取り込みなどすべてが完結する統合開発環境が用意されています。
Arduino IDEですが、
通常のArduinoは Arduino 1.0.5 が最新、GalileoはArduino IDE for Galileoを使用します。
Arduino 1.0.5
http://arduino.cc/en/main/software
Intel Galileo Arduino SW 1.5.3
https://communities.intel.com/docs/DOC-22226
からダウンロードしてアーカイブを展開しましょう。
次にArduinoと通信するドライバをインストールします。
Arduino Unoの場合 USB接続して認識されたあと、
展開したディレクトリの drivers を指定してインストールしてください。
Galileo の場合は同様に
hardware\arduino\x86\tools を指定してインストールしてください。
デバイスが認識されたら IDEを起動しましょう。
中身のコードは適当ですが、最小構成のスケッチで何もしないコードになります。
スケッチは
1) 検証・コンパイル
2) マイコンボードに書き込む
で即座にリスタートされます。
なお、初回はツール→シリアルポート で認識されている シリアルポートを設定してください。
私の環境では COM8 になりました。
Arduino UNO でも Galileo でもどちらでも動作します。
次は Hello World がわりに LED を点滅させましょう。
void setup() {
// 初期化コードはココに書く
pinMode(13, OUTPUT);
}
void loop() {
// 周期的に行う処理はココに書く
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
これを転送すると Arduino UNO, Galileoともボード上に実装されたLEDが
点灯と消灯を500msずつ繰り返します。
ちなみに 30msまでは十分肉眼で認識できます。
なぜ13ピンを指定しているかってのは、標準的なArduinoは13ピンにLEDが付いているから、
"Hello, World" がわりに使われるんですね。
さてCが分かる人向けにいうと、
先ほど書いたプログラムですが、実際のコードは
int
main() {
setup();
for(;;) {
loop();
}
}
というコードと、main() を呼び出すスタブコードがリンクされて動いています。
普段は意識しないのですがね。
このふたつのArduino IDEは、レジストリを共有してますので別のマシンにいれておいた方が楽です。
課題1) Wether Shield
まずは環境センサーですが、市販品でよいシールドがありました。
それが、Sparcfun.com の Wether Shield です。
オプションですが風向、風力、雨量センサーもあります。今回のレビューではそれも使用します。
このシールドは温湿度センサーとして HTU21Dを、気圧センサーとして MPL3115A2を使用していますが、これらは I2Cバスで接続されています。
精度は 5-60℃ では ±0.4℃でそれ以外では誤差が広がる傾向があります。
照度は相対的なアナログ値、風向は角度に応じたアナログ値で、風速、雨量はデジタルで返されるようです。
早速使ってみましょう。
製造元の Sparkfun によるサンプルコードが GitHub にありますので、それを使ってみます。
必要なファイルは
サンプルコード Weather_Shield
https://raw.github.com/sparkfun/Weather_Shield/master/firmware/Weather_Shield/Weather_Shield.ino
ライブラリ MPL3115A2_Pressure.zip
https://github.com/sparkfun/MPL3115A2_Breakout/raw/master/library/MPL3115A2_Pressure.zip
ライブラリ HTU21D_Breakout/Library
https://github.com/sparkfun/HTU21D_Breakout/tree/master/Library/HTU21D_Humidity
ライブラリを Arduino IDEでインポートします。
Weather_Shield.inoは温度がファーレンハイト度になってますので、セルシウス度のメソッド呼び出しに切り替えます。
Galileo は interrupts() 関数をサポートしていないのですが、そもそも linuxベースで動いている以上必要ではないので、interrupts() をコメントアウトしてスケッチを転送したところ、
シリアルから数値が出てきました。
計測された温度が29.7度、湿度が37と返されていますが、室温計は20度、湿度60%です。
精度はこの温度範囲なら最大±0.4度ですが、Quark SoC X1000の直上のため熱が大きいようです。
比較してみるため絶対湿度へ換算してみましょう。
室温計
重量絶対湿度 H : 0.00955kg/kgDA
容積絶対湿度 ε : 11.04g/m3
センサー計測値
重量絶対湿度 H : 0.00898kg/kgDA
容積絶対湿度 ε : 10.73g/m3
センサの温度範囲が下限0.4度の誤差があったとすれば、10.81g/m3 まで近づきますから、問題ないように思えます。
SoCとウェザーシールドの間の空気が滞留しないように振り続けたところ
温度 20.1度、湿度61.6を記録しました。
予想通りの結果ですが、実用にする場合には、ファンで外気をある程度の風量でセンサーに当てるなどの措置が必要ですね。
または、ウェザーシールドではなく、専用のブレイクアウトカードを使って距離を離す方法もいいでしょう。
振ってみた時
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=61.6,tempC=20.1,rainin=0.00,dailyrainin=0.00,pressure=101707.25,batt_lvl=4.73,light_lvl=0.07,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=61.6,tempC=20.1,rainin=0.00,dailyrainin=0.00,pressure=101710.00,batt_lvl=4.72,light_lvl=0.05,#
静止時
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=37.0,tempC=29.7,rainin=0.00,dailyrainin=0.00,pressure=101755.50,batt_lvl=4.70,light_lvl=0.01,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=39.8,tempC=29.7,rainin=0.00,dailyrainin=0.00,pressure=101747.25,batt_lvl=4.72,light_lvl=0.01,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=43.2,tempC=29.6,rainin=0.00,dailyrainin=0.00,pressure=101745.50,batt_lvl=4.70,light_lvl=0.01,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=48.1,tempC=29.3,rainin=0.00,dailyrainin=0.00,pressure=101739.00,batt_lvl=4.72,light_lvl=0.01,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=47.8,tempC=29.1,rainin=0.00,dailyrainin=0.00,pressure=101745.50,batt_lvl=4.72,light_lvl=0.05,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=45.5,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101751.75,batt_lvl=4.71,light_lvl=0.05,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=43.6,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101750.50,batt_lvl=4.72,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=42.3,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101748.75,batt_lvl=4.72,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=40.9,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101742.75,batt_lvl=4.74,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=40.5,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101749.00,batt_lvl=4.72,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=40.3,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101751.25,batt_lvl=4.72,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=39.5,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101746.75,batt_lvl=4.72,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=39.1,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101744.00,batt_lvl=4.72,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=39.0,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101750.00,batt_lvl=4.72,light_lvl=0.06,#
$,winddir=23,windspeedmph=0.0,windgustmph=0.0,windgustdir=0,windspdmph_avg2m=0.0,winddir_avg2m=23,windgustmph_10m=0.0,windgustdir_10m=0,humidity=38.8,tempC=29.2,rainin=0.00,dailyrainin=0.00,pressure=101743.75,batt_lvl=4.71,light_lvl=0.06,#
課題2) Arduino UNO R3
Intel Galileoにとっては、屋外設定をするには設置環境が厳しいのと消費電力が大きく電力供給が難しいことが予想されましたので、一般的な Arduino である Arduino UNO R3 を使用することとしました。
Intel Galileo も Arduino 互換インターフェイスをもっていますので、Arduinoで動くシールドは条件つきで Galileoでも動くということが期待されます。
Arduino UNO での開発は Arduino IDE を使用しますが、Galileoのものと区別するために
バージョン 1.0.5 for Windows を使用してみました。
Weather Shield のサンプルを動かしてみたところ、すんなり動作しました。
もちろん interrupts() 関数のコメントアウトは外しています。
課題3) XBee
測定機器と可視化機器を分割するうえで欠かせないのがこれ。
無線でありながら、消費電力の少ないZigBeeネットワークを実現する Digi XBeeです。
マイコンとはシリアルインターフェイスで接続して、1対1や複数と通信することができる優れものです。
今回は試作ということで電力を気にせず実装するため出力が大きい XBee Proおよび Arduinoに接続するスイッチサイエンス製 ワイヤレスシールドを使います。
ただし、XBee PROの送信時の消費電流が 205mAと大きいため、電池が干上がるのが早くなりますから、消費電力を抑えた2次試作を行う場合には、消費電流が max 45mA の XBee ZBを使用し、到達距離を補うために設置個数を増やすなどの対策が必要です。
さて、XBee の使い方ですが、
事前準備として
・一台を コーディネーターモードに
・通信したいノードおよび中継ノードになれるものをルーターモードに
・省電力にして中継機能がないエンドポイントモードに
設定する必要があります。
これらの設定には X-CTU という Windows/OS X/Linuxで動くツールで行うのが便利ですので、インストールしましょう。
XBeeのメーカーの Digi の X-CTU Software は次のURLからダウンロードできます。
必要なのは XCTUです。
XCTU Next Gen Installer, v. 6.1.0, Windows x32/x64
http://ftp1.digi.com/support/utilities/40003026_A.exe
XCTUは起動すると、現段階で 6.1.1 へのアップデート指示がありますので、アップデートします。
XCTU 6.1.1 - January 29th, 2014
XBeeをUSBシリアル変換でPCとつなぎます。
今回は、XBeeシールド + USB変換アダプタで対応しました。
方法は次の方法によります
1)XBeeシールドのジャンパを外します。
2)FTDI USBシリアルアダプタを 3.3V仕様にしてジャンパに挿します
3)PCにつなぎます
4)Windows7/8では勝手にドライバがインストールされます
5)X-CTU を起動します。
6)親機にする側をコーディネイター APIモードに変更します。
まず XBeeを見つけましょう。
X-CTU から ルーペのついたアイコンを押す
使用する COMポートを選択します。ここでは COM7 を選択して Next>を押します。
ポートパラメータを設定します。デフォルトでOKですので Finishを押します。
探してます
見つかりました。
設定情報が見えるようになりました。
Function set をみると Zigbee Router AT になってます。
ファームウェアアイコンを押すと、アップデートが選択できます。
ここで Function set を ZigBee Coordinator API、Firmware version を Newest にして、Finishを押してください。
アップデート完了後はこんな感じになります。
7)もう一台を Router API に変更します。
やり方は同様です
8)両方通電してネットワークを構成していることを確認します。
中間報告の段階では、ネットワークグループを示す PAN IDは初期値のままで、Arduinoからの任意の送信、受信はできていませんので、今後追記します。
課題4)シールドのスタック
Arduino シールドは連結ピンを使うと、複数枚スタックすることができます。
ただし条件が一つ。I2Cバス以外は共用できないということです。
そこで、XBeeシールドと Weather Shieildについて使用しているピンを確認しましょう。
見事に重複しないですね。
これなら問題なしです。
実際に乗せてみるとこんな感じです。
Arduino側は、まだ載せていませんが、動作中はこんな感じです。
ここまでのまとめ
中間報告時点では、
・GalileoをArduino IDEで動作させることはできた
・Arduino UNO R3をArduino IDEで動作させることはできた
・ウェザーシールドは Galileo / Arduino で動かせることを確認した
・XBeeの設定を行い、ネットワーク化することができた
というところまででした。
残る作業は
・実際に通信するプログラムへ改変する
・オプションの風向風力計、雨量計を接続する
・設置してみる
・可視化する
ということになりますが、それなりに時間がかかると思いますので、随時記載を増やしつつ薦めて行きます。
また、作業を進めていくに当たり、いろいろ調査した結果などもありますので、随時まとめていきます。
mr_osaminさん
2014/03/10
参考になります。
引き続き、注目しています!
はにゃさん
2014/03/10
コメントありがとうございます。
RPiより遅いSoCに実時間処理出来ないOSが入ってますから制約はありますが、その中で対応していくのも面白いです。
mr_osaminさん
2014/03/10
これと連携する仕組みがとても興味深いです。
自分でも取り組んでみたいなぁ。
はにゃさん
2014/03/10
I2C(TWI)バスなら、アドレスがかぶらなければ2線で通信できるのがいいですね。
アナログセンサーでもADC内蔵なのでいけますよ。
mr_osaminさん
2014/03/10
パッチコさん
2014/03/17
前にシリアル通信レベルはやった事があるのですが、
もうすっかり忘れてしまいました。
じっくり読みたいそんなレビューですね。天晴!
いきなりこれのレビュー来たら、私は難しいだろうなあ。
蒼-aoi-さん
2014/03/30
私の実家は農家のため、こういう分野の機器には興味があります。
自分でも電子百葉箱っぽいもの(部品の実験がてらに温度・照度・湿度あたりをシリアルROMに保存)を作ったことがありますが、お遊び工作だったので、実用できるものではありませんでした。
なので、はにゃさんの完成が楽しみです。
zigbeeは、かなり安くなってくれると嬉しいです。
映画「ツイスター」(古)のようなマイクロセンサ的な機器(一個一個にzigbee搭載)を作ってみたいです。
はにゃさん
2014/04/01
実家には農地があるんで、そこで試してみたいと思ってたりします。
温度・照度・湿度・気圧が分かるだけでも色々できそうですし、
土の湿度センサーも今は有りますから、それらがあると自動散水機を連動させることもできそうです。
まずは、小さいところの試作から進めます。