目次


Arduino と Rails を使用して Bluemix 上で IoT アプリケーションを開発する

Comments

はじめに

このチュートリアルでは、モノのインターネット (IoT: Internet of Things) に適用できるテクノロジーを使用するアプリケーションの開発方法を紹介します。このチュートリアルで開発するサンプル・アプリケーションは、加速度計からデータを収集して Web サーバーに保管し、それらのデータを加速度計の読み取り結果として即座に Web ページに表示するというものです。

アプリケーションを作成するために必要となるもの

パート 1 には、以下のものが必要です。

  • IBM Bluemix アカウント
  • Ruby 1.8.7 ~ 2.0.0 のいずれかのバージョン (Bluemix でサポートされているバージョン)
  • Rails フレームワーク 3.2.13 (Bluemix と ibm_db gem でサポートされているバージョン)
  • ibm_db gem

パート 2 には、以下のものが必要です。

Python および Ruby on Rails に関する知識が必要ですが、絶対に必要というわけではありません。また、Arduino や他の種類のマイクロコントローラー・ボードを使用した経験がないとしても、このチュートリアルで説明する内容を理解することはできます。

アプリを実行するコードを入手する

アプリケーションの開発

チュートリアルのこのパートでは、データを収集、保管、分析するために必要なソフトウェア・コンポーネントについて説明します。

ステップ 1. Rails アプリケーションを作成する

  1. 私たちはまず、ローカル・コンピューター上で Rails アプリケーションを作成しました。コマンド・プロンプトから、$ rails new AnalyzeVibration を実行します (ここで、AnalyzeVibration はこのアプリケーションの名前です)。これにより、この名前の新規アプリケーション・フォルダーがカレント・ディレクトリーに作成されます。
  2. このサンプル・アプリケーションには、以下の MVC パーツが必要です。
    • モデル: 読み取り
    • ビュー: index (pages 内)
    • コントローラー: ページ、読み取り値、サーバー・リクエスト

    この MVC アーキテクチャーを生成するには、以下のコマンドを実行します。

                $ cd AnalyzeVibration
                $ rails generate model Reading
                $ rails generate controller Pages
                $ rails generate controller Readings
                $ rails generate controller ServerRequests

    以下のファイルが生成されます。

    controllers ディレクトリーに生成されるファイルのスクリーンショット
    controllers ディレクトリーに生成されるファイルのスクリーンショット
    models ディレクトリーに生成されるファイルのスクリーンショット
    models ディレクトリーに生成されるファイルのスクリーンショット
    views ディレクトリーに生成されるディレクトリーのスクリーンショット
    views ディレクトリーに生成されるディレクトリーのスクリーンショット
    migrate ディレクトリーに生成されるファイルのスクリーンショット
    migrate ディレクトリーに生成されるファイルのスクリーンショット
  3. 次にマイグレーション・ファイルを編集して、データベース内のテーブルを作成するときに使用する、サンプル・モデルのフィールドを作成します。
                class CreateReadings < ActiveRecord::Migration
    # axis_x - Measurement of Axis X from Accelerometer
    # axis_y - Measurement of Axis Y from Accelerometer
    # axis_z - Measurement of Axis Z from Accelerometer
    def change
    create_table :readings do |t|
    t.float :axis_x
    t.float :axis_y
    t.float :axis_z
    t.timestamps

    end
    end
    end
  4. マイグレーション・ファイルを編集したら、コマンド $ rake db:migrate を実行して開発データベース内にテーブルを作成します。私たちのローカル開発環境で使用しているデータベースは、デフォルトで Rails に組み込まれている SQLite データベースです。
  5. コマンド $ rails s を実行してサーバーを起動します。実行中のアプリケーションを確認するには、ブラウザーを開き、http://localhost:3000 にアクセスします。サーバーを停止するには、ターミナル・ウィンドウで Ctrl+C を実行します。
  6. Pages コントローラー (pages_controller.rb) を使用してコントローラーを編集します。このコントローラーは、アプリケーションのホーム・ページをレンダリングします。
                    class PagesController < ApplicationController
    def index

    end
    end
  7. ServerRequests コントローラー (server_requests_controller.rb) は、Arduino によって収集された読み取り値 (x 軸、y 軸、z 軸) が含まれる POST リクエストを受信して、それらの読み取り値をデータベースに保存します。
                class ServerRequestsController <
                    ApplicationController
    def server_post
    if params[:reading].present? && !params[:reading].nil?
    readings = params[:reading]
    readings = readings.split(",")

    readings.each { |e|
    axis = e.split(" ").map{|t| t.to_f}
    new_reading = Reading.new
    new_reading.axis_x = axis[0]
    new_reading.axis_y = axis[1]
    new_reading.axis_z = axis[2]
    new_reading.save

    }
    end

    render nothing: true
    end
    end
  8. Readings コントローラー (readings_controller.rb) は、データベース内に保管されている加速度計の読み取り値のうち、決められた数の読み取り値を格納した JSON 文書を返します。このデータは、Google Charts API で許容されるフォーマットで生成されます。
                    class ReadingsController < ApplicationController
    def getreadings
    axis = params[:axis]
    number = params[:number].to_i

    if axis == "x"
    readings = Hash[*Reading.last(number).collect{|it| [it.id, it.axis_x]}.flatten]
    elsif axis == "y"
    readings = Hash[*Reading.last(number).collect{|it| [it.id, it.axis_y]}.flatten]
    elsif axis == "z"
    readings = Hash[*Reading.last(number).collect{|it| [it.id, it.axis_z]}.flatten]
    end

    part1 = '{ "cols":[ {"id":"","label":"","pattern":"","type":"string"},
    {"id":"","label":"Measurement","pattern":"","type":"number"}], "rows":['
    part2 = readings.map{|k,v| '{"c":[{"v":"Id-' + k.to_s + '"},{"v":"' + v.to_s + '"}]}' }.join(',')
    part3 = ']}'
    readings_google_charts_format = part1 + part2 + part3
    @readings_json = JSON.parse(readings_google_charts_format)

    render json: @readings_json

    end
    end
  9. index ビューを作成するために、app/views/pages/ ディレクトリーに index.html.erb という名前のファイルを作成します。このビューに、ホーム・ページの HTML コードを含めることになります。
                    <div id="main">
    <section class="sectionleft">
    <h2>X-Axis Measurements</h2>
    <div id="x_readings_chart" class="readings_chart"></div>
    <h2>Y-Axis Measurements</h2>
    <div id="y_readings_chart" class="readings_chart"></div>
    <h2>Z-Axis Measurements</h2>
    <div id="z_readings_chart" class="readings_chart"></div>
    </section>

    <section class="sectionright">
    </section>

    </div>
  10. ホーム・ページを変更してルートを作成するために、config/routes.rb ファイルを編集して以下のコードを追加します。
                root :to => "pages#index"

    match '/server_post', :to => 'server_requests#server_post', :via => 'post'
    match '/getreadings/:axis/:number', :to => 'readings#getreadings', :via => 'get'

    アプリケーションのディレクトリー (AnalyzeVibration) 内の public/ にアクセスし、index.html ファイルを別の名前 (例えば、index2.html) に変更します。

    名前が変更された index ファイルが含まれる public ディレクトリーのスクリーンショット
  11. アプリケーションにアセット (CSS ファイルと JavaScript ファイル) を追加します。リポジトリーからすべてのコード・ファイル (layout.css.scss、pages.css.scss、charts.js、application.js など) をコピーすることをお勧めします。 アプリケーションに追加するアセットが含まれるディレクトリーのスクリーンショット
    アプリケーションに追加するアセットが含まれるディレクトリーのスクリーンショット

    例えば charts.js ファイルは、データベースに保管されている加速度計の読み取り値を使用して Google Charts のレンダリングを行います。

ステップ 2. Bluemix 環境を準備する

  1. Bluemix 上にアプリケーションを作成します。Bluemix アカウントにログインしたら、「Dashboard (ダッシュボード)」 > 「Applications (アプリケーション)」の順にアクセスして、「Create an app (アプリケーションを作成)」をクリックしてください。
  2. 「Runtime (ランタイム)」カテゴリーから Ruby on Rails ランタイムを選択し、名前を入力して (ホスト名は一意でなければなりません) 「CREATE (作成)」をクリックします。この例でのアプリケーション名は、myrailsapplication です。 ランタイムを選択する画面のスクリーンショット
    ランタイムを選択する画面のスクリーンショット

    作成されたアプリケーションには、(アプリケーションの起動後に) Bluemix から提供される URL リンクを通じてアクセスすることができます。アプリケーションが起動するまで待ってから、サービスを追加してください。これは、データベース・サービスの作成 (およびバインド) 中にエラーが発生しないようにするためです。

  3. データベース・サービスを作成するために、「Dashboard (ダッシュボード)」 > 「Applications (アプリケーション)」の順にアクセスして、「Add a service (サービスを追加)」をクリックします。
  4. 「Database Management (データベース管理)」カテゴリーで、「SQL Database Service (SQL データベース・サービス)」をクリックします。作成した Rails アプリケーションにこのサービスを関連付けるために、「App (アプリケーション)」フィールドでは、このアプリケーションの名前 (myrailsapplication) を選択し、「Name (名前)」にはサービスの名前を入力して (この例では「mydatabaseservice」という名前にしました) 「CREATE (作成)」をクリックします。 データベース・サービスを追加する画面のスクリーンキャプチャー
    データベース・サービスを追加する画面のスクリーンキャプチャー

    これで、Bluemix 環境で Analyze Vibration アプリケーションをデプロイする準備ができました。

ステップ 3. アプリケーションをデプロイ可能な状態に準備する (ローカル・アプリケーション)

  1. ibm_db アダプターをインストールしましょう。この例では Bluemix 上の (IBM DB2 で動作する) SQL Database サービスを利用することから、アプリケーションをデータベースに接続できるようにするためのライブラリー (Ruby gem) をインストールしなければなりません。それには、gemfile に gem 'ibm_db' という行を追加します。sqlite3 は使用しないので、gem 'sqlite3' という行はコメントアウトします。また、Ruby のバージョンを指定するために、使用するバージョンを設定した行を追加します (例: ruby '1.9.3')。 ibm_db アダプターをインストールするために準備した gemfile の中身のスクリーンショット
    ibm_db アダプターをインストールするために準備した gemfile の中身のスクリーンショット
  2. $ bundle install を実行して gem アダプターをインストールします。

    : ibm_db gem をインストールした後は、DB2 をローカル・コンピューターにインストールしないと、ローカル・ホストでアプリケーションをテストすることはできません。また、Rails アプリケーションをデプロイする際の重要なステップは、データベースに接続するように database.yml ファイルを設定することです。ただし、Bluemix にアプリケーションをデプロイするために使用するビルドパックにより、このファイルが再作成され、自動的に接続が確立されます。

  3. ここで、本番環境の設定を変更してみましょう。config/environments/production.rb にアクセスし、アセットに関連する config.serve_static_assets および config.assets.compile という2 つの構成パラメーターを true に設定します。 production.rb の設定の変更を示す画面のスクリーンショット
    production.rb の設定の変更を示す画面のスクリーンショット
  4. manifest.yml ファイルを、Rails によって作成されたアプリケーション (この例では、AnalyzeVibration) のメイン・パスに追加 (リポジトリーからコピー) します。 コピーする manifest.yml を示す画面のスクリーンショット
    コピーする manifest.yml を示す画面のスクリーンショット

    アプリケーションをデプロイするときに使用されるこのファイルには、サービス、ビルドパック、メモリーなど、アプリケーションに関する情報が格納されています。

  5. 追加したファイルを編集して、前に作成したアプリケーションとサービスに関する情報を追加します。 ファイルの編集内容を示す画面のスクリーンショット
    ファイルの編集内容を示す画面のスクリーンショット

    Bluemix 内の基本 Ruby ランタイムには、SQL Database サービスにアクセスするために必要な DB2 ドライバーがプリインストールされていません。そこで代わりに利用できるのが、GitHub.com でホストされているカスタム・ビルドパックです。

    同じファイル (manifest.yml) 内に、disk_quota、インスタンス数、メモリーなども指定することができます。

    これで、アプリケーションはデプロイ可能な状態になりました。

ステップ 4. アプリケーションを Bluemix にデプロイする

アプリケーションをデプロイするには、その前に Cloud Foundry コマンド・ライン・インターフェース (CLI) をインストールする必要があります。

  1. コマンド・プロンプトを開き、アプリケーションのディレクトリー (AnalyzeVibration) にアクセスして、以下の cf コマンドを実行します。
    1. Bluemix に接続するためのコマンド: $ cf api https://api.ng.bluemix.net
    2. Bluemix にログインするためのコマンド (要求に応じて e-メールとパスワードを入力してください): $ cf login
    3. マイグレーションを実行するためのコマンド: $ cf push <appname> -c "bundle exec rake db:migrate"

      cf push コマンドは、アプリケーションを Bluemix サーバーにプッシュして、マイグレーションを実行 (データベース内にテーブルを作成) します。続いてアプリケーションを実行し、サーバーへの接続を試行します。ただし、この時点ではまだ Bluemix アプリケーションを起動していないため、この後半の部分は失敗するはずです。したがって、この処理をキャンセルしても構いません。

      ヒント: cf ツールを使用してアプリケーションをデプロイする際に、別のコマンド・プロンプトを開き、$ cf logs <appname> を実行してログを追跡してください。

  2. アプリケーションをもう一度プッシュし、$ cf push <appname> -c "null" を実行して起動します。cf ツールは最後に渡されたコマンドを保管するため、上記のコマンドはアプリケーションをプッシュし、"null" によって最後に実行したコマンドをクリアした後、ビルドパックのデフォルト・コマンドを使用してサーバーを起動します。

おめでとうございます!現時点で、Rails アプリケーションは Bluemix 上で実行中になっているはずです。

デバイスの構築

チュートリアルのこのパートでは、目的のデータを生成するデバイスを作成するために必要なハードウェア・コンポーネントについて説明します。

ステップ 1. ハードウェアをセットアップする

このセクションでは、Arduino、加速度計、およびイーサネット・シールドを扱う方法を説明します。これから構築するデバイスによって、前のパートで作成した Rails アプリケーションに送信するデータを生成します。

  1. イーサネット・シールドを Arduino に接続します。
  2. 加速度計をイーサネット・シールドの適切なピンに接続します (下の画像を参照)。 加速度計をイーサネット・シールドのピンに接続する方法を示す画像
    加速度計をイーサネット・シールドのピンに接続する方法を示す画像

イーサネット・シールドを持っていないとしても、心配することはありません。Arduino を USB ケーブルでコンピューターに接続すれば、Arduino から Web サーバーにデータを送信することができます。その場合のプロセスは、この後のステップで詳しく説明します。

ステップ 2. 加速度計をテストする

ハードウェアのセットアップが完了したら、サンプル・コードが問題なく機能することを確認するために、いくつかのライブラリーを Arduino 環境にインストールする必要があります。必要なファイルは、I2Cdev ライブラリーにあります。i2cdevlib をダウンロードして解凍した後、以下の手順に従って、必要なライブラリーを Arduino IDE にインストールしてください。

  1. 「Sketch (スケッチ)」 > 「Import Library (ライブラリーのインポート)」 > 「Add Library (ライブラリーの追加)」の順に選択します。
  2. 解凍したフォルダー内の Arduino/MPU6050 フォルダーを選択します。
  3. Arduino/I2Cdev フォルダーについても、同じプロセスを繰り返します。

これですべてのライブラリーが揃ったら、サンプル・アプリケーションを実行して、加速度計が正常に機能していることを検証する必要があります。サンプル・アプリケーションをロードするには、「File (ファイル)」 > 「Examples (サンプル)」 > 「MPU6050」 > 「Examples (サンプル)」 > 「MPU6050_raw」の順に選択します。そして、すべてが順調に進んでいることをテストするために、コードをアップロードして、シリアル・モニターを開きます。

現時点でのアプリケーションをテストする画面のスクリーンショット
現時点でのアプリケーションをテストする画面のスクリーンショット

以下のような出力が表示されたら、加速度計は完璧に機能しています。おめでとうございます!

加速度計が正常に機能していることを示す画面のスクリーンショット
加速度計が正常に機能していることを示す画面のスクリーンショット

: サンプル・アプリケーションでのボー・レートは、デフォルトで 38400 に設定されます。奇妙な文字が画面に表示されているとしたら、コードに記載しているのと同じボー・レートでシリアル・モニターが動作していることを確認してください。

ステップ 3. Python を使用して USB 経由で加速度データを収集する

Arduino 用のイーサネット・シールドを持っていない場合 (あるいは、すぐに利用できるイーサネット・ケーブルがない場合は)、USB で Arduino を PC に接続し、Python で作成された単純なコードを使用して、収集されたデータを Web サーバーに送信することができます。

まず、Arduino の出力を Python コードで読み取れることを確認します。それには、いくつかの初期化メッセージを削除して、タブをスペースに変更する必要がありますが、これらの変更は元のコードに対するほんのわずかな調整です。

ダウンロードするファイルを示すスクリーンショット
ダウンロードするファイルを示すスクリーンショット

次に、シリアル接続をテストしましょう。テストでは、Arduino から送信されたデータを読み取り、ターミナル・ウィンドウにそのデータを表示します。それには、pySerial モジュールをインストールする必要があります。pip がインストールされているとしたら、pySerial モジュールをインストールするのは至って簡単なはずです。コマンド $ pip install pyserial を実行するだけでインストールすることができます。

pip のことを知らないとしても (あるいは pip がインストールされていない場合でも)、安心してください。「Python & OS Support」の指示に従って、2 分足らずでインストールすることができます。

pySerial がインストールされたら、リポジトリーのコードを取得することができます。

取得するソースコード・ファイルを示すスクリーンショット
取得するソースコード・ファイルを示すスクリーンショット

Arduino が接続されている正しいシリアル・ポートを設定します。どのポートに接続されているか確信が持てない場合は、テスト対象として複数のポートを定義しても構いません。

テストするポートを定義するコードのスクリーンショット
テストするポートを定義するコードのスクリーンショット

いよいよコードを実行します!コードを実行すると、以下のような出力が表示されるはずです。

コード実行時の出力のスクリーンショット
コード実行時の出力のスクリーンショット

ステップ 4. HTTP リクエストを使用して、収集したデータを送信する

データを収集して表示したら、今度はさらに有用なことを行います。そこで、収集したデータを、前に作成した Web サーバーに送信してみましょう。それにはまず、$ pip install httplib コマンドを実行して別の Python ライブラリーをインストールします。これにより、収集したデータを HTTP リクエストで送信することが可能になります。それでは以下の手順に従って、目的のデータを送信するように既存のコードを微調整してみましょう。

  1. インポートされたモジュールに httplib を追加して、以下に示す sendRequest 関数を作成します。ここに示されている URL (myapp.mybluemix.net) は、必ずご自分のアプリケーション用の URL に変更してください。 myapp.mybluemix.net の変更内容を示す画面のスクリーンショット
    myapp.mybluemix.net の変更内容を示す画面のスクリーンショット
  2. データをターミナル・ウィンドウに出力せずに、Web サーバーにデータを送信するので、以下に示す行を変更します。 Web サーバーにデータを送信するコードを示す画面のスクリーンショット
    Web サーバーにデータを送信するコードを示す画面のスクリーンショット

    上記の行を以下のように変更します。

    変更後のコードを示す画面のスクリーンショット
    変更後のコードを示す画面のスクリーンショット

変更後のコードも、ここにあります。

変更後のコードが含まれるファイルの場所を示す画面のスクリーンショット
変更後のコードが含まれるファイルの場所を示す画面のスクリーンショット

イーサネット・シールドとイーサネット・ケーブルがある場合、Arduino から直接 HTTP リクエストを送信することができます。それには、以下のコードを使用します。

イーサネットを使用するコードが含まれるファイルの場所を示す画面のスクリーンショット
イーサネットを使用するコードが含まれるファイルの場所を示す画面のスクリーンショット

このコードを Arduino で実行するには、コードをアップロードして、Arduino にイーサネット・ケーブルを接続します。

: 忘れずに、Web サーバー・アドレス (myapp.mybluemix.net) をご自分のアプリケーションの URL に変更してください。

まとめ

このチュートリアルでは、さまざまな IoT アプリケーションを作成する上で使用可能なフレームワークを提供しており、ここでは加速度計を Arduino に接続して使用し、加速度データを Web サーバーに送信して即座に表示しました。このチュートリアルで紹介したのは、Bluemix と Arduino を使用して実現できる内容の具体例の 1 つですが、その原則は、他の多くのアプリケーションを作成する際に適用することができます。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management, Cloud computing
ArticleID=987200
ArticleTitle=Arduino と Rails を使用して Bluemix 上で IoT アプリケーションを開発する
publish-date=10302014