×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
MoistureSenser(土壌水分計) を使ってみる
1.ADコンバータはMCP3028の10ビットと12ビット
2.ADコンバータの接続
16vxx ---- 3.3v
15VR ---- 3.3V
14GND--- GND
13CLK ---- SCLK
12Dout--- MSO
11Din --- MSI
10CS ---- CE0
9DGND -- GND
3.MoistureSenserの接続
赤 3.3V
黒 GND
青 CH0
4.データの校正
完全水没で
3.3Vで 5Vで
12ビット 2496 2V前後 4095 3.299V
10ビット 613 1.97V 1023 3.299
メーカーのHPを見ると Arduinoの例で内蔵ADが10ビットだから
5vで
0から300 乾燥
300から700 標準
700から950 水びたし
校正結果
10ビットで使用して
上記を採用
5.ソースコードは
MP3208msenser10.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#sudo apt-get install python-spidev
import time
import sys
import spidev
spi = spidev.SpiDev()
spi.open(0,0)
def readadc(adcnum):
r = spi.xfer2([1, 8 + adcnum << 4, 0])
adcout = ((r[1] & 3) << 8) + r[2]
return adcout
def readadc12(adcnum):
if adcnum > 7 or adcnum < 0:
return -1
r = spi.xfer2([4 | 2 | (adcnum >> 2), (adcnum & 3) << 6, 0])
adcout = ((r[1] & 15) << 8) + r[2]
return adcout
def convertVolts(data):
volts = (data * 3.3) / 1023
#volts = round(volts,4)
return volts
def convertVolts12(data):
volts = (data * 3.3) / 4095
#volts = round(volts,4)
return volts
if __name__ == '__main__':
try:
while True:
data = readadc(0) #12ビット readadc12(0)
print("adc10bit : {:8.5f} ".format(data))
volts =convertVolts(data) #12ビット convertVolts12(0)
print("adc10volt : {:8.5f} ".format(volts))
time.sleep(3)
except KeyboardInterrupt:
spi.close()
sys.exit(0)
1.ADコンバータはMCP3028の10ビットと12ビット
2.ADコンバータの接続
16vxx ---- 3.3v
15VR ---- 3.3V
14GND--- GND
13CLK ---- SCLK
12Dout--- MSO
11Din --- MSI
10CS ---- CE0
9DGND -- GND
3.MoistureSenserの接続
赤 3.3V
黒 GND
青 CH0
4.データの校正
完全水没で
3.3Vで 5Vで
12ビット 2496 2V前後 4095 3.299V
10ビット 613 1.97V 1023 3.299
メーカーのHPを見ると Arduinoの例で内蔵ADが10ビットだから
5vで
0から300 乾燥
300から700 標準
700から950 水びたし
校正結果
10ビットで使用して
上記を採用
5.ソースコードは
MP3208msenser10.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#sudo apt-get install python-spidev
import time
import sys
import spidev
spi = spidev.SpiDev()
spi.open(0,0)
def readadc(adcnum):
r = spi.xfer2([1, 8 + adcnum << 4, 0])
adcout = ((r[1] & 3) << 8) + r[2]
return adcout
def readadc12(adcnum):
if adcnum > 7 or adcnum < 0:
return -1
r = spi.xfer2([4 | 2 | (adcnum >> 2), (adcnum & 3) << 6, 0])
adcout = ((r[1] & 15) << 8) + r[2]
return adcout
def convertVolts(data):
volts = (data * 3.3) / 1023
#volts = round(volts,4)
return volts
def convertVolts12(data):
volts = (data * 3.3) / 4095
#volts = round(volts,4)
return volts
if __name__ == '__main__':
try:
while True:
data = readadc(0) #12ビット readadc12(0)
print("adc10bit : {:8.5f} ".format(data))
volts =convertVolts(data) #12ビット convertVolts12(0)
print("adc10volt : {:8.5f} ".format(volts))
time.sleep(3)
except KeyboardInterrupt:
spi.close()
sys.exit(0)
PR
RapberryPI 2016年8月現在の初期設定
(2016年12月版を参照しましょう これは古い)
雑誌やgoogle先生の情報が追い付いていないので、今日現在の情報をまとめてみた
0.SDカード関連別
・初期の初期
sudo apt-get update
sudo apr-get upgrade
sudo apt-get install ibus-mozc fonts-takao
・環境設定から
SetLocation
japan jp utf-8
Set Timezone
jappan
setKeyBord
japan japan
でリブート
JPの表示からmozcの選択
でリブート
1.事前準備
・OSを最新に
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
・各種もろもろのモジュールを pipが便利です
pipはPython 2.7.9以降、Python 3.4以降でデフォルトでインストールされている
*sudo apt-get install python3-pip python-pip 最新版がインストール済みと怒られた
sudo apt-get install python-dev
sudo apt-get install python3-dev すでに最新版ですと怒られた
sudo apt-get install git-core すでに最新版ですと怒られた
sudo apt-get install python-setuptools
sudo apt-get install python3-setuptools これがうまく実行できない
ときは
https;//pypi.python.org/pypi/setupypplsからpypa-setuptoos-xxxx
pypa-setuptools-xxxにディレクトリを移動して
sudo python3 setup.py install を実行
2.I2Cの設定
・設定 >> Raspberryの設定 >> 設定画面
I2Cを有効にする
・python-smbusモジュールのインストール
sudo apt-get install python3-sumbus #python3
sudo apt-get install python-smbus #python2
・libi2c-devドライバーのインストール(不必要かもしれないが念の為)
sudo apt-get install libi2c-dev
・I2Cツールのインストール
sudo spt-get intall i2c-tools
(i2cdetect -y 1でアドレスの確認)
(i2cget -y 1 0x?? b) アドレスで読み出し
(i2cget -y 1 0x?? 0x?? b) アドレスとレジスタ番号で読出
・ちょっと上級でリピートコンディション
信号が1バイトごとにスタートエンドに挟まれて送られるが
機種によってはリピートコンデュションを使って連続送受信モードのものもある
その場合は、設定しないとレジスタ0番号しか読まない
/etc/modprobe.d/i2c.confを作成
options i2c_bcm2708 combined-1を記入 reboot
ただし複数の機器を接続しているときは要注意
3.SPIの設定
・Menu>>設定>>RaspberryPiの設定>>インターフェース
SPIを有効
・python-spidev のインストール
sudo apt-get install python-spidev すでに最新版ですと怒られた
sudo apt-get install python3-spidev すでに最新版ですと怒られた
4.wiringpiのインストール
先にdevとsetuotoolは必須
sudo pip install wiringpi
sudo pip3 install wiringpi
sudo pip install wiringpi2
sudo pip3 install wiringpi2
古い機種なら
sudo apt-get install git-core を実行済みとして
sudo python setup.py install
5.機種別ライブラリのインストール
gitでメーカー等で公開されているソースをコピー
コピーしたディレクトリにチェンジして
sudo python setup.py installで
を実行
6.ブラウザ
(2016年12月版を参照しましょう これは古い)
雑誌やgoogle先生の情報が追い付いていないので、今日現在の情報をまとめてみた
0.SDカード関連別
・初期の初期
sudo apt-get update
sudo apr-get upgrade
sudo apt-get install ibus-mozc fonts-takao
・環境設定から
SetLocation
japan jp utf-8
Set Timezone
jappan
setKeyBord
japan japan
でリブート
JPの表示からmozcの選択
でリブート
1.事前準備
・OSを最新に
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
・各種もろもろのモジュールを pipが便利です
pipはPython 2.7.9以降、Python 3.4以降でデフォルトでインストールされている
*sudo apt-get install python3-pip python-pip 最新版がインストール済みと怒られた
sudo apt-get install python-dev
sudo apt-get install python3-dev すでに最新版ですと怒られた
sudo apt-get install git-core すでに最新版ですと怒られた
sudo apt-get install python-setuptools
sudo apt-get install python3-setuptools これがうまく実行できない
ときは
https;//pypi.python.org/pypi/setupypplsからpypa-setuptoos-xxxx
pypa-setuptools-xxxにディレクトリを移動して
sudo python3 setup.py install を実行
2.I2Cの設定
・設定 >> Raspberryの設定 >> 設定画面
I2Cを有効にする
・python-smbusモジュールのインストール
sudo apt-get install python3-sumbus #python3
sudo apt-get install python-smbus #python2
・libi2c-devドライバーのインストール(不必要かもしれないが念の為)
sudo apt-get install libi2c-dev
・I2Cツールのインストール
sudo spt-get intall i2c-tools
(i2cdetect -y 1でアドレスの確認)
(i2cget -y 1 0x?? b) アドレスで読み出し
(i2cget -y 1 0x?? 0x?? b) アドレスとレジスタ番号で読出
・ちょっと上級でリピートコンディション
信号が1バイトごとにスタートエンドに挟まれて送られるが
機種によってはリピートコンデュションを使って連続送受信モードのものもある
その場合は、設定しないとレジスタ0番号しか読まない
/etc/modprobe.d/i2c.confを作成
options i2c_bcm2708 combined-1を記入 reboot
ただし複数の機器を接続しているときは要注意
3.SPIの設定
・Menu>>設定>>RaspberryPiの設定>>インターフェース
SPIを有効
・python-spidev のインストール
sudo apt-get install python-spidev すでに最新版ですと怒られた
sudo apt-get install python3-spidev すでに最新版ですと怒られた
4.wiringpiのインストール
先にdevとsetuotoolは必須
sudo pip install wiringpi
sudo pip3 install wiringpi
sudo pip install wiringpi2
sudo pip3 install wiringpi2
古い機種なら
sudo apt-get install git-core を実行済みとして
git clone https://github.com/neuralassembly/WiringPi2-Python.gitディレクトリをWiringPi2-Pythonにチェンジして
sudo python setup.py install
5.機種別ライブラリのインストール
gitでメーカー等で公開されているソースをコピー
コピーしたディレクトリにチェンジして
sudo python setup.py installで
を実行
6.ブラウザ
sudo apt-get install iceweasel iceweasel-l10n-ja
でOK
BME280をI2Cモードで使ってみる
google先生で検索すると山のようにでてくるので、
スイッチサイエンスのBME280を参照してみる
https://github.com/SWITCHSCIENCE/BME280
BME280について詳しい日本語の説明も記載されているのでありがたく
参照させていただく。
まずは
1.RaspberyPiをI2Cに有効に、
2.python-sumbusパッケージをインストール
sudo apt-get install python3-smbus
sudo apt-get install pyhton-smbus
3.I2Cツールをインストール
sudo apt-get install i2c-tools
4.結線
1--VDD
2--GND
3--X
4--SDA(3)
5--GND
6--SCL(5)
5.I2Cアドレスの確認
sudo I2Cdetect -y 1
00X74
6.先のスイッチサイエンスのソースをダウンロードして実行
print文に ()を忘れずに
BME280test2.py
1.ADT7410の13bitと16bitの切り替え
コンフィギュレーション・レジスタを1にする
ADT7410のコンフィグレジスタは0X03
上位1ビットが1なら16ビット 0なら13ビット
i2c.write_byte_data(adt7410_addr,0x03,0x00) が13ビット
i2c.write_byte_data(adt7410_addr,0x03,0x80) が16ビット
2.分解能が
13ビットなら1/16
if (data>4096):
data = data - 8192
data = data /16.0
16ビットなら
if (data>= 32768): マイナスフラグが上位1ビットのため
data= temp - 65536
data = data/128.0
3.13ビットのデータソース
#i2c adt7410
import time
import smbus
#make new
i2c = smbus.SMBus(1)
#i2caddr
adt7410_addr = 0x48
register7410 = 0x00
#rejista03 16bit
i2c.write_byte_data(adt7410_addr,0x03,0x00)
while True:
#rejisuta 0x00 0x01 2byte
datas = i2c.read_i2c_block_data(adt7410_addr,register7410,2)
data = datas[0] << 8
data = data | datas[1]
data = data >> 3
if (data>4096):
data = data - 8192
data = data /16.0
print(data )
time.sleep(1)
4.16ビットの時のデータソース
#i2c adt7410
import time
import smbus
#make new
i2c = smbus.SMBus(1)
#i2caddr
adt7410_addr = 0x48
#rejista03 16bit
i2c.write_byte_data(adt7410_addr,0x03,0x80)
while True:
#rejisuta 0x00 0x01 2byte
t_data = i2c.read_i2c_block_data(adt7410_addr,0x00,2)
temp = t_data[0] << 8
temp = temp | t_data[1]
if (temp >= 32768):
temp = temp - 65536
now_temp = temp /128.0
print(now_temp)
time.sleep(1)
温度であまり意味がないが、、、
コンフィギュレーション・レジスタを1にする
ADT7410のコンフィグレジスタは0X03
上位1ビットが1なら16ビット 0なら13ビット
i2c.write_byte_data(adt7410_addr,0x03,0x00) が13ビット
i2c.write_byte_data(adt7410_addr,0x03,0x80) が16ビット
2.分解能が
13ビットなら1/16
if (data>4096):
data = data - 8192
data = data /16.0
16ビットなら
if (data>= 32768): マイナスフラグが上位1ビットのため
data= temp - 65536
data = data/128.0
3.13ビットのデータソース
#i2c adt7410
import time
import smbus
#make new
i2c = smbus.SMBus(1)
#i2caddr
adt7410_addr = 0x48
register7410 = 0x00
#rejista03 16bit
i2c.write_byte_data(adt7410_addr,0x03,0x00)
while True:
#rejisuta 0x00 0x01 2byte
datas = i2c.read_i2c_block_data(adt7410_addr,register7410,2)
data = datas[0] << 8
data = data | datas[1]
data = data >> 3
if (data>4096):
data = data - 8192
data = data /16.0
print(data )
time.sleep(1)
4.16ビットの時のデータソース
#i2c adt7410
import time
import smbus
#make new
i2c = smbus.SMBus(1)
#i2caddr
adt7410_addr = 0x48
#rejista03 16bit
i2c.write_byte_data(adt7410_addr,0x03,0x80)
while True:
#rejisuta 0x00 0x01 2byte
t_data = i2c.read_i2c_block_data(adt7410_addr,0x00,2)
temp = t_data[0] << 8
temp = temp | t_data[1]
if (temp >= 32768):
temp = temp - 65536
now_temp = temp /128.0
print(now_temp)
time.sleep(1)
温度であまり意味がないが、、、
ADT7410はI2Cで接続してsmbusを利用して通信する
前章でSPIを説明したので、I2Cを説明
・i2c = smbus.SMBus(1)
バス番号を選択
i2cツールで引数を0,1で検索してエラーにならない方で
・adt7410_addr = 0x48
センサーのアドレス I2Cツールで検索
・register7410 = 0x00
読み出しレジスター
#I2Cの読込み
def read():
datas = i2c.read_i2c_block_data(adt7410_addr,register7410,2)
data = datas[0] << 8
data = data | datas[1]
data = data >> 3
if (data>= 4096):
data = data - 8192
data = data /16.0
return data
・I2c.read_i2c_block_data(adt7410_addr,register7410,2)
アドレス0x48のレジスタ0から2バイト読みだし(13ビットだから)
13ビットだからはじめの1バイト[0]に8ビット 次の[1]に8ビット
セットされる(頭から13ビット分セット!)
[b12b11b10b9b8b7b6b5] [b4b3b2b1b0???]
・data = datas[0] << 8
datasにdatas[0]を8ビット左シフトしてセット
b12b11b10b9b8b7b6b500000000
・data = data | datas[1] OR演算だから
b12b11b10b9b8b7b6b5b4b3b2b1b0???
・ data = data >> 3
000b12b11b10b9b8b7b6b5b4b3b2b1b0
なおb12はマイナスフラグ
データシートを見ると
1/16=0.0625刻みだから
-0.0625で 00011111 11111111 0x1FFF =8191
+0.0625で 0000000 0000001 0X0001 = 1
-55 で0x1290 = 7312
+150で0x960 = 2400
つまり0~2400はプラスで
7312~8191はマイナス
この計算式では+の値だけになるので修正が必要
if (data>= 4096):
data = data - 8192
data = data /16
SPIとI2Cを同時に使用して
アナログLM35温度センサーの値を10ビットと12ビット
デジタル温度センサーADT7410のI2Cの測定値の比較をしてみた
I2Cの有効化とsumbusの取り込み先に実施して
以下のソースで比較
--------------------------------------------------
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#sudo apt-get install python-spidev
import time
import sys
import spidev
import smbus
#I2Cの定義
i2c = smbus.SMBus(1)
adt7410_addr = 0x48
register7410 = 0x00
#SPIの定義
spi = spidev.SpiDev()
spi.open(0,0)
#SPIの10ビット読込
def readadc(adcnum):
r = spi.xfer2([1, 8 + adcnum << 4, 0])
adcout = ((r[1] & 3) << 8) + r[2]
return adcout
#SPIの12ビット読込
def readadc12(adcnum):
if adcnum > 7 or adcnum < 0:
return -1
r = spi.xfer2([4 | 2 | (adcnum >> 2), (adcnum & 3) << 6, 0])
adcout = ((r[1] & 15) << 8) + r[2]
return adcout
#SPI10ビットのLM35のボルト
def convertVolts(data):
volts = (data * 3.3) / 1023
#volts = round(volts,4)
return volts
#SPI12ビットのボルト
def convertVolts12(data):
volts = (data * 3.3) / 4095
#volts = round(volts,4)
return volts
#温度補正
def convertTemp(volts):
#temp = (100 * volts) - 50.0
temp = volts * 100
temp = round(temp,4)
return temp
#I2Cの読込み
def read():
datas = i2c.read_i2c_block_data(adt7410_addr,register7410,2)
data = datas[0] << 8
data = data | datas[1]
data = data >> 3
if (data>= 4096):
data = data - 8192
data = data /16.0
return data
if __name__ == '__main__':
try:
while True:
#10ビット
data = readadc(1)
volts = convertVolts(data)
temp = convertTemp(volts)
print("temp10bit : {:8.2f}".format(temp))
#12ビット
data = readadc12(1)
volts = convertVolts12(data)
temp = convertTemp(volts)
print("temp 12bit: {:8.2f}".format(temp))
#I2C
temp = read()
print("temp I2C: {:8.2f}".format(temp))
time.sleep(3)
except KeyboardInterrupt:
spi.close()
sys.exit(0)
-----------------------------------------------------------------
結果は
temp10bit : 24.84
temp12bit: 24.90
temp I2C: 25.12
でした
前章でSPIを説明したので、I2Cを説明
・i2c = smbus.SMBus(1)
バス番号を選択
i2cツールで引数を0,1で検索してエラーにならない方で
sudo i2cdetect -y 1
(0か1 ラズパイのバージョンによる)・adt7410_addr = 0x48
センサーのアドレス I2Cツールで検索
・register7410 = 0x00
読み出しレジスター
#I2Cの読込み
def read():
datas = i2c.read_i2c_block_data(adt7410_addr,register7410,2)
data = datas[0] << 8
data = data | datas[1]
data = data >> 3
if (data>= 4096):
data = data - 8192
data = data /16.0
return data
・I2c.read_i2c_block_data(adt7410_addr,register7410,2)
アドレス0x48のレジスタ0から2バイト読みだし(13ビットだから)
13ビットだからはじめの1バイト[0]に8ビット 次の[1]に8ビット
セットされる(頭から13ビット分セット!)
[b12b11b10b9b8b7b6b5] [b4b3b2b1b0???]
・data = datas[0] << 8
datasにdatas[0]を8ビット左シフトしてセット
b12b11b10b9b8b7b6b500000000
・data = data | datas[1] OR演算だから
b12b11b10b9b8b7b6b5b4b3b2b1b0???
・ data = data >> 3
000b12b11b10b9b8b7b6b5b4b3b2b1b0
なおb12はマイナスフラグ
データシートを見ると
1/16=0.0625刻みだから
-0.0625で 00011111 11111111 0x1FFF =8191
+0.0625で 0000000 0000001 0X0001 = 1
-55 で0x1290 = 7312
+150で0x960 = 2400
つまり0~2400はプラスで
7312~8191はマイナス
この計算式では+の値だけになるので修正が必要
if (data>= 4096):
data = data - 8192
data = data /16
SPIとI2Cを同時に使用して
アナログLM35温度センサーの値を10ビットと12ビット
デジタル温度センサーADT7410のI2Cの測定値の比較をしてみた
I2Cの有効化とsumbusの取り込み先に実施して
以下のソースで比較
--------------------------------------------------
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#sudo apt-get install python-spidev
import time
import sys
import spidev
import smbus
#I2Cの定義
i2c = smbus.SMBus(1)
adt7410_addr = 0x48
register7410 = 0x00
#SPIの定義
spi = spidev.SpiDev()
spi.open(0,0)
#SPIの10ビット読込
def readadc(adcnum):
r = spi.xfer2([1, 8 + adcnum << 4, 0])
adcout = ((r[1] & 3) << 8) + r[2]
return adcout
#SPIの12ビット読込
def readadc12(adcnum):
if adcnum > 7 or adcnum < 0:
return -1
r = spi.xfer2([4 | 2 | (adcnum >> 2), (adcnum & 3) << 6, 0])
adcout = ((r[1] & 15) << 8) + r[2]
return adcout
#SPI10ビットのLM35のボルト
def convertVolts(data):
volts = (data * 3.3) / 1023
#volts = round(volts,4)
return volts
#SPI12ビットのボルト
def convertVolts12(data):
volts = (data * 3.3) / 4095
#volts = round(volts,4)
return volts
#温度補正
def convertTemp(volts):
#temp = (100 * volts) - 50.0
temp = volts * 100
temp = round(temp,4)
return temp
#I2Cの読込み
def read():
datas = i2c.read_i2c_block_data(adt7410_addr,register7410,2)
data = datas[0] << 8
data = data | datas[1]
data = data >> 3
if (data>= 4096):
data = data - 8192
data = data /16.0
return data
if __name__ == '__main__':
try:
while True:
#10ビット
data = readadc(1)
volts = convertVolts(data)
temp = convertTemp(volts)
print("temp10bit : {:8.2f}".format(temp))
#12ビット
data = readadc12(1)
volts = convertVolts12(data)
temp = convertTemp(volts)
print("temp 12bit: {:8.2f}".format(temp))
#I2C
temp = read()
print("temp I2C: {:8.2f}".format(temp))
time.sleep(3)
except KeyboardInterrupt:
spi.close()
sys.exit(0)
-----------------------------------------------------------------
結果は
temp10bit : 24.84
temp12bit: 24.90
temp I2C: 25.12
でした