1. 程式人生 > >用Python讓Raspberry Pi“動”起來 --開啟樹莓派的機器人制作

用Python讓Raspberry Pi“動”起來 --開啟樹莓派的機器人制作

http://www.leiphone.com/news/201409/HO2CW0YKz6GtXdEp.html

【編者按】本文是來自奧鬆機器人社群的投稿,作者為小強之工。

前段時間,接觸了一款在開源硬體界被稱為是“人氣之王”的樹莓派(Raspberry Pi)袖珍計算機,功能強大的她擁有一顆SOC,集CPU、GPU、DSP和SDRAM為一體,以SD卡為記憶體硬碟,擁有網絡卡、USB口(可以直接連線鍵盤、滑鼠、U盤等外設)、同時具備視訊、音訊模擬輸出以及HDMI高清輸出的能力,在外部介面上還具備了一般計算機裝置不具有的GPIO、SPI、I2C、UART等硬體配置,為我們的創新機器人制作提供硬體條件。切入正題,用Python讓Raspberry Pi動起來,在這個醒目的標題中可以看出我這個製作的主題就是利用Raspberry Pi的硬體和Python語言來完成一個機器人制作,那下面就聽我娓娓到來吧! 


硬體搭建篇 

在這次製作中,我選擇了一款AS-4WD鋁合金的小車平臺,以小車平臺為基礎,在上面添加了7寸高清液晶顯示器、無線鍵盤、藍芽模組以及電機驅動器等配件,如圖1是羅列製作機器人所用的物料。整個樹莓派的小車系統分兩步來搭建,首先是搭建樹莓派的計算機系統,雖然是一個袖珍的計算機,但是“麻雀雖小,五臟俱全”,除去樹莓派的主機板外,還需準備一套標準通用的USB鍵盤滑鼠,一個顯示器(在本文描述的是一個用於車載監控裝置的7寸顯示器,通過RCA介面相連),一塊電池用於整個系統供電,最後也是最關鍵的需要準備預裝了Debian系統的SD卡(對於SD卡要求讀寫最好在4MB/S以上、容量大於2GB,當然容量更大速度越快更好)。在完成計算機系統搭建後,接下來是完成機器人系統的搭建,在原理上,主要利用樹莓派那兩排外接的針腳的GPIO功能控制外接樹莓派專用的驅動器(Raspi Driver)來實現電機的使能、正反轉控制,以及利用UART功能與藍芽數傳模組實現資料通訊,這樣就能通過手機端的藍芽遙控器對小車進行控制,如圖2是整體硬體搭建完後的靚圖,在圖3中給出了樹莓派機器人的硬體連線圖。

圖1 機器人所用物料

圖2-1 會行走的樹莓派電腦

圖3 樹莓派機器人的硬體連線圖

上手樹莓派之Python庫配置篇

在使用樹莓派時,也是我第一次接觸Python這門語言,通過對相關資料的學習,發現Python是門簡單易學的語言,如果有著C或者其他的計算機語言基礎,基本上半天就能上手編寫程式,在開始編寫小車控制程式前需要對我們的樹莓派計算機的相關Python的庫文件進行安裝設定,首先是GPIO,開啟LX終端(LXTerminal),更新apt-get軟體安裝包列表(注意必須要在網路連線正常情況下),然後執行安裝命令來安裝raspberry-gpio-python包,具體指令如下:

[email protected]

~ $ sudo apt-get update

[email protected] ~ $ sudo apt-get install python-rpi.gpio

在安裝完成Python的GPIO庫後,接下來是安裝Python的UART庫,和上述之前步驟相似,更新apt-get軟體安裝包列表,後安裝Python的串列埠通訊模組,具體指令如下:

[email protected] ~ $ sudo apt-get update

[email protected] ~ $ sudo apt-get install python-serial

通過上述兩個步驟,已經安裝好了Python與樹莓派外接硬體GPIO以及UART庫檔案,在接下來的小車控制程式裡就可以直接呼叫程式碼了,在開始編寫控制程式前,需要對預設串口的一些引數進行更改,由於系統預設的串列埠功能用於輸出核心日誌,相關的引數與我們的外界的串列埠裝置有所不同,所以需要對其啟動配置檔案進行更改,在LXTerminal通過鍵入“sudo nano /boot/cmdline.txt”進入/boot/cmdline.txt,用vi編輯器開啟cmdline.txt檔案,將

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

去掉

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

退出vi編輯器時,注意要對檔案進行儲存;同時需要對系統初始化檔案進行編輯,在 LXTerminal中,鍵入“ sudo nano /etc/inittab”,然後找到以下片段內容

#Spawn a getty on Raspberry Pi serial line

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

改為如下,註釋掉對“ttyAMA0”埠的引數即可,退出vi編輯器時,同樣需要注意要對文件進行儲存

#Spawn a getty on Raspberry Pi serial line

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

重啟樹莓派,該配置就可以生效了,完成了上述步驟,就可以進入下一章節,機器人除錯進程。

上手樹莓派之Python GPIO除錯篇

作為第一次上手樹莓派外接IO時可能有些不惑,如何利用在計算機上的語言來讓你的計算機的IO出現跳動呢!!其實並不複雜,只要開啟系統桌面上的IDLE3編輯器,分4步走,

Step1:匯入GPIO庫,在編輯行中鍵入“import RPi.GPIO as GPIO”,按“回車”鍵執行即可;

Step2:設定GPIO引腳使用標號模式,若是選擇板子上的標號,在編輯器中鍵入“GPIO.setmode(GPIO.BOARD)”若是使用晶片本身的標號模式,只要鍵入“GPIO.setmode(GPIO.BCM)”;

Step3:設定對應GPIO的模式,若是使用其輸出功能“GPIO.setup(pin_number,GPIO.OUT)”,使用輸入功能只要將GPIO.OUT修改為GPIO.IN即可;

Step4:在輸出模式下,使對應管腳的電平置高或者置低,在輸入模式下只要讀取相應管腳的電平即可。如果你對上述4個步驟有了理解,那就嘗試一下,我在此對RasPi Driver上熄滅LED1以及點亮LED2操作為例說明,給出試驗程式碼以及試驗實際的照片(如圖4),如果你也能實現上述操作,那就恭喜你,已經掌握了在樹莓派上對GPIO的使用。

import RPi.GPIO as GPIO

#### gpio init

GPIO.setmode(GPIO.BCM)

GPIO.setup(7,GPIO.OUT) #LED2

GPIO.setup(8,GPIO.OUT) #LED1

GPIO.output(7,GPIO.LOW) #LED2 ON

GPIO.output(8,GPIO.HIGH)#LED1 OFF

 圖4 試驗截圖

上手樹莓派之Python UART除錯篇

對於樹莓派的UART功能的實現其實方法和步驟與上面的GPIO 的使用類似,也是分作4步走:

Step1:匯入串列埠庫,鍵入“import serial”;

Step2:初始化串列埠,在此設置於外部藍芽配套的引數,BUAD=9600,timeout = 0.5,相應的鍵入“ser = serial.Serial('/dev/ttyAMA0', 9600, timeout = 0.5)”;

Step3:開啟使能串列埠,“if ser.isOpen() == False:ser.open()”;

import serial

import time

ser = serial.Serial('/dev/ttyAMA0', 9600, timeout = 0.5)

while True:

if ser.isOpen() == False:

ser.open()

print ser.read()

 ser.write('A')

time.sleep(1)

Step4:當讀取資料時使用“ser.read() ”,當傳送資料時使用“ser.write(資料)”。在這裡我通過IDLE3編輯了一個Python的程式Serial_test.py,然後直接在LXTerminal鍵入“sudo python Serial_test.py”(注意,由於預設狀態下是利用賬戶名:pi進行操作,所以需要將檔案放置在/home/pi目錄下,才能直接執行,無需),然後手機藍芽遙控器(如圖5)與藍芽透傳模組相連線,成功通訊後,既可以通過手機遙控器的按鍵按鈕傳送相應字元在串列埠上看見對應字元列印至螢幕。在此我給出了測試的源程式(如下),通過電腦端的藍芽虛擬出串列埠與樹莓派外接的藍芽透明串列埠模組連線,進行資料傳遞,電腦端的串列埠助手傳送字母“B”,同時收到樹莓派發送來的字母“A”並顯示在除錯的接收視窗,樹莓派端收到由電腦端傳送來的字母“B”,並打印出來,通過此現象既可以證明樹莓派的UART功能測試正常,如下附實驗的螢幕截圖6。

圖5 手機藍芽遙控器

圖6 測試照片 

上手樹莓派之機器人控制篇

對於AS-4WD小車的控制而言就比較簡單了,在本製作中用到了RasPi專用的電機驅動板,板載以L293為核心的電機驅動電路,以及通過兩組每組2個IO來實現電機的正反轉、以及使能。

通過上述的管腳佈置可以清晰的看出,樹莓派外接硬體與RasPi Driver的連線關係,通過GPIO4以及GPIO17控制其中一路電機的轉向以及使能(高電平有效),利用GPIO8來對正反轉進行狀態指示,同理可見GPIO25用於另一路的正反轉控制、GPIO10為使能、GPIO7狀態指示;同時利用板上外接的UART介面與藍芽串列埠模組連線,具體方法不在贅述。

 對於整個程式框架相對以前的微控制器版的遙控小車而言是比較簡單的,主要分功能模組初始化設定、迴圈判斷遙控值以及輸出對應功能運動值,詳見系統控制原理框圖8。匯入庫檔案,對GPIO和串列埠配置,具體引數和上述一致,不在贅述;完成上述設定後,就是整個控制小車的程式了,讀取串列埠緩衝區的值,隨後完成迴圈判斷由手機藍芽遙控器傳送的字元資料“A”、“B”、“C”、“D”,對應相應的運動動作(注意:在對應相應的動作時,可能由於驅動板電機的接線原因高低電平不對應預設動作,可以靈活適當調整接線或者軟體修改電平)

圖8 系統控制原理框圖

至此,用樹莓派的小車已經告一段落,也是完成了筆者對樹莓派的電子製作的處女作,通過幾天的的學習,發現其資源以及各方面的效能允許我們開發更多更好地電子製作、機器人制作,相信在不久的將來,還能繼續為大家奉上樹莓派大餐!