まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:raspberrypi

先日の Maker Fair Tokyo 2017 でラズパイ用の小型 TFT モニタを購入しました:


Raspberry Pi2 / Pi3用タッチスクリーンTFTモニタセット(3.5インチ)



ラズパイ用のモニタにはメーカーやサイズで色々な種類がありますが、僕が購入したのは Physical Computing Lab という会社から提供されている、3.5 インチモニタ(上図)でした。


ラズパイの用途にもよるとは思うのですが、自分の場合はある程度のセットアップをした後は「リモートからアクセスして開発環境として使う」ことが多いです。それができる環境が1万円弱で揃うってすごい時代になったものです。

なお、今までにラズパイで色々やってきた記録はこちらを参照ください:
http://dotnsf.blog.jp/tag/raspberrypi


さてラズパイに直付けモニタは必要か?というと、上でも触れましたが「ある程度のセットアップが済んでいれば」必要ないと思っています。ラズパイが起動して、ネットワークに繋がっていて、IP アドレスが分かっていればリモートから SSH や VNC などでログインして使えばいいわけです。

問題になるのは「ある程度のセットアップを済ます前」です。例えばラズパイが起動して、ネットワークに接続されていても、その IP アドレスがわからないと外部からは接続できません。(MAC アドレス等を使って)外部から IP アドレスを調べる方法がないわけではないのですが、手っ取り早いのは HDMI ケーブルとキーボード&マウスを繋げて、画面で確認する方法です。つまり「モニターが必要なくなる段階になるまでにはキーボードだけでなく、HDMI モニタとケーブルが必要」なのです。キーボードはともかく、モニターを持ち歩くのは厳しい。このジレンマをなんとかしたくて、ラズパイ一体型の小型モニタを購入してみました。

やりたいことは上記のようにセットアップの最終段階、つまり「起動後の IP アドレスの確認」です。この目的のためであれば Window システムを使った GUI である必要はなく(むしろ画面が小さくて使いにくいので GUI でないほうがよく)、CUI(キャラクター端末インターフェース)で起動できれば充分です。というわけで、あまり事例のないキャラクター端末としての小型モニタ利用の手順を、(あらかじめ用意された OS イメージではなく)自分の利用中の Raspbian 環境で使う前提でまとめました。


まず普通にラズパイをセットアップします。使っているイメージは Raspbian Jessie の最新版で、マイクロ SD カードも自分で用意したもので構いません。この時点で HDMI を使っていてもいなくても構いません(IP アドレスが固定なら SSH でも構いません)。また TFT モニタはこの時点でラズパイに取り付けておきます(まだ何も写りません)。

まずラズパイでも他のシステムでも構いませんが、以下のページにアクセスして画面下のほうにある「ドライバー一式」という所で、最新版ドライバーのファイル名を確認してください。2017/Aug/08 時点では LCD-show-160811.tar.gz が最新でした:
http://store.techshare.jp/html/page147.html

2017080801


このファイルをモニタをセットアップしたいラズパイにダウンロードします。あらためてラズパイにログインし、以下のコマンドを実行してドライバーをダウンロードします(ファイル名は上記で確認した最新版ファイルの名前を指定してください、GUI であればブラウザから直接ダウンロードも可能です):
$ wget http://techshare.co.jp/raspiosimage/LCD-show-160811.tar.gz

ダウンロードが完了したらファイルを展開します:
$ tar xzvf LCD-show-160811.tar.gz

LCD-show というフォルダが作られ、その中にドライバファイル一式が入ります。最終的な目標は「キャラクター端末としてモニタを利用する」ことなので、まずこの時点でラズパイを CUI モードに変更します(GUI でモニタを使いたい場合はこの時点でラズパイを GUI モードに変更します)。画面モードを切り替える場合は raspi-config コマンドで変更します:
$ sudo raspi-config

最初にメニュー3番目の "Boot Options" を選択します:
2017080801


次の画面で一番上の "Desktop / CLI" を選択します:
2017080802


次の画面で変更したいモードを選択します。今回は CUI モードで、ログインプロンプトを出した状態で起動したいので、一番上の "Console" を選択します(変更した場合はここでラズパイを再起動します):
2017080803



再起動後、改めてラズパイにログインし、ダウンロードしたドライバを読み込ませた状態で HDMI モードで再起動します(LCD-hdmi コマンド実行後に自動的に再起動します):
$ cd LCD-show
$ sudo ./LCD-hdmi

何度か再起動を繰り返してここまできました。最後にラズパイを TFT モニタモードに切り替えます。改めてラズパイにログイン後、モニタのサイズに合わせて LCDxx-show コマンドを実行します(以下の例は 3.5 インチモニタ用):
$ cd LCD-show
$ sudo ./LCD35-show

このコマンドが成功すると、ラズパイに接続された TFT モニタに CUI コンソールが表示されるようになります。キーボードが接続されていればコマンドを入力してその結果を確認することも可能になりました:
2017080800


TFT モニタ(の解像度)がもう少し大きいものであれば話は違ってくると思いますが、この 3.5 インチはラズパイとほぼ同じサイズで、一体感があります。一方で、このサイズのモニタだと GUI で使うこと自体に無理があると感じています。 そうなると今回紹介したように CUI で使うのが現実的かな、と考えています。

で、CUI で使うための手順紹介をあまり見かけなかったので、自分でやって紹介してみた、というのが今回のブログエントリを書いた経緯でした。 同じように考えている皆さんの参考になれば。


自分はラズパイ(Raspberry Pi 3B)をリモートの開発環境として使っています。自宅内ネットワークで常時起動させ、OpenVPN 経由で外からもアクセスできるようにしています。その辺りの設定についてはこちらを参照してください:
OpenVPN でローカル(自宅)ネットワークに VPN 接続する


そんなラズパイに各種開発環境やら docker やら TensorFlow やら、、を導入しています。これで外からも利用できる開発環境を構築しています:
http://dotnsf.blog.jp/tag/raspberrypi


さて、コーディングして動かすところまではこういったツールだけで問題ないのですが、1点だけ不便に感じる点がありました。それが「cf ツール」です。作ったアプリケーションを IBM Bluemix (Cloud Foundry) 環境上にデプロイする際に使うツールなのですが、公式にはラズパイ用のバイナリは提供されていません。なのでラズパイで開発して、動かして、テスト&デバッグして、、というところまではこの環境でできるのですが、作ったアプリを IBM Bluemix 上で動かす、という最後のステップの際に別の(cf ツールの導入された)環境に切り替えて行う、というちと面倒な手順をとる必要がありました:
Releases cloudfoundry/cli

2017080601


これをラズパイ環境のままで行えるようにする、というのが今回の目的です。実はこれまでにも IBM LinuxONE 環境などで同様の経験はしていて、その時は自分でソースからビルドして対応したりしていました:
IBM LinuxONE コミュニティクラウド上で cf コマンドを動かす

2017080602
(↑メインフレーム上で cf を動かしたのは、もしかすると世界中で自分だけかも・・)


で、同様の問題がラズパイで発生しているということです。というわけで、ラズパイ環境でも同様に cf ツールをビルドしてみました。以下はその手順紹介ですが、基本的には上記の LinuxONE 環境と同じことをしています。

まず cf ツールは go 言語で書かれているため、ビルドには go 言語が必要です。ラズパイ用の go 言語導入については以下を参照して、go 言語が動く環境を作っておいてください:
ラズパイに go 1.8 をインストールする

go 言語が動くようになったら次はソースコードの入手です。以下のコマンドを実行します:
$ go get code.cloudfoundry.org/cli

これで $GOPATH/src/code.cloudfoundry.org/cli 以下にソースコードが展開されます。これをビルドします:
$ cd $GOPATH/src/code.cloudfoundry.org/cli
$ bin/build

ビルドが成功すると $GOPATH/src/code.cloudfoundry.org/cli/out/ 以下に cf コマンドが生成されます。試しに動くかテストしてみます:
$ cd $GOPATH/src/code.cloudfoundry.org/cli/out
$ ./cf -v
cf version 6.29.0+35e54cd.2017-08-06

バージョン番号が表示され、ちゃんと動くことが確認できました。後はこのコマンドを PATH の通った所に移動すれば完成です。
$ sudo mv $GOPATH/src/code.cloudfoundry.org/cli/out/cf /usr/local/bin
$ sudo chown root.staff /usr/local/bin/cf


なお、このラズパイ版の cf コマンドについては困っていた方が他にもいたようで、たまに有志でビルドされたものが見つかります。僕が動作確認しているわけではないし、動作保証もできないのですが、こういった所から入手して使うという手段もありそうです:

https://github.com/mmb/cf-cli-pi
https://cf-cli-pi.s3.amazonaws.com/index.html


ラズベリーパイに go 言語をインストールします。
go_lang1


といっても普通に
$ sudo apt-get install golang

でもインストールは可能です。ただこの方法で go をインストールすると、少し古いバージョン 1.3 が導入されます。このバージョンでも問題なければこの方法でもいいのですが、以下はバージョン 1.8 の導入方法を紹介します。

具体的には Google のサイトから、ラズパイ用にビルドされたバイナリをダウンロードし、展開します:
$ cd /tmp
$ wget https://storage.googleapis.com/golang/go1.8.linux-armv6l.tar.gz
$ sudo tar -C /usr/local -xzf go1.8.linux-armv6l.tar.gz

続いて環境変数を設定します。~/.bashrc に以下の行を追加します:
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

この例では GOPATH を ~/go に設定しています。go 言語のソースコードを書く場合のフォルダを指定しています。

この状態で再ログインするか、source ~/.bashrc を実行すると設定内容が有効になって、go 1.8 が使えるようになります:
$ go version
go version go1.8 linux/arm


2017年6月の Raspbian のアップデートに合わせて PIXEL for PC(PC / Mac 用の Raspbian、わかりやすく言うと「パソコン版のラズベリーパイ」)も新しくなりました。以前のものは専用の Live CD だけが提供されていたのですが、現在のバージョンではハードディスク(仮想ディスク)へのインストールができるようになりました。「デスクトップ Linux 環境推進派」として見逃せないこの環境を早速ためしてみました:
2017073001


まず、今回導入したマシンは以下のようなスペックの仮想マシンです。おそらく実機でも問題ない、はず:
 ハイパーバイザー: KVM on CentOS 6
 仮想CPU: 1
 仮想メモリ: 1GB
 仮想ディスク: 10GB

まず最新の PIXEL for PC をダウンロードします。僕が今回使ったのはこの 2017/06/22 版の iso イメージです(2GB ほどあります):
http://downloads.raspberrypi.org/rpd_x86/images/rpd_x86-2017-06-23/2017-06-22-rpd-x86-jessie.iso


このイメージを使って仮想マシンを作成して起動します。実機の場合は iso を DVD に焼いて、その DVD をドライブに入れて起動することだと読み替えてください。なお(後でわかることですが)PIXEL for PC は Debian 8 ベースなので、仮想マシン作成時の OS の種類とバージョンは Debian 8 に相当するものを指定しています:
2017073002


なお作成時のオプションとして、(今回は)アーキテクチャに 64bit 版を選択しました。このあたりは実際に導入する環境に合わせてください:
2017073003


そんなこんなで ISO から起動します。最初に表示されるブートメニューでは "Graphical install" を選択しました:
2017073004


GUI インストーラーが起動します(この右上に "Debian 8" って表示されてますね)。最初にキーボードの種類を選択します。ここでは日本簿キーボードである "Japanese" を選択しました。選択後、 "Continue" で次の画面へ:
2017073001


ここで ISO をイメージを探して、そこから色々ロードして、・・・と少し待ちます:
2017073002


ここからが本格的なインストールオプションの指定になります。まずはインストール先ディスクとボリュームを指定します。僕はデフォルトの "use entire disk" を選択しましたが、LVM(論理ボリュームマネージャー)や暗号化 LVM を使う場合は適宜指定します。終わったら "Continue" :
2017073003


次にインストール先ディスクの選択を行います。この例ではディスクは1台しかないので、その1台のディスクを選択して "Continue" :
2017073004


選択したディスクのパーティショニングを指定します。ここでは(ディスクが大きくもないので)デフォルトの "All files in one partition"(全ファイルを1つのパーティションにコピー)を選択しています。そして "Continue":
2017073005


スワップ領域と合わせたパーティショニングの情報が表示されます。この内容で問題がなければ "Finish partitioning and write changes to disk" を選択して "Continue":
2017073006


ディスクに変更の書込みを行う直前の確認画面です。変更を行う場合は "Yes" を選択して "Continue":
2017073007


この後はパーティションのフォーマットが行われ・・・:
2017073008


インストール(ファイルコピー)が開始されます。環境にもよりますが、しばらく(数十分程度)待ちます:
2017073009


このような(GRUB がなんたら・・)画面になればファイルコピー完了はもうすぐです:
2017073001


ファイルコピーが済んだら最後に GRUB のインストールを行います。この画面では "Yes" を選択して "Continue" :
2017073002


GRUB のインストール先ディスクを指定します。今回は1つしかないので、その1つを選択して "Continue":
2017073003


最後のインストール作業が行われ・・・:
2017073004


この画面になったら再起動前にドライブに挿入している DVD(iso)を取り外します。iso の場合は仮想ドライブから iso ファイルを切断します。そして最後の "Continue" :
2017073005


最後に後処理が行われ、自動的に再起動がかかります:
2017073006


PIXEL の再起動がかかった直後はこんな画面になります:
2017073001


その後、おなじみのラズベリーアイコンが表示され・・・:
2017073002


PIXEL のデスクトップ画面が起動します! あのラズベリーパイではなく、(仮想)PC 上で Raspbian OS が起動しました。もちろん Raspbian OS 同様に利用できます:
2017073003


PIXEL でも標準で Scatch などは導入済みですぐに使い始めることができます。一方で Node-RED などは別途導入が必要なので、全く同じ構成というわけではなさそうです:
2017073004


もともと Debian っぽく使えていた Raspbian ですが、マシンの基本スペックが高いぶんだけ PIXEL の方が快適に感じるかもしれません。日本語化も含めたインストール作業後の諸設定はまた別途。


Google が提供する機械学習ライブラリ TensorFlow公式にはラズベリーパイ用のモジュールは用意されていませんが、ラズベリーパイ向けのパッケージを作って公開されているものを見つけました:
https://github.com/samjabrahams/tensorflow-on-raspberry-pi


実際に導入してみた手順を紹介します。なお以下の情報は 2017/Jul/19 時点のものであり、実際に試した時の環境は以下のとおりです:
ハードウェア: Raspberry Pi 3 Type B
OS: Raspbian GNU/Linux 8.0(Jessie)
Linux カーネル: 4.9.28
TensorFlow: 1.1.0


【Pythonのインストール】
Python 2.7 または 3.3 以上が必要です。自分の環境では標準で 2.7 がインストールされていたので、これをそのまま使うことにしました。というわけで、以下の手順は Python 2.7 用のものです。


【pip 他のインストール】
TensorFlow 本体のインストール時に必要な pip や開発用依存モジュールをまとめてインストールします:
$ sudo apt-get update
$ sudo apt-get install python-pip python-dev

【TensorFlow のインストール】
ラズパイ用の TensorFlow 1.1.0 をダウンロードし、pip でインストールします:
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl

wheel パッケージが展開され、各種ライブラリ含めたビルドが行われます。実際には結構な時間がかかる作業です。


【mock ライブラリの再インストール】
最後に mock ライブラリの再インストール(一度削除して、もう一度インストール)が必要とのことで、その作業を行っておきます:
$ sudo pip uninstall mock
$ sudo pip install mock

【動作確認】
クラスメソッド様のサイトに「TensorFlow 版ハローワールド」的なサンプルプログラムがあったので、これをそのまま動かしてみます:
TensorFlowで Hello Worldを動かしてみた&その解説

テキストエディタで以下の内容を編集し、hello-tf.py という名前で保存します:
# hello-tf.py
import tensorflow as tf
import multiprocessing as mp
 
core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num )
sess = tf.Session(config=config)
 
hello = tf.constant('hello, tensorflow!')
print sess.run(hello)
 
a = tf.constant(10)
b = tf.constant(32)
print sess.run(a+b)

これを Python で実行します:
$ python hello-tf.py
hello, tensorflow!
42

青字のような結果が出力されれば、とりあえず動作していることが確認できました。


 

このページのトップヘ