Python 3 및 모듈 시리얼을 통해 Arduino UNO에 숫자를 보내는 방법


9

나는 Arduino (일반적으로 컴퓨터 프로그래밍)를 처음 사용 하므로이 질문이 어리석은 경우 사과드립니다.

기본 arduino-LED 연결을 설정하면 직렬 포트를 통해 INTEGERS를 arduino로 보내는 데 문제가 있습니다. 'm', 'o'등의 문자를 쉽게 보낼 수 있습니다. 그러나 숫자를 보내면 단순히 숫자를 얻지 못하는 것처럼 보입니다.

Arduino 코드는 이상적으로는 Python 또는 직렬 모니터를 통해 USB 포트에서 값을 가져온 다음 값에 따라 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 코드입니다!). 0에 LED가 꺼져 야합니다 !! 뭔가 빠졌지 만 찾을 수 없습니다 ... 무엇이 잘못되었는지 말씀해 주시겠습니까?

파이썬에서 사용하는 코드는 다음과 같습니다.

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

이 솔루션은 문자에서도 작동하지 않습니다. 또한 문자와 관련하여 다음과 같은 바이트로 전송하는 것이 좋습니다. b'm '. 어쨌든, 답변 주셔서 감사합니다.
mickkk

답변:


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

빈 댓글 상자의 회색 텍스트에 표시된 내용에도 불구하고 감사합니다. Arduino를 PC-> 플래시 인터페이스로 사용하는 Teensy 3.2를 사용하여 비트 스트림 (FPGA .bin 프로그램 파일)을 SPI 플래시 칩에 쓰려고했지만 이것이 PC에서 작동하게하는 열쇠였습니다.
KyranF

1

Serial.read()직렬 포트에서 하나의 문자 만 읽고 ASCII 값을 반환합니다 48.

완전한 숫자를 읽으려면 두 가지 옵션이 있습니다.

  1. 사용 Serial.parseInt()로 읽기 수를 반환하기 전에 변환을 필요로하고 수행으로 많은 문자로 읽는다 int. 자세한 내용은 여기를 참조 하십시오.
  2. 마지막 문자 Serial.read()까지 루프에서 withn 문자를 읽고, 각 문자를 버퍼 ( char배열)에 넣은 다음 결과 문자열을 표준 C 함수를 사용하여 숫자로 변환합니다 atoi.

물론 첫 번째 옵션이 가장 쉬운 옵션이지만 01 초 시간 초과 후 아무것도 읽지 않으면 반환 됩니다 (로 구성 가능 Serial.setTimeout()).


이 답변은 내가 요구 한 것과 정확히 일치하지는 않았지만 매우 유용했으며 사용할 것입니다! 도와 주셔서 감사합니다!
mickkk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.