実行環境はタグをどうぞ.
なかなかPC⇔Arduinoのシリアル通信をしている記事がなかったので,python3でarduinoと通信する方法をメモ.
RasPiだとたくさんあるんだけど,同じ感じで実行しても出来ない.
#そもそもの話
実験装置を同期させてデータ取りたい時にArduino使って実験装置を操作する事がある.
で,最終的にはPCに実験装置のデータを集約してcsvに落とし込んだり,そこから自動でグラフ生成する.
それらを全部簡単にできるのがPythonってわけ.
じゃあPC⇔Arduinoのシリアル通信する必要があるよね!(SPI通信...?知らんな)
...まあシリアル通信でも遅延があるので,完全同期は無理!
お金のある人はLabVIEWで実験装置同期してデータ取ろうな!(血涙)
[LabVIEW 2018]
(http://www.ni.com/ja-jp/shop/labview.html)
#やり方
PythonでPySerialを使用する.
ターミナルにてpipコマンドを使ってPySerialをインストール.
$ pip install pyserial
実際のコードは以下の通り.書くのめんどいのでArduino→PCも同じ感じでやってくれ.
PC側
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側
//シリアル通信(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以上のシリアルポートを指定する方法]
(https://support.microsoft.com/ja-jp/help/115831/howto-specify-serial-ports-larger-than-com9)