忍者ブログ
[28]  [29]  [30]  [31]  [32]  [33]  [34]  [35]  [36]  [37]  [38
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ADT7410はI2Cで接続してsmbusを利用して通信する
前章で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

でした

拍手

PR
ADコンバータであるMCP3XXXを使う下準備

違いは3008は10ビット(1024) 3208は12ビット(4096)

3208は10ビットの読み出しも可能



1.RaspberyPiでSPIの使用を有効に
 Menu>>設定>>RaspberryPiの設定>>インターフェース>>SPI
 を有効

2.パッケージをインストール
 python-spidev と python-dev (python)
 python3-spidev と python3-dev(python3)
 
 python2用とpython3用の2種類
  
 sudo apt-get install python-spidev python-dev
 sudo apt-get install python3-spidev python3-dev



3.使い方は
 import spidev
 
 spidev.SpiDev() で初期化
 spi.open(bus,device) でオープン device= CE0   1=CE1
 spi.close() で終わり


4.ソース 3008(10ビット)と3208(12ビット)
----------------------------------------------------------
!/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
def convertTemp(volts):
    #temp = (100 * volts) - 50.0
    temp = volts * 100
    temp = round(temp,4)
    return temp

if __name__ == '__main__':
    try:
        while True:
            data = readadc(1)
            print("adc10bit  : {:8} ".format(data))
            volts = convertVolts(data)
            temp = convertTemp(volts)
            print("volts10bit: {:8.2f}".format(volts))
            print("temp10bit : {:8.2f}".format(temp))

            data = readadc12(1)
            print("adc12bit  : {:8} ".format(data))
            volts = convertVolts12(data)
            temp = convertTemp(volts)
            print("volts12bit: {:8.2f}".format(volts))
            print("temp 12bit: {:8.2f}".format(temp))
           

            time.sleep(3)
    except KeyboardInterrupt:
        spi.close()
        sys.exit(0)

----------------------------------------------------------

4.1、ビット操作
 AD変換をする以上、ビット操作は必須である。
 

    r = spi.xfer2([4 | 2 | (adcnum >> 2), (adcnum & 3) << 6, 0])
    adcout = ((r[1] & 15) << 8) + r[2]

 3208は
 [000001Dd2 ,d1d2xxxxxx,xxxxxxxx]
 でデータを渡して
 [????????,???Nb11b10b9b8,b7b6b5b4b3b2b1b0]でデータが
 帰ってくる

4.2.送信データの説明
 d2d1d0 =チャネルのビット表示 0=000,1=001、7=111
  ・di[0]=[000001Dd2]  
       00000100 
       00000010
       0000000D2
      でor
       0000011d2を送信。。。。
   
 ・di[1]=[D1D2xxxxxx]
  チャンネルと00000011をandで上位8ビットをマスク
  6ビット左シフト
  [D1D2000000]をセット
 
  ・di[2]=[,xxxxxxxx]
    [00000000]をセット

4.3。受信データの説明(データシート参照)
 r[1]の上位4ビットをマスクする つまりビット操作のANDで
 15=00001111でビット操作
 r[1] = [0000b11b10b9b8]
    これを8ビット左シフトしてr[2]と連結すると
    [0000b11b10b9b8b7b6b5b4b3b2b1b0]と目出度くデータ取得



4.4volts = (data * 3.3) / 4095
 データシートを見ると4096が正解のようである


 
5.MCP3208をライブラリ化して利用
(日経リナックスの9月号を引用)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import spidev
class Mcp3208():
    def __init__(self, bus=0, device=0, vref=3.3):
        self.spi = spidev.SpiDev()  # spi初期化
        self.bus = bus
        self.device = device
        self.vref = vref
    def __read(self, ch):
        v = self.spi.xfer2([4 | 2 | (ch >> 2), (ch & 0x03) << 6, 0])
        value = ((v[1] & 0x0f) << 8) | v[2]
        return value
    def raw(self, ch):
        self.spi.open(self.bus, self.device)  # デバイス使用開始
        value = self.__read(ch)  # デバイスから値を取得
        self.spi.close()  # デバイス使用終了
        return value
    def get(self, ch):
        self.spi.open(self.bus, self.device)  # デバイス使用開始
        value = self.__read(ch)  # デバイスから値を取得
        result = (value * self.vref / 4096.0)
        self.spi.close()  # デバイス使用終了
        return result
-------------------------------------------------------------------------
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import adc
import math
import time
import sys
def main():
    bus = 0
    device = 0
    vref = 3.3
    mcp3208 = adc.Mcp3208(bus, device, vref)
    # 温度の測定
    channel = 0
    result = mcp3208.get(channel)
    t = result * 100
    print("lm35dz:{:8.2f}".format(t))
 
if __name__ == "__main__":
    try:
      while True:
         main()
         time.sleep(1)
    except KeyboardInterrupt:
         sys.exit(0)    
---------------------------------------------------

おまけ
spidevを使わない方法もあるようでして
詳細はgoogle先生で「Mp3208 python 」で検索
シリアル通信を手組すれば良いわけですが、
データシートを見ながら解析するとSPI通信の中身が
よく理解できる。
これはこれでトラブルがあった時に原因を追及しやすい


拍手

SUNFOUNDERのセンサーキットセットのDHT11
pyhtonのサンプルソースをダウンロードして動作確認したが、
動かない、

で色々とgoogle先生に相談しながら、テストを開始

githubにDHT11のソースコードが上がっていたので
ダウンロードhttps://github.com/szazo/DHT11_Python

今後の事もあるのでgithubを
sudo apt-get install git
でインストール

git clone https://github.com/szazo/DHT11_Python.git

でクーロンを作成

作成されたDHT11_Pythonの中身の
dht11_example.pyを修正

今回は、ラズパイのGPIO4 (BCMGPIO 23)につないだので
instance = dht11.DHT11(pin=23)に修正


sudo python dht11_example.py


で実行できた でも湿度がおかしい

ちなみに
Adafruit内のAdafruitDHTを
sudo python AdafruitDHT.py 11 23で実行しても湿度がおかしい


拍手

WiringPi自体はOSに含まれているが

sudo pip3 install wiringpiで
python用のライブラリをインストールする事
sudo pip3 install wiringpi
pipはPython 2.7.9以降、Python 3.4以降でデフォルトでインストール
されている

python用のライブラリ管理用のモジュール

なおIDEからのSHEllではパッケージが実行できないので
(GPIOが管理者でないとNG)
sudo python3 ****.pyで実行の事

 

拍手

貴社は、○月○日現在GoogleMAPへのご登録がされていません。
○月1日より周辺エリアを順にお伺いし、ご登録をしております。

という050-xxxx-xxxx番号でのセールスハガキが来た。

結びは

貴社のビジネスにGoogleをお役立てください

で終わっている。

Google AdWORDSマネージャーID:634-540-****のSという如何にも
google関係者を錯覚させるようにしている。

AdWORDSならワンクリック単位で料金が発生するが、意味がわからん
googleのサイトから直接申し込めるし、このハガキの目的は、
いったに何?

(株)リ*********という法人名で

この会社を調べると今年の4月にできたHP制作会社のようであるが
資本金も設立時期も未掲載、06の番号がHP上はあるのになぜに
050なのか不明、、、

google先生に聞いてみると、
同じような文面で近隣の住所からハガキを出している法人がいる。




拍手

カレンダー
03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
フリーエリア
最新CM
[03/10 DORA]
最新TB
プロフィール
HN:
dorabu
性別:
非公開
バーコード
ブログ内検索
P R
Copyright © ドラブーのアンドロイドとIoTなブログ All rights reserved. / Template by 四季. / Material by てんせん.

忍者ブログ [PR]