Raspberry piの日本語化

sshで接続しているとあまり関係がありませんが、ローカルコンソールで使っている場合、日本語の文字化けが起ります。
その回避法として、jfbterm を使う方法が有ります.

Raspi-configではDefault localeとしてja_JP.UTF-8を選択しているとします.

sudo aptitude -y install jfbterm
jfbtermをインストールします.これは一度だけ行います.

シェルでjfbtermを実行すると、日本語の文字化けの無いterminalが起動します.
raspberry piを立ち上げるごとにjfbtermを起動する必要が有り面倒な面も有りますが、普段はsshなどでリモートログインで利用する場合は関係ありません.運用次第と言ったところでしょうか。

Raspberry piにFTPを導入しよう

Raspberry piを運用しているとSDメモリーカードの破損に備えてデータのバックアップを行った方が良いでしょう。
その際に考えられる方法としてUSBメモリーへの保存もありますが、マウントなどの処理が案外面倒なものです.ここではFTPを使ってネットワーク越しに別のPCから必要なデータを吸い上げることを考えます.

そこでFTPの導入です.
Raspberry pi でftpを実現するためにはvsftpdを使います

–Vsftpdインストール

$ sudo apt-get update
$ sudo apt-get install vsftpd
*2.3.5-3 がインストールされました。

vsftpd.conf を編集しましょう

$ sudo service vsftpd stop
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf-ORG
$ sudo vi /etc/vsftpd.conf

—- 変更箇所だけ
anonymous_enable=NO #匿名ユーザー(anonymous)のログイン禁止

local_enable=YES #ローカルユーザーを許可

write_enable=YES #書き込み許可

local_umask=022 #ファイル作成時のパーミッション755

—- 以上

–Vsftpdの起動
$ sudo service vsftpd start
もしくは
$ sudo /etc/init.d/vsftpd start

同じネットワーク上の別のPCからFTPクライアントを使ってRapberry piに接続します.
ユーザー名:pi
パスワードはraspberry piにログインする時につかっているもの。
これでディレクトリーhome/piに接続できるでしょう

Raspberry piに送信メールサーバをインストールする

Raspberry piでGPIOを使って外部センサーからの情報を入力した際に、その結果をメールで通知することがあります.またUSBカメラを使った動体検出をトリガーとして報知システムを考えた場合にもメール送信を検討する事でしょう。

ここではRaspberry piでメール送信を行うための設定に付いて紹介します.
メールサーバーとしてpostfixをインストールします.

pi@raspberrypi ~ $ sudo apt-get install postfix

つぎに設定ファイルの作成です
/etc/postfix/main.cf に次の内容を追記します。ここではレンタルサーバーのリレーSMTPとして使います。gmailを使う事も出来ますのでご自分の使いやすい方を選んでください。

inet_protocols = ipv4
sender_canonical_maps = regexp:/etc/postfix/canonical
relayhost=[smtp.gmoserver.jp]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
smtp_sasl_security_options = noanonymous

/etc/postfix/relay_password を作成し上記サーバーのアカウント情報を記述します。

smtp.gmoserver.jp hoge@sample.com:foovar

お約束ごとですがhoge@sample.comの部分に実際のメールアカウント名を、foovarの部分にパスワードを記述します
次に /etc/postfix/canonical を作成します

/.*/ hoge@sample.com

ここでもお約束事ですね。hoge@sample.comをご自分の使う環境に合わせて書き換えてください。

つぎは先ほど作成したrelay_passwordからhash を作成します

sudo postmap hash:/etc/postfix/relay_password

最後にpostfix の再起動を行いましょう

sudo service postfix restart

エラーメッセージの無き事を確認してください.

mailコマンドを使う場合にはapt-get install でmailutilsをインストールしてください。

Raspberry piで大気圧センサーMPL115A1を使う

ここではRaspberry piで秋月電子で買える大気圧センサーモジュールを使ってみます.
I2Cインターフェイスに対応したMPL115A2もありますが今回はSPIインターフェイスに対応したMPL115A1を使います

IMG_1899

スクリーンショット 2013-12-14 6.13.23

事前にRaspberry piでSPI通信を行うための設定を済ませておきます.

今回はPythonでプログラムを組んでみました。
このデバイスではデバイスごとのばらつきを補正するための補正係数を内部に持っています。それら補正係数を読み出した上で大気圧を算出します。他のセンサーと比較して複雑な計算処理が必要になるという事で使いこなしは少々面倒です.Google検索で見つかる同様の使いこなしについての記事を見渡してもその計算はいろいろと工夫されているのがうかがえます.ここでは出来るだけデバイスのアプリケーションノートにそった形で作っています.


import spidev
import time
import math
#main
spi_ch = 0
spi = spidev.SpiDev()
spi.open(0,spi_ch)
spi.max_speed_hz=(100000)

msb = spi.xfer2([0x88,0x00])
lsb = spi.xfer2([0x8a,0x00])
a0=(msb[1]<<8)|lsb[1]
if a0 >> 15:
     a0 = ~a0
a0int= (a0>>3)& 0b111111111111
a0fract = (a0 & 0b111)/8.0
a0val = a0int + a0fract*(0.1** int(math.log10(a0fract)+1))
print a0val
if a0>>15:
     a0=-a0val
else:
     a0 = a0val
print 'a0',a0

msb = spi.xfer2([0x8c,0x00])
lsb = spi.xfer2([0x8e,0x00])
b1 = (msb[1]<<8)|lsb[1]
if b1 >>15:
     b1 = ~b1
b1int= (b1>>13)& 0b11
b1fract = (b1 & 0b1111111111111)/8191.0
b1val = b1int + b1fract*(0.1** int(math.log10(b1fract)+1))
if b1 >> 15:
     b1=-b1val
else:
     b1=b1val
print 'b1',b1

msb = spi.xfer2([0x90,0x00])
lsb = spi.xfer2([0x92,0x00])
b2 = (msb[1]<<8)|lsb[1]
if b2 >>15:
     b2 = ~b2
b2int= (b2>>14)& 0b1
b2fract = (b2 & 0b11111111111111)/16383.0
b2val = b2int + b2fract*(0.1** int(math.log10(b2fract)+1))
if b2>>15:
     b2=-b2val
else:
     b2 =b2val
print 'b2',b2

msb = spi.xfer2([0x94,0x00])
lsb = spi.xfer2([0x96,0x00])
c12 = (msb[1]<<8)|lsb[1]
c12 >>= 2
c12value = c12 / 4194304.0
c12 = c12value
print 'c12',c12

print
values=[]
for i in range(10):
     spi.xfer2([0x24,0x00])
     time.sleep(0.003)
     padcm=spi.xfer2([0x80,0x00])
     padcl=spi.xfer2([0x82,0x00])
     padc = ((padcm[1]<<8) | padcl[1])
     tadcm=spi.xfer2([0x84,0x00])
     tadcl=spi.xfer2([0x86,0x00])
     tadc = ((tadcm[1]<<8)| tadcl[1])
     padc >>= 6
     tadc >>= 6
     c12x2 = c12*tadc
     a1 = b1 + c12x2
     a1x1 = a1*padc
     y1 = a0 +a1x1
     a2x2 = b2*tadc
     pcomp =y1+a2x2
     pressureValue = (pcomp *65.0/1023.0+50)*10 # hPa
     print "%d:pressure:%0.2f hPa"%(i,pressureValue)
     values.append(pressureValue)
sum = 0.0
for i in range(len(values)):
     sum += values[i]
ave = sum/len(values)
print"average pressure: %0.2f hPa"%ave

実行するとコンソールには補正係数の計算途中も表示されます。不要な場合はコメントアウトまたは削除して構いません。測定ばらつきを吸収するために10回測定値の平均を最後に表示するようにしています.単位は天気予報でもなじみのあるヘクトパスカル(hPa)です。

上手く動作すれば、天気予報でみる気圧と同じ様な値が出てくるはずです.気圧は標高にも左右されそしてセンサーの周りの気圧変化にも非常に敏感です.センサーの近くで息を吹きかければそれも気圧の変化を及ぼします.正確な測定値を期待する場合には設置場所にも配慮する必要が有ります.

定点観測する事で気圧の変化のトレンドを知ることができます.たとえば低気圧の通過に伴ってセンサーの出力結果も値が上下するのが分かるはずです.大気圧の測定は気圧の変化のあくまで結果(現在の事象)であり、そこから未来の天気を予報をするのは難しいと思います.測定結果と同時に天候の様子を記録し、それぞれの相関を観察するのも面白いでしょう。天気が急速に変化する時には大気圧も急激に変化していきます。台風の通過では気圧が普段よりも一層低い値を示します.

Raspberry piを使えば測定結果をその都度メールで発信したり、Twitterでtweetしたり、GoogleDocのスプレッドシートに記録したりと、応用範囲はずっと広がります。ぜひ挑戦してみてください.

温度センサーADT7310をRaspberry piで使う

温度センサーADT7310をRaspberry piで使ってみます.
秋月電子で売られている同タイプの温度センサーにはI2Cインターフェイスに対応したADT7410もあります。
ここではSPIに対応したADT7310を使います。
IMG_1900

スクリーンショット 2013-12-14 5.55.12

事前にRaspberry piでSPIが使えるようシステムの設定を済ませておきます。
ここではPythonで制御します

import spidev
import time
spi_ch = 1
spi = spidev.SpiDev()
spi.open(0,spi_ch)
spi.max_speed_hz=(100000)   #クロック周波数を設定
spi.xfer2([0x08,0x80])  # センサーを16ビット精度に設定
time.sleep(0.5)
spi.xfer2([0x54]) #連続モードにセット
time.sleep(1) #ADT7410が測定データをAD変換するための時間を待つ
ret = spi.xfer2([0xff,0xff]) #ダミーの2バイトをセンサーに書き込んで2バイトの温度データを読み取る
temp = ret[0]<<8 | ret[1]
temp /= 128.0      #℃に変換
print "temparature:",temp
print "stop:",spi.xfer2([0x50]) #連続モードを停止
spi.close()

無事動作すればコンソールに現在温度を表示するはずです。定時観測に使う場合はこのプログラムに測定結果をメールなどで飛ばす処理を加えたスクリプトにしてcronで定期的に呼び出すようにすると良いでしょう。
ADT7310の制御コマンドは他にも有りますが、順番など含めて動作を確認できたのが上で紹介したコマンドの流れになります.使いこなしによっては他のコマンドも使えると思います。いろいろと試してみてください。

Raspberry piにはSPIで使えるCE信号がCE0とCE1の二つしか無いと言う事はSPIデバイスを二つ使えるという事ですね。液晶デバイスなどSPIシリアルを持ったモジュールなども有りますので使いこなしてみるのも面白いでしょうね。

今回はSPIシリアルを持った温度センサーを使いました。同タイプの温度センサーモジュールにはI2Cインターフェイスを持ったものが有ります.他にも気圧センサーなどもSPIとI2Cのどちらかを選択することができます.もっと多くのモジュールをつなげたい、ほかのセンサーも同時に使いたいと言った時にはI2C対応のモジュールを検討してみると良いでしょう。(それでもI2Cアドレスが競合してしまっては使えないので気をつけましょう)