2

私はArduinoでいくつかのコードを実行しています.cgiスクリプトを使用して値をPythonに渡すスライダーのあるWebサイトがあります。次に、python スクリプトは pySerial を使用して、モーターを制御する Arduino に値を送信します。

ウェブサイトのスライダーを使ってモーターの速度を制御できるようにする計画でした。

ただし、ウェブサイトで値を変更するたびにArduinoがリセットされ、モーターが停止するという問題に直面しているようです。これを回避する方法はありますか?私のpythonコードは以下です。

#!/usr/bin/env python
import cgi
form=cgi.FieldStorage()

import json

ser = serial.Serial('dev/ttyACM0', 9600) 
#I think there should be a sleep here for 1.5 seconds
ser.write("%s\n" % (form["value"]))
ser.close()

print "Content-type: application/json"
print
print(json.JSONEncoder().encode({"status":"ok"}))

たとえば、モーターが 50% の速度で動作していて、Web サイトで値を変更すると、serial.Serial('dev/ttyACM0', 9600) コマンドを実行するこのスクリプトが実行されます。これにより、arduino をリセットするポートが開き、新しいコマンドを渡す前にモーターが停止します。

ser.write("%s\n" % (form["value"])) ポートを新たに開かずにarduinoに渡す方法はありますか? Pythonセッション間でポートを開いたままにするなど?

そうでない場合、この問題を回避する他の方法はありますか?

4

2 に答える 2

2

リセットは、使用している特定の Arduino デバイスのハードウェア設計によるものだと思います。代わりに Arduino Micro または Leonardo ボードを使用することをお勧めします。それらは仮想シリアル ポートを使用し、シリアル ポートが開かれるたびにスケッチを再起動するべきではありません。これはArduinoサイトからのものです:

シリアルポートを開いてもリセットされません。

Arduino Uno とは異なり、Leonardo と Micro は、コンピューターのシリアル ポートを開いたときにスケッチを再起動しません。つまり、setup() 関数で送信されたほとんどのデータなど、ボードによって既にコンピューターに送信されたシリアル データは表示されません。

リセット時のシリアル再列挙。

ボードにはシリアル通信を処理するための専用チップがないため、シリアル ポートは仮想的であり、オペレーティング システムとボード自体の両方でソフトウェア ルーチンになります。Arduino を接続するとコンピューターがシリアル ポート ドライバーのインスタンスを作成するように、Leonardo/Micro はブートローダーを実行するたびにシリアル インスタンスを作成します。このボードは、USB の Connected Device Class (CDC) ドライバーのインスタンスです。これは、ボードをリセットするたびに、USB シリアル接続が切断され、再確立されることを意味します。ボードがシリアル ポートのリストから消え、リストが再列挙されます。Leonardo へのシリアル接続が開いているプログラムは、接続を失います。これは、Arduino Uno とは対照的です。これにより、USB 接続 (セカンダリ ATmega8U2 または ATmega16U2 プロセッサによって維持される) を閉じることなく、メイン プロセッサ (ATmega328P) をリセットできます。この違いは、ドライバーのインストール、アップロード、および通信に影響を与えます...

于 2013-08-25T19:32:46.213 に答える
0

を使用できるかもしれませんがsetDTR(False)、これはまだテスト済みです。しばらく前に、当初は setDTR に関連していたバグが修正されました。これをどのオペレーティングシステムで使用していますか?

ser = serial.Serial('dev/ttyACM0', 9600)
ser.timeout = 1
ser.setDTR(False)

これが機能しない場合はお知らせください。

于 2013-08-15T17:37:28.377 に答える