第1步:計算機環境
在計算機方面,我們將使用一個稱為PySerial的Python模塊。巧合的是,PySerial允許通過Python使用串行連接。在Windows上安裝PySerial是一個非常簡單的過程。 注意:此“假設”假設您已安裝Python 2. *!如果您不這樣做,PySerial仍然可以使用,但是您可能需要稍微更改代碼以適應新標準。
要在Windows上安裝,只需訪問PySerial的下載頁面,下載Windows二進制文件并運行它(在撰寫本文時為pyserial-2.7.win32.exe)。然后,通過打開新的Python解釋器實例并運行以下命令來測試安裝:
import serial
步驟2:初始連接
要從Python啟動與Arduino的連接,我們首先必須確定Arduino處于哪個 COM端口。幸運的是,Ardunio編程環境使此任務變得簡單。
只需查看Arduino IDE的右下角,您將看到一些包含COM端口號的文本。我們將使用它來啟動我們的Python串行連接,如下所示:
arduino = serial.Serial(‘COM1’, 115200, timeout=.1)
上面的代碼將在“ COM1”上使用“ 115200”波特創建一個名為“ ardunio”的新串行對象,速率和.1秒超時。保持選定的波特率非常重要,因為它必須與Ardiuno端的波特率完全匹配。
第3步:Ardiuno與Python的通信
在Ardunio和Python之間進行通信比通過其他方式更容易。首先,我們需要一些代碼來啟動Ardunio的串行連接,并傳遞一條消息。我們可以使用Arduino的Serial.write()函數來做到這一點,就像這樣:
void setup() {
Serial.begin(115200); // use the same baud-rate as the python side
}
void loop() {
Serial.println(“Hello world from Ardunio!”); // write a string
delay(1000);
}
這段代碼將編寫一個“來自Ardunio的Hello world!”。每秒一次連接到串行連接?,F在,我們將構建一個Python腳本,該腳本能夠接收這些消息,并根據需要對其進行處理。首先,我們必須像上一頁一樣啟動連接,然后創建一個循環,該循環從流中獲取當前信息,并將其打印到控制臺。
import serial
arduino = serial.Serial(‘COM1’, 115200, timeout=.1)
while True:
data = arduino.readline()[:-2] #the last bit gets rid of the new-line chars
if data:
print data
請注意,在這種情況下,readline()處于阻塞狀態,因此它將等待直到新行完全通過串行緩沖區為止。通常,readline()會占據空白行,因此我放入了if語句來檢查數據是否實際包含任何內容。如果您想更精確地獲取非阻塞數據,則可以在Arduino端使用read()并使用Serial.write()(用于字節)或Serial.print()(用于ASCII字符),但是您需要
第4步:Python與Arduino通訊
這一步有點難,因為這需要我們在事物的Arduino方面解析數據。為了幫助加快速度,我繼續編寫了一個簡單的循環,該循環從Serial緩沖區中獲取當前數據,并創建一個以Null結尾的字符串(C字符串),然后將其傳遞回Serial連接。您可以使用此技術來編寫實際的解析器,方法是指定自己的數據包前綴和后綴,然后在串行緩沖區中掃描這些內容,并相應地創建字符串。
void setup() {
Serial.begin();
}
void loop() {
if(Serial.available() 》 0) {
char data = Serial.read();
char str[2];
str[0] = data;
str[1] = ‘’;
Serial.print(str);
}
}
現在我們可以編寫一個簡單的腳本,將數據從Python發送到Arduino,然后打印出返回的內容。
import serial, time
arduino = serial.Serial(‘COM1’, 115200, timeout=.1)
time.sleep(1) #give the connection a second to settle
arduino.write(“Hello from Python!”)
while True:
data = arduino.readline()
if data:
print data.rstrip(‘ ’) #strip out the new lines for now
# (better to do .read() in the long run for this reason
不難看出如何進一步擴展此方法以允許兩個設備之間進行復雜的通信。我將在以后的“ ible”中介紹這種通信的一個示例,在該示例中,我將制作一種能夠在任何PC游戲上工作的游戲手柄設備!
-
usb
+關注
關注
60文章
7896瀏覽量
263996 -
python
+關注
關注
56文章
4782瀏覽量
84453 -
Arduino
+關注
關注
187文章
6464瀏覽量
186651
發布評論請先 登錄
相關推薦
評論