Python 3およびモジュールシリアルを介してArduino UNOに番号を送信する方法


9

私はArduino(および一般的なコンピュータプログラミング)を初めて使用するので、この質問がばかげているようでしたら申し訳ありません。

基本的なarduino-LED接続をセットアップしたら、シリアルポートを介してINTEGERSをarduinoに送信できません。「m」や「o」などの文字は簡単に送信できます。ただし、数値を送信すると、取得できないように見えます。

これがArduinoコードです。理想的には、USBポートからPythonまたはシリアルモニターを介して値を取得し、その値に従ってLEDの輝度を調整します。(値は[0,255]の範囲内でなければなりません)。

注:私はARDUINO UNOとPYTHON 3を使用しています

// --------------------------

int LED = 10;
int number;

void setup(){

pinMode(LED,OUTPUT);
Serial.begin(9600);
}

void loop(){

number = Serial.read();
Serial.print(number);
Serial.print('\n');
if(number == -1){
number = 0;
}

else if(number > 255){

number = 255;

}

else if(number < 0){

number = 0;
}

analogWrite(LED,number);
delay(1000);
}

ただし、シリアルポートまたはPythonを介して、たとえば0の値を入力すると、48が回答として返され(興味深いことに、0のASCIIコードです)、LEDが点灯します。 0でLEDはオフになるはずです!! 何か不足していますが、何が見つかりません...何が悪いのか教えていただけませんか?

Pythonで使用するコードは次のとおりです。

import serial
import time
try:
    arduino = serial.Serial(port,speed)
    time.sleep(2)
    print("Connection to " + port + " established succesfully!\n")
except Exception as e:
    print(e)

#Note: for characters such as 'a' I set data = b'a' to convert the data in bytes
#However the same thing does not work with numbers...
data = 0
data = arduino.write(valueToWrite)
time.sleep(2)
arduino.close()

私は何を間違っているか、誤解していますか?ありがとうございました。


1
試してみるarduino.write(chr(valueToWrite))
Gerben 2014

このソリューションは文字に対しても機能しません。さらに、文字に関する限り、b'm 'のようなバイトとして送信するだけで問題は解決します。とにかく、答えてくれてありがとう。
mickkk 14

回答:


6

Arduinoでの解析は遅くて時間がかかる可能性があるため(クロックのプリスケーリングを使用したり、時間を重視するタスクがある場合は悪いことです)、Pythonで実行してみましょう。

問題は、数値をASCIIとして送信するのに対し、それらを生のバイナリとして送信する必要があることです。これがstruct出てくるところです。

3>> import struct
3>> print(struct.pack('>B', 0))
b'\x00'
3>> print(struct.pack('>B', 255))
b'\xff'
3>> print(struct.pack('>2B', 255, 0))
b'\xff\x00'
3>> print(struct.pack('>H', 9000))
b'#('

だからあなたが本当に欲しいのは:

data = arduino.write(struct.pack('>B', valueToWrite))

またはその効果に何か。


どうもありがとうございました!これはまさに私が探していたものです!
mickkk 2014

空のコメントボックスの灰色のテキストが言っていることにもかかわらず、私は感謝します!ArduinoをPC->フラッシュインターフェイスとして使用するTeensy 3.2を使用して、ビットストリーム(FPGA .binプログラムファイル)をSPIフラッシュチップに書き込もうとしており、これがPC側で動作させるための鍵でした。
KyranF 2017

1

Serial.read()のみ読み込みONEシリアルポートから文字をして説明し、そのASCII値、返す48あなたが得たが。

完全な番号を読み取るには、2つのオプションがあります。

  1. Serial.parseInt()必要な数の文字を読み取り、読み取った数をとして返す前に変換を実行するを使用しますint。こちらのリファレンスをさらに確認しください。
  2. Serial.read()最後の1つまでループで(nを使用して)個々の文字を読み取り、読み取った各文字をバッファー(char配列)に入れて、結果の文字列を標準のC関数で数値に変換しますatoi

もちろん、最初のオプションが最も簡単ですが0、1秒のタイムアウト後に何も読み取られない場合に戻ります(で構成可能Serial.setTimeout())。


この答えは、私が求めていたものとは完全には一致しませんでしたが、非常に便利で、私はそれを使用します!助けてくれてありがとう!
mickkk 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.