Eu sou novo no Arduino (e na programação de computadores em geral), então peço desculpas se essa pergunta parecer boba.
Depois de configurar uma conexão arduino-LED básica, tenho problemas ao enviar INTEGERS para o arduino através da porta serial. Posso facilmente enviar caracteres como 'm', 'o' e assim por diante. No entanto, se eu enviar um número, parece que ele simplesmente não o entende.
Aqui está o código do Arduino, idealmente, ele deve obter um valor da porta usb através do python ou do monitor serial e, em seguida, ajustar o brilho do LED de acordo com o valor. (o valor deve estar no intervalo [0,255]).
NOTA: Estou usando ARDUINO UNO e 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);
}
No entanto, quando insiro um valor na porta serial ou através do Python, por exemplo 0, ele me fornece 48 como resposta (que, curiosamente, é o código ASCII para 0!) E acende o LED, que não é o que deveria acontecer desde a 0 o LED deve estar apagado !! Estou faltando alguma coisa, mas não consigo encontrar o que ... Você poderia me dizer o que está errado?
Aqui está o código que eu uso no 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()
o que estou fazendo de errado ou mal-entendido? Obrigado.
fonte
arduino.write(chr(valueToWrite))
Respostas:
A análise no Arduino pode ser lenta e demorada (o que é ruim se você usar a pré-escala do relógio ou tiver tarefas críticas), então vamos fazê-lo no Python.
O problema é que você está enviando os números como ASCII, enquanto você precisa enviá-los como binários brutos. É aqui que
struct
entra.Então, o que você realmente quer é:
ou algo nesse sentido.
fonte
Serial.read()
lê apenas UM caractere da porta serial e retorna seu valor ASCII, o que explica o que48
você obteve.Para ler um número completo, você tem 2 opções:
Serial.parseInt()
que leia quantos caracteres forem necessários e realize a conversão antes de retornar o número de leitura como umint
. Por favor, verifique a referência aqui.Serial.read()
) até o último, coloca cada caractere de leitura em um buffer (char
matriz) e converte a sequência resultante em um número com a função C padrãoatoi
.Obviamente, a primeira opção é a mais fácil, mas retornará
0
se nada for lido após um tempo limite de 1s (configurável comSerial.setTimeout()
).fonte