🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
IDE

IDE、統合開発環境((Integrated Development Environment)とは、テキストエディタ以上の機能を提供して、ソフトウェア開発を効率をあげるコンピュータプログラムを指す。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

1109閲覧

Arduinoのシリアルモニタの送信ボタンは何を実行している?

sattyorin

総合スコア5

IDE

IDE、統合開発環境((Integrated Development Environment)とは、テキストエディタ以上の機能を提供して、ソフトウェア開発を効率をあげるコンピュータプログラムを指す。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/12/28 09:28

編集2019/12/28 09:35

前提・実現したいこと

arduinoのシリアルモニタの送信ボタンで実行されていることを、pythonプログラム上で実行したい。

arduino

1if (Serial.available() > 0){ 2 Serial.print(hoge); 3} 4```がarduinoに書き込んであり、pythonのプログラムによってSerial.available() > 0 の状態にしたい。 5 6### 試したこと 7. 8arduino IDEのシリアルモニタでAとか3とかなんでもいいからなにか'送信'するとhogeの内容はシリアルモニタ上に出力される。 9 10. 11pyserialを使って 12```python 13ser = serial.Serial('/dev/ttyACM0', 115200,timeout=None) 14ser.write(str.encode('A')) 15data = ser.readline() 16print(data)

ser.read()の前で受信待ち状態になる。
arduino上のプログラムのif (Serial.available() > 0)を消して実行したらhogeの内容はちゃんとターミナル上にプリントされた。
'送信'と同じことをするには何を書けばいいの...?Serial.available() > 0 の状態にするにはどうすれば...?

どなたか教えていただけると大変助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

(timeoutの扱いを勘違いしてたので全面改稿。コメント欄はその痕跡...)

私の環境はWindowsですが、Jupyterで一行ずつ実行してみると、
Pythonでシリアルポートを開いたとたんにArduinoのLEDがチカチカします。
その後間をおいて'A'を送ればArduinoが送信を始めました

Mac/Linuxでも同様だとすれば、Pythonのシリアル制御がボートOpen時にDTRをいじっているかなにか、それでArduinoが一旦リセットされているのでは。(ちょっとオシロを引っ張り出すのが面倒なので確認してません)
Open(Serialのインスタンス生成)したあと、1秒ぐらい待ってみるとどうなりますか。


オシロ引っ張り出して見てみました。やっぱり、Pythonでポート開いたときにArduinoのリセット端子が落ちています。

Arduino

1void setup() { 2 Serial.begin(115200); 3 pinMode(2,OUTPUT); 4} 5 6void loop() { 7 digitalWrite(2,HIGH); 8 if(Serial.available() > 0){ 9 Serial.println(millis()); 10 } 11}

として見ていると、リセットから2PinがHになるまで1.5秒ぐらいかかっています。余裕を見て2秒くらい待ったほうがいいかも。(アナログのビンテージもののオシロなので画面写真とかはありません)

投稿2019/12/28 11:16

編集2019/12/28 12:07
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2019/12/28 11:24

あ、逆か> timeout 勘違いすみません
sattyorin

2019/12/28 11:29

ありがとうございます。しかし、 ser = serial.Serial('/dev/ttyACM0', 115200,timeout=100) ser = serial.Serial('/dev/ttyACM0', 115200,timeout=500) ser = serial.Serial('/dev/ttyACM0', 115200,timeout=1000) で試してみましたが変わらないです。 ser.write(str.encode('A')) print('flag') data = ser.readline() print(data) print('done') で実行するとflagだけプリントされます。
sattyorin

2019/12/28 12:38

私の環境はLinux(ubuntu)です。 time.sleep(3)を試しましたが、だめでした。 しかし for i in range(10):   for j in range(10000): ser.write(str.encode('A'))   data = ser.read()   print(data) としたら1回だけは読んでくれました...笑
sattyorin

2019/12/28 12:40

ser.setDTR(False)とtime.sleep(3)両方書いたらできました!!
sattyorin

2019/12/28 12:47

追記今見ました!わざわざありがとうございます...!もうすこし色々試してみます!
guest

0

状況を正しく把握できてませんでした
多分thkanaさんの指摘のとおりかなと思います。


arduino側が送れていないのではありません
python側で読めていません。

readlineは一行(改行文字まで)読みます。
送ってる方は改行文字は入れてない。
読んでる方は改行文字を待っている。

それだけ

投稿2019/12/28 09:41

編集2019/12/28 12:09
ozwk

総合スコア13551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sattyorin

2019/12/28 09:48

hogeの内容(の一例)はb'0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\r\n' であり、"試したこと"に書いたようにreadlineはできています。Serial.available() > 0にならないのが問題なのかなと思っています。もし、Serial.available() > 0の状態にできる方法を知っていれば教えていただきたいです。
ozwk

2019/12/28 10:16

> 、"試したこと"に書いたようにreadlineはできています どこに書いてあるんですか? 質問のpythonのコードをreadlineからreadにしたら読めないってこと?
sattyorin

2019/12/28 10:25

すみません、 "arduino上のプログラムのif (Serial.available() > 0)を消して実行したらhogeの内容はちゃんとターミナル上にプリントされた。" のことを指しました。 > 質問のpythonのコードをreadlineからreadにしたら読めないってこと? if (Serial.available() > 0 がarduinoに書き込まれているとできません。if (Serial.available() > 0)を書き込まないとできます。結果は b'0'です。 arduinoのシリアルモニタの送信ボタンは何を実行しているのかがわかりません。何かを"送信"すると(Serial.available() > 0)の状態になりSerial.print(hoge);を実行してくれます。その 何かを"送信" をpythonのプログラムで実行したいです。
ozwk

2019/12/28 11:42 編集

「送信」はpythonで言ったらwrite()相当です 通ってるか試しにserial.availableのif文内でledつけるとかしてみてください
sattyorin

2019/12/28 12:48

ozwkさんもコメントありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問