私はシリアル経由でarduinoと通信するPythonスクリプトを持っています。それは私のコンピュータ上で期待どおりに動作しますが、私は自分のRaspberry Piでスクリプトを実行すると動作しません。 「Sent:1」を印刷した後に固まってしまいます。私はそれがarduino(sendValueからの最初の行)から1バイトを待っていると思う。しかし、私はコンピュータやPiのシリアルモニタから正常に動作するので、なぜこれが起こっているのか分かりません。Arduinoとインターフェイスしてシリアル経由でラズベリーパイに作用しないPythonコード
Pythonスクリプト:
import serial
ser = serial.Serial('/dev/ttyACM0', 9600)
def sendValue(value):
ser.read(1) # Arduino will send one byte when it's ready for the value
ser.write(value) # Send value
print("Sent: {}".format(value))
return;
ser.write('1') # Select function '1'
print("Sent: 1")
sendValue('5000') # Send 1st parameter to function '1'
sendValue('4000') # Send 2nd parameter to function '1'
while True:
print(ser.readline())
Arduinoのコードは:私はそれが立ち往生だと思うところ
int task = 0;
int val = 0;
int val2 = 0;
int val3 = 0;
void task1(int length){
Serial.println(length);
digitalWrite(13, HIGH);
delay(length);
digitalWrite(13, LOW);
}
void task2(int length1, int length2){
Serial.print("Running task2 with parameters ");
Serial.print(length1);
Serial.print(" and ");
Serial.println(length2);
digitalWrite(13, HIGH);
delay(length1);
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(length2);
digitalWrite(13, LOW);
}
void waitForSerial(){
while(Serial.available() == 0);
}
int getValue(){
Serial.write(48);
waitForSerial();
return Serial.parseInt();
}
int getCommand(){
if(Serial.available() == 0){
return -1;
}
String in = "";
in += (char)Serial.read();
return in.toInt();
}
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
task = getCommand();
switch(task){
case 0:
val = getValue();
task1(val);
val = 0;
break;
case 1:
val = getValue();
val2 = getValue();
task2(val, val2);
val = val2 = 0;
break;
}
}
私の代わりにser.read(1)
のに遅延を入れて試してみましたが、それはまだ動作しません。
これをラズベリーパイコミュニティまたはArduinoコミュニティに配置するかどうかはわかりませんでしたので、ここで説明します。
あなたは 'シリアルを追加する必要があります。println( 'READY') 'を' setup() 'にします。シリアルに接続するたびに 'setup()'が実行されますか? – Marcel
'setup()'ルーチンはプロセッサが起動するたびに実行されます:1)電源投入、2)ボードのリセットボタンを押す、3)内蔵USBポート自動リセット ")。自動リセットは、USB接続を介してボードをプログラムできるようにするものです。詳細はこちら[http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection]またはgoogle "arduino autoreset"を参照してください。 – mhopeng
*いくつかのケースでは、Windowsホストは自動リセットを起動しませんが、LinuxまたはOS Xは常にそうするでしょう。 – mhopeng