Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

「Arduinoのシリアル入力から文字列を受け取る。」のPC側Pythonプログラム

Arduinoのシリアル入力から文字列を受け取る。」は、実はPC側がPythonプログラムの例だった。
https://algorithm.joho.info/arduino/python-serial-led-string/
なんかちょっとPythonに興味あったのでやってみたのだが、問題ないはずのArduino側で手こずって、当初の興味の対象のPythonが後回しになった。

で、こっちも、あれこれ悩んだ。

同じサイトのここを参考にPython環境を整えたのだが、同じサイトのスクリプトがエラーで動かない。
同じサイトの意味がないよ。
後でよくよく調べたらコードはPython2用らしいのに環境はPython3を薦めているチグハグなサイトだった。

動かないやつ。

「初学者には」とか語っておきながら、そのサイトのプログラムが互換性に関連したエラーで動かないなんて、と思った。
他のサイトを探そうと思ったが、せっかくArduinoの方の準備ができたのでもう少し粘ることにした。
ちなみに、検索検索で他のサイトにはいろいろ助けてもらって結局動くようにできたけど、ここのサイトは全く役に立ってない。
と、恨み言を書いておこう。
そもそもコードの書いてあるページにバージョンの話が一切ないので初学者には気付くことさえ無理。

基本のスタンスは、まず実行してエラー・メッセージを吐いてもらって、それを見て検索したり考えたりするというものだ。

実行1回目

どうやらシリアル・ポートの番号の指定方法がダメらしい。
検索で行き当たったがここ。
https://stackoverflow.com/questions/40710110/valueerror-port-must-be-none-or-a-string-not-class-int
なんかいろいろ書いてあるが、超斜め読みでは直接「COM5」って書くのが手っ取り早いように思われた。
こうした。

直接「”COM5″」と書き、無関係になった部分はコメント・アウトした。

実行2回目

「raw_inputなんて知らんよ。」とおっしゃっている。
検索する。
ここに行き当たる。
https://yaaamaaaguuu.hatenablog.com/entry/2017/03/12/194658
raw_inputでなくinputに直せばいいらしいと分かる。
同時に、一連のエラーがPython2とPython3の互換性関連ではないかとのニュアンスも得る。
直す。

実行3回目

「on」を送るとLEDが点灯するということなので「on」と打ってエンターを押すのだが、
unicode strings are not supported
と出る。
検索してここに行く。
https://stackoverflow.com/questions/35642855/python3-pyserial-typeerror-unicode-strings-are-not-supported-please-encode-to
ser.write (serialcmd)はser.write(serialcmd.encode())にするようにと回答されている。
私の見ているコードではser.write(flag+”.”)なのだが、とりあえずser.write(flag.encode())としてみる。

実行4回目

意図したとおりに動作し、LEDもちゃんと点灯、消灯し、「a」で終了した。

教訓
Python2かPython3かは鬼門。
その点に関して配慮の無いサイトは、つまり書いたあと放置してるサイトなのであまり参考にしない方がいい。
余計な遠回りをする羽目になる。

追記(2019/06/19)
Arduinoのシリアル入力から文字列を受け取る。」で最終的にSerial.readStringUntilを使うことにしたので、終端コードを決めておく必要が生じた。
flag = input()+”¥n”
として、Arduino側のスケッチは
a = Serial.readStringUntil(‘¥n’);
のようにすることにした。

以上、環境は Windows10 Pro 64BIT の下で Arduino 1.8.8, Python 3.7.2 を用いた。

このエントリーをはてなブックマークに追加

Posted under: Arduino


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.