Arduino/みんな試作機/I2C通信と温湿度計
をテンプレートにして作成
[
トップ
] [
新規
| |
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#topicpath
** I2C通信と温湿度計 [#sdfb243f]
>>
SHT25(あるいは SHT-25, Strawberry Linux では[[こちら>http...
I2C 通信の練習でもある。~
先日、mbed 祭りに参加したので、mbed でもいいけれど、つい...
<<
*** I2C 通信 [#ieb45f87]
+ はじめに~
I2C 通信と SPI 通信は Arduino と他のデバイスとの通信のス...
RIGHT:2014-12-23 (火) 12:20:56
~
+ I2C 通信の基礎知識
++ 配線~
センサー(スレーブ)への配線は4本。Arduino(マスター) 側...
#style(class=table_left)
|センサー(スレーブ)|Arduino(マスター)(Mega2560, Leona...
|Vin 電源供給 | 3.3V か 5V か(センサーによる)|
|GND グラウンド | GND |
|SCL クロック | A5 |
|SDA データ送受信 | A4 |
#clear
++ マスターとスレーブ~
通信は双方向である。ただし、通信のクロックを決める方をマ...
普通、Arduino をマスターにすると思われるので、以下はその...
接続について、マスターは一つだけである。しかし、スレーブ...
~
++ アドレス~
複数つないだスレーブは、(通常7bit の)アドレスで区別する。...
作られているので、複数の同種センサーは一つのI2C通信のライ...
特に Arduino の場合には、I2C 通信用のポートが1組しかない...
のポートが用意されている(ことがある)。~
~
++ プルアップ~
SCL と SDA のラインは数kΩ程度の抵抗でプルアップされている...
特に何もなければ、電源電圧と同じ電圧になるようになってい...
気をつけなければならないのは、複数のスレーブを接続した場...
利用者がプルアップ抵抗を用意しなくていいように、というメ...
接続することになり、あだとなる。気をつけたい(>自分)。~
~
+ Arduino の Wire ライブラリ~
Arduino は、I2C 通信のために、Wire というライブラリを用意...
こと。[[日本語リファレンスのページ>http://www.musashinode...
関数は多くないので、全部掲載する。
#style(class=table_left)
| 分類| 関数|使い方|h
| 初期化| Wire.begin() | 通信開始。マスターの時には、引数...
| 書き込み| Wire.beginTransmission(アドレス)| どのスレー...
| | Wire.write(データ) | データは、1バイトのデータ、文...
| | Wire.endTransmission() | 送信終了(戻り値 0 で正常終...
|読み込み| Wire.requestFrom(アドレス, バイト数) | どのア...
| | Wire.available() | 引き続く read() でスレーブ側が何...
| | Wire.read()| 1バイトだけ受け取る。引数なし。戻り値は...
|その他| Wire.onReceive() | スレーブとして動く時に用いる...
| | Wire.onRequest() |スレーブとして動く時に用いる関数な...
#clear
RIGHT:2014-12-23 (火) 13:20:59
*** I2C のレベル変換 [#r5e445b7]
- はじめに~
センサーは、2.1〜3.6V までで動かすように指定されている。A...
SCL, SDA は Arduino 側は 5V で動いている。そのままでは正...
専用の変換装置もある。例えば、秋月電子では、[[レベル変換...
~
しかし、いろいろと工夫をする人がいて、(バイポーラー)トラ...
参考にして使わせていただく。~
~
- リンク
-- [[ねがてぃぶろぐ>http://gomisai.blog75.fc2.com/]] / [[...
-- [[Air Variable>http://airvariable.asablo.jp/]] / [[FET...
RIGHT:2014-12-23 (火) 18:12:27
- 配線例~
&ref(CIMG3420.JPG,,30%);~
RIGHT:2014-12-23 (火) 18:23:43
~
*** センサー SHT-25 [#c9b683e1]
- インターネット上の情報源
-- [[データシート>http://www.sensirion.com/fileadmin/user...
-- [[誤り検出符号(CRC checksum)計算方法>http://www.sensir...
-- Sensirion に掲載されている[[サンプルプログラム>http://...
-- SHT25 Arduino の[[ライブラリ>https://github.com/misens...
ライブラリを使ってもいいけど、これらを元に自分でプログラ...
RIGHT:2014-12-23 (火) 14:24:00
~
- 誤り検出符号のチェック方法~
-- サンプルプログラム([[誤り検出符号(CRC checksum)計算方...
typedef unsigned char u8t; ///< range: 0 .. 255
const u16t POLYNOMIAL = 0x131; //P(x)=x^8+x^5+x^4+1 = 10...
u8t SHT2x_CheckCrc(u8t data[], u8t nbrOfBytes, u8t check...
u8t crc = 0;
u8t byteCtr;
//calculates 8-Bit checksum with given polynomial
for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
{
crc ^= (data[byteCtr]);
for (u8t bit = 8; bit > 0; --bit)
{
if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
else crc = (crc << 1);
}
}
if (crc != checksum) return CHECKSUM_ERROR;
else return 0;
}
-- コメント
--- 演算子 &はビットAND、^はビットXOR、<<はビット左シフト
~
- サンプルコード
#include <Wire.h>
#define SHT25Address 0x40 // 7bit のアド...
#define TempHold 0xE3 // Trigger T ...
#define HumidHold 0xE5 // Trigger RH ...
#define ReadRgstr 0xE7 // Read Regist...
#define SoftReset 0xFE // Soft Reset ...
#define UserRgstr 0x02 // User Regist...
/*------------------------------------------------------...
命令を書き込む。
*/
int SHT25write(unsigned char command){
Wire.beginTransmission(SHT25Address); // I2C: 書き...
Wire.write(command); // I2C: 1バイ...
return( Wire.endTransmission(false) ); // I2C: 書き...
}
/*------------------------------------------------------...
データを読み込む。Checksum は活用できていない。
*/
unsigned int SHT25readdata(){
unsigned int result, checksum;
int ans;
ans = Wire.requestFrom(SHT25Address, 3); // I2C: アド...
while( Wire.available() < ans){} // I2C: デー...
result = (Wire.read()<<8); // I2C: デー...
result += Wire.read();
result &= ~0x0003;
checksum= Wire.read(); // 誤り検出...
return result;
}
/*======================================================...
リセット : うまくいかない。
*/
int SHT25reset(void){
int result = 0;
result = SHT25write(SoftReset);
// Serial.print("Write Result: ");
// Serial.println(result);
delay(1000);
result += SHT25write(UserRgstr);
// Serial.print("Write Result: ");
// Serial.println(result);
delay(1000);
return result;
}
/*======================================================...
温度の取得
*/
float SHT25Temp(void){
while( SHT25write(TempHold) != 0 ){
Serial.println("Error ");
}
return (-46.85 + 175.72 / 65536.0 * (float)(SHT25readd...
}
/*======================================================...
湿度の取得
*/
float SHT25Humid(void){
while( SHT25write(HumidHold) != 0 ){
Serial.println("Error ");
}
return (-6.0 + 125.0 / 65536.0 * (float)(SHT25readdata...
}
void setup(){
Wire.begin();
Serial.begin(9600);
SHT25reset();
Serial.println("Temp / Humid");
}
void loop(){
int ans;
Serial.print(SHT25Temp());
Serial.print(", ");
Serial.println(SHT25Humid());
delay(1000);
}
RIGHT:2014-12-23 (火) 17:55:26
終了行:
#topicpath
** I2C通信と温湿度計 [#sdfb243f]
>>
SHT25(あるいは SHT-25, Strawberry Linux では[[こちら>http...
I2C 通信の練習でもある。~
先日、mbed 祭りに参加したので、mbed でもいいけれど、つい...
<<
*** I2C 通信 [#ieb45f87]
+ はじめに~
I2C 通信と SPI 通信は Arduino と他のデバイスとの通信のス...
RIGHT:2014-12-23 (火) 12:20:56
~
+ I2C 通信の基礎知識
++ 配線~
センサー(スレーブ)への配線は4本。Arduino(マスター) 側...
#style(class=table_left)
|センサー(スレーブ)|Arduino(マスター)(Mega2560, Leona...
|Vin 電源供給 | 3.3V か 5V か(センサーによる)|
|GND グラウンド | GND |
|SCL クロック | A5 |
|SDA データ送受信 | A4 |
#clear
++ マスターとスレーブ~
通信は双方向である。ただし、通信のクロックを決める方をマ...
普通、Arduino をマスターにすると思われるので、以下はその...
接続について、マスターは一つだけである。しかし、スレーブ...
~
++ アドレス~
複数つないだスレーブは、(通常7bit の)アドレスで区別する。...
作られているので、複数の同種センサーは一つのI2C通信のライ...
特に Arduino の場合には、I2C 通信用のポートが1組しかない...
のポートが用意されている(ことがある)。~
~
++ プルアップ~
SCL と SDA のラインは数kΩ程度の抵抗でプルアップされている...
特に何もなければ、電源電圧と同じ電圧になるようになってい...
気をつけなければならないのは、複数のスレーブを接続した場...
利用者がプルアップ抵抗を用意しなくていいように、というメ...
接続することになり、あだとなる。気をつけたい(>自分)。~
~
+ Arduino の Wire ライブラリ~
Arduino は、I2C 通信のために、Wire というライブラリを用意...
こと。[[日本語リファレンスのページ>http://www.musashinode...
関数は多くないので、全部掲載する。
#style(class=table_left)
| 分類| 関数|使い方|h
| 初期化| Wire.begin() | 通信開始。マスターの時には、引数...
| 書き込み| Wire.beginTransmission(アドレス)| どのスレー...
| | Wire.write(データ) | データは、1バイトのデータ、文...
| | Wire.endTransmission() | 送信終了(戻り値 0 で正常終...
|読み込み| Wire.requestFrom(アドレス, バイト数) | どのア...
| | Wire.available() | 引き続く read() でスレーブ側が何...
| | Wire.read()| 1バイトだけ受け取る。引数なし。戻り値は...
|その他| Wire.onReceive() | スレーブとして動く時に用いる...
| | Wire.onRequest() |スレーブとして動く時に用いる関数な...
#clear
RIGHT:2014-12-23 (火) 13:20:59
*** I2C のレベル変換 [#r5e445b7]
- はじめに~
センサーは、2.1〜3.6V までで動かすように指定されている。A...
SCL, SDA は Arduino 側は 5V で動いている。そのままでは正...
専用の変換装置もある。例えば、秋月電子では、[[レベル変換...
~
しかし、いろいろと工夫をする人がいて、(バイポーラー)トラ...
参考にして使わせていただく。~
~
- リンク
-- [[ねがてぃぶろぐ>http://gomisai.blog75.fc2.com/]] / [[...
-- [[Air Variable>http://airvariable.asablo.jp/]] / [[FET...
RIGHT:2014-12-23 (火) 18:12:27
- 配線例~
&ref(CIMG3420.JPG,,30%);~
RIGHT:2014-12-23 (火) 18:23:43
~
*** センサー SHT-25 [#c9b683e1]
- インターネット上の情報源
-- [[データシート>http://www.sensirion.com/fileadmin/user...
-- [[誤り検出符号(CRC checksum)計算方法>http://www.sensir...
-- Sensirion に掲載されている[[サンプルプログラム>http://...
-- SHT25 Arduino の[[ライブラリ>https://github.com/misens...
ライブラリを使ってもいいけど、これらを元に自分でプログラ...
RIGHT:2014-12-23 (火) 14:24:00
~
- 誤り検出符号のチェック方法~
-- サンプルプログラム([[誤り検出符号(CRC checksum)計算方...
typedef unsigned char u8t; ///< range: 0 .. 255
const u16t POLYNOMIAL = 0x131; //P(x)=x^8+x^5+x^4+1 = 10...
u8t SHT2x_CheckCrc(u8t data[], u8t nbrOfBytes, u8t check...
u8t crc = 0;
u8t byteCtr;
//calculates 8-Bit checksum with given polynomial
for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
{
crc ^= (data[byteCtr]);
for (u8t bit = 8; bit > 0; --bit)
{
if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
else crc = (crc << 1);
}
}
if (crc != checksum) return CHECKSUM_ERROR;
else return 0;
}
-- コメント
--- 演算子 &はビットAND、^はビットXOR、<<はビット左シフト
~
- サンプルコード
#include <Wire.h>
#define SHT25Address 0x40 // 7bit のアド...
#define TempHold 0xE3 // Trigger T ...
#define HumidHold 0xE5 // Trigger RH ...
#define ReadRgstr 0xE7 // Read Regist...
#define SoftReset 0xFE // Soft Reset ...
#define UserRgstr 0x02 // User Regist...
/*------------------------------------------------------...
命令を書き込む。
*/
int SHT25write(unsigned char command){
Wire.beginTransmission(SHT25Address); // I2C: 書き...
Wire.write(command); // I2C: 1バイ...
return( Wire.endTransmission(false) ); // I2C: 書き...
}
/*------------------------------------------------------...
データを読み込む。Checksum は活用できていない。
*/
unsigned int SHT25readdata(){
unsigned int result, checksum;
int ans;
ans = Wire.requestFrom(SHT25Address, 3); // I2C: アド...
while( Wire.available() < ans){} // I2C: デー...
result = (Wire.read()<<8); // I2C: デー...
result += Wire.read();
result &= ~0x0003;
checksum= Wire.read(); // 誤り検出...
return result;
}
/*======================================================...
リセット : うまくいかない。
*/
int SHT25reset(void){
int result = 0;
result = SHT25write(SoftReset);
// Serial.print("Write Result: ");
// Serial.println(result);
delay(1000);
result += SHT25write(UserRgstr);
// Serial.print("Write Result: ");
// Serial.println(result);
delay(1000);
return result;
}
/*======================================================...
温度の取得
*/
float SHT25Temp(void){
while( SHT25write(TempHold) != 0 ){
Serial.println("Error ");
}
return (-46.85 + 175.72 / 65536.0 * (float)(SHT25readd...
}
/*======================================================...
湿度の取得
*/
float SHT25Humid(void){
while( SHT25write(HumidHold) != 0 ){
Serial.println("Error ");
}
return (-6.0 + 125.0 / 65536.0 * (float)(SHT25readdata...
}
void setup(){
Wire.begin();
Serial.begin(9600);
SHT25reset();
Serial.println("Temp / Humid");
}
void loop(){
int ans;
Serial.print(SHT25Temp());
Serial.print(", ");
Serial.println(SHT25Humid());
delay(1000);
}
RIGHT:2014-12-23 (火) 17:55:26
ページ名: