(高度に比例してプロペラが動きます)
LPS22HBという気圧センサをArduinoを用いて使用してみました.(ドローンの高度保持のため)
このセンサは防塵防水で,ノイズレベルは0.1[hPa],精度は0.1[hPa](高度換算83cm)というセンサです.
実際は,大体10[cm]ぐらい動けば出力も変わってくるぐらいの高精度なセンサでした(ノイズは大体20[cm]程度に収まる感じでした).
あまり情報が見つからなかったので,ここに回路図とプログラムを記録していきたいと思います.
-
接続方法
LPS22HBはI2C接続で通信しました.
I2Cは2端子しかないので接続はとても簡単です. SCLとSDL端子をそれぞれのデバイスのSCLとSDLに接続するだけです.
ただし,今回は,使用電圧が違うので途中にI2Cバス用双方向電圧レベル変換モジュール(PCA)を挟まないといけません.(Arduino Mega:5V,LPS22HB:1.7 – 3.6V).
回路図はこちらです.
変換モジュールにはArduinoから3.3Vと5Vと入力し(低電圧側と高電圧側があります),LPS22HBには3.3Vを入力します.
-
プログラム
プログラムはこちらです.
setup()の部分の,「CTRL_REG1_LPF_9_75HZ」を変更することで,出力モードを変えることができます.
生の出力データと[hPa]での気圧を表示し,さらに,高度計算をすることで[m]と[cm]での標高を表示させています.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Wire.h> | |
////////////////////////LPS22HB//////////////////////////// | |
#define LPS22HB_ADDRESS 0x5c//I2Cでの気圧センサのスレーブアドレス | |
#define CTRL_REG1 0x10//設定用のレジスタのアドレス | |
#define CTRL_REG1_POWER_DOWN 0x00//データ出力モード(0Hz) | |
////////LPS22HBの設定//////// | |
#define CTRL_REG1_1HZ 0x10//データ出力モード(1Hz) | |
#define CTRL_REG1_10HZ 0x20//データ出力モード(10Hz) | |
#define CTRL_REG1_25HZ 0x30//データ出力モード(35Hz) | |
#define CTRL_REG1_50HZ 0x40//データ出力モード(50Hz) | |
#define CTRL_REG1_75HZ 0x50//データ出力モード(75Hz)//akiracing.com | |
#define CTRL_REG1_LPF_9_1HZ 0x18//データ出力モード(1Hz)//LPF, Freq/9 | |
#define CTRL_REG1_LPF_9_10HZ 0x28//データ出力モード(10Hz)//LPF, Freq/9 | |
#define CTRL_REG1_LPF_9_25HZ 0x38//データ出力モード(35Hz)//LPF, Freq/9 | |
#define CTRL_REG1_LPF_9_50HZ 0x48//データ出力モード(50Hz)//LPF, Freq/9 | |
#define CTRL_REG1_LPF_9_75HZ 0x58//データ出力モード(75Hz)//LPF, Freq/9 | |
#define CTRL_REG1_LPF_20_1HZ 0x1C//データ出力モード(1Hz)//LPF, Freq/20 | |
#define CTRL_REG1_LPF_20_10HZ 0x2C//データ出力モード(10Hz)//LPF, Freq/20 | |
#define CTRL_REG1_LPF_20_25HZ 0x3C//データ出力モード(35Hz)//LPF, Freq/20 | |
#define CTRL_REG1_LPF_20_50HZ 0x4C//データ出力モード(50Hz)//LPF, Freq/20 | |
#define CTRL_REG1_LPF_20_75HZ 0x5C8//データ出力モード(75Hz)//LPF, Freq/20 | |
uint8_t barometerData[3];//8ビット出力データの保存用配列 | |
volatile int32_t pressureBIN = 0;//2進数での気圧データ格納用 | |
volatile float pressure = 0;//10進数での気圧データ格納用 | |
volatile float altitudeM = 0;//[m]換算した高度 | |
volatile float altitudeCM = 0;//[cm]換算した高度 | |
volatile float referencePressure = 1013.15;//高度計算に使用する基準高度での大気圧[hPa] | |
volatile float referenceTemp = 15.0;//高度計算に使用する基準温度[C] | |
//////////////////////////////////akiracing.com/////////////// | |
void setup() { | |
Wire.begin();//I2C通信を開始する | |
Serial.begin(9600);//シリアル通信を開始する | |
i2cWriteByte(LPS22HB_ADDRESS, CTRL_REG1, CTRL_REG1_LPF_9_75HZ);//測定を開始する//アドレスCTRL_REG1にレジスタCTRL_REG1_75HZを書き込む | |
} | |
void loop() { | |
barometer();//気圧データの取得 | |
Serial.print("BIN: "); | |
Serial.print(pressureBIN); | |
Serial.print("\t"); | |
Serial.print(pressure); | |
Serial.print("[hPa]"); | |
Serial.print("\t"); | |
Serial.print(altitudeM); | |
Serial.print("[m]"); | |
Serial.print("\t"); | |
Serial.print(altitudeCM); | |
Serial.print("[cm]"); | |
Serial.println("\t"); | |
} | |
void barometer() { | |
i2cRead(LPS22HB_ADDRESS, 0x28, 3, barometerData); //0x28から,3バイト分をbarometerDataにいれる | |
pressureBIN = (uint32_t)barometerData[2] << 16 | (uint16_t)barometerData[1] << 8 | barometerData[0]; //barometerData[2]を左に16シフトし(<<),barometerData[1]を左に8シフトし(<<),barometerData[0]を足し合わせる(|) | |
pressure = pressureBIN / 4096.000000;//[hPa]に変換 | |
altitudeM = ((pow((referencePressure / pressure), (1 / 5.257)) - 1) * (referenceTemp + 273.15)) / 0.0065;//高度[m]に変換 | |
altitudeCM = altitudeM * 100;//高度[cm]に変換 | |
//http://keisan.casio.jp/exec/system/1257609530 の式を使用 | |
} | |
void i2cRead(uint8_t Address, uint8_t Register, uint8_t NBytes, volatile uint8_t* Data) {//指定したアドレスのデータを読む関数 | |
Wire.beginTransmission(Address);//指定したアドレスと通信を始める | |
Wire.write(Register);//レジスタを書き込む | |
Wire.endTransmission();//通信を終了する | |
Wire.requestFrom(Address, NBytes);//スレーブからNByteのデータを要求する | |
uint8_t index = 0; | |
while (Wire.available()) { | |
Data[index++] = Wire.read();//データを読み込む | |
} | |
} | |
void i2cWriteByte(uint8_t Address, uint8_t Register, volatile uint8_t Data) {//指定したアドレスにデータを書き込む関数 | |
Wire.beginTransmission(Address);//指定したアドレスと通信を始める | |
Wire.write(Register);//指定するレジスタを書き込む | |
Wire.write(Data);//データを書き込む | |
Wire.endTransmission();//通信を終了する | |
} |
お疲れ様です。
これまた自動車にも利用できそうなアイテムが出てきましたね。
しかも防塵防水w
負圧を取るバキュームセンサーとしても応用が利きそうですね。
これは正圧(いわゆるブースト)には対応しているのでしょうか。
相変わらず、勉強になります(笑)。
このセンサは,260~1260hPaが範囲なので,ターボなどを使っていたら使えませんが,自然吸気なら大丈夫な範囲だと思います.
このセンサはホースなどのの取り付け部分がないので,測定するするのは少しめんどくさそうですが,,,
昔,吸気圧力を測定しようと思い,このセンサを買ったのですが,何もせずに保管されています.笑 http://akizukidenshi.com/catalog/g/gP-07529/
秋月電子には正圧や負圧の測定できる気圧センサがいろいろあるので,みてみると面白いと思います.
ホースを使わずに吸入圧力を測るという発想が、もう自分には出来ないレベルですw
空気が流れるところに設置する感じなんでしょうか…
旧い人間なので、見た姿ことのある姿しか想像できないですw
技術は進歩しているのですね…ググッてみます。