search
LoginSignup
37

More than 3 years have passed since last update.

posted at

updated at

Organization

PC⇔Arduinoのシリアル通信をPython3でやってみた

実行環境はタグをどうぞ.
なかなかPC⇔Arduinoのシリアル通信をしている記事がなかったので,python3でarduinoと通信する方法をメモ.
RasPiだとたくさんあるんだけど,同じ感じで実行しても出来ない.

そもそもの話

実験装置を同期させてデータ取りたい時にArduino使って実験装置を操作する事がある.
で,最終的にはPCに実験装置のデータを集約してcsvに落とし込んだり,そこから自動でグラフ生成する.
それらを全部簡単にできるのがPythonってわけ.
じゃあPC⇔Arduinoのシリアル通信する必要があるよね!(SPI通信...?知らんな)

...まあシリアル通信でも遅延があるので,完全同期は無理!
お金のある人はLabVIEW​で実験装置同期してデータ取ろうな!(血涙)
LabVIEW 2018

やり方

PythonでPySerialを使用する.
ターミナルにてpipコマンドを使ってPySerialをインストール.

$ pip install pyserial

実際のコードは以下の通り.書くのめんどいのでArduino→PCも同じ感じでやってくれ.

PC側

Serial_PC.py
import serial

#シリアル通信(PC⇔Arduino)
ser = serial.Serial()
ser.port = "COM4"     #デバイスマネージャでArduinoのポート確認
ser.baudrate = 115200 #Arduinoと合わせる
ser.setDTR(False)     #DTRを常にLOWにしReset阻止
ser.open()            #COMポートを開く
ser.write(b'1')       #送りたい内容をバイト列で送信
ser.close()           #COMポートを閉じる

Arduino側

Serial_arduino.ino
//シリアル通信(PC⇔Arduino)
char data;

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

void loop(){
 if (Serial.available() > 0) {
   data = Serial.read();
   if(data == '1'){
     //実行したい内容
   }
   else{
     //違う時
   }
 }
}

気を付ける事

Arduinoとの通信が始まらない

ser.setDTR(False) #DTRを常にLOWにしReset阻止

これが超・重・要☆
これがないと通信開始時にArduinoがリセットされて通信エラーになる
コンパイルエラーも出ないのでマジで鬼畜仕様.
これで半日位溶かした気が...

参考までに日本語のサイト1個だけ見つけたので載せる.
http://erias00.blogspot.com/2016/05/pyserialrts.html

COM番号が2ケタ

COM番号が2ケタだとバグる問題は健在.流石Windows様
COM10以上のシリアルポートを指定する方法

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
37