Segui as instruções deste site com sucesso:
http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
e pude obter comunicação entre o pi e o meu arudino mega exatamente como o site especifica.
No entanto, em vez de enviar um número inteiro representando o número de vezes que o LED pisca, desejo enviar texto ASCII como:
"Mova 5 metros para a frente", "Vire à esquerda", "Mova 10 metros para trás" para o arduino a partir do pi.
Eu escrevi o seguinte código:
char inData[64];
char inChar=-1;
void setup(){
Serial.begin(9600);
Serial.begin("Waiting for Raspberry Pi to send a signal...\n");
}
void loop(){
byte numBytesAvailable= Serial.available();
// if there is something to read
if (numBytesAvailable > 0){
// store everything into "inData"
int i;
for (i=0;i<numBytesAvailable;i++){
inChar= Serial.read();
inData[i] = inChar;
}
inData[i] = '\0';
Serial.print("Arduino Received: ");
Serial.println(inData);
}
}
Pisquei o código acima com êxito no meu Arduino Mega 2560.
Mudei para o meu terminal python no Raspberry Pi e no console digitei:
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
O que é exibido no monitor serial do meu Arduino é o seguinte:
Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E
Mas o que eu quero é:
Arduino Received: MOVE
Como altero o código acima para obter todos os caracteres no buffer inData?
Respostas:
O problema é que o Arduino está rodando tão rápido que executa a
if (numBytesAvailable > 0)
linha várias vezes entre cada caractere que chega pela porta serial. Assim que um personagem chega, ele o agarra, passa de zero a um e imprime um único caractere.O que você deve fazer é enviar um caractere de fim de linha ('\ n') após cada comando do seu programa Python. Em seguida, peça ao seu código do Arduino que armazene em buffer cada caractere que receber e atue somente na mensagem quando receber o caractere de fim de linha.
Portanto, se você alterar seu código Python, envie um caractere de fim de linha, assim:
Então seu código Arduino pode ser algo como isto:
fonte
Seu script Python está enviando quatro bytes,
M
,O
,V
, eE
. Como o Arduino deve saber que essa é uma única string? Considere que o código Python:é completamente idêntico ao
do ponto de vista do Arduino. Portas seriais transferem caracteres, não cadeias.
No seu código, o Arduino é rápido (comparado à taxa de 9600 bauds); portanto, toda vez que ele chama
Serial.available()
, ele vê apenas um desses quatro caracteres. É por isso que você obteve a saída que obteve.O que você precisa fazer é criar uma maneira de delimitar as strings, ou seja, marcá-las de alguma forma no Python, para que o Arduino possa acrescentar os caracteres individuais que recebe ao seu conceito de alto nível de string .
O uso de linhas é simples: envie cada sequência terminada com um caractere de nova linha (
'\n'
). No Arduino, leia os caracteres e adicione-os à sua string. Quando você vê um'\n'
, a sequência acabou e você pode imprimi-la.fonte
O código acima funciona perfeitamente na minha conexão entre Pi e Arduino
fonte
Use em
.readline
vez de.read
Eu tive o mesmo problema e isso foi corrigido imediatamente. Espero que isso tenha ajudado!
fonte
Foi assim que fiz no primeiro exemplo:
fonte