注目キーワード
  1. Photoshop
  2. Python
  3. Raspberry Pi
  4. Arduino

Arduino→Python(PC)間シリアル通信でstr,float型のデータを受信してみた

ここでは「Arduino→Python(PC)」間のシリアル通信でstr型、float型のデータを受信する方法を紹介します。

 

この記事を読むことで

Arduino側の送信プログラム

Python(PC)側の受信プログラム

str、float型のデータ受信

を知ることができます。

 

Arduinoでセンサ値を取得し、Python(PC)側にデータを送信するプログラムを知りたい方や、ロボットなどにセンサ値を取り入れたい方の参考になれば幸いです。

それでは始めていきましょう。

 

シリアル通信の準備

まずはArduino→Python(PC)間のシリアル通信を行う上で必要な物や開発環境を紹介します。

 

シリアル通信で必要なもの

Arduinoから取得したセンサ値をPython(PC)側で取得するので、これらに使うマイコン、センサ、配線は必須となります。

 

必要なもの

Arduino: Arduino MEGA2560 R3 互換機

PC: Windows 10

センサ: ボリューム等、値が取れるもの

ジャンパー線

USB-TypeBケーブル: ArduinoとPC接続用のケーブル

 

今回は簡単なセンサ値として、ボリューム(可変抵抗)を使いました。

arduinotopython_serial_00

 

ここでのボリュームの配線は

Arduino ⇄ ボリューム

5V ⇄ Vin

A0 ⇄ 信号PIN

GND ⇄ GND

となっています。

 

シリアル通信を行う開発環境

Arduino→Python(PC)でシリアル通信を行うために必要な開発環境は以下の通りです。

必要な開発環境

Python3系: python3.7.5

Arduino IDE: Arduino1.8.9

エディター: Visual studio Code

 

エディターについては、コマンドプロンプト等でも構いません。

これと言って必要な開発環境はありませんね。

 

Arduino→Python:str型シリアル通信

では早速、ArduinoとPython(PC)間でシリアル通信を行い、Arduinoから取得したセンサ値をPython側で受け取ってみましょう。

 

Arduino側のプログラム

まずはArduino側のプログラムを紹介します。

 const int VOLUME_PIN_1 = A0;    // initialize analog PIN
 const int VOLUME_MAX = 1023;
 
 void setup(){
   Serial.begin(9600);  // Start Serial Communication
}
 
 void loop(){
   float volume_value = analogRead(VOLUME_PIN_1);
   volume_value = volume_value / 3.788;  //change volume range
   Serial.println(volume_value, 3);
 
   delay(100);
}

 

Arduino側では

送信したい値をSerial.println()

するだけでOKです。

 

センサ値を複数送信する場合はまた記述方法が異なりますが、Serial.println()を使えば良いということを覚えておいてください。

 

Python側のプログラム

続いて、Python側(PC)の受信プログラムです。

Python側では「pyserial」というパッケージを使って、シリアル通信を行います。

 

「pyserial」のパッケージをインストールしていない方はコマンドプロンプトなどから

pip install pyserial

を実行し、インストールしてください。

インストールが完了したら、以下のようにプログラムを記述します。

 

この際、ArduinoのシリアルポートがマイコンやPCによって異なるので各自確認をしてください。

確認方法としては

ArduinoIDE ツール > シリアルポート

でシリアルポートを確認することができます。

arduinotopython_serialCOM5

 

また、ボーレートを変える場合は

self.baudrate = ○○

を任意に変えてください。*このときArduino側のSerial.beginと同じになるように

 

import serial


class GetData(object):

    def __init__(self):
        self.port = 'COM5'
        self.baudrate = 9600
        print("Open Port")
        self.ser = serial.Serial(self.port, self.baudrate, timeout=1)

    def get_data(self):
        value = self.ser.readline()
        value = value.decode()
        value = value.rstrip() 
        return value

    def ser_close(self):
        print("Close Port")
        self.ser.close()


if __name__ == '__main__':
    data = GetData()
    while True:
        try:
            value = data.get_data()
            print("Value:" + value)
            print(type(value))
        except KeyboardInterrupt:
            data.ser_close()
            break

 

プログラムは別のPythonファイルで呼び出す(インポートする)ことを前提として記述しているので

シリアルポートをopenする def __init__()

データを取得する def get_data()

シリアルポートをcloseする def ser_close()

と関数を分けています。

 

メイン文では、Ctrl + CでKeyboardInterruptがあったときにシリアルポートをcloseするようにtry-except文を用いています。

 

デバッグ用として

print(“Value:” + value)
print(type(value))

などを記述しています。

今回はstr型のデータをArduinoから受信するため、このようなprint文の記述で書けます。

 

str型データ値の取得結果

準備ができたらPythonファイルを実行し、Arduino側からセンサ値を受信していきます。

実行すると

<class ‘ str ‘>

Value : 24.551


といった表示がターミナルから確認できますね。

 

arduinotopython_serial_01

 

受信値としてstr型のデータを受信できていることが確認できました。

 

Arduino→Python:float型シリアル通信

続いては、float型のデータをシリアル通信で受信する方法です。

Arduino側のプログラムはstr型の時と変わらないので割愛します。

 

Python側のプログラム

先ほどはstr型のデータとして処理していましたが、float型でデータを受信していきます。

float型でデータを受信することで、他のプログラムへ組み込むときに扱いやすいと思ったのがきっかけです。

 

早速プログラムの方を見てみましょう。

import serial


class GetData(object):

    def __init__(self):
        self.port = 'COM5'
        self.baudrate = 9600
        print("Open Port")
        self.ser = serial.Serial(self.port, self.baudrate, timeout=1)
        self.value = 0

    def get_data(self):
        self.value = self.ser.readline().strip()
        self.value = float(self.value)      

        return self.value

    def ser_close(self):
        print("Close Port")
        self.ser.close()


if __name__ == '__main__':
    data = GetData()
    while True:
        try:
            value = data.get_data()
            print("Value: {}".format(value))
            print(type(value))
        except ValueError:
            pass
        except KeyboardInterrupt:
            data.ser_close()
            break

 

str型シリアル通信と違う箇所は

get_data()関数: float()型への型変換

メイン文: print出力時に.formatを使う

といった点です。

 

コピペでPythonファイルの準備ができたら、実際にfloat型データを受信できているかを確認しましょう。

 

float型データ値の取得結果

Pythonファイルを実行すると

<class ‘ float ‘>

Value: 20.063


といった結果が確認できました。

 

arduinotopython_serial_02

 

これで、用途に応じて受信する型を決めることができます。

 

以上となりますが、Arduino➡Pythonのシリアル通信でデータ受信を行う際の参考にしていただければ幸いです。

お疲れ様でした。

arduinotopython_serial_top
学びに関する情報をチェック!