簡單實現電腦讀取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…。

Similar Posts