まとめ Raspberry Pi i2cモジュールを使ってみる

Raspberry Pi でのi2cモジュールの使ったものについてまとめてみました。

written by gatamix

ラズパイ(41) センサーの値をmysqlに書き込む

Gatamixです。
温度センサー(lps25h)の値をデータベースに書き込んでみます。

python ライブラリーのインストールをします。

$sudo apt-get install python-dev
$sudo apt-get install libmysqlclient-dev
$sudo pip install MySQL-python

メタ変数は以下です。
foge:データベース名
huga:テーブル名
foo:ユーザー名
passwd:パスワード

書き込み用のpythonコードです。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
 
import smbus
import time
import sys
import datetime
import MySQLdb

Device_add = 0x5d 
 
#通信確認
whoami = smbus.SMBus(1).read_byte_data(Device_add, 0x0f)
if whoami != 0xbd:
    print('接続できません')
    sys.exit()

#レジスタ切り替え(モード変更)
smbus.SMBus(1).write_byte_data(Device_add, 0x20, 0x90) 
time.sleep(1)

#データ読み込み

buff = [0 for i in range(5)]
buff[0] = smbus.SMBus(1).read_byte_data(Device_add, 0x28)
#print("buff[0]=%x" % buff[0])
buff[1] = smbus.SMBus(1).read_byte_data(Device_add, 0x29)
#print("buff[1]=%x" % buff[1])
buff[2] = smbus.SMBus(1).read_byte_data(Device_add, 0x2A)
#print("buff[2]=%x" % buff[2])
buff[3] = smbus.SMBus(1).read_byte_data(Device_add, 0x2B)
#print("buff[3]=%x" % buff[3])
buff[4] = smbus.SMBus(1).read_byte_data(Device_add, 0x2C)
#print("buff[4]=%x" % buff[4])

Data = [0 for i in range(2)]

"""---------------------------
圧力データ24bitデータ
8bitデータをシフトして結合
---------------------------"""

Data[0] = (buff[2] << 16 | buff[1] << 8 | buff[0])

"""---------------------------
温度データ16bitデータ
8bitデータをシフトして結合
---------------------------"""

Data[1] = (buff[4] << 8 | buff[3])

"""------------------------
圧力データの計算
Pout(hPa) = PRESS_OUT / 4096
-------------------------"""

Data[0] = float(Data[0]) / 4096

"""---------------------------
マイナスデータの補正と
温度データの計算
T(°C) = 42.5 + (TEMP_OUT / 480)
----------------------------"""

if Data[1] & 0x8000:
    Data[1] = -((Data[1] - 1) ^ 0xffff)
Data[1] = float(Data[1]) / 480.0 + 42.5

#出力-------------------------

print("Pressure %.2f hPa" % (Data[0]))
print("Temperature %.2f degree" % (Data[1]))

connector = MySQLdb.connect(host="localhost", db="hoge", user="foo", passwd="passwd", charset="utf8")
cursor = connector.cursor()
 
str_tmp = "%6.2f" % Data[1]
sql = u"insert into fuga values(now(), %s)" % str_tmp
cursor.execute(sql)
 
connector.commit()
 
cursor.close()
connector.close()

確認
$sudo mysql -u foo -p
>use hoge;
>select * from fuga;

written by gatamix

ラズパイ(36) センサーで測定した値をメールで送る

Gatamixです。
センサーを使っての一つの目標だったデータの送信を行ってみました。
使ったセンサーはいつものLPS25Hです。
処理の流れは以下です。
①データの取得(温度、気圧)
②CSVに記録
③プログラムで自動でグラフ作成
④メールでCSVファイルとPNGファイルを送信する
記録:添付ファイルのヘッダーを追加するところでスペルミスをしました。
メールの添付ファイルがファイル名が表示されないという結果があらわれて、
ミスをしてもメールは送信されたので原因が究明に時間がかかりました。
*MIMEについてMultipurpose Internet Mail Extensionsの略である。
電子書式で色々なフォーマットを取り扱うための規格。
ここが間違えると上手く表示されない。


以下コード(長いですが参考までに記載します。)

written by gatamix

ラズパイ(32) センサーで測定したデータをグラフに自動描画する

Gatamixです。
Raspberry piの調子がイマイチですが、LPS25Hを使って以下のことをやってみました。
①データの取得(温度、気圧)
②CSVに記録
③プログラムで自動でグラフ作成
スケールを自動にするとオフセットでグラフが表示されるのでオフセットをなしに設定しました。
以下プログラム。
Raspberry pi でascii コードのエラーで℃が表示できなかったのを解決しました。
(python 2.7だからか?Mac python 3.6では表示できた。)
温度の単位をTex 形式で表示できるので、
変更。deg. → $^\circ$C

written by gatamix

ラズパイ(27) センサー(LPS25H)で測定したデータをcsvファイルに保存する

Gatamixです。
最近の記事で、CSVの取り扱いをやってきました。
今回は、センサー(LPS25H)で測定したデータをCSVに保存します。
簡単に説明すると、
 ①センサーの初期設定
 ②データの読み込み
 ③CSVの書き込み
 ④インターバル
 ⑤、②〜④を繰り返す
 ⑥データ名の変更
となります。
これまでの記事の内容でできました。
プログラムです。

written by gatamix

ラズパイ(24) LPS25H 番外編 ビット演算と2の補数について

少し補足します。
スマホだと横にしないと上手く表示されないかもしれません。
・bitの結合について
前のプログラムで
Data[0] = (buff[2] << 16 | buff[1] << 8 | buff[0])
と気圧のデータを処理している場所があると思います。
例えば
buff[2] = 0x0f(16進数) = 00001111(2進数)
buff[1] = 0x4e(16進数) = 01001110(2進数)
buff[0] = 0x33(16進数) = 00110011(2進数)
とする場合
上位のbitの場合buff[2]を16bit 左にシフトしているので
00001111 00000000 00000000(2進)
となります。
これらを論理和で計算する場合は、以下となります。

 

 

 

・負の値の補正
前のプログラムの
if Data[1] & 0x8000:
Data[1] = -((Data[1] – 1) ^ 0xffff)
の部分の補足です。
マイナスの場合に2の補数でデータが格納されているので
そのままだと正の値で計算されてしまうので
絶対値にして、マイナス符号をつけて、格納します。
2の補数は反転して( 排他的論理和(xor)をffff(16進)と行うことで反転します。)
それに1を足すことで作ります。

2補数の作成例

 

 

 

このプログラムの場合は2の補数を戻すので、
1を引いて、反転する(xor ffff(16進数))ことで求めます。
参考リンク

関連
Raspberry Pi(23)MEMSセンサー LPS25Hで温度と気圧の取得

written by gatamix

ラズパイ(23)MEMSセンサー LPS25Hで温度と気圧の取得

i2cセンサーのLPS25Hを使用して温度と気圧を測定しました。
データシートによると圧力センサーはMEMSで出来ているようです。
データシート
http://www.st.com/ja/mems-and-sensors/lps25h.html
Raspberry Pi との接続は、以下のようにRaspberry pi 側 4箇所
(VDD:電源、SCL:クロック、SDA:通信、GND )
デバイス側6箇所でした。
(上記に加えて、CS:i2cモード選択,SDO:デバイスアドレス選択)
ジャンパーワイヤーで接続すると抜けやすくて大変でした。
(ワイヤーが途中で抜けて、プログラムのエラーの原因が一時不明になった。)
プルアップはRaspberry Pi の内部で行われているので、不要です。
接続の回路図です。


次にプログラミングです。Pythonで作成しました。
通常のユーザーだとi2cのアクセス権限がない場合(未設定の場合)があります。
ユーザーグループにi2cを加えて下さい。
smbus の関数についてはなかなか理解ができず苦戦しました。
一応、参考にしたサイトのリンクを貼っておきます。

***変更***
http://iwasakiyouhei.com/post-2508/を参考にしましたが、リンクが繋がらない。
同じく参考にした http://geckour.orz.hm/blog/web/2016/07/12/179 もページが消えています。
********

この接続の場合はデータのアドレスは0x5dになります。
大まかな流れとしては、
①通信確認(WHO_AM_I)としてレジスタアドレス0x0Fから0xBDを読み込む。
②モード切り替えのためレジスタアドレス0x20へ0x90を書き込む。
③レジスタから8bitデータを読み込む×5
④読み込んだデータを結合して気圧は24bit、温度は16bitのデータにする。(シフトして論理和で結合する。)
⑤補正の計算する。気圧:Pout(hPa) = PRESS_OUT / 4096、気温:T(°C) = 42.5 + (TEMP_OUT / 480)
⑥出力する。
作ったプログラムは以下です。

関連
Raspberry Pi(24) LPS25H 番外編 ビット演算と2の補数について

written by gatamix