MATLABのArduino用Add-onを用いてArduinoを制御し、Arduinoに接続されたセンサの情報を取ります。
気圧センサにはFreescale社(現NXP)のMPL115A2を使いました。
MPL115にはI2C接続(A2)と、SPI接続(A1)があり、今回用いたのはI2C接続のMPL115A2です。
前に秋月でモジュールを買ったのですが、今、見たらSPI接続のA1しかありませんでした(なぜ?)。
まず、今回用いるArduino UNOとMPL115A2を接続します。MPL115は電源電圧が+5Vでも大丈夫なので+5Vで動かします。
電源ピン(1ピン)のコンデンサは、秋月のモジュールには実装されています。2ピン(CAP)はデータシートを見ますと「1μFのコンデンサを介してGNDに接続せよ」と書いてあります。これは絶対接続すべきです。接続しなかった場合には、測定データの誤差が大きくなります。
最近のセンサ・デバイスは測定値(アナログ)をデバイス内部でデジタル信号に変換して(さらにフォーマットを整え)、出力してくれるスグレモノが多いですが、内部では修羅場(?)になっていて、微小なアナログ信号をガシガシ動く粗暴な(?)デジタル信号からいかに守るかが精度を保つポイントになります。CAPピンの1μFも、その解決の1つです(何気に不要なノイズを流す働きをします)。
7ピン(SDA)、8ピン(SCL)に関しては、データシートにはプルアップ抵抗が入っているのですが、ArduinoをMATLAB 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)なので、誤差範囲ですね。
データ補正のための係数を取得して、それを使って補正するところが、ちょっとメンドクサイかと思います。