簡單實現電腦讀取csv檔資料並與Arduino進行傳輸
本篇文章實作的範例為從電腦讀取csv資料後,將其中一筆csv的資料傳送至Arduino,在Arduino上接收來自於電腦傳送的資料後,再將此資料傳回電腦,顯示在螢幕上。
實際連接方式
簡單用傳資料的USB連接線將電腦與Arduino連接後,即可實現。
Arduino端程式
在Arduino端須將以下程式燒錄至Arduino上作運行。
此程式會跟先前在簡單實現Arduino與電腦傳輸字串範例的文章裡面的Arduino程式一樣。
下圖為程式碼在Arduino IDE開啟的樣子。
以下為Arduino端程式碼
void setup() {
Serial.begin(9600); // 設定串列通訊速率為9600 bps
}
void loop() {
if (Serial.available() > 0){
String data = Serial.readStringUntil('\n'); // 讀取從電腦發送的資料,直到換行符號
data.trim(); // 移除可能的空格
Serial.print(data); // 直接將資料回傳給電腦
Serial.print('\n'); // 在每次發送後加上換行符號
}
}
程式碼講解
一開始要先有
if (Serial.available() > 0)
代表串列通訊可行的時候,再執行if裡面的程式,這樣的好處是避免在沒有串列通訊的時候,去執行,那也不會接收到字串,來避免沒有回應的問題。
因為我們是讀取字串,要判斷字串要讀取到換行符號的時候,才算一個完整的字串
data = Serial.readStringUntil('\n');
然後後面就是用Serial.print將data也就是Arduino接收電腦傳遞的字串,再傳遞回給電腦。
Serial.print(data);
CSV檔資料
這邊的CSV檔資料只有一個欄位就是Number,以下依序就為1,2,3…
CSV檔裡面其中一筆資料指的就是一個欄位的資料,像是第一筆資料就是Number,第二筆資料就是1,往下依此類推。
Python端程式
在電腦端要準備python程式。
以下是在spyder IDE上開啟python程式。
要運行python程式之前,要import serial與time的兩個模組。
以下為完整程式碼
以下為完整程式碼
import serial
import csv
import time
ser = serial.Serial('COM5', 9600, timeout=2)
i = 0
time.sleep(5)
with open('Data2.csv', newline='') as csvfile:
csv_reader = csv.reader(csvfile)
for row in csv_reader:
data = row[0]
print('Data send to Arduino:', data)
ser.write(data.encode())
response = ser.readline().decode('utf-8')
i = i + 1
print('Response from Arduino:', response)
time.sleep(1)
ser.close()
一開始會採用python的serial模組開啟串列通訊,這邊要設定好Arduino連接的連接埠,還有傳輸的baud rate。
ser = serial.Serial('COM5', 9600, timeout=2)
這邊的話我有用time.sleep先休息5秒鐘,目的在於要有個緩衝時間,讓通訊運作。
time.sleep(5)
首先要先開啟csv檔案,我們會指定csv_reader為這個檔案,然後沿著這個檔案的row進行迴圈,要傳遞的就是一筆資料我們稱為data,它是來自於row[0]。
with open('Data2.csv', newline='') as csvfile:
csv_reader = csv.reader(csvfile)
for row in csv_reader:
data = row[0]
print('Data send to Arduino:', data)
我們會將這筆資料進行編碼成0或1的訊號後,透過串列通訊傳遞至Arduino。
ser.write(data.encode())
再將arduino傳回的字串接收,由於串列通訊是以0或1訊號傳遞,是透過ascii編碼方式,所以還是需要再將0或1訊號解碼回我們看到的字串。
response = ser.readline().decode('utf-8')
最終運行完畢後,需要關閉串列通訊。
ser.close()
實現方式
要先將Arduino端程式碼燒錄到Arduino中,代表Arduino已經開啟接收訊息與傳遞訊息的功能。
接下來,在到電腦端開啟python程式後,按下執行,即可在spyder IDE的console視窗上,得到結果。
實作結果
在spyder IDE右下角的console就可以看到我們從電腦發送的資料(Data send to Arduino)即為Number,Arduino上接收到此資料再丟回來的結果(Response from Arduino)為Number,後面依序類推為1,2,3…。