温度計

投稿日: カテゴリー: RasberryPiおやじブログ色々なこと

使用目的:機器内の温度検知用に小さい温度計を探していたところ このICを見つけ 試しに制作しました。

-25℃〜85℃温度計 (補正なし精度2℃)のI2C規格でシリアル通信ができるICです。1.7mm角高さ0.6mmの大きさの大きさ。待機電流1uA 電源電圧3.3v の性能です。

温度/湿度/気圧から

投稿日: カテゴリー: RasberryPiおやじブログ
温度/気圧/湿度の測定結果

趣味で作った測定システムを動かしてみました。

1300分位の位置が今、左に向かって過去を表しています。約1日分です。気圧は上昇、湿度は乾燥、温度は下降に向かっています。空調の効いた部屋内の測定なので気温は外気でないので変化はわかりません。気圧が上昇しているので高気圧が近づき、湿度が乾燥しているので北風が吹いていることを表しています。

 IOTと言う言葉を耳にしますが、このように時間の流れで変化をみると色々なものが想像できます。

こんなこと考えるの面白いと思うんだけどなあ〜 興味ある人いるのかなあ〜

ADT7310で温度測定

投稿日: カテゴリー: RasberryPiおやじブログ
測定風景

0.0625℃の分解能で測定される温度計(ADT7310)で 実験場所の温度を22時間程測定してみました。実際には、60秒で60回測定して平均したものを測定結果(60分x24時間で1440個)としています。

温度グラフ 測定結果

緑色が1日、青色が1分、橙色が1時間の測定結果を表示している。青色より1秒間隔の測定差が判り、橙色より1分単位の変化が、緑色より24分単位の変化が判ります。

起床時から少し増えたのは私が部屋に入ったから。メモリ20(8時頃)から太陽の光が部屋に入ったので。メモリ25の付近は曇ったため。メモリ35(14時頃)から下がり始めています。21℃から23.5℃で推移していることが分かりました。

一応の結果が得れたので、今度は気温、気圧と湿度の3つを測定できると面白いと考えています。

測定した温度グラフを作る 2019/1

投稿日: カテゴリー: RasberryPiおやじブログ
1日経過

1日(22時間)、RaspberryPiで温度計測をした結果が出ました。太陽の光が差し込むと温度が上昇し夕方になると下降しています。途中の下がっているところは光が雲により遮られた時です。起床した時が最低温度で側にしばらく座っていると上昇が始まっています。人間ってすごく発熱するんだとびっくりです。

約6時間経過

エアコン風の影響を受けない所で測定の試験を初めて約6時間経過した。緑色の1日を1分単位で測定した結果は、22.8->21.1℃と下がった。橙色は、1時間を1分単位で表示、青色は、1分を1秒単位で測定したものです。

.

SPIやI2Cで温度計測ができるようになりました。しかし、データを記録したいことは多いので、CSVファイルに測定データを格納するプログラクをPythonで作ることにした。

  • Python3で作る
  • RaspberryPi3 B+ で動作する。
  • 1日分のデータを格納できる。
  • 測定は1秒に1回測定して1分単位に纏める。
  • 平均と標準偏差を求め 標準偏差の4倍の範囲で表示する。(4倍は99.99%を含む範囲)

を目標に作っている途中です。ファイルは1日1回なので実働テストに時間がかかってしまう。

SPIで温度測定ができた2。

投稿日: カテゴリー: RasberryPiおやじブログ

SPIとI2Cの通信手段を確認できました。

センサー、表示器、RaspberryPi

下記にRaspberryPi3B+ で動作させた PythonのプログラムをPDFにしています。このセンサーは電源電圧と測定温度で誤差が -40℃〜105℃(2.7V-3.6v)では±0.5℃、カタログの表から 0-100℃(3.3v)では±0.2℃程度と考えることができるので、私には十分です。

RaspberryPi モニタ
 coding: utf-8 
#
import spidev
import time
class Adt7310:
def init(self): #インスタンス作成時に呼び出し 確認2018/12/29
self.spi = spidev.SpiDev()
self.spi.open(0,0)
self.spi.max_speed_hz = 10 # 通信速度の設定
self.spi.bits_per_word = 8 # 送信文字(bit)単位の設定
self.spi.mode = 3 # [CPOL|CPHA]
CPOL 0:正理論 ポジパルス --_-
0 CPHA 0: CPOL立上りで読込
1 CPHA 1: CPOL立下りで読込
CPOL 1:負理論 ネガパルス -----_--
2 CPHA 0: CPOL立下りで読込
3 CPHA 1: CPOL立上りで読込
参考資料 http://dlnware.com/theory/SPI-Transfer-Modes
#
def spi_close(self): #動作未確認
self.spi.close()
シャットダウン
ADT7310は、コンフィギュレーション・レジスタ(レジスタ・アドレス0x01)のビット[6:5]を11にする。
シャットダウン前の最後の変換からの変換結果は、シャットダウン・モードのときでもADT7310から読み取ることができます。
コンフィギュレーション・レジスタ(レジスタ・アドレス0x01)のビット[6:5]に00にするとシャットダウン・モードから抜けることができます。
シャットダウン・モードから出るのに1ms(0.1μFデカップリング・コンデンサで)必要です。
デバイスがシャットダウンモードから抜け出ると、内部クロックが開始され、変換が開始されます。
def spi_shutdown(self): #動作未確認 self.spi.xfer([0b00001000,0b01100000]) # Register:01へ シャットダウンコマンドdata:0x60 の書き込み
#
 xfer CS端子が転送中は activate され 未使用時は解放される。
 xfer2 CS端子は解放されている。
参考資料 https://pypi.org/project/spidev/
#
ワンショットモード
ワンショット・モードでは、ADT7310はただちに変換を完了してからシャットダウン・モードなる。
ワンショットモードは、消費電力を削減する。
ワンショットモードを有効にするには、
コンフィギュレーションレジスタ(レジスタアドレス0x01)のビット[6:5]を01に設定します。
動作モードビットに書き込んだ後、温度値レジスタから温度を読み出す前に、少なくとも240ms待機が必要。
この遅延により、ADT7310は起動して変換を完了するのに十分な時間を確保できる。
更新された温度変換を得るには、
コンフィギュレーションレジスタ(レジスタアドレス0x01)のビット[6:5]を01にリセットします。
1 SPSモード
このモードでは、パーツは1秒あたり1回の測定を実行します。
一回の変換はわずか60msしかかからず、残りの940msの間はアイドル状態のままです。
このモードは、コンフィギュレーションレジスタ(レジスタアドレス0x01)のビット[6:5]を10にする。
def spi_oneshot(self): #動作未確認 self.spi.xfer([0b00001000,0b10100000]) # Register:01へ ワンショットコマンドdata:0xa0 の書き込み def spi_SPS(self): #確認2018/12/29 self.spi.xfer([0b00001000,0b01000000]) # Register:01へ SPSコマンドdata:0x40 の書き込み
温度データの読込
読取りは、ADT7310に書込み/読込みビットを1にセットして開始すると、
アドレス指定されたレジスタに応じて8または16クロック・パルスを供給し、
ADT7310はアドレス指定されたレジスタからデータをクロック・アウトしますDOUTに出力される。
データは、コマンドバイトに続くSCLKの最初の立ち下がりエッジでクロック出力されます。
マスターがCSをハイにすると、読み出しは終了します。
マスタは、読み込まれたレジスタごとにバス上で新しい読み取りを開始する必要があります。
1つの読み取りにつき 1つのレジスタのみが読み出されます。
ただし、連続リードモードでは、コマンドバイトC2 = 1となり、連続して温度値レジスタを読み出すことができます。
マスタはSCLKで16クロック・パルスを送信し、温度値はDOUTでクロック出力されます。
def spi_read(self): #確認2018/12/29 e = self.spi.xfer([0b01010000,0xff,0xff])[1:] # Register:02へ データ呼び出しコマンドdata:0x50 の書き込み er = e[0]<<8 | e[1] if(er >= 0x8000): er = er - 0x10000 er = er / 128.0 return er # 2バイトの0xffはダミーデータです。
Status Register (Register Address 0x00)
Bit Default Type Name
[3:0] 0000 R unused
4 0 R Tlow
5 0 R Thigh
6 0 R Tcrit
7 0 R _RDY
4このビットは、温度がTLOW温度制限を下回ると1に設定されます。
ステータスレジスタが読み出されたとき、
および/または測定された温度が限界を超えたときに、
ビットは0にクリアされます
TLOW + THYST設定値レジスタに設定します。
5このビットは、温度がTHIGHの温度制限を超えると1に設定されます。
ステータスレジスタが読み出されたとき、
および/または測定された温度が制限値を下回ったとき、
ビットは0にクリアされます
THIGH-THYST設定値レジスタに設定します。
6このビットは、温度がTCRITの温度制限を超えると1に設定されます。
ステータスレジスタが読み出されたとき、
および/または測定された温度が制限値を下回ったときに
0にクリアされます
TCRIT - THYST設定値レジスタに設定します。
7温度変換結果が温度値レジスタに書き込まれると、このビットはローになります。
温度値レジスタを読み出すと1にリセットされます。
ワンショットモードと1つのSPSモードでは、
このビットはワンショット・ビットへのライト後にリセットされます。
def spi_status(self): #確認2018/12/29 d = self.spi.xfer([0b01000000,0xff]) ## Register:00へ ステータス呼び出しとダミーdata:0xff の書き込み return d[1]
------------------------ サブルーチン -----------------------
one SPSモードでは、1秒間に1回の測定が行われるから、測定の終了を待って読み出す部分が必要です。
def spi_read_SPS(self): #確認2018/12/29 while self.spi_status() & 0x80 != 0: # データの準備ができるまで time.sleep(0.4) # 間隔で待つ。 ret = self.spi_read() # 温度データを読み出す。 return ret
#
#
ADT7310 の概要
●高性能:
温度精度±0.5℃@-40℃~+105℃(2.7V~3.6V) ±0.4℃@-40℃~+105℃(3.0V)
16ビット温度分解能:0.0078℃
高速な最初の温度の変換時間:パワアップ後6ms
●低消費:
パワーセービング・モード:1サンプル/1秒
ノーマル・モード:700μW@3.3V
シャットダウン・モード:7μW@3.3V
●容易な導入:
温度校正 / 補正は不要
直線性補正の不要
●広い動作範囲:
温度範囲:-55℃~+150℃
電圧範囲:2.7V~5.5V
●プログラマブル割り込み:
高精度な温度過熱割り込み 温度上昇 / 温度低下割り込み
●SPI互換インターフェース
●8ピン狭幅SOIC、RoHS準拠パッケージ
#
SPI コマンド Byte
0 0 (固定)
1 0 (固定)
2 1:温度連続読出 0:
[5:3] 7-0:レジスターアドレス
6 1:読み出し 0:書き込み
7 0 (固定)
#
コンフィギュレーション・レジスタ(レジスタ・アドレス0x01)
[1:0] これらの2つのビットは、
INTピンとCTピンを設定する前に発生する可能性のある低温/過温度フォルトの数を設定します。
これにより、誤ったトリガーを避けることができます
温度ノイズ。
00 = 1フォルト(デフォルト)。
01 = 2フォルト。
10 = 3フォルト。
11 = 4フォルト。
2 このビットは、CTピンの出力極性を選択します。
0 =アクティブロー。1 =アクティブハイ。
3 このビットは、INTピンの出力極性を選択します。
0 =アクティブロー。1 =アクティブハイ。
4 このビットは、コンパレータモードと割り込みモードを選択します。
0 =割り込みモード。1 =コンパレータモード。
[6:5] これら2つのビットは、ADT7310の動作モードを設定します。
00 =連続変換(デフォルト)。 1つの変換が終了すると、ADT7310は別の変換を開始します。
01 =ワンショット。変換時間は通常240ミリ秒です。
10 = 1 SPSモード。変換時間は通常60msです。この動作モードは平均消費電流を低減します。
11 =シャットダウン。インターフェイス回路を除くすべての回路がパワーダウンされます。
7 このビットは変換時にADCの分解能を設定します。
0 = 13ビット分解能。符号ビット+12ビットは0.0625℃の温度分解能を与えます。
1 = 16ビット分解能。符号ビット+ 15ビットは0.0078125℃の温度分解能を与えます。
#

私のソフトウエア

投稿日: カテゴリー: RasberryPiおやじブログ

pythonのプログラムを見よう見まねで初めますが、我流のソフトは難解かもしれません。もし 必要になり見られる方がありましたら、こんなように思って書いたと参考にしてください。

ソフトを習った時代背景

  • 45年程前に聞いた教授の雑談から「ソフトは、●はじめ、●動作、●終わりの3つが重要」をお聞きした。(これが唯一教えて頂いたこと)
  • line-editorが最先端で、普通はプログラムをカードや紙テープで作っていた時代です。
  • 情報も入手し難く、聞く人も存じ上げない状態でした

プログラムに使った言語

  1. 初めは手動アセンブルでマシン語を
  2. アセンブラを使ってマシン語を
  3. コンパイラを使ってC言語を

社員5人のベンチャー企業に就職し、最高270日/年の出張日々で車中や機内でソフトを作る状態で

たどり着いた「ゆるいルール」

  • プログラムのコメント欄をみるとわかるようになるべく多く記載する。
  • 簡単に修正のできるソフトにする。
  • 困難な部分は、後で修正しなくても良いようにサブルーチン化する。

メモリの使い方

データの記録方法に絶対アドレスと相対アドレスがあると考えてます。例えば 郵便の住所はその場所しかないので絶対アドレス、説明で使う「xxx商店の3つ隣の家」を相対アドレスと呼んでます。

データ記録用のメモリは、絶対アドレスでなく相対アドレスをなるべく使うようにしています。プログラムの中で、機能の少ないプログラムの塊をサブルーチンと呼んだとき、サブルーチンにxxx商店とY番目と知らせると同じ影響を異なるアドレスに及ぼすことができるからです。これで、プログラムとメモリを一まとまりと考えることができるようになります。この方法を使うようにしています。

SPIとI2CとSIOの差

投稿日: カテゴリー: RasberryPiおやじブログ

個人的ですが 今回 改めて考えてみたら、こんな分類になってしまいました。

RS232C,RS485,RS422などの SIO

友達同士で通信をキャッチボールのように送受信を行う(半二重)ものと各々勝手に喋っている通信(全二重)の方法。使用信号 TXD,RXDと表示されていることが多い

SPI

送信と受信を同時に同数のbit’s dataでおこなう方法。使用信号:SI,SO,SCLK (と選択CE0,CE1…CEn)を使うことが多い

I2C

強い親と弱い子の会話みたいな通信方法。信号内容で「誰かにこれを命令する」、「誰かに問い合わせする」ように通信する。使用信号は、SDA,SCLです。

別方向から

ハードに利用できるのは、SPI 、SIO 、I2Cの順と考えますがSPIが一番簡単です。

raspberryPi3で SPI通信

投稿日: カテゴリー: RasberryPiおやじブログ

今回は、少しの配線で沢山のデータの受け渡しに便利なシリアルパラレル変換に利用しやすいSPI通信を使えるようにする。

そもそも SPI通信とは (ネット情報)

  • モトローラ社が提唱した方式で、3本または4本の接続線での通信
  • 通信は、マスタが出力するクロック信号(SCK)を基準にして、互いに向かい合わせて接続したSDIとSDOで、同時に1ビット毎のデータの送受信を行います。
  • 常にマスタが主導権を持ち、8ビット単位のデータ通信が行われます。

 

 

python3のspidevのMethodsには次のようなものがある。 (ネット情報)

  • open(bus, device)
  • readbytes(n)
  • writebytes(list of values)
  • xfer(list of values [ , speed_hz, delay_usec, bit_per_word ] )
  • xfer2(list of values [ , speed_hz, delay_usec, bit_per_word ] )
  • xfer3(list of values [ , speed_hz, delay_usec, bit_per_word ] )
  • close()

   raspberryPi3のピン配置(SPI分 raspberrypiの解説本より)

  • 19 SPIMOSI
  • 21 SPIMOSO
  • 23 SPI SCLK
  • 24 SPI CE0
  • 26 SPI CE1

実験のためにチェッカー基板への接続

 SIとSOを接続

テストプログラム

コネクタの接続を入り切りして受信と接続の関係を確認しました。

raspberry3でUSBカメラに使うopencvのインストール

投稿日: カテゴリー: RasberryPiおやじブログ

USBカメラを使ってPython3で写真を撮る

2018/12/14 表示できるようになりました。

できなかった原因:opencvをコンパイルして作成したとき、必要なライブラリーを忘れていた。そこであらかじめできている python3とopencvを新しい参考先を見つけてインストールしました。

参考先をコメントとして書いたプログラムshow_camera

 

 

————————- 以下 2018/12/14 以前 —————————–

opencvをインストールする。

RaspberryPi3B+でカメラを使うには Python3+opencvを使う記事を参考にしています。

参考文献

そこに出ている説明で入力するものを TXTに書きましたので ご利用ください。

opencv-instal

コピペしたいので、MacとRaspberryP13B+をVNCを使って接続してMacで操作しています。cmakeがなかったので、raspberrypi設定のアプリケーションでcmakeを検索して選択の後 OKして得ました。

安易な方法:opencv-installの1行を選択してコピーして VNCのコマンド行に貼り付ける方法で行いました。

インストール完了

python3を作動させて確認できました。

RaspberryPi serial通信のテスト

投稿日: カテゴリー: RasberryPiおやじブログ

ToDo: 一文字を送り、受け取る。

準備 raspberrypi設定でシリアル通信の使用を宣言する。

設定画面

送信TXD信号と受信RXD信号を接続する。

チェッカー基板を使用

プログラムを書く

raspberryPi3 コネクタピン

  • pin8 UART TXD
  • pin10 UART RXD
テスト用プログラム

動かしてみる

python3を動かし、作成したプログラムをpython3のfileにある「open」を使って開く。開いたプログラムの[RUN]=>[Run Module]で動作させると写真のように 送信したデータが受信されたことがわかる。