コンテンツへスキップ

ラズパイ上で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のバージョンが合わないとすぐエラー!要注意。

参考

教育用ロボットビュートローバーを使用して簡単な制御を行ったので、その方法を紹介します。

前回=>教育用ロボットビュートローバー開発環境構[

ビュートシリーズ用 赤外線センサ(1個) -ROBOT SHOP

目次

  • ライントレースとは
  • 使用する機能の詳細
  • プログラム
  • 雑記
  • 参考

ライントレースとは

ライントレースというのは、その名の通り、「線に追従する」ことで、ロボットに電車のように線の上を走らせます。 自動運転技術の1つとして、高速道路の白線を認識していることもあります。

ライントレースの精度や速さを競う大会がいくつもあります。私が知ってるのはこれとか =>ロボトレース -NIF 共益財団法人ニューテクノロジー振興財団

使用する機能の詳細

  • モータードライブ
  • アナログ入力

モーターのサンプルコード

サンプルコードをダウンロードしてビルドします。(詳細は環境構築編)

VS-WRC003LV-ヴイストン株式会社
電池をいれてスイッチを倒して接続します。すると、前後に動いているのがわかります。モーターを動かす関数は以下の通りです。

Mtr_Run_lv(-20000,20000,0,0,0,0);

左端の値は右モータ、右隣の値は左モータで、正転逆転出力は32767~-32767で調節します。モーターが向かい合わせについているので、左のモータは-にします。 上の関数で信号を与えますが、それは一瞬の事です。走らせるにはそのまま待機させなければいけません。そのための関数が下の関数です。

Wait(1000);

たとえばWait(1)だと、1m秒(=1/1000秒)そのまま待機します。

アナログ入力

光センサとアナログ入力について

ビュートローバーには赤外線距離センサがついてきます。距離センサなので、今回の使用方法は邪道ですね。

受光素子と発光素子が並んでついています。発光素子が発した赤外線が、床を反射して受光素子に入ってきます。このときの光の量で距離を判断しています。(量というのはだいぶアバウトですが。)

ビュートローバーでは、帰ってきた光の量をAdRead関数0~1023までの1024段階(10bit)で入手できます。センサ入力はアナログ(連続)で、それをデジタル(離散)に変換しています。このとき、プルアップという方法をとっているので、センサの感度に対して光が最小以下のとき1023,最大以上のとき0になります。

ちなみにプルアップについて
マイコンにセンサから信号が来ないときはどうなるでしょうか。この時、人間からは何レベルか解りませんし、マイコンに取っては不安定な信号になります。これはマイコンにとってとても良くない状態なので、何も入力されていないときには回路的に1023レベルか0レベルに決定できるようにしたのがプルアップ/プルダウンです。

コード

アナログ入力取得する関数が予め定義されていますので、それを使用します。

 AdRead(1);

入力(引数)はチャンネル(0~7 = 1~8)で、出力(戻り値)はA/D 変換の値(0~1023)です。

試験的にアナログ入力情報を取得してLEDを光らせます。

	while(1){
		
		Rightdata = AdRead(0);
		Leftdata = AdRead(1);
		if(Rightdata< 500){
			LED(1);		//緑のLED点灯
			Wait(500);	//1000msec待つ
		}
		if(Leftdata< 500){
			LED(2);
			Wait(500);		//オレンジのLED点灯
		}
		else{
			LED(0);	
		}
	}
左センサが感知右センサが感知左LEDが点灯右LEDが点灯
OOOO
OXOX
XOXO
XXXX

Border以上: 反射がない/黒=>光る
Border以下: 反射がある/白=>光らない

このボーダーは自分で設定する事が出来ます。 50にすると、センサと床の距離が同じなままで白黒を判別できました。私の手元に青いテープしかなかったのでうまく調整します。

プログラム

ライントレース

機体がラインにまたがり、センサがラインの両端に来るような状況を考えています。

作成したコードです。後半で解説しています。簡単なコードなのでかなり改良の余地があります(^^ゞ
使用するセンサの質や数、配置によってコードが変わってくるでしょうが、今回は製品を使用するので誤差は小さめかと思います。

#ifdef __cplusplus
extern "C" {
void abort(void);
#endif
void main(void);
#ifdef __cplusplus
}
#endif

/*インクルード***********************************************************/
#include<36064s.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "vs-wrc003lv.h"

/*グローバル変数***********************************************************/

int Leftdata;
int Rightdata;
int Borderr = 50;
int Borderl = 55;
/*メイン関数***********************************************************/
void main(void)
{
	//制御周期の設定[単位:Hz 範囲:30.0~]
	const BYTE MainCycle = 60;
	Init((BYTE)MainCycle);		//CPUの初期設定
	
	//ループ
	while(1){
		Rightdata = AdRead(0);
		Leftdata = AdRead(1);
		if(Rightdata > Borderr){
			LED(1);		//緑のLED点灯
			Mtr_Run_lv(-10000,-10000,0,0,0,0);
			Wait(100);	//100msec待つ
		}
		
		if(Leftdata>Borderl){
			LED(2);
			Mtr_Run_lv(10000,10000,0,0,0,0);
			Wait(100);		//オレンジのLED点灯
		}
		else{
			Mtr_Run_lv(0,0,0,0,0,0);//停止
			Wait(100);
			LED(0);	
			Mtr_Run_lv(-10000,10000,0,0,0,0);//前進
			Wait(100);
		}
	}
}

#ifdef __cplusplus
void abort(void)
{
	
}
#endif

アルゴリズム

コードを実行する時、処理は上から順に行われますので、私がやったコードの実行手順は以下のようになっています(たぶん)。

実行手順

これを実行すると、下のように動作すると思います。センサは白に反応するので注意してください。

状態左センサ右センサ機体動作
持つXXLED左右交互に点滅
線の上OOLED消灯、前進
右に脱線OX左朱LED点灯、反時計回り
左に脱線XO右緑LED点灯、時計回り

ライントレースの動作

実際に走らせてみたところ、完走です。 センサのボーダーの値はそれぞれの機体で走らせてみて調整してください。動画は諸事情によりありません。


雑記

紹介したコードの場合、手に持っている時にもモーターが左右交互に回転しようとしますので、効率が悪いです。 また、機体進行方向に対して水平なラインに出会ったときにも、左右交互に回転しようとしてしまい、脱出出来ません。

ロボットで勉強してみようという方がいらっしゃいましたら、コードを改良したりセンサを増やしてみたりして、様々な場合に対応できるように改良してみると楽しいのではないでしょうか。

参考

関連商品紹介

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

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

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

目次

  • マイコンとは
  • 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):続編、あとからビルドのインクルードファイル設定を変更する場合について追記しました。

参考