2015年11月10日火曜日

スタンドアロンになってしまった RaspberryPi を救う方法

概要

想定ケースとしては

  • RaspberryPi (RPi) は常に無線 LAN に接続しており他のマシンから SSH でログインして操作していた

という状況で突如無線 LAN が停止してログインできなくなったときに救うケースを考えてみます

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)

最終手段

いきなりですが、最終手段です
どうしても RPi を操作できる状況にできない場合は、ネットワークが復旧したあとで電源プラグを引っこ抜いて再起動するしかないと思います

電源を直接抜いてシャットダウンすると SD カードが破損して最悪 OS 起動しなくなったりデータが正確に保存されないなどのリスクがあります
自分は一度だけ OS が起動しなくなり SD カードをフォーマットしなおしたことがありますが、ほぼ遭遇したことはありません
なので「どうしても」というケースでは実施して問題ないと思います

今回は上記を最終手段として、それまでに救えるいくつかの方法を検討していきます

キーボードおよびディスプレイを使って救出する

おそらくこれが一番メジャーだと思います
キーボードしかない場合も想定して復旧方法を検討します

有線のキーボードおよびディスプレイに接続できる状況

この状況があれば一番救える確率が高いです
キーボードは USB でディスプレイは HDMI とします

この場合はまずそのままキーボードとディスプレイを RPi に接続します
で、キーボードから何かしらの信号を送れば HDMI 側にも信号が飛んで RPi の CUI が表示されればそのまま救出完了になります
( RPi の OS のバージョンが Raspbian Jessie だった場合はデフォルトが GUI なのでキーボードの Tab や Alt 十字キーを使ってターミナルを起動するなりして救う必要があります、キーボードが HHK で十字キーボードがないとか OS のキーボード配列の設定が違うとか問題に遭遇する可能性もありますが、そうなったら頑張るしかないです )

ですが、キーボードとディスプレイを接続して信号を送ってみたのにディスプレイ側に信号が来ないなんてことに遭遇すると思います
RPi は起動時にディスプレイが繋がっていれば HDMI の出力を ON にするのですが、HDMI が繋がっていない状態で電源を ON にすると HDMI の出力が行われません
( 自分の場合は上記に該当しており、デフォルト GUI だった OS を CUI の状態にしたら発生しました )
その場合は画面が見えない状態でキーボードで HDMI の出力を ON にするコマンドを実行しなければいけません
コマンドは以下の通り

  • tvservice -o
  • tvservice -p
  • fbset -depth 8
  • fbset -depth 24

簡単に説明するとディスプレイの出力を OFF -> ON して画面のフレームバッファの設定を 8 -> 24 に変更します
このコマンドを画面が真っ暗な状態で、想像しながらタイプする必要があります
間違ってタイプした場合は Ctrl + e -> Ctrl + u を駆使して一旦クリアした後で再度冷静にタイプしましょう
タイプが成功して HDMI への信号が ON になれば画面が表示されて救出完了になります

あとコマンドをいきなり実行できる状態で RPi が起動していればいいのですが、pi ユーザで一度ログインしないとダメな場合には、そこから想像しながらタイプする必要があるので若干難易度があがります

どうしても画面が表示されない場合は「sudo reboot」もありです
もしくは「sudo shutdown -h now」でシャットダウンして RPi 上の LED が点滅しないことを確認して電源を抜いてから再起動でも問題ないと思います

有線のキーボードはあるがディスプレイがない

これは、上記の通り想像しながらキーをタイプするしかないと思います
ディスプレイがないのでディスプレイに出力してもしょうがないのでこの場合は

  • sudo reboot

or

  • sudo shutdown -h now

のどちらかを頑張ってタイプして復旧させるしかないと思います
そしてこの場合は GUI だと終わります
さすがに GUI をキーボード Only で想像しながらタイプするのは無理があります

頑張ってタイプしても再起動しない、停止しないという場合は、キーボード自体の信号が送信されていない可能性があるかもしれません
例えば PPi を電池やモバイルバッテリーで動かしている場合に充電が足りずに RPi に十分な電圧が加わらず USB ポートが正常に動作しないなどが考えられます
RPi は通常 5V (家庭用の電源コンセント) の電圧がかかることを想定しています

ディスプレイはあるが無線キーボードしかない

例えば Bluetooth の無線キーボードだけある状況です
基本は有線と変わらず接続できたら停止 or 再起動コマンドを想像しながら発行するということしかできません

ただ、無線の場合は有線に比べて信号を送るまでの難易度があがります
まず RPi に Bluetooth レシーバが接続されていることが絶対条件です
これがないと終了です
レシーバがあり無線キーボードがアドバタイズできる状況であるならば救える可能性はあります

が、ここからもハードルが高いです
RPi の場合 Bluetooth キーボードと接続するにはキーボードとペアリングするためのコマンドを発行する必要があります
(参考 : RaspberryPi で Bluetooth キーボードを接続する方法, RaspberryPi の bluetoothctl で無線キーボードに接続 )
一度接続したキーボードは trust することで自動で再接続してくれるオプションがあるのですが、このオプションは RPi が起動する場合でないと使えません
なので RPi が起動中に Bluetooth キーボードが接続できる範囲にきても自動で接続してくれません

ではどうするか、ですが自分は以下のスクリプトを cron で回す設定を事前に行っています
bluetoothctl と expect で無線キーボードに定期的に接続するスクリプト

ここまで事前に用意できていて初めて無線キーボードが使えるようになります
有線に比べてかなりハードルが高いので、緊急時はできれば有線キーボードを準備してください

キーボードもディスプレイもない

これは相当厳しいです
最悪 PC があればなんとかなります (後述) が、この場合は電源 OFF をするしかないです

PC を持っている場合

一台 PC を持っている場合に救出できる方法がないか検討します

シリアル通信を使う

RPi の GPIO を使って RPi 上の信号を PC に表示します
ただ、シリアル通信をするのであれば PC 以外に以下の機材が必要になります

  • ジャンパケーブル
  • FTDI シリアル - USB 変換アダプタ
  • USB ケーブル

やり方や機材等の詳細はこちらを御覧ください
シリアル通信に必要な機材はこれ以外のパターンもたくさんあります
が、とりあえず PC だけでは無理です

そしてシリアル通信の最大の弱点は PC を停止した状態で配線しないと信号が受け取れない点にあります
・・・そう、起動している RPi だと結局シリアル信号をモニタすることができないのです

じゃあなんで紹介したんだとなりますが、1 つは電源での OFF -> ON 後にとりあえず正常に動作しているか確認したい場合に使えます
もう 1 つは実は起動した状態でシリアル通信できる方法があると誰かが教えてくれのではと、思ったからです
もしかしたら、あとで調べたらあっさり方法がわかるかもしれませんが

最後に

RPi は一度セットアップしてサーバとして動かすのであれば電源だけあれば OK で省スペースなのですが、いざぶっ壊れて対応しなければいけないときに、とたんにハードルと必要になる機材が増えるようなイメージがあります

しょうがないと言えば確かにしょうがないですが、もっとスマートな方法はないものだろうかと思いました

2015年11月9日月曜日

CentOS7 で docker-compose を試してみた

概要

docker-compose は複数のコンテナで構成されるアプリを管理するためのツールです
fig と言われていたツールがそのまま docker-compose になりました
今回は docker-compose の QuickStart を試してみたので紹介します

環境

  • CentOS7 64bit
  • docker-engine 1.8.3
  • docker-compose 1.4.2

docker-compose のインストール

  • VERSION_NUM=1.4.2
  • curl -L https://github.com/docker/compose/releases/download/VERSION_NUM/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  • chmod +x /usr/local/bin/docker-compose
  • docker-compose version

でインストールします
インストールが完了したらバージョンが表示されることを確認してください

各種ビルド用のファイルの作成

アプリを構成するファイルを作成していきます

DockerFile の作成

  • mkdir ~/mydocker
  • cd ~/mydocker
  • touch DockerFile
FROM ruby:2.2.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp

イメージは DokcerHub にある ruby というイメージの tag 2.2.0 を使います
他の最新版のバージョンもあるのでそれでもいいかもしれません

Gemfile の作成

  • cd ~/mydocker
  • touch Gemfile
source 'https://rubygems.org'
gem 'rails', '4.2.0'

単純に rails をインストールするだけの Gemfile です
DockerFile 内の ADD というコマンドで作成した Gemfile をコンテナ上に渡します

docker-compose.yml の作成

  • cd ~/mydocker
  • touch docker-compose.yml
db:
  image: postgres
web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db

docker-compose.yml にアプリを構成するコンテナの定義を記載します
DB には postgres を指定します
ファイル内では環境変数の参照も行えるようです
その他の詳細はこちらのページを参照してください

web コンテナ上で動作する rails のサンプルアプリを作成する

  • cd ~/mydocker
  • docker-compose run web rails new . --force --database=postgresql --skip-bundle

run コマンドのあとに docker-compose.yml に記載したコンテナを指定します ( -> web )
そのあとでコンテナ上で実行するコマンドを記載します ( -> rails new . --force --database=postgresql --skip-bundle )
コンテナ上で実行されたコマンドの結果はローカルに保存されるのでこのアプリを使ってコンテナ上で動作させます

Gemfile の編集

サンプルアプリを作成した際に生成される Gemfile を編集します
今回はブラウザ上で動作するアプリを実行するための以下の行をコメントアウトします

gem 'therubyracer', platforms: :ruby

コメントアウトしたら保存しましょう

config/database.yml の編集

  • cd ~/mydocker
  • vim config/database.yml
development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test

上記の設定になるようにローカルの config/database.yml を編集してください
デフォルトで作成される config/database.yml にはいろいろと記載されているので全部消してもいいですし、必要な部分だけ編集しても OK です

ビルドの実行

docker-compose 上で動作するイメージをビルドします

  • cd ~/mydocker
  • docker-compose build

初回ビルド時はいろいろとダウンロードする必要があるので時間がかかります
ビルドが完了したら docker images で新しいイメージが作成されていることを確認しましょう
今回の手順で実施すると mydocker_web というイメージが作成されていると思います

REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mydocker_web                latest              35147b5838ce        18 seconds ago      914.2 MB

コンテナ上でのアプリの起動

イメージが作成できたらアプリを起動してみましょう

  • cd ~/mydocker
  • docker-compose up

起動したらプロセスを確認してみます

  • docker-compose ps
     Name                   Command               State           Ports
--------------------------------------------------------------------------------
mydocker_db_1    /docker-entrypoint.sh postgres   Up      5432/tcp
mydocker_web_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp

State が Up になっていれば OK です

動作確認

この状態でブラウザで 3000 番にアクセスすると Rails のサンプル画面が表示されると思います

http://hostname:3000/

コンテナを停止させたい場合は

  • docker-compose stop

で OK です

紹介は以上です
次回は docker-compose の特徴的な機能の 1 つである scale を検証できればと思います

Tips

データベースが作成されているか確認してみる

  • docker exec -it mydocker_db_1 bash
  • su - postgres
  • psql -l
  • psql postgres

docker exec は作成したコンテナにログインすることができる便利なコマンドです
デバッグで重宝します
データベースがない場合はdocker-compose run web rake db:create で作成可能です

イメージが削除できない

Error response from daemon: Conflict, cannot delete 3e2dbcd4b881 because the running container 379975ee952b is using it, stop it and use -f to force

docker-compose で作成したイメージを削除しようとして発生しました
まだイメージを使ったコンテナが動作しているためイメージを削除できないというエラーのようです
docker ps -a で全コンテナを表示して該当するコンテナを削除しましょう
全コンテナを削除して問題ない場合は

  • docker rm $(docker ps -aq)

で全コンテナを削除してから、再度 docker rmi してみましょう

2015年11月8日日曜日

Eclipse + Astyle で C 言語のコードをフォーマットする

概要

Astyle という C や Java で使えるソースコードフォーマッタを Eclipse で使えるようにしてみました

環境

  • Mac OS X 10.10.5
  • Eclipse 4.4 Luna
  • Astyle Plugin 1.0.1

インストール

Eclipse を開き

Help -> Install New Software

を選択

Add を選択しプラグインを公開している URL を入力
http://astyleclipse.sourceforge.net/update

add_plugin_site_astyle.png

一覧に表示されたチェックし Next を選択

check_plugin_astyle.png

利用規約に同意してインストールを実施する
セキュリティ警告は OK にする
再起動を促されるので実施する

設定方法

コードフォーマットしたときにインストールした Astyle プラグインのフォーマットルールを使うように設定する

Eclipse -> 環境設定 -> Astyle

でスタイルを選択できるので好みのスタイルを選択し OK

choice_style_in_astyle.png

次に C/C++ のフォーマットの設定を Astyle のフォーマッタに変更する

Eclipse -> 環境設定 -> C/C++ -> Code Style -> Formatter

で Code Formatter の部分を「Astyle Plugin」に変更する

change_fomatter_to_astyle.png

これで設定は完了です
あとは C 言語のソースコードを編集しているときに Ctrl+Shift+f でフォーマットすることで Astyle のフォーマットが適用されます

2015年11月6日金曜日

nRF51822 + nRF51 DK を使って BLE デバイスの開発環境を構築

概要

nRF51822 とは NordicSemiconductor 社が提供する BLE モジュールです
nRF51822 には専用の開発用のボード (nRF51 DK) がありこれを使うことで BLE デバイスの開発を行うことができます
今回は開発環境の構築方法を紹介します

環境

  • Windows7 64bit
  • nRF51822
  • nRF51 DK
  • MicroUSB x 1

各種インストール

各種インストールの作業は Windows 上で行っていきます

アプリ焼きこみ用のツール nRFgo Studio のインストール

開発したアプリをモジュールに焼きこむためのツールです

  • https://www.nordicsemi.com/chi/node_176/2.4GHz-RF/nRFgo-Studio にアクセス
  • 「DOWNLOADS」タブを選択
  • nRFgo Studio-Win64 を選択しダウンロード
  • ダウンロードした nrfgostudio_win-64_1.21.0_installer.msi を実行しインストール
  • インストール中の Choose Setup Type は Typical を選択
  • ドライバをインストールする確認ダイアログが続けて表示されるのですべて OK にする
  • 続けて nRF Tools をインストールする旨が表示されるので続けてインストール
  • J-Link のドライバをインストール

で nRFgo Studio がインストールできます
同時に J-Link のドライバもインストールするのを忘れないようにしてください
2015/11/05 時点での最新版は 1.21.0 でした

開発用の IDE Keil のインストール

Keil という組み込み開発で使用する IDE をインストールします

  • https://www.keil.com/download/ にアクセス
  • 「Download」タブを選択
  • 「Product Downloads」を選択
  • 「MDK-ARM」を選択
  • ダウンロードするために個人情報を入力 (keil だけダウンロードに必要)
  • ダウンロードのページに遷移したら MDK517.EXE を選択しダウンロード
  • ダウンロードした MDK517.EXE を実行しインストール

で Keil の μVision という IDE がインストールできます
デフォルトの設定だと C ドライブ直下に C:\Keil_v5 というディレクトリ名でインストールされます
IDE を起動する場合は C:\Keil_v5\UV4\UV4.exe を実行してください
2015/11/05 時点での最新版は 5.17.0 でした

nRF51 SDK のインストール

開発に必要な SDK をインストールします

ダウンロードが完了したら解凍して適当な場所に配置すれば OK です
nRFgo Studio から参照します
zip をダウンロードする際に他の最新版があればそちらをダウンロードしても OK です
2015/11/05 時点での最新版は 9.0.0 でした

この作業は nRF Studio のインストール時に完了しています
最新版をインストールしたい場合にだけ実施してください

  • https://www.segger.com/jlink-software.html にアクセス
  • Software and documentation pack for Windows の最新版を Download
  • ダウンロードが完了したら zip を解凍し Setup_JLink_V502i.exe を実行しインストール
  • インストール中の「Install USB Driver for J-Link」にチェック

でドライバがインストールされるはずです
2015/11/05 時点での最新版は 502i でした

配線

開発ボードと Windows を接続していきます
開発ボードへの電源の供給は PC から行います

配線は非常に簡単で開発ボード側の MicroUSB と PC の USB ポートを接続すれば OK です
基本はこれだけで開発できます

他にはデバッグ用のシリアル通信や nRF51822 モジュールへの書き込みを行うための配線がありますが、とりあえず BLE デバイスを開発するだけであれば上記で十分です

配線が完了したら開発ボードの電源を ON にしましょう

サンプルの焼きこみ

では開発ボードにサンプルアプリを焼きこんでみましょう
今回は簡単な Peripheral アプリを焼きこんで、ちゃんとアドバタイズされるか確認してみます

配線を完了し開発ボードの電源が入っている状態で nRFgo Studio を起動します
起動したら左ペインの「Device Mangaer」に nRF51 development boards があり、その中に Segger … で始まるデバイスが認識されていることを確認してください
これが表示されない場合は開発ボードがうまく Windows 側に認識されていないので、ドライバのインストールを再度実施してください

SoftDevice の焼きこみ

Segger を選択した状態で右ペインに移動します
まずは SoftDevice を焼きこんでいきます
SoftDevice とは簡単にいうとミドルウェアのようなもので、開発するアプリはこの SoftDevice 上で動作します

右ペインの「Program SoftDevice」タグを選択します
そして「File to program」に SoftDevice を指定します
指定する SoftDevice はダウンロードした SDK に含まれています
例えば C ドライブ直下に SDK を配置したのであれば

C:\nRF51_SDK_9.0.0_2e23562\components\softdevice\s110\hex\s110_softdevice.hex

にあります
選択したら「Program」ボタンを押して焼きこみを開始します
ダイアログが表示され最終的に successfully になれば OK です

サンプルアプリのビルド

ここがちょっとだけ面倒です
サンプルアプリ用の .hex ファイルが SDK 内に同梱されておらずソースファイルから自分でビルドして作成する必要があります
まず Keil を開きましょう
開いたら SDK に同梱されているサンプルプロジェクトを開きます

Project -> Open Project

で以下を指定して開きます

C:\nRF51_SDK_9.0.0_2e23562\examples\ble_peripheral\ble_app_hrs\pca10028\s110\arm5_no_packs\ble_app_hrs_s110_pca10028.uvprojx

するとプロジェクトが開きます
今回は特にソースを修正する必要はないので開いたらいきなりビルドします

Project -> Build target

でビルドが始まります
プロジェクト内に存在する C のソールコードがコンパイルされ最終的に .hex が作成されれば OK です
.hex ファイルはarm5_no_packs\_build\nrf51422_xxac_s110.hex に作成されます

サンプルアプリの焼き込み

作成できたアプリを焼きこんでいきましょう
再度 nRFgo Studio に戻ります

今度は右ペインの「Program Application」タグを選択します
そして、FIle to program に先ほど作成した .hex ファイルを指定します

C:\nRF51_SDK_9.0.0_2e23562\examples\ble_peripheral\ble_app_hrs\pca10028\s110\arm5_no_packs\_build\nrf51422_xxac_s110.hex

選択したら「Program」を選択します
SoftDevice の書き込み同様ダイアログが表示され最終的に successfully になれば書き込み完了です

動作確認

今回は iPhone で確認してみます
スマホアプリに BLE を検知できるアプリがいくつかあるのでそれを使います

開発ボードの電源が入っている状態でアプリを立ち上げてみましょう
すると開発ボードに焼きこまれたアプリがBLEデバイスとして検知できると思います
今回の場合「Nordic_HRM」というデバイス名でアプリを書き込んでいるのでその名前で見つかると思います

最後に

紹介は以上です
今回 nRF51822 モジュールに直接書き込みはしませんでした
モジュールに書き込みを行いたい場合は Debug out という 10pin の I/F が開発ボードにあるので、ジャンパを使って nRF58122 が乗った別のボードと接続した状態で nRF Studio で Program すれば焼きこむことができると思います

あとは main.c なりソースの修正をしてビルドして再度 .hex ファイルを作成して焼き込めば開発できると思います
ただ、これだと print 文などをデバッグできないので作業効率が悪いです
やはり開発ボードとシリアル通信して print 文をデバッグした方がいいです
次回にでもシリアル通信の記事を紹介できればと思います

Tips

アプリを修正して Program してうまく動作しない場合は一旦「Erase all」してから再度 SoftDevice -> アプリの順番で書き込みを行ってみてください

2015年11月4日水曜日

CentOS7 で docker 1.8 を試してみた

概要

久しぶりに docker に触りました
バージョンアップもしていたので試したことをメモしておきます
これ をベースに進めていきます

環境

  • CentOS 7.1.1503 64bit
  • kernel 3.10.0-229.el7.x86_64
  • Docker 1.8.3 build f4bf5c7

インストールおよび docker デーモンの起動

以降の作業は root ユーザで実施しました

HelloWorld サンプルの実行

  • docker run hello-world

DockerHub で公開されている hello-world というイメージをダウンロードしてコンテナとして起動します
このサンプルはヘルプ的なものが表示されてすぐに終了します

インタラクティブモード

  • docker run -it ubuntu bash

ubuntu というイメージをダウンロードしてインタラクティブモードで bash を実行します
普通に SSH をしているように ubuntu 上でコマンドが実行できます
apt でパッケージのインストールも行えます
インタラクティブモードは exit 等で抜けない限り docker 上のプロセスとして存在します
exit 後はプロセスが終了します ( コンテナが削除されます )

特定のプログラムを実行するサンプル

  • docker run docker/whalesay cowsay boo

docker/whalesay というイメージをダウンロードして「cowsay boo」というコマンドを実行します
cowsay というコマンドは AA を作成し引数に渡された文字列をセリフとして出力するネタコマンドです
docker/whalesay イメージはすでに cowsay がインストールされているイメージなのでコンテナとして実行することができます
実行すると AA が表示されてコンテナが終了します

独自のイメージを生成してみる (Dockerfile 入門)

  • mkdir mydocker
  • cd mydocker
  • touch Dockerfile
  • vim Dockerfile
FROM docker/whalesay:latest
RUN apt-get -y update & apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
  • docker build -t docker-whale .
  • docker images
  • docker run docker-whale

やっていることは単純で Dockerfile を作成して、そこに実行するコマンドを記載しているだけです
FROM, RUN, CMD は Dockerfile 内で使えるコマンドです
FROM は取得するイメージを指定し、RUN はイメージ作成時に実行されるコマンドで、CMD はコンテナ起動時に実行されるコマンドです
他のパラメータについてはこちらを参照してください

docker build の -t オプションで作成するイメージ名を指定します
build が完了したら docker images で作成できたイメージを確認しましょう

REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker-whale                latest              421acc6431fe        About an hour ago   276.8 MB

あとは作成したイメージを指定して docker run します
fortune というコマンドを使って先ほどの cowsay に出力される吹き出しのセリフをランダムに変更しているだけです
コンテナを何度か起動してみるとセリフが毎回変わっていることが確認できると思います

作成した独自のイメージを DockerHub で公開する

  • docker tag 421acc6431fe kakakikikeke/docker-whale:latest
  • docker login –username=username –password=password –email=your-registed-email@sample.com
  • docker push kakakikikeke/docker-whale

まず tag で公開用のイメージをローカルに作成します
tag を付けるときは「ユーザ名/イメージ名」という命名規則で作成してください
最後にコロンでバージョン名を記載します

次に docker login コマンドで認証します
DockerHub に登録したユーザ名、パワワード、メールアドレスを使って認証します
認証に成功すると /root/.docker/config.json に認証用のファイルが生成されます

そして最後に push します
push に成功すると DockerHub のコンパネ上に自分のイメージが表示されるようになります
my_docker_images.png

公開した自分のイメージを使ってみる

  • docker rmi -f 421acc6431fe
  • docker pull kakakikikeke/docker-whale
  • docker run kakakikikeke/docker-whale

既存のローカルのイメージを削除して、DockerHub からイメージを pull してあとは run しているだけです
ダウンロードしたイメージでもコンテナが正常に動作していることが確認できると思います

最後に

紹介は以上です
「-it」オプションのインタラクティブモードは非常に便利な機能だなと思いました
Dockerfile を作るのが捗る気がします

Tips

CentOS 6 でも試してみたのですがエラーが発生し動きませんでした

  • CentOS 64bit 6.7
  • kernel 2.6.32-358.el6.x86_64
  • Docker 1.7.1

Error response from daemon cannot start container xxxxxxxxxx no such file or directory

CentOS の 6 系はそもそもサポート対象ではなくなったっぽいので納得と言えば納得ですが、まぁ仕方ないといったところでしょうか
古いバージョンの Docker なら動くかもしれないです
https://github.com/docker/docker/issues/14365

なんかすごいブーイングですが、押し通してる感じです

2015年11月2日月曜日

RaspberryPi + FTDI でシリアル通信をやってみた

概要

RaspberryPi に接続するのに SSH や HDMI などでディスプレイの表示ができないときに PC と RaspberryPi だけを使って接続することができます
シリアル通信という技術を使うことで実現することができるのでその方法を紹介します

環境

Mac へのドライバインストール

変換アダプタを Mac 上で使用できるようにするためにドライバをインストールします

http://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_3.dmg

をダウンロードしてポチポチやっていけばインストールできます
2015/10/30 時点でのドライバの最新版は v2_3 でしたので最新版が他にあればそちらをインストールするようにしてください

配線

まず完成した配線は以下の通りです
overview.jpg

ジャンパワイヤ (ジャンパ) が 3 本必要になります (Mac 側から電源を共有するのであれば更にもう一本ジャンパワイヤが必要になります)
以下配線の説明を簡単にしていきます

RaspberryPi 側の配線

まず、RaspberryPi 側の GPIO にジャンパ(メス)を接続します
GPIO の物理 PIN の番号でいうと 6番(GND), 8番(TX), 10番(RX) に接続します
3 本並んでいるのでわかりやすいと思います
rpi_to_ftdi.jpg

FTDI 側の配線

RaspberryPi(RPi) に配線したジャンパを FTDI のアダプタに接続します
まず、RPi 側の GND に接続したジャンパを FTDI の GND に接続します
アダプタに GPIO の番号が印字されているので GND のところに接続してください

次に RX, TX ですがここがちょっと気をつけるポイントです
RPi の TX に接続したジャンパは アダプタ側の RX に接続します
そして、RPi の RX に接続したジャンパは アダプタ側の TX に接続します
つまり、RX と TX がクロスすることになります
RPi 側のTX (送信) を FTDI 側で RX (受信) する感じです
ftdi_to_mac.jpg

Mac 側の接続

これはアダプタの USB 端子をそのまま PC に接続すればOKです
接続が完了したら以下のコマンドを実行して USB アダプタがちゃんと認識されているか確認してください

  • ls -ltr /dev/tty.*

自分の場合は以下の名前でアダプタが認識されていました

crw-rw-rw- 1 root wheel 18, 4 10 29 20:48 /dev/tty.usbserial-AI02RMKU

こんな感じの結果があれば OK です

screen コマンドでシリアル通信の準備をしておく

先に説明しておくべきでしたが、配線中は RaspberryPi の電源は OFF にしておいてください
ON の状態で実施してもシリアル通信のデータを Mac で受信することができません

USB のアダプタが認識できたら screen コマンドを使ってシリアル通信の準備をします
Mac 上でターミナルを起動します
以下のコマンドでシリアル通信を実現します

  • screen /dev/tty.usbserial-AI02RMKU 115200

最後の「115200」という数字はボーレートという値で RPi 側から送信されるボーレートの値が 115200 なのでそれに合わせる必要があります
とりあえず実行すると真っ暗な画面になりますが、そのまま待機しましょう

RaspberryPi の電源を ON にする

ここまで準備出来たら RaspberryPi の電源を ON にしましょう
今回はコンセントから直接電源を共有しているので、起動するには電源アダプタをコンセントに接続すれば OK です

すると screen で待機していたターミナル上に RaspberryPI の起動ログが流れていることが確認できると思います
起動が完了するとログインプロンプトが表示されるので、普通に Mac のキーボードを使ってログインすれば、RPi 上でコマンドを実行することが可能になります
raspberry_serial_console.png

最後に

紹介は以上です

Wi-Fi 環境があったり有線 LAN 環境があるのであれば SSH で接続することをおすすめします
理由としては機材を用意し配線する必要もないからです

シリアル通信を使うケースとしてはやはり緊急時等のデバッグかなと思います
RPi やネットワークに問題があり SSH できない場合やキーボードやモニタなどの機材が用意できない場合に PC さえあれば接続できるので便利です

今回は FTDI の変換アダプタを使いましたが USB とジャンパが一旦になっている専用のケーブルもあるのでそれを使ってもOKです
どちらにしろ最近の PC であれば USB に変換するのは必要だとは思いますが

2015年11月1日日曜日

RaspberryPi で Lチカをやってみた

概要

今更ながらやってみました
簡単に紹介します

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • 各種DIYキット
    • ブレッドボード
    • ジャンパ (オス - メス) 2 本
    • LED (緑色)

配線

完成図は以下の通りです
enter image description here

enter image description here

まず配線方法についてそれぞれ説明します
以下の作業は電源 ON でも OFF でもどちらでも OK です

RaspberryPi 側の配線

こちらは超簡単です
GPIO の論理 PIN 番号の 6 番(GND), 18番 (GPIO) にジャンパンのメスを接続します
※物理 PIN 番号だと 6 番, 12 番になります
あとはオス側はブレッドボードの同列に適当に差し込んでおけばとりあえず OK です
wiring_rpi.png

ブレッドボード側の配線

こっちが少しだけ大変です
wiring_bread_board.png

まず RaspberryPi (RPi) の GND の同列上に LED のマイナス側を刺します
LED には +/- がありプラスのほうが足が少し長いです
なので短い方を GND の列と合わせてブレッドボードに刺します

次に LED のプラス側の下に抵抗を刺します
今回用意した抵抗は 220 オームの抵抗 (色 : 赤赤茶金) を用意しました
200 から 300 オームくらいの抵抗であれば OK です
1Kオームくらいの抵抗をつなぐと抵抗が強すぎるせいで LED が点灯しないので注意してください

そして抵抗のもう片方の列上に RPi に接続されている GPIO から出いているジャンパを接続します

これで L チカのための配線自体は完了です

信号の送信

たぶんこの状態だと RPi の電源が入っていてもまだ LED は光っていないと思います
理由は GPIO 18 番にまだ電気が流れていないためでその制御を RPi 上でコマンドで制御します

まず GPIO 18 番を使えるようにします

  • sudo echo 18 > /sys/class/gpio/export

次に GPIO 18 番を信号の「出力」として使うことを設定します

  • sudo echo out > /sys/class/gpio/gpio18/direction

あとは、実際に信号を送信します

  • sudo echo 1 > /sys/class/gpio/gpio18/value

すると LED がピカっと光るとおもいます
最後の echo で 0 を送信すると LED が消灯します

最後に

基本はググれば L チカ関係のネタはたくさんでてくると思います

今回自分がはまったポイントは 2 つです

  • 抵抗の値が大きすぎて通電はしていたが LED が光らなかった
  • RPi 上でコマンドで制御する GPIO の番号は物理番号ではなく論理番号を使う

でした
どちらもかなり基本的なところでつまづきました
これを経験して感じたのは

  • 抵抗のオーム数は色からわかるようにしておくとよい
  • GPIO はある程度配置と役割を覚えておいたほうがよい

ということでした
次はセンサーやモーターを GPIO で制御してみたいです

おまけ: Pythonスクリプトで制御

https://github.com/kakakikikeke/python-pybluez-sample/commit/0e69f3a2f606630126b37f722fa185dc244c956e