第1步:計(jì)算機(jī)環(huán)境
在計(jì)算機(jī)方面,我們將使用一個(gè)稱為PySerial的Python模塊。巧合的是,PySerial允許通過(guò)Python使用串行連接。在Windows上安裝PySerial是一個(gè)非常簡(jiǎn)單的過(guò)程。 注意:此“假設(shè)”假設(shè)您已安裝Python 2. *!如果您不這樣做,PySerial仍然可以使用,但是您可能需要稍微更改代碼以適應(yīng)新標(biāo)準(zhǔn)。
要在Windows上安裝,只需訪問(wèn)PySerial的下載頁(yè)面,下載Windows二進(jìn)制文件并運(yùn)行它(在撰寫本文時(shí)為pyserial-2.7.win32.exe)。然后,通過(guò)打開(kāi)新的Python解釋器實(shí)例并運(yùn)行以下命令來(lái)測(cè)試安裝:
import serial
步驟2:初始連接
要從Python啟動(dòng)與Arduino的連接,我們首先必須確定Arduino處于哪個(gè) COM端口。幸運(yùn)的是,Ardunio編程環(huán)境使此任務(wù)變得簡(jiǎn)單。
只需查看Arduino IDE的右下角,您將看到一些包含COM端口號(hào)的文本。我們將使用它來(lái)啟動(dòng)我們的Python串行連接,如下所示:
arduino = serial.Serial(‘COM1’, 115200, timeout=.1)
上面的代碼將在“ COM1”上使用“ 115200”波特創(chuàng)建一個(gè)名為“ ardunio”的新串行對(duì)象,速率和.1秒超時(shí)。保持選定的波特率非常重要,因?yàn)樗仨毰cArdiuno端的波特率完全匹配。
第3步:Ardiuno與Python的通信
在Ardunio和Python之間進(jìn)行通信比通過(guò)其他方式更容易。首先,我們需要一些代碼來(lái)啟動(dòng)Ardunio的串行連接,并傳遞一條消息。我們可以使用Arduino的Serial.write()函數(shù)來(lái)做到這一點(diǎn),就像這樣:
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);
}
這段代碼將編寫一個(gè)“來(lái)自Ardunio的Hello world!”。每秒一次連接到串行連接?,F(xiàn)在,我們將構(gòu)建一個(gè)Python腳本,該腳本能夠接收這些消息,并根據(jù)需要對(duì)其進(jìn)行處理。首先,我們必須像上一頁(yè)一樣啟動(dòng)連接,然后創(chuàng)建一個(gè)循環(huán),該循環(huán)從流中獲取當(dāng)前信息,并將其打印到控制臺(tái)。
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
請(qǐng)注意,在這種情況下,readline()處于阻塞狀態(tài),因此它將等待直到新行完全通過(guò)串行緩沖區(qū)為止。通常,readline()會(huì)占據(jù)空白行,因此我放入了if語(yǔ)句來(lái)檢查數(shù)據(jù)是否實(shí)際包含任何內(nèi)容。如果您想更精確地獲取非阻塞數(shù)據(jù),則可以在Arduino端使用read()并使用Serial.write()(用于字節(jié))或Serial.print()(用于ASCII字符),但是您需要
第4步:Python與Arduino通訊
這一步有點(diǎn)難,因?yàn)檫@需要我們?cè)谑挛锏腁rduino方面解析數(shù)據(jù)。為了幫助加快速度,我繼續(xù)編寫了一個(gè)簡(jiǎn)單的循環(huán),該循環(huán)從Serial緩沖區(qū)中獲取當(dāng)前數(shù)據(jù),并創(chuàng)建一個(gè)以Null結(jié)尾的字符串(C字符串),然后將其傳遞回Serial連接。您可以使用此技術(shù)來(lái)編寫實(shí)際的解析器,方法是指定自己的數(shù)據(jù)包前綴和后綴,然后在串行緩沖區(qū)中掃描這些內(nèi)容,并相應(yīng)地創(chuàng)建字符串。
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);
}
}
現(xiàn)在我們可以編寫一個(gè)簡(jiǎn)單的腳本,將數(shù)據(jù)從Python發(fā)送到Arduino,然后打印出返回的內(nèi)容。
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
不難看出如何進(jìn)一步擴(kuò)展此方法以允許兩個(gè)設(shè)備之間進(jìn)行復(fù)雜的通信。我將在以后的“ ible”中介紹這種通信的一個(gè)示例,在該示例中,我將制作一種能夠在任何PC游戲上工作的游戲手柄設(shè)備!
-
usb
+關(guān)注
關(guān)注
60文章
7876瀏覽量
263712 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375 -
Arduino
+關(guān)注
關(guān)注
187文章
6457瀏覽量
186502
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論