Arduino」タグアーカイブ

温湿度センサーSHT31をクロックストレッチで使う時の備忘録

前回は、センシリオン社製温湿度センサーSHT31をArduinoで制御する時の注意点を紹介しました。

Part3で述べた様に、測定開始コマンドを送った直後、SHT31のデータシートに記載された測定時間分(表1参照)の待ち時間をdelay()を使って決め打ちで指定しないと、マスター(Arduino)が温湿度データを受け取れませんでした。

表1 SHT31の測定時間一覧

しかしながら、SHT31が持つ「クロックストレッチ」機能を使うと、delay()を使ってその待ち時間を決め打ちで指定する必要はありません。

I2Cの「クロックストレッチ」とは、マスターからのコマンドに対して、スレーブの処理が間に合わない時、スレーブがクロックライン(SCL)を強制的にLOWにしてマスター側からのクロック送信を待たせる機能です(図1参照)。

図1 クロックストレッチの説明(NXPセミコンダクタのI2C仕様書から引用)

スレーブ側の処理が終了すると、クロック送信が再開され、マスターはスレーブからのデータを受信できるようになります。

続きを読む

温湿度センサーSHT31を使う場合の注意点(まとめ)

Part1Part2Part3で得られた知見を元に、センシリオン製温湿度センサーSHT31を使って温湿度を測定してCOMに表示するスケッチを書いてみました。ご参考になれば幸いです。また、このスケッチで得られるCOMの表示を図1に示します。

続きを読む

温湿度センサーSHT31を使う場合の注意点(パート3)

センシリオン製温湿度センサーSHT31を使う上での注意点その3です。

Part1Part2で、SHT31にWriteコマンドを送った後にある程度の待ち時間が必要で有ることを示しましたが、Part3では、どの程度の待ち時間が適切なのか?を検討したいと思います。

● 初期化コマンドは1msの待ち時間でOK。測定開始コマンドの場合は、データシートに記載がある測定完了までの待ち時間が必要

結論としては表題の通りなのですが、順を追って説明します。まず、全ての待ち時間を1msとした場合のI2Cバスの挙動を観測してみました。Arduinoのスケッチを以下に示します。

続きを読む

温湿度センサーSHT31を使う場合の注意点(パート2)

センシリオン製温湿度センサーSHT31を使う上での注意点その2です。

待ち時間の妥当性を検証する前に、待ち時間を入れないとWriteコマンドが実行されないことを実証しておきたいと思います。

具体的には、ステータスレジスタ消去コマンド(0x3041)が実行されていないことを確かめます(図1の「45Wa 30a 41~a」部分) 。

I2C通信で失敗した例図1 Writeコマンドを連投したときのI2C波形
ステータスレジスタ消去コマンド(0x3041)を送ってもNACKを返している

続きを読む

温湿度センサーSHT31を使う場合の注意点(パート1)

センシリオン社製温湿度センサーSHT31をArduinoのI2C経由で制御して評価していたのですが(写真1)、いろいろと「はまって」しまいました(苦笑)。そのときのトラブルとその解決法を備忘録として以下に記載します。

写真1 センシリオン製温湿度センサーSHT31を、
Keysightデジタルオシロスコープ(DSOX2014A)で評価している様子

なお、トラブルが多岐にわたったのと、それぞれのトラブルに対する解決策及びその妥当性の検証に時間がかかったため、何回かに分けて詳細を記載したいと思います。

今回はその第一回です。

続きを読む

MAX6675とK型熱電対とを使って温度を測ってみた

前回のエントリではK型熱電対をMAX6675で使うためのArduinoのSketchの一例を紹介しました。このエントリでは、そのSketchを使って各種温度を測定した結果を紹介します。

1.水温の変化を測定する

まず、温度がはっきり分かっている物体の温度を測ってみました。具体的には「水」です。水の場合、1気圧での沸点が100℃と一定なので、温度測定の基準として使うことができます。写真1の様に水(約600cc)を満たした鍋の中に熱電対を入れ、ガスコンロで加熱して温度変化を測定しました。

写真1 測定の様子

測定結果を図1に示します。

図1 水温の測定結果

100℃は水の沸点ですので、この範囲においては温度が一定になっていることがよく分かります。

続きを読む

ArduinoでSPIを使う時の備忘録

ArduinoSPI(Serial Peripheral Interface)を使って、K型熱電対用センサーIC、MAX6675動作させてみたわけですが、そのSketchを書いている時に得た知見を備忘録として列挙しておきます。
また、このエントリの後半には、得られた知見を元に書いたサンプルSketchを掲載しました。

1.Arduino IDEでは「SS」「SCK」「MISO」「MOSI」は予約語で、汎用的な変数名としては使えない

上記文字列はSPI専用の変数として予約されているようで、コンパイルすると「conflicting declaration」エラーが出ます。図1参照。SSやSCKなどは他のSketchでも使いそうですが、使えないようです。

図1 SS,SCK,MISO,MOSIを使った場合のコンパイルエラー

2.SPIに関連するArduinoのピンは固定されている

Arduinoのボードによって違いますが、UNOの場合、SSは10番ピン、SCKは13番ピン、MOSIは11番ピン、MISOは12番ピンです。ボードごとの違いはここの「Connections」を参照ください。

続きを読む

K型熱電対用センサーIC(MAX6675)からのデータが化ける【追記あり】

MAX6675(写真1)はSPIインターフェースを持つ、K型熱電対用センサーです。Arduinoを使って評価をしていたのですが(写真2)、COMに表示されるデータのうち、一番目のデータのみあり得ないデータになってしまいました。

MAX6675写真1 MAX6675が搭載された基板
Amazonで購入

DSOX2014写真2 測定の様子
SPIインターフェースに流れる波形を確認したいので、
キーサイトテクノロジーのオシロスコープDSOX2014を使った

Vdd_8_GND_9_1図1 1回目はあり得ないデータが取得されている。2回目以降は問題ない。

このエントリでは、なぜ一番目のデータのみ、あり得ないデータが取得されたその理由と対策を備忘録として記載します。

続きを読む

安価な温湿度センサー、DHT11の性能を検証してみた。Part.1

0.はじめに

ArduinoやRaspberry Piなどに接続される温湿度センサーの代表的なものとして、DHT11があります。インターネット上ではDHT11を接続して温湿度を測定しました、という例を多く見かけます。

しかしながら、どの程度の性能を持っているか?を検証した記事は少ないように思います。

このエントリでは、DHT11と、高精度温湿度センサ、SHT31とを同時に動作させ(写真1)、DHT11の測定データがSHT31の測定データとどれくらい一致するか?を実験・検証してみました。

結果、DHT11は、SHT31と(25℃近辺であれば)遜色のない性能を持っていることがわかりました(図1&図2)

DHT11 VS SHT31-2写真1 DHT11とSHT31とを同時に動作させてみた。

温度データ図1 DHT11とSHT31とを16時間連続運転して得られた温度データ

DHT11 VS SHT31 RH

図2 DHT11とSHT31とを16時間連続運転して得られた湿度データ

続きを読む

ArduinoのWireライブラリに関するTips

 皆様、ご無沙汰しております。代表の國頭です。

 「デバッグ事例」のカテゴリでは、ほぼ6年ぶりの更新になりますがどうぞ宜しくお願い致します。

 さて、表題にありますように「ArduinoのWireライブラリ」について、ここ数年疑問だった事が解決したので、私の備忘録も兼ねて記事を書いてみたいと思います。

 Arduinoについてはご存じの方が多いと思うので、ここでは詳細な説明は省きますが、私はI2CやSPIなどで制御できるデバイスの評価用プラットフォームとして使っています。

 つい先日、温湿度センサーである、Sensirion社製「SHT31」を評価する機会がありましたので、その時に得られた知見をご報告したいと思います。

続きを読む