エンジニア風味 (Engineer-taste)

電子系エンジニアのメモ帳

気圧センサMPL115A2にMATLABからArduino経由でアクセスする

MATLABArduino用Add-onを用いてArduinoを制御し、Arduinoに接続されたセンサの情報を取ります。
気圧センサにはFreescale社(現NXP)のMPL115A2を使いました。
MPL115にはI2C接続(A2)と、SPI接続(A1)があり、今回用いたのはI2C接続のMPL115A2です。
前に秋月でモジュールを買ったのですが、今、見たらSPI接続のA1しかありませんでした(なぜ?)。

まず、今回用いるArduino UNOとMPL115A2を接続します。MPL115は電源電圧が+5Vでも大丈夫なので+5Vで動かします。

f:id:engineer-paju:20190217092607p:plain
MPL115A2配線図

電源ピン(1ピン)のコンデンサは、秋月のモジュールには実装されています。2ピン(CAP)はデータシートを見ますと「1μFのコンデンサを介してGNDに接続せよ」と書いてあります。これは絶対接続すべきです。接続しなかった場合には、測定データの誤差が大きくなります。
最近のセンサ・デバイスは測定値(アナログ)をデバイス内部でデジタル信号に変換して(さらにフォーマットを整え)、出力してくれるスグレモノが多いですが、内部では修羅場(?)になっていて、微小なアナログ信号をガシガシ動く粗暴な(?)デジタル信号からいかに守るかが精度を保つポイントになります。CAPピンの1μFも、その解決の1つです(何気に不要なノイズを流す働きをします)。

7ピン(SDA)、8ピン(SCL)に関しては、データシートにはプルアップ抵抗が入っているのですが、ArduinoMATLAB Add-onで制御する場合にはArduino側のSDA, SCLピンにプルアップを自動的に入れてくれるので不要となります。

MATLABのコードは下記のようになります。
ArduinoにUNOを使い、COMポートにCOM6が割り当てられている場合です。

a=arduino('COM6','Uno','Libraries','I2C');
MPL115=i2cdev(a,'0x60');% I2Cデバイスをつくる

% 係数取得
write(MPL115,hex2dec('04'),'uint8');
pause(0.1);

Coef=read(MPL115,8,'uint8');% 係数データ取込み

%データ変換
dum=hex2dec('12') ;
writeRegister(MPL115,dum,0,'uint8');
pause(0.1);

write(MPL115,0,'uint8');% データ要求
pause(0.1);
Data=read(MPL115,4,'uint8');% データ取込み

clear MPL112 a;%デバイスを開放

a0hex=[dec2hex(Coef(1)) dec2hex(Coef(2))];
a0=nhex2dec(a0hex,16)/(2^3);
b1hex=[dec2hex(Coef(3)) dec2hex(Coef(4))];
b1=nhex2dec(b1hex,16)/(2^13);
b2hex=[dec2hex(Coef(5)) dec2hex(Coef(6))];
b2=nhex2dec(b2hex,16)/(2^14);
c12hex=[dec2hex(Coef(7)) dec2hex(Coef(8))];
c12=nhex2dec(c12hex,16)/(2^24);

Padc=double(uint16(Data(1))*4)+round(double(Data(2))/64);
Tadc=(double(Data(3))*256+double(Data(4)))/64;

Pcomp=double(a0+(b1+c12*Tadc)*Padc+b2*Tadc);
Pha=round((Pcomp*(115-50)/1023+50)*10);

disp(['気圧は ',num2str(Pha),' hPa']);

今、やってみたところ、1002 hPaになりました。
近隣の気象庁アメダスでは1010 hPaだそうです。
このデバイスの精度は、±1 kPa(=±10hPa)なので、誤差範囲ですね。

データ補正のための係数を取得して、それを使って補正するところが、ちょっとメンドクサイかと思います。