とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【Arduino】Arduino と python でシリアル通信

Pythonには、pyserialというシリアル通信専用のライブラリがあります。
Welcome to pySerial’s documentation — pySerial 3.0 documentation
この記事では、そのpyserialというライブラリを使って、Arduino UNO と PC(Pythonを使用)をシリアル通信してみたいと思います。

1.pyserialのインストール

pip install pyserial

を実行します。
下のプログラムで

import serial

と書いていますが、モジュールの名前は「pyserial」です。
「pip install serial」を実行すると別のモジュールがインストールされて、シリアル通信できないので注意してください。

pyserial の代わりに serial をインストールすると、こうなるようです。
stackoverflow.com

2.pyserialの使い方

1.COMポートを開く

Pythonではこのように書きます。

import serial
ser = serial.Serial('COM3', 115200, timeout=0.1) 

ArduinoをつなげたCOMポートの名称、ビットレートタイムアウト時間の順で指定します。

もし間違ったCOMポートを指定すると、下のようなエラーが出ます。

SerialException: could not open port 'COM5': PermissionError(13, 'アクセスが拒否されました。', None, 5)



2.COMポートを閉じる

COMポートを閉じるにはこのように書きます。

ser.close()

上のプログラムでserとは、「1.COMポートを開く」のプログラムの ser = serial.Serial(...) のserです。
ポートをクローズしないと、次回使う時にポートが開けずにエラーが出てしまうので、必ず ser.close() をどこかで実行するようにしてください。

また、Python特有のwithを使って次のように書くこともできます。

with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
    x = ser.read()  

このように書くと、ser.close() と書かなくてもwithの中を抜けると、勝手にポートを閉じてくれます。

 

2.文字の送信(一文字ずつ)

PC(Python)→ Arduino に文字「a」を送信してみます。

Pythonのプログラム

import serial

ser = serial.Serial(COM5, 115200, timeout = 0.1)
ser.write("a") 
ser.close()
 (以下省略)


Arduinoのプログラム

void setup(){
  Serial.begin(115200);
}

void loop(){
  int data= Serial.read();
 (以下省略)
}

 

3.文字列受信

Arduino→PC(Python)に文字列を送信します。(Python側は、文字列を受信します。)

Pythonのプログラム

import serial

ser = serial.Serial(COM5, 115200, timeout = 0.1)
data = ser.read_all() 
ser.close()
 (以下省略)

 

Arduinoのプログラム

void setup(){
  Serial.begin(115200);
}

void loop(){
  Serial.println("hello");
 (以下省略)
}

Pythonのプログラムの中の、ser.read_all()関数は、その名の通りシリアル通信で受信したデータをすべて読み込む関数です。読み込んだ文字列は、dataに格納されています。

 

4.byte型のデータを送信

PC(Python)→ Arduinobyte型のデータを送信します。
Arduinoの Serial.write() 関数のPython版です。

Pythonのプログラム

import serial

ser = serial.Serial(COM5, 115200, timeout = 0.1)
ser.write(bytes([123]))
ser.close()
 (以下省略)

 

Arduinoのプログラム

void setup(){
  Serial.begin(115200);
}

void loop(){
   byte data = (byte)Serial.read();
 (以下省略)
}

5.byte型のデータを受信

Arduino→PC(Python)にbyte型のデータを送信します。(Python側は、byte型の数値を受信します。)

Pythonのプログラム

import serial

ser = serial.Serial(COM5, 115200, timeout = 0.1)
String_data = ser.read()
int_data = int.from_bytes(String_data , 'big')
ser.close()
 (以下省略)

 

Arduinoのプログラム

void setup(){
  Serial.begin(115200);
}

void loop(){
   Serial.write(123);
 (以下省略)
}