Saya berhasil mengikuti instruksi di situs web ini:
http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
dan saya bisa mendapatkan komunikasi antara pi dan mega arudino saya persis seperti yang ditentukan situs web.
Namun, alih-alih mengirim bilangan bulat yang mewakili berapa kali LED berkedip, saya ingin mengirim teks ASCII seperti:
"MOVE 5 METER FORWARD", "TURN LEFT", "MOVE 10 METER BACKWARD" ke arduino dari pi.
Saya menulis kode berikut:
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);
}
}
Saya mem-flash kode di atas dengan sukses ke Arduino Mega 2560 saya.
Saya beralih ke terminal python saya di Raspberry Pi dan di konsol saya mengetik:
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
Apa yang ditampilkan pada Monitor Seri Arduino saya adalah sebagai berikut:
Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E
Tapi yang saya inginkan adalah:
Arduino Received: MOVE
Bagaimana cara mengubah kode di atas untuk memasukkan semua karakter ke buffer inData?
Jawaban:
Masalahnya adalah bahwa Arduino berputar-putar begitu cepat, itu akan mengeksekusi
if (numBytesAvailable > 0)
garis beberapa kali antara setiap karakter yang datang melalui port serial. Jadi begitu sebuah karakter tiba, ia mengambilnya, berputar dari nol ke satu, dan mencetak satu karakter.Yang harus Anda lakukan adalah mengirim karakter garis akhir ('\ n') setelah setiap perintah dari program Python Anda. Kemudian minta buffer kode Arduino Anda masing-masing karakter yang diterimanya dan hanya bertindak pada pesan setelah menerima karakter end-of-line.
Jadi jika Anda mengubah kode Python Anda jangan mengirim karakter garis akhir, seperti:
Maka kode Arduino Anda bisa seperti ini:
sumber
Python naskah Anda mengirimkan empat byte,
M
,O
,V
, danE
. Bagaimana Arduino seharusnya tahu bahwa itu adalah string tunggal? Pertimbangkan bahwa kode Python:adalah benar-benar identik dengan
dari sudut pandang Arduino. Port serial mentransfer karakter, bukan string.
Dalam kode Anda, Arduino cepat (dibandingkan dengan baud rate 9600), jadi setiap kali dipanggil
Serial.available()
, ia hanya melihat satu dari empat karakter itu. Itu sebabnya Anda mendapatkan hasil yang Anda lakukan.Yang perlu Anda lakukan adalah membuat beberapa cara untuk membatasi string, yaitu menandainya dengan beberapa cara dari Python sehingga Arduino dapat menambahkan karakter individu yang diterimanya ke dalam konsep string tingkat tinggi Anda .
Menggunakan garis sangat mudah: kirim setiap string yang diakhiri dengan karakter baris baru (
'\n'
). Di Arduino, baca karakter dan tambahkan ke string Anda. Ketika Anda melihat'\n'
, string sudah berakhir dan Anda dapat mencetaknya.sumber
Kode di atas berfungsi sempurna pada koneksi saya antara Pi dan Arduino
sumber
Gunakan
.readline
sebagai ganti.read
Saya memiliki masalah yang sama dan ini segera diperbaiki. Semoga ini bisa membantu!
sumber
Ini adalah bagaimana saya melakukannya dari contoh pertama:
sumber