コンテンツへスキップ

ラズパイ上でruby on Railsをやるのが楽なのでは?と思って環境構築したときに詰まったことを書きます。

IoT的なシステムを作る上で、センサ情報をラズパイが取得し、webアプリへ送信するものを作るならラズパイ上でruby on Railsをやるのが楽なのでは?と思って環境構築したときに詰まったことを書きます。

目次

  • 目的
  • 環境構築
  • 参考

目的

ラズパイ上でRuby on Rails環境を作ります。現在の環境は以下。

  • raspberry pi 3 B +
  • ubuntu MATE

Railsとは

Ruby on RailsはRubyで書かれたwebアプリケーションフレームワークであり、webアプリケーションを他のフレームワークよりも少ないコードでかけるように設計されています。 Model View Controllerアーキテクチャに基づいて構築されています。


Model View Controller
  • model:処理
  • view:画面表示部分
  • controller:modelとviewをつなぐ処理 modelとviewへの命令に変換する

modelとviewの中間処理をcontrollerに書く、というような思想がModel View Controllerです。図はwikipediaを参考にしました。

環境構築

普段通りアップデートを確認した後、以下のコマンドを打っていきます。先にnode.jsをインストールしているのは、これがないとjavascriptがないと怒られるからだそうです。

$sudo apt-get install nodejs 

次に参考で見たのでは以下のようにやっていましたが、rbenv install -listで入れたいバージョンが出てこないエラーが発生しました。

$sudo apt-get install rbenv ruby-build 

理由についていろいろと調べたところ、知人によってsudoでrbenvを入れたせいでroot権限が付与されたのではないかと指摘されますた。 ですので、試行錯誤の結果、gitからcloneでインストールしたら成功しました。APPはお好きな名前に変更してください。

$sudo rm -rf ~/.rbenv
$git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build //続いているので注意
$rbenv install -l 
$rbenv install 2.5.0
$rbenv rehash
$sudo reboot
$gem install bundler
$gem install rails
$ sudo apt-get install libsqlite3-dev
$ sudo reboot
$ mkdir rails
$ cd rails
$ rails new APP —skip-bundle //APPアプリを作成。
$ cd APP

ここで、ラズパイと相性が悪い部分があるので、エラー回避のため、config/boot.rbの以下を削除(コメントアウト)します。

#require ‘bootsnap/setup’

ラズパイの接続状況を調べて、以下のように書きます。右上の有線・無線マークの接続情報から見られます。

$ rails s -b (ラズパイの現在のPIアドレス) -d

これにて成功です。http://(ラズパイのIPアドレス):3000 を開いて確認します。

Railsのhello

成功ではありますが、chromium-driver-helperがサポート終了するらしいので、webdriberに移行して欲しいというメッセージが現れます。

+--------------------------------------------------------------------+
 |                                                                    |
 |  NOTICE: chromedriver-helper is deprecated after 2019-03-31.       |
 |                                                                    |
 |  Please update to use the 'webdrivers' gem instead.                |
 |  See https://github.com/flavorjones/chromedriver-helper/issues/83  |
 |                                                                    |
 +--------------------------------------------------------------------+

rails/Gemfileを以下のように変更して、

group :test do
 # Adds support for Capybara system testing and selenium driver
 gem 'capybara', '>= 2.15'
 gem 'selenium-webdriver'
 # Easy installation and use of chromedriver to run system tests with Chrome
 gem 'chromedriver-helper' => gem 'webdrivers'  //ここ
end
$bundle install

同様にサーバーを立てて動作を確認しましょう。 アプリケーションを作るたびにこの設定をした方がいいと思います。このときもconfig/boot.rbの設定変更を忘れずに。

雑記

以前windowsに入れたときにめちゃくちゃ大変だった記憶があります。rubyのバージョンが合わないとすぐエラー!要注意。

参考

これからマイコンを使ってプログラミングの勉強を使用という方へ向けて、

プログラミング教育用ロボットのビュートローバーの開発環境構築とサンプルコードの実行までを、参考本に沿いつつ、(古い本なので)変更点などを書いていきます。

追記: つづき=>教育用ロボットビュートローバーで簡単制御:ライントレース

目次

  • マイコンとは
  • H8マイコンとビュートローバー
  • 組み立て
  • 環境構築
  • LED点滅
  • 雑記
  • 参考

マイコンとは

そもそもマイコンとは、マイクロコンピュータ、つまり小型計算機のことです。かつてはマイコンコンピュータを指していたそうですが、最近はPICマイコンのような部品を指すことが多いと思います。

家電製品を分解してみると回路が入っていますが、その中の計算処理をする部分です。こんな感じの物です。

手元にあったPICマイコン

これにプログラムを書き込んで、LEDを点滅させてリモコンにしたり、モーターに電気を流してタイヤを回したりするというわけです。

私聞いたことがあるのはPIC、LPC、R8C、H8ですが、他にも様々なものが販売されています。これにプログラムを書き込んでいくと、自立的に走行させたりできます。

H8マイコンとビュートローバー

ビュートローバーは専用ソフトウェアでフォーチャートから比較器簡単にプログラミングを学べる教育用ロボットです。統合開発環境HEWを使用することでC言語で開発することもできます。

プログラミング教育用ロボット ビュートローバー H8 [学習教材] [vstone]

プログラミング教材 ビュートローバーARM ビュートローバーH8 -ヴイストン株式会社

搭載されているのはH8/36064G搭載のVS-WRC003LVです。

組み立て

箱の中身

組み立てマニュアルに沿って組み立てます。

この時点で電池を入れると、前後左右に動きます。持ち上げると音が鳴り、その状態で左右のセンサを覆ってみて対応するLEDが点滅します。

ギアボックス

うまく動作しなかったら組み立てに失敗しているので確認しましょう。配線やモーターのギアに注意です。

完成!(左側が前)

環境構築

環境構築の前に

プログラムを書き込んでマイコンを動かすわけですが、C言語というプログラミング言語で命令する場合、一度機械語に翻訳する必要があります。

たとえば2+3=5をする場合、人間は「2+3」と書けば「5」と答えますし、C言語でもそのように書きます。一方、機械は以下のような計算をしています(機械語にかなり近い言語であるアセンブリ言語のイメージ)。

計算のイメージ

A ← 0    Aに初期値0を入れます
A ← A + (79) Aに79番地の値を加えます
A ← A + (80) Aに80番地の値を加えます
(81) ← A   81番地にAのもつ値を入れます

アセンブリ言語では ADD (M) がA ← A + (M)です。計算そのものは回路的に行えます。数値は16進数です。また、加算命令もとある番地に入っていて加算したり値を移動したりするたびに番地を指定して呼び出して...という感じに計算していきます。

ただ、最近一般的に使われているPCやラズパイは計算能力が高いのでこんなめんどうな部分は意識する必要がありません。マイコンは計算能力が低いので、プログラムを作る私たちはこのような部分を知っておくと便利です。宇宙開発のような機械を小さくしたい時や省消費電力化したいとき、あるいは簡単なロボットが作りたいときや教育等にマイコンを使用します。

統合開発環境HEW

統合開発環境とはC/C++によるプログラム作成に必要なソフトウェアが全部入っているソフトウェアのことです。

C言語などを機械語に変換してくれるソフトウェアをコンパイラといいます。機械語はハードウェアごとに違うので、マイコンにあったコンパイラをインストールしなければいけません。

【無償評価版】H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V.7.00 Release 00 -RENESASのページの無償評価版のものを選択します。 ([無償評価版]H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージv.700 Release 00)

ログインしてh8v7000_ev.exeをダウンロードして実行し、推奨設定でインストールします。

HEW

Flash Development Toolkit

フラッシュ開発ツールキットとはフラッシュメモリに対して書き込みを行うためのソフトウェアです。

フラッシュ開発ツールキット Flash Development Toolkit (Programming GUI)の最新版(【無償評価版】フラッシュ開発ツールキット V.4.09 Release 03)をインストールします。

特に変更なしでインストールします。言語だけAsia(japanese)にします。

H8 Writer

書き込み用ツールをインストールします。同じくVS-WRC003LV-ヴイストン株式会社からインストールします。

モニタプログラム

H8/300H、H8/300H Tinyシリーズ用サンプルプログラム -Renesasから、HEW3,HEW4(C/C++ Compiler Ver. 6.0)対応版 H8/300H Tiny用 モニタプログラムをダウンロードします。

デフォルトの設定ならC:\300tに保存されるので、そのフォルダのmonitor.hwsをクリックしてHEWを起動します。何か言われたら「はい」でHEWをアップデートします。

モニタプログラムの設定

ユーザ・イニシャライズ・モジュールを設定します。monitor.cを以下のように設定します。

/************************************************************************/
/*      H8/300H Monitor Program (Normal Mode)           Ver. 2.0B       */
/*              Copyright (C) 2003 Renesas Technology Corp.             */
/************************************************************************/
#include "36064s.h"                              /*変更                 */
#pragma global_register(monitor=R5)             /* Return Address       */
void (*monitor)(void);                          /*                      */
/************************************************************************/
/*      User Initialize Module                                          */
/*              Input   R5  <-- Return Address                          */
/*              Output  Nothing                                         */
/*              Used Stack Area --> 0(0) Byte                           */
/************************************************************************/
#pragma noregsave(INITIALIZE)                   /* Non Register Save    */
void INITIALIZE(void)                           /*                      */
{ 
  WDT.TCSRWD.BYTE=0x92;                         /* 追加分               */
  WDT.TCSRWD.BYTE=0x92;				/* 追加分    			*/
  monitor();                                    /* Goto Monitor Program */
}      

マイコンにはウォッチドックタイマと呼ばれるマイコンの暴走を検知する機能が備わっています。モニタを使用する場合これは邪魔なので、機能を停止させるためのコードを追加しました。H8/36064が搭載されているので、マイコンの種類を指定するために36064s.hに変更します。

リンケージ・サブコンド・ファイルを以下のようにカスタマイズします。 monitor.subを以下のように変更します。

INPUT      NORMAL,MONITOR
LIST       MONITOR.MAP
SHOW       SYMBOL
OUTPUT     MONITOR.MOT
FORM       STYPE
CHANGE     INFORMATION=1320
NOOPTIMIZE
LIBRARY    NORMAL,36064
LIBRARY    MONITOR
DEFINE     $BRR=17
DEFINE     $STACK=FF00
START      VECTOR/0,ROM/100,RAM/F780,USER/F840,SCI/FFA8

変更したのは8行目と10行目です。8行目はマイコンの指定、10行目に通信速度を指定します。参考書p.230に記載されています。

書き換えたらメニューバーからビルドします。ビルドとは、マイコンが実行可能なプログラムに変換することです。ビルドは多少時間がかかりますのでのんびり待ちます。下記のように出たらが完了です。

Build Finished
0 Errors, 0 Warnings

モニタプログラムの書き込み

マイコンのスイッチを押したまま電源を入れると書き込みモードで起動します。 デバイスマネージャーなど(windws10ならスタートを押した後そのままデバイスマネージャーなどと打って検索)でどのポートにつながっているか確認します。USBコネクタを抜き差ししながら確認してください。この場合はCOM3なのでポート3でした。

デバイスマネージャー

H8 Writerを起動して、C:300t\moniter\Release\MONITOR.MOT、COM3を指定して書き込みを行います。

H8 Writer

本との差異について

モニタプログラム専用通信ソフトHtermは配布が終了していたので、参考本に記載されているシリアルコンバータVS-WRC003LV とHtermはインストールしませんでした。

サンプルプログラムのテスト走行

VS-WRC003LV -ヴイストン株式会社からサンプルプログラムをダウンロードできます。zipファイルを解凍し、ドキュメントなど好きなフォルダに張り付けてください。 HEWを起動し、ワークスぺースを開くから先ほど保存したフォルダの中からhwsファイルを開きます。バージョンが異なる場合何か聞かれますが、すべて「OK」です。

サンプルプログラムを開く

メニューバーのビルドから一番上の[H8S,H8/300 Standard Toolchain..]を選択してコンパイラ、リンカなどを設定します。

相対パスはCustom directory、ディレクトリに各 CPU 用のインクルードファイルがあるiodefine フォルダのパスを設定し、OKを押します。このサブディレクトリは各自のPCで必ず確認してください。私の場合はC:\Program Files (x86)\Renesas\Hew\System\Pg\Renesas\H8\H8_7_0\Generate\iodefineを指定しました。

(追記)あとからビルドのインクルードファイル設定を変更する場合

ビルド→RX Standard Toolchain→コンパイラタブ→オプション項目(S)からインクルードファイルディレクトリを選択(Custom directoryから、iodefineを指定。私はC:\Program Files (x86)\Renesas\Hew\System\Pg\Renesas\H8\H8_7_0\Generate\iodefine)→追加ボタン

wirter \WRC003LV_SampleProject_MOTOR_20100826_0926\FILES\Debugの中の.motを開きます

参考

LED点滅

ビルドからすべてをビルドします。pdfの通りにやるとデバックの体験のために必ずerrorを吐きます。 36064S.hの一行目を削除します。保存してすべてをビルド。このとき、保存が拒否されることがありますが、その場合はHEWの起動を右クリック/その他から管理者権限で行ってください。0 Errors, 0 Warningsと出ればOKです。

1: void main(void)
2: {
3:   //制御周期の設定[単位:Hz 範囲:30.0~]
4:   const BYTE MainCycle = 60;
5:
6:   Init((BYTE)MainCycle); //CPU の初期設定
7:   //I2C_init(void); //IXBUS 初期化
8:
9:   //ループ
10:   while(1){
11:     LED(1); //緑の LED 点灯
12:     Wait(1000); //1000msec 待つ
13:     LED(2); //オレンジの LED 点灯
14:     Wait(1000); //1000msec 待つ
15:   }
16: }

VS-WRC003LV -ヴイストン株式会社のページで配布されているLED点滅サンプルコードより引用。

再びH8 Writerを起動して今ビルドしたファイルを (C:\Users\user\Documents\HEW\WRC003LV_SampleProject_LED_20100826_0926\LED\Debug\LED.motなど)を指定します。すると、マイコンのLEDが交互に点滅します。wait関数の引数を1000から500に帰ると点滅が早くなります。

書き込み

雑記

使っているのはDCモーターなので動かすのは簡単そうです。来週やってみようと思います。今後これを使ってなにをしようかな。センサを増やしてフィードバック制御出来たらうれしいですね。

追記(2019/4/22):続編、あとからビルドのインクルードファイル設定を変更する場合について追記しました。

参考