【LattePanda】從零開始教學,在LattePanda上使用Python與Arduino來控制meArm機械手臂

本文章將帶領讀者從基礎開始,到學會用在LattePanda上面使用Python跟內建的Arduino Leonardo來控制機械手臂,想學習Python圖控界面,與Arduino的Serial溝通,或者是機械手臂的介紹的朋友不妨來看看本篇教學文喔!

作者/攝影  袁佑緣
時間   3小時
成本   約1,850(不含LattePanda)
難度

★★★★★

材料表

1.Python的環境安裝

首先請到python的官網(https://www.python.org/downloads/windows/)下載最新版的安裝檔,在這邊要提醒一下python目前有兩種版本,一個是2.7x版,另一個3.x版,2.7x版python是比較舊的版本,同時官方也有發出聲明將不會在繼續更新了,而本篇的範例使用的是新版3.x的python,所以請讀者注意一下不要選錯囉。

以筆者為例,最新的Python版本是3.6.1,以及LattePanda是64bit版本的,所以點選Windowsx86-64-excutable installer,如下圖。

接下來請記得在安裝python的時候將下方”Add Python 3.6 to PATH”勾選起來,意思是要把python加入windows的環境變數內。

安裝完後,為了測試我們的電腦是否能正常呼叫python,請呼叫您電腦的終端機,windows的使用者請按下快捷鍵”win+R”便會在左下角顯示執行視窗,接著輸入”cmd”,這樣一來就會叫出windows的命令提示字元,如下圖。

命令提示字元(command prompt)

接下來請輸入”pip install matplotlib”,使用python的套件管理員pip來安裝matplotlib這個套件。

接下來請輸入”pip install pyserial”,使用python的套件管理員pip來安裝pyserial這個套件。

接下來為了要讓讀者方便開發python的程式,請到以下的網站(http://thonny.org/)下載並安裝Thonny這個python IDE。

2.Arduino 環境準備

請到官網下載最新板的Arduino IDE,下載網址請點這裡。以筆者為例,最新版本的Arduino IDE為8.2板,因為LattePanda上面運行的Windows10,所以請記得點選windows版的IDE來下載,另外為了不覆蓋到LattePanda系統原本舊版的Arduino,請點選”Windows ZIP file for non admin install”。

想直接下載的話請點選JUST DOWNLOAD,當然如果行有餘力的話也可以給予Arduino一些贊助喔!

最後解壓縮完成之後,點開Ardunio的資料夾執行IDE的程式即可。

另外,為了要控制LattePanda內建的Arduino Leonardo,必須將控制板選為Arduino Leonardo。

Arduino IDE在上傳程式碼的時候,需要選擇對應的port(連接埠)才能上傳到控制板上,如下圖,請選擇有Arduino Leonardo的COM port。

 

3.執行本專案的程式碼

請在Arduino IDE 上面完成以下的程式碼。

[pastacode lang=”cpp” manual=”%23include%20%3CServo.h%3E%20%2F%2F%20%E5%BC%95%E5%85%A5Arduino%E6%8E%A7%E5%88%B6%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94%E7%9A%84%E5%87%BD%E5%BC%8F%E5%BA%AB%0A%0AServo%20s%5B4%5D%3B%20%2F%2F%20%E5%BB%BA%E7%AB%8B%E4%B8%80%E5%80%8B%E9%95%B7%E5%BA%A6%E7%82%BA4%E7%9A%84servo%E7%89%A9%E4%BB%B6%0A%0A%2F%2F%20%E5%AE%A3%E5%91%8A%E6%94%B6%E5%88%B0Serial%E7%9A%84%E8%A8%8A%E6%81%AF%E8%88%87%E9%95%B7%E5%BA%A6%0Aint%20%20data%3B%0Asize_t%20data_size%20%3D%20sizeof(data_size)%3B%0A%0Avoid%20setup()%0A%7B%0A%20%20%20%20Serial.begin(115200)%3B%20%2F%2F%20%E5%B0%87Serial%E7%9A%84%E9%AE%91%E7%8E%87%E8%A8%AD%E5%AE%9A%E7%82%BA115200%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20%E5%B0%874%E5%80%8Bservo%E5%B0%8D%E6%87%89%E5%88%B0%E4%BB%A5%E4%B8%8B4%E5%80%8BArduino%E8%85%B3%E4%BD%8D%0A%20%20%20%20s%5B0%5D.attach(7)%3B%20%0A%20%20%20%20s%5B1%5D.attach(8)%3B%0A%20%20%20%20s%5B2%5D.attach(9)%3B%0A%20%20%20%20s%5B3%5D.attach(10)%3B%0A%7D%0A%0A%0Avoid%20loop()%0A%7B%0A%20%20%20%20%2F%2F%20%E5%A6%82%E6%9E%9C%E5%BE%9EPython%E5%9C%96%E6%8E%A7%E7%95%8C%E9%9D%A2%E6%94%B6%E5%88%B0%E7%9A%84%E8%B3%87%E8%A8%8A%E6%98%AFs%E9%96%8B%E9%A0%AD%EF%BC%8C%E5%89%87%E6%AA%A2%E8%A6%96%E4%B8%8B%E4%B8%80%E5%80%8B%E5%AD%97%E5%85%83%0A%20%20%20%20%2F%2F%20%E6%98%AF%E6%8C%87%E5%AE%9A%E5%93%AA%E4%B8%80%E5%80%8B%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94(0~3%E8%99%9F)%0A%20%20%20%20%2F%2F%20%E6%9C%80%E5%BE%8C%E5%86%8D%E6%8E%A5%E6%94%B6%E4%B8%804%E5%80%8Bbytes%E7%9A%84%E6%95%B4%E6%95%B8%EF%BC%8C%E4%BD%9C%E7%82%BA%E9%A6%AC%E9%81%94%E8%A6%81%E8%BD%89%E5%88%B0%E7%9A%84%E8%A7%92%E5%BA%A6(0~180%E5%BA%A6)%0A%20%20%20%20if(Serial.available())%0A%20%20%20%20%20%20%20%20if(Serial.read()%20%3D%3D%20’s’)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20int%20servo_number%20%3D%20Serial.read()%20-%20’0’%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(servo_number%20%3C%204%20%26%26%20servo_number%20%3E%3D%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.print(%22Servo%20number%3A%20%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(servo_number)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while(Serial.available()%20%3C%20data_size)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.readBytes((char*)%26data%2C%20data_size)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(data)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%5Bservo_number%5D.write(data)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%7D%0A” message=”” highlight=”” provider=”manual”/]

上傳Arduino程式碼

請先確認您的Arduino IDE是否有按照2. Arduino環境設定,將Arduino Leonardo的板子與連接埠都選擇正確,並按下快捷鍵<Ctrl+U>或者是如下圖點選上傳的箭頭來上傳程式碼。

打開Thonny,完成以下的Python程式碼。

[pastacode lang=”python” manual=”%23%20matplotlib%E6%98%AF%E7%94%A8%E4%BE%86%E9%A1%AF%E7%A4%BAGUI%E7%9A%84%E5%87%BD%E5%BC%8F%E5%BA%AB%0A%23%20serial%E5%89%87%E6%98%AF%E7%94%A8%E4%BE%86%E8%B7%9FArduino%E6%BA%9D%E9%80%9A%E7%9A%84%E5%87%BD%E5%BC%8F%E5%BA%AB%0A%23%20struct%E8%B7%9Fpack%E5%89%87%E6%98%AF%E5%9C%A8Serial%E5%82%B3%E8%BC%B8%E8%B3%87%E6%96%99%E6%99%82%EF%BC%8C%E6%89%93%E5%8C%85%E8%B3%87%E8%A8%8A%E6%9C%83%E7%94%A8%E5%88%B0%E7%9A%84%E5%B7%A5%E5%85%B7%0Afrom%20matplotlib.widgets%20import%20Slider%20%0Aimport%20matplotlib.pyplot%20as%20plt%0Aimport%20serial%0Afrom%20struct%20import%20pack%0A%0A%23%20%E5%9C%A8%E9%80%A3%E6%8E%A5%E5%9F%A0COM8%E5%BB%BA%E7%AB%8B%E4%B8%80%E5%80%8B%E9%AE%91%E7%8E%87%E7%82%BA115200%E7%9A%84Serial%0A%23%20%E9%80%99%E8%A3%A1%E8%A6%81%E6%8F%90%E9%86%92%E8%AE%80%E8%80%85%EF%BC%8C%E8%A8%98%E5%BE%97%E8%A6%81%E6%8A%8ACOM8%E6%94%B9%E6%88%90%E6%82%A8LattePanda%E4%B8%8A%E7%9A%84COM%20port%0Aser%20%3D%20serial.Serial(‘COM8’%2C%20115200%2C%20timeout%3D0)%0A%0A%23%20%E5%AE%9A%E7%BE%A9%E4%B8%80%E5%80%8B%E5%87%BD%E5%BC%8F%EF%BC%8C%E5%B0%87%E6%9C%83%E6%A0%B9%E6%93%9Ai(%E9%A6%AC%E9%81%94%2F%E6%8B%89%E6%A1%BF%E7%B7%A8%E8%99%9F)%EF%BC%8C%E5%9B%9E%E5%82%B3%E6%8C%87%E5%AE%9A%E7%9A%84%E5%87%BD%E5%BC%8F%0Adef%20send_ith(i)%3A%0A%20%20%20%20def%20send(val)%3A%20%23%20%E5%AE%9A%E7%BE%A9%E4%B8%80%E5%80%8B%E5%87%BD%E5%BC%8F%EF%BC%8C%E7%94%A8%E4%BE%86%E9%80%81%E5%87%BA%E6%8E%A7%E5%88%B6%E9%A6%AC%E9%81%94%E8%A7%92%E5%BA%A6%E7%9A%84%E8%A8%8A%E8%99%9F%0A%20%20%20%20%20%20%20%20data_header%20%3D%20bytes(‘s’%20%2B%20str(i)%2C%20’UTF8’)%0A%20%20%20%20%20%20%20%20data%20%3D%20int(val)%0A%20%20%20%20%20%20%20%20ser.write(pack(‘%3C2si’%2C%20data_header%2C%20data))%0A%20%20%20%20return%20send%0A%0A%0A%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94%E6%8E%A7%E5%88%B6%E6%8B%89%E6%A1%BF%E7%9A%84%E5%9C%96%E5%BD%A2%E5%8C%96%E7%95%8C%E9%9D%A2%E4%BB%A5%E5%8F%8A%E5%85%B6%E5%B0%8D%E6%87%89%E7%9A%84%E5%87%BD%E5%BC%8F%0Aa%20%3D%20%5B%5D%0As%20%3D%20%5B%5D%0Afor%20i%20in%20range(4)%3A%0A%20%20%20%20a.append(plt.axes(%5B0.2%2C%200.2*(4%20-%20i)%2C%200.6%2C%200.07%5D))%0A%20%20%20%20s.append(Slider(a%5Bi%5D%2C%20’Servo’%20%2B%20str(i%2B1)%20%2B%20’%20’%2C%200%2C%20180%2C%20valfmt%20%3D%20’%25d’%2C%20valinit%20%3D%2090))%0A%20%20%20%20s%5Bi%5D.on_changed(send_ith(i))%0A%0Aplt.show()%0A%0A” message=”” highlight=”” provider=”manual”/]

執行Python程式

請在Thonny IDE上,按下快捷鍵<F5>或者是點選下圖中的播放鍵來執行Python

如果在執行Python時遇到如下的錯誤,那有可能是您的COM port沒有設定正確,請回去看一下2. Arduino 環境設定那一步中的COM port,並把正確的port輸入上面Python程式碼中。

成功執行後,就可以看到一個簡單的Python互動界面,讀者可以透過上面的拉桿來操控四個伺服馬達各別的角度。

4.接上機械手臂,來動手玩玩看吧

完成上述的步驟後,我們就可以來執行最後的實做部份了,本次範例所使用的機械手臂是有名的開源機械手臂meArm,上面有4個伺服馬達,一共有四個自由度,然後因為特殊的平行連桿機構,最尾端的夾爪會一直保持水平,方便機器夾取物件,加上使用壓克力平板與螺絲螺帽就能輕易組裝,是一個相當好入門的教育套件,接下來我們就來看一下要如何完成電路的連接吧。

LattePanda與機械手臂的接線如下圖,由於本範例所使用的Arduino腳位是7, 8, 9, 10,所以請按照官方給的腳位圖接上去(紅圈的部份)。

特別注意,為了保護馬達與電路系統,電源的部份請最後再接上去。

電路接線圖

LattePanda腳位圖

 

完成圖

上視圖

 

相關文章:

 

2 thoughts on “【LattePanda】從零開始教學,在LattePanda上使用Python與Arduino來控制meArm機械手臂

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *