2014年1月30日木曜日

Intel Galileo お試し。

 スイッチサイエンスさんでIntel Galileoボードの在庫が復活していたので、遊びでいじってみることにしました。とりあえず、ポチッと購入したものの、使い道は全く考えていません。というか、Galileoボードに関しては、「冷やかしでボード自体をちょっといじってみる」くらいしか用途が思いつきません。Linuxで電子工作的なことをやるなら、ハードウェア制御が余り入らなければ、Raspberry Piで、よりハードウェアな制御が欲し(くてLinuxも画像処理やネットワークで使いたい)い場合は、BeagleBone BlackとかRaspberry Pi + Arduino のコンビが自分としては今のところベストソリューションな感じです。
 しかし、世間(といってもかなり狭い人々の間の世界ですが・・・)で話題になっている以上、色物として触っておかないわけには行きません。(なんでさ?)
 一応、正規のArduinoの一種ですし、HDMIやサウンド入出力がないところからすると、Raspberry PiやBeagleBoneと言うよりは、「超速っのArduino」っていう部分を狙っているんだろうなぁ?という気はするので、もしかすると、RPiとBBBとの使い分けもできるかもしれません。

 まずは、Galileo用のArduino IDEをここからDownloadして、展開します。インストールは必要なく、展開してArduino.exeを起動するだけですが、ネットで見た感じだと、フォルダの長さ(階層の深さ)や間にスペースの入ったパス等が問題になるようなので、C:\の直下などに展開しておいたほうが無難なようです。

 で、早速、GalileoボードをACアダプタで起動(ACアダプタより先にUSBコネクタを接続すると壊れるかもってさ!Arduinoとかの代わりにホビーMakerを意識しているボードとは思えないんだけど・・・)して、USBに接続しようとした所、USB CllientのコネクタにマイクロUSBコネクタがささりません。よく見ると、コネクタが潰れてる・・・。化粧箱や運送されてきた箱は綺麗だったので、ボード自体の不良です・・・。まったく・・・。今まで、色々なマイコンボードを沢山購入して、使いましたが、こんな、潰れたUSBコネクタがくっついたのが検品通って出荷されるとか、初めてです。Galileoボードのクオリティの低さっていうか・・・そもそも製品としてダメダメなんじゃないの?感がなんだか心配になってきます・・・。
 送り返して交換してもらえばいいのですが、悪いのはIntelでスイッチサイエンスさんには非はないですし、なによりも、面倒なので、ラジペンで潰れたUSBコネクタを無理やりこじ開けます。



バキメキゴキボキっガリゴリッ!!



 まったく、めんどくさいボードです。で、無理やりUSBコネクタをねじ込んで、電源を入れてもPC側から認識されません。おかしいな?こじり過ぎて、USBコネクタのハンダが剥がれちゃったかな?と色々チェックしていると1分くらいしてから、やっと、「新しいハードウェア・・・、ドライバを・・・」となりました。Galieo側が起動しないとPC(Windowsマシンです)からも認識されないようです。で、ドライバはそのままでは入りません。まあ、これはArduinoでもモデルによってはそうなので、(Galileo専用の)Arduino IDEをダウンロードして解凍しておいたフォルダの「driver」フォルダを指定してドライバーをインストール・・・しようとすると「見つかりません」って言われます。なんでよ?ネットで先人の知恵を借りると、どうも、ドライバは「Arduino(IDEのルートフォルダ)\hardware\arduino\x86\tools」フォルダにある「linux-cdc-acm.inf」のinfoファイルを選択してインストールするらしい。driverフォルダにGalileoってフォルダ作って入れておいてよ・・・。

 もうダメ、ここまでで既にテンションが半分くらいに下がって来てる。

 デバイスマネージャで見ると「Gadget Serial v2.4」のように見えます。



 右クリックして、ドライバの更新で、


 手動でインストールするを選択して、
「Arduino(IDEのルートフォルダ)\hardware\arduino\x86\tools」フォルダを指定します。


 「Galileo」が見つかるので、選択して、インストールします。


 ドライバがインストールされれば、COMポートとして認識されるはずです。


 (専用)Arduino IDE のCOMポートを該当のポートに設定しておきます。

 さて、出回り始めて、まもないGalileoですが、Firmwareは既に何回かUpdateされているようなので、アップデートをはじめに行っておきます。「ヘルプ」→「Firmware Update」で開始されます。


 アップデートは数分かかります。こんな画面が表示されます。


 で、とりあえず、アップデートを終えて、改めて、LAN、ACアダプタをつないで、USBコネクタを接続。1分くらいしてPC側にCOMポートが認識されたところで、まずは、Hello,World!!代わりの定番、Lチカ。サンプルプログラム 「ファイル」→「スケッチの例」→「01Basics」→「Blink」を開いて、COMポートが正しく選択されているのを確認して、書込「→」ボタンを押し、虫眼鏡の「シリアルモニタ」ボタンを押してシリアルコンソールを開くとプログラムが実行されて、ボード上(バッテリ用2Pコネクタの近く)のLEDが点滅しました。



次に、以下の様なスケッチを実行。以下のスケッチは、たとえばこれとか、ネットワーク接続の方法やIPアドレスを調べる方法をGoogle先生に質問すると色々見つかるものを簡素化したものです。


 IPアドレスが分かれば、SSHDが動いているのでSSHログインできます。ログインは root / パスワード無し で可能です。


 ちなみに、Galileo はmicroSDカードスロットがあり、Arduino側からArduino風にmicroSDとして使う他に、こちらから Linux For SD Image をダウンロードして、microSDからの起動も可能です。自分はこちらを使うことにしました。ダウンロードした圧縮ファイルから解凍されたファイル群をFAT32でフォーマットしたmicroSDカードのルートに配置して、カードスロットに挿して電源を入れるだけでOKです。

 この辺りまで、ゴニョゴニョとやったところで、こちらのサイトを発見。「ひとりぶろぐ - Intelのx86 CPU搭載「インテルGalileo開発ボード」をMacで試してみた」が参考になります。

 それでは、GalileoのLinux部分を触ってみたいと思います。前述のサイトと合わせて、こちらのサイトの情報がピン情報などのリファレンスとして非常に有用です。

 ボード上のLEDを光らせてみます。sketchのバイナリファイルがあるとLinux上からの直接IO操作の妨げになる(sketch用のデーモンがIOを掴んでいる)らしいので、/sketch/ 以下にあるファイルを全て rm * してしまい、一旦再起動をかけます。ボード上のLEDはGPIO3につながっているので、

(上図はこちらのものを頂いています。)


 こんな感じで操作すると、

   echo -n "3" > /sys/class/gpio/export
   echo -n  "out" > /sys/class/gpio/gpio3/direction   → 入出力方向
   echo -n "1" > /sys/class/gpio/gpio3/value   → 点灯
   echo -n "0" > /sys/class/gpio/gpio3/value   → 消灯
   echo -n "3" > /sys/class/gpio/unexport   → 解放

ボード上のLEDの点灯・消灯が確認できます。

 次に、上記のコマンドライン操作をpythonのSimpleHTTPServerを使って、ブラウザ上から操作するというのを試します。これは、ひとりぶろぐさんのサンプルをそのままボードのLEDに置き換えたものです。(感謝)

以下、 HelloGalileoLED.py として /home/root/下に配置。

#!/usr/bin/env python

import SimpleHTTPServer
import SocketServer
import os

os.system('/bin/echo -n "3" > /sys/class/gpio/export')
os.system('/bin/echo -n "out" > /sys/class/gpio/gpio3/direction')
os.system('/bin/echo -n "0" > /sys/class/gpio/gpio3/value')

class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/on':
            os.system('/bin/echo -n "1" > /sys/class/gpio/gpio3/value')
            self.path = '/on.html'
        if self.path == '/off':
            os.system('/bin/echo -n "0" > /sys/class/gpio/gpio3/value')
            self.path = '/off.html'
        return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

Handler = MyRequestHandler
server = SocketServer.TCPServer(('0.0.0.0', 8080), Handler)

server.serve_forever()

ブラウザ表示用のHTMLファイルを on.html として /home/root/下に配置。

<html>
<head><title></title></head>
<body>
    <h1>ON
</h1>

</body>
</html>

同様にHTMLファイルを off.html として /home/root/下に配置。

<html>
<head><title></title></head>
<body>
<h1>OFF</h1>
</body>
</html>

/home/root/ で

   python ./HelloGalileoLED.py

として起動します。PCのブラウザから

   http:// GalileoのIPアドレス /on   → LED点灯
   http:// GalileoのIPアドレス /off   → LED消灯

の動作が確認できるはずです。起動したコンソールでCntl+Cでプログラムを停止できますが、gpioの開放処理を入れていないので、手動で

   echo -n "3" > /sys/class/gpio/unexport   → 解放

する必要があります。

 とりあえず、今回はここら辺まで。気が向いたらArduino用シールドやセンサを試してみたいと思います。今回はじめていじってみた感想としては、「ラジペンがないとはじめられないようじゃ、Arduinoの手軽さはないなぁ」というところでしょうか。