気圧センサモジュールを使ってみる(Arduino)
今回は、気圧センサモジュールからの値を、
Python言語で自作のターミナル(シリアル通信)ソフトで、
表示させてみたいと思います。
今回使用する、気圧センサモジュールです。

aitendo
・気圧センサモジュール [M180-4P]
 ¥299-(税別)
 https://www.aitendo.com/product/10760
 ※私のモジュールは、AliExpress(大陸)からの購入品です。
このモジュールは、
気温(温度)センサーも内蔵されていますから、
気圧と温度の取得が可能です。
また、通信方式は I2C なので、回路も簡単ですが、
動作電源:1.8~3.6Vなので、供給電源に注意が必要です。
気圧センサモジュールとArduinoの接続です。
回路は図の通りです。
   この回路図の作図には fritzing を利用させて頂いております。
   https://fritzing.org/home/

では、スケッチします。
スケッチ内容は、センサモジュールから、
気圧・気温を取得して、シリアルモニタに表示するものとします。
気圧センサモジュールとArduinoの通信・制御ですが、
このセンサモジュールの通信方式は、I2Cなので、
I2C用のライブラリ、”Wire” と、
このセンサモジュール制御用の ”Adafruit_BMP085” を
使用させて頂くことにします。
Arduino IDE にインストールする方法は、
1.メニュー「スケッチ」 → 「ライブラリをインクルード」
   → 「ライブラリを管理」 を選択します。

2.ライブラリマネージャ画面の
 検索欄に、”Adafruit BMP085” と入力します。
 表示された一覧の中から、
 ”Adafruit BMP085 Library” を選択し、〔インストール〕ボタンと押します。
これで、ライブラリの準備は完了です。

スケッチです。
// ライブラリインクルード
#include <Wire.h>   // I2C通信用
#include <Adafruit_BMP085.h>    // 気圧センサ用
double t_data;   // 温度情報用
double d_data;   // 気圧情報用
// オブジェクト生成
Adafruit_BMP085 a_bmp;
void setup() {
  // put your setup code here, to run once:
  // シリアルモニタ設定
  Serial.begin( 9600 );
  // 気圧センサ起動
  if ( !a_bmp.begin() ) {
    Serial.println( "センサ起動エラー" );
    while(1);	// エラー時の強制ループ
  }
}
void loop() {
  // put your main code here, to run repeatedly:
  // 温度情報取得
  t_data = a_bmp.readTemperature();
  // コンソールモニタへ出力
  Serial.print( t_data );
  Serial.println( " ℃" );
  // 気圧情報取得
  d_data= (double)a_bmp.readPressure()/100;
  // コンソールモニタへ出力
  Serial.print( d_data );
  Serial.println( " hPa" );
    
  // 2000ms待機
  delay( 2000 );
}
では、マイコンボードに書き込んで実行してみます。


シリアルモニタを開くと、
気圧と温度が表示されています。
続いて、この表示情報を、
Python言語で自作のターミナル(シリアル通信)ソフトで、
表示してみます。
シリアル通信のプログラムを1から記述しても良いのですが、
Python言語には、数多くのライブラリが用意されています。
技量のない私は、このライブラリのお世話になることにします。
シリアル通信用のライブラリ “pySerial” を使用します。
この “pySerial” ライブラリを使用するには、
インストールが必要です。
”pySerial” のインストールは、
コマンドプロンプトから
デスクトップにショートカットがない場合、
 Windowsメニュー「スタート」→「Windowsシステムルール」
     →「コマンドプロンプト」
で起動します。

”pip install pyserial” と打鍵します。

これで、インストールは完了でライブラリの利用が可能になります。
プログラミングは Visual Studio Code で行います。
デスクトップにショートカットがない場合、
 Windowsメニュー「スタート」→「Visual Studio Code」
    →「Visual Studio Code」
で起動します。

メニュー「ファイル(F)」→「新規ファイル」で、
新規のプログラミング用のシート(Untitled-1)を用意します。


もちろん、Arduino IDE での Arduino 言語と、
Python言語では、言語の違いから記述方法が違います。
ですが、ある程度 Arduino 言語が理解出来ていれば、
何となく分かるのではと思います。
違いを何点かあげてみると、
 ・行コメントは、 // ではなく、 # です。
 ・1文の終わりに ; は必要ない。
 ・制御文法(for、while等)のブロック記述は、 { } ではなく、
  インデントで行う。
などでしょうか。
プログラムの記述前に次の2点を確認しておきます。
 ・Arduino との接続ポートの確認
  ※Windowsメニューで、右クリック→「デバイスマネージャー(M)」、
   デバイスマネージャー画面のポート(COMとLPT)欄で確認します。
   このとき、Arduino とUSBケーブルで接続されていないと表示されません。 

 ・Arduino 側スケッチの Serial.begin( ) の通信速度を確認
 私の場合、
  ・ポート:COM3
  ・通信速度:9600bps
 でした。
では、記述してみます。
# pySerialモジュールをインポート
import serial
# 通信条件設定・通信オープン
seri = serial.Serial('COM3',9600,parity=serial.PARITY_NONE)
# 通信(受信)無限ループ
#     ”crtl + c” キーでの停止を例外処理で可能にしておく
try:
    while True:
        # ポートより一行を取得    
        r_data = seri.readline()
        # 全角文字を含むため文字コード変換
        r_data = r_data.decode('utf-8')
        # 改行を無効にして表示出力(Python print()の改行を無効に)
        print(r_data,end='') 
except KeyboardInterrupt:
    print('Stop with key!')
# 通信クローズ   
seri.close() 
こんな感じで書いてみました。
簡単な解説です。
・今回作成のターミナルソフトは、受信のみ対応です。
・serial.Serial( ) 文の、'COM3' は、デバイスマネージャー(M)の
 ポート(COMとLPT)欄より確認し、Arduino との接続ポートを設定します。
 次の 9600 は、Arduino 側スケッチの Serial.begin( ) の設定値と合わせます。
・受信処理を永久ループ(while True:)で行うように記述していますので、
 停止できません。
 そのため、キーボードからの ”crtl + c” キーで停止出来るように、
 例外処理(try:)で対応しています。
・Arduino 側から、全角文字(℃)を送信してきますので、
 decode( ) 文を使って文字コード変換を行っています。
 送信データが半角のみの場合は、不要だと思います。
・print( )文では、改行することがデフォルトとなっていますので、
 今回は、受信した情報に改行指示が含まれるので、
 二重改行になってしまいます。 
 そのため、print( )文の引数に、end='' を付けて、
 print( ) 文の改行を無効にしています。
実行してみます。
1.メニューの「ファイル(N)」 → 「名前を付けて保存…」
 で、保存します。
 私の場合、
  ・保存場所:C:\python_lang
  ・ファイル名:”terminal_1.py”
  ・ファイルの種類:Python
 としました。
 ※本来は、1,2行記述したところで、一度保存されるのが良いと思います。
  そうすれば、Python言語での文法チェックを受けながら記述することが出来ます。



2.Arduino と PCをUSBケーブルで接続します。
 このとき、デバイスマネジャーより、ポートを再確認しておきます。
 私の場合、
  ・ポート:COM3
 でした。
3.メニューの「実行(R)」 → 「デバッグなしで実行」
 で、プログラムを起動します。


これで、Visual Studio Code のターミナル窓(右下窓)に
Arduinoからの、気圧と温度が表示されれば完了です。


