Raspberry Pi2 OSインストール2015/07/01 00:39

Raspberry Pi 2を購入してOSをインストールしようとした時につまづいたのでメモ。

NOOBSのダウンロード、ダウンロードしたファイルを解凍してSDカードへコピー、ラズパイへSDカードセットして起動、インストールする対象の選択画面が出たのでRaspbianを選んで実行、、、
インストール完了までスムーズに進むかと思ったら、インストールが途中で止まる事象が起きた。
ダウンロード失敗かと思い再度ダウンロードしてトライしてもダメ、SDカードを上書きフォーマットした上で実施してもダメだった。

原因は不明だが、SDFormatterを使用してフォーマットする際にオプション「論理サイズ調整」をONにする事で事象が解消した。(下記) 初期状態でもファイル読み書きできたので、フォーマット作業をスキップしてそのままコピーしたのがまずかったらしい。基本に従わないとやっぱり駄目だ。

なお、microSDカードはSAMSUNGのClass10 UHS-I対応の16GBを使用していた。

python で Too many open files2015/05/26 23:34

Raspberry Pi上で、pythonにより、センサーのデータをシリアル経由で取得してログファイルに書き出すテストプログラムを作ったが、起動して1時間程度で、プロセスが停止してしまう。
Too many open files のメッセージを出して止まる。以下試行錯誤して対処したメモ。

■実施環境
  python 2.7
  OS : Raspbian
  基盤 : Raspberry Pi model B+


エラー個所はログ出力&画面表示機能を関数化した以下を呼び出す部分で発生した。
事例についてwebを探してみると、「closeしてないよ」という指摘が多いがcloseはしている。

# -------------------------------------
# ログ出力
# -------------------------------------
def logoutput(text):
  try:
    f = open("IoTGtwlog.txt","a")
    f.write(str(text) + "\n")
    print str(text)
  except Exception as e:
    print str(e)
  finally:
    f.close()

   
次に指摘されるケースはディスクリプタの上限数がなんちゃらという指摘。
Linuxでプロセスが開けるファイルの上限は決まっている。以下の方法で確認できる。
ulimit -n
1024
この上限を増やす設定を施す事で回避する方法が各地で紹介されている。
(ファイルディスクリプタの上限数を上げる対処方法)

しかし、今回openしているファイルは1つで、try命令の中のfinallyで
openしたファイルのcloseは指定していた。にもかかわらず
Too many open files のエラーが出た。
書き方が古いようなので、withを使った書き方に変更するが同じように開始20分でToo many open files のエラーが出た。close指定したけどcloseできてない?という事で、closeできるまで待つロジックを入れてみたが、同じ結果になる。

# -------------------------------------
# ログ出力
# -------------------------------------
def logoutput(text):
  with open("IoTGtwlog.txt","a") as f:
    f.write(str(text) + "\n")
    while (f.closed != True):
      f.close()
      time.sleep(0.1)
  print str(text)


お作法に習った記述をしたにもかかわらず、Too many open files のエラーが回避できない。
よくわからないので、ファイルに自力でログを記録するのではなく、pythonが持っているロギングツールを使う。以下に使い方かわかりやすく説明されたサイトがある。こちらを元に変更する。
http://symfoware.blog68.fc2.com/blog-entry-883.html

# -------------------------------------
# ログ出力
# -------------------------------------
import logging

def logoutput(text):
  logging.basicConfig(
    level=logging.DEBUG,      #デバッグモード
    filename='IoTGtwlog.txt', #ファイル名指定
    filemode='a',             #追記モード
    format="%(asctime)s %(levelname)s %(message)s"  #フォーマット指定
    )
  logging.debug(str(text))
  print str(text)


稼働テストをした結果、ログ出力ではエラーが出なくなった。
が、今度はシリアルポートが開けないためにToo many open files のエラーが発生した。

serial.serialutil.SerialException: could not open port /dev/ttyAMA0: [Errno 24] Too many open files: '/dev/ttyAMA0'

Raspberry Piでシリアル通信する時の処理は、ファイル操作のopen closeと同じで、論理パスに対してopen/closeするので、同じ問題が起きると推測される。シリアルは通信の都度、openしてread、writeしていたが、デバッグしてみると、どうやらclose命令出してもcloseしないので、最初にopenしたままcloseしないことにした。起動してからほぼ1日放置してみたが、Too many open files のメッセージは出なくなったので、この問題はとりあえず解決とした。


Raspberry Pi RDP接続 日本語keymap適用2015/04/11 02:09

Raspberry Pi にXRDPをインストールしてRDP接続するとキーボードがUSになる。
Shift + 2 キー入力の結果が「@ 」になる。
USキーを日本語キーボードにするための手順がWEBにある。
でもなぜか手順通りやったつもりなのに、うまくいかなかった事が解決したのでメモ。
シロウトがlinuxに手を出すと、想像もつかない所で引っかかる。

参照元
https://xrdp.vmeta.jp/%E3%82%AD%E3%83%BC%E9%85%8D%E5%88%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
http://qiita.com/tsukaman/items/af79cde2a72d64c46261

作業ステップとハマり箇所
(1)RasbianにXRDPパッケージを導入
 →ここは間違えようがない
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install xrdp

(2)日本語キーマップファイルのコピー
 →root権限で実行する事(ハマる)
sudo su -
cd /etc/xrdp
sudo wget http://w.vmeta.jp/temp/km-0411.ini
chmod 644 km-0411.ini
sudo ln -s km-0411.ini km-e0200411.ini
sudo ln -s km-0411.ini km-e0010411.ini
sudo ln -s km-0411.ini km-e0210411.ini

(3) /etc/xrdp/startwm.sh ファイルをエディタで編集
 →ここも記載通り。以下を記載して後は#でコメントアウト。

export LANG=ja_JP.UTF-8

. /etc/X11/Xsession

(4) xrdpサービスの再起動
 →これも間違えようがない。
sudo /etc/init.d/xrdp restart


Raspberry Piにwebカメラを接続してOpenCVで表示する2015/04/08 00:07

Raspberry Piにwebカメラを接続してリアルタイムで画面表示させたい。それをスマホから見たい。

使用するカメラ:Logitech QuickCam Fusion

技術要素は3点
(1)Webカメラの画像をデスクトップに表示する
(2)表示した画像をリモートで見れるようにする
(3)スマホ側からRaspberryPiへリモート接続できるようにする



(1)Webカメラの画像をデスクトップに表示する
Raspberry Piにwebカメラを接続して、デスクトップに表示させるところまではOpenCVとサンプルプログラムを使用する。LinuxマシンへのOpenCVの導入と、Webカメラの画像を取得してデスクトップ上のウィンドウに表示するサンプルプログラムが以下に紹介されており、その通りの内容を順番に実行するだけでできる。

Installation of OpenCV for Ubuntu and Raspbian
Setting up OpenCV C++ for Ubuntu and Raspbian

作成するCPPソースファイル上で、画面表示サイズをパラメータ指定する。使用したカメラのスペック上は1.3MPIXELの撮影が可能だが、320×240に抑える。

作成したCPPファイルをビルドする。
$ g++ camera.cpp -o camera `pkg-config opencv --cflags --libs`

プログラムの実行
$ sudo ./camera

プログラムの終了
スペースを押すとキャプチャされる.
実行フォルダ内に「frame.png」という形式で保存される。

実行画面はこんな感じ。起動中は画面リフレッシュを繰り返すせいか、CPU使用率が振り切った状態のままになる。かなり高負荷だ。

(2)表示した画像をリモートで見れるようにする
これだけではRaspberry Piをカメラにしただけだが、ネットワーク越しにスマホからRaspberry Piのデスクトップ画面を見る事が出来るようにすれば、カメラ画像も見る事ができ、監視ツールとして使える。Raspberry Piに対してXRDPとよばれるリモートデスクトップ接続を可能にするサーバソフトをインストールすれば可能になる。基本的に
$ sudo apt-get install xrdp
でよい。詳しい説明はググると山ほど事例が出てくるので割愛。

※X11RDPと呼ばれるNewVersionが存在するが、残念ながらRaspberry Piでは使えませんよと書いてある。
http://scarygliders.net/2013/07/25/x11rdp-o-matic-version-3-now-released/

(3)スマホ側からRaspberryPiへリモート接続できるようにする
接続するクライアント側には、RDPクライアントをインストールし、Raspberry Piへの接続設定をする事で接続可能となる。iOS向けでフリーのRDPクライアントをいくつか試したが、以下が比較的ちゃんと動いた。設定の問題だけかもしれないが、Microsoft製のRDPクライアントではキーボードが正しく反応しなかった。

iRdesktop

さらにRaspberry PiにPPTPサーバを入れておけば、(セキュリティ上の懸念はあるが)外部からも接続できる。夢が広がる。もっと賢いやり方もあると思うが。。

昇電型赤外線センサake-1を試す2015/03/25 22:33

ake-1は秋月で100円程度で手に入る赤外線センサーで、人感センサーとして使える。
センサー部で受光した赤外線の変動に連動してoutput電圧が変化する。人が前を横切ると、人の発する赤外線によってoutput電圧が変化する。実装上のポイントは以下3点

①変動有無の検知方法
②フレネルレンズの使用
③ノイズ除去


①変動有無の検知方法

刻々と変動する値から、適切に変動有無を判定する仕組みが要る。以下紹介サイトのサンプルをベースに使わせて頂いた。10ミリ秒毎にanalogread取得し、500ミリ秒の合計を取得する。前後の合計差が大きければ、動きアリと判定する仕組み。他にも変動量を元に判定するアルゴリズムはあると思うが、シンプルかつ計算が簡単なのでこのまま使う。

★参考にさせて頂いたサイト
http://www.surveytec.com/cgi-bin/diarypic/diary.cgi?no=40

②フレネルレンズの使用
ake-1は、物や人が発する微小な赤外線の変動をセンサで検知する受動型センサ。レンズをつけて赤外線を集光し、センサー部に当てると、狙い通りに動作させる事が出来る。感度を良くするためにはフレネルレンズというレンズを使う。カメラのピント合わせのように、センサーとフレネルレンズとの焦点距離を合わせてやること&余計な赤外線が入らないように囲ってやる必要がある。ake-1と同じく秋月で販売されているフレネルレンズを装着すると正常に動作するが、共立エレショップで実験用のフレネルレンズ(LENS-C-13)を組み合わせても、ピッタリハマるがまともに動作しなかった。動作検知しない&ノイズが出た。

ake-1と秋月のフレネルレンズの装着図。瞬間接着剤で固定する。右上の凸型のおかげでズレることもない。基盤との接続には、ブレッドボード用のQiコネクタ(メス)を3個くっつけてコネクタにした。

③ノイズ除去
センサから出力されるanalog値の変動をarduinoで取得するが、これも微小な変動なので、判定する時にノイズが入ると邪魔になる。ノイズ除去のバイパスコンデンサ10μFをV-GND間とGND-センサ間に入れる。
また、反応を良くするためGND-センサ間にプルアップ抵抗10kΩを入れる。省くと検知性能が下がる。
そして受け側のarduinoで微小な変動を検出するため、Analog基準電圧を1.1Vにする。(ake-1のオフセット電圧は0.7Vなので)
  analogReference(INTERNAL);
とする。

以上を、これまでに試した温湿度センサとLCDを一緒にして16ホールユニバーサル基盤4×4枚に乗せる。


■材料
・arduino FIO
・温湿度センサモジュールDHT11
・赤外線センサake-1
・CDSセル
・LCD(SD1602VBWB)
・シフトレジスタ(74HC595)
・LED
・10kΩ カーボン抵抗
・10μF コンデンサ

基盤に乗せたものを、昔購入したiPodの外装プラケースに入れる。センサー用の穴とUSBケーブル用の穴を開け(作業的にはこれが一番大変だが)、基盤を固定するため隙間をデコパネ切って埋めて完成。

■構成
・AKE-1(S) → A3
・CDSセル → A1
・LED → D5
・DHT11(S) → D4
・LCD LED(15) → D3
・74HC595の接続は省略

スケッチ
機能は、単純に温度・湿度・CDSセルのレベル、赤外線センサによる動作検知レベルを液晶画面に表示するのみ。しきい値以上の動作を赤外線センサで検知したら、D5につなげたLEDがチカっとする。


上記では単体で動くだけなので、Xbeeを使ってIoTゲートウェイと連携する機能、IoTゲートウェイからクラウドサービスへ連携する機能を今後付けたい。

温湿度センサ DHT11を試す。2015/01/29 01:15

温度と湿度が手軽に得られるモジュールを探していた。
秋月で520円程度で売られていた温湿度センサモジュールDHT11を使用した。
http://akizukidenshi.com/catalog/g/gM-07040/

DHT11により計測された温度、湿度はデジタル出力で得られる。
適当なライブラリを使わないと、データが得られない。
分解能は湿度:1%、温度:1℃。細かい値は得られない。

以下のサイトではDHT11について、あまりよろしくない性能である事の記載があったが、
その事は購入後に知った(泣)。参考程度にわかれば良いとあきらめる。
http://www.geocities.jp/bokunimowakaru/diy/arduino/humidity.html

秋月のDHT11はDF ROBOTという中国の会社がモジュール化した製品であり、
DF ROBOTのサイトに載っているArduinoライブラリをそのまま使用し、
サンプルもそのまま使う事で値が得られる。DATAは4番PINに入れる。
https://www.dfrobot.com/index.php?route=product/product&product_id=174

本体から伸びる線のどれが何なのか、説明情報がなく不親切な感じだが
なんとなく赤=Vdd、黒=GND、緑=DATAとしてつなげてsampleスケッチを動かしてみると
値が得られた。

Lチカ並みのお手軽さなのはありがたい。
VCCは3.3~5.5Vなので、3.3Vマシンでもそのまま使える。
DHT11のデータシートではDATAとVdd間に5KΩ入れる事に
なっているが、モジュール内に内蔵されているようなので無視して使える。