【PySerial】Python×Arduinoで制御してみる1【Lチカ】

はじめに

こんにちは、がんがんです。
本日はPythonによるシリアル通信であるPySerialを実験したのでその備忘録です。

PySerialとは

PySerialはPythonでシリアル通信を可能にするものです。


ドキュメントはこちらです。
Welcome to pySerial’s documentation — pySerial 3.0 documentation

追記【2019.01.15】

ありがたいことに
鹿児島大学生 Advent Calendar 2018の13日目に参加させて頂きました。
コメント、ミスなどあれば指摘のほどよろしくお願いします。

環境、注意点

PySerialの使い方はこちらを参考にしました。
shizenkarasuzon.hatenablog.com

環境としては

  1. Windows 10 Pro
  2. Python 3.6.4
  3. PySerial 3.4

を使用しています。OSの環境が変わるとポートの入力方法が変わるので注意。


また、PySerialのバージョンにも注意。
昔のバージョンでは、ポートの入力がint型でしたが、現在はCOM*というstr型になっているので注意しないといけない。

この違いに気づかずに躓いた記事も以下に置いておきます。
【Python/Arduino】シリアル通信でLED点滅(1文字) | アルゴリズム雑記

実験

k99-tech.com

まずはこちらの記事を参考にしてLEDを光らせていきます。今回は参考記事にベースを合わせています。
"1"が送信されたらLED点灯、"0"が送信されたらLED消灯です。

コードは以下のようになっています。
なお、送信するものはバイト型である必要があるためbを忘れずに気をつけねばです。

#  python_led.py
import serial, time

def main():
	#  COMポートを開く
	print("Open Port")
	ser =serial.Serial("COM3", 9600)
	while True:
		#  LED点灯
		ser.write(b"1")
		time.sleep(1)
		#  LED消灯
		ser.write(b"0")
		time.sleep(1)
	
	print("Close Port")
	ser.close()
/*
  PythonでLEDを制御
    led.ino
*/

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);  //  初期化
}

void loop() {
  byte var;
  var = Serial.read();
  
  switch(var){
    case '0':
      digitalWrite(13, LOW);
      break;
    case '1':
      digitalWrite(13, HIGH);
      break;
    default:
      break;
  }
}


しっかりとLEDが点滅してくれました。無限ループなので止め方も考えておくべきでした。

まとめ

今回はPythonのシリアル通信ライブラリPySerialを試してみました。
Pythonの方がArduino言語よりも使い慣れているため、個人的に開発が楽になりました。

次回はcsvファイルから値を読み込み、それを送信したりしたいです。