專題:Raspberry Pi跳舞布偶佩佩

七月 6, 2017
Facebook
Twitter
伺服馬達對位置移動的指令反應非常快。在這個專題裡,我們會用伺服馬達來拉動布偶佩佩的繩子,讓佩佩跳舞或做出你喜歡的任何動作(圖9-9)。
圖片

圖9-9 Raspberry Pi 布偶佩佩
要控制這個專題,其實只要編輯一系列讓程式和馬達執行的動作,就像播放錄音一樣。在第293 頁「專題:布偶佩佩會說話」段落中,我們會將它擴充,給它聲音。而在第16 章,我們會讓布偶跨足網路,用跳舞來回應特定的推特標籤。

材料清單

進行本專題所需的材料如下:
材料 來源
Adafruit 16 頻道12 位元PWM/ 伺服驅動器 Adafruit: 815
4×9g伺服馬達 eBay、Adafruit: 169
母筒形插孔,用於鎖入轉接器端子 Adafruit: 368
母對母跳線 Adafruit: 266
公對公跳線 Adafruit: 758
5V/2A電源 Adafruit: 276
竹籤×4(約3英寸) 超市
小布偶(四肢各連一條繩子) eBay
A4或信件大小之裱背板 美術用品店
熱熔膠槍或環氧樹脂膠以及電鑽 五金行

設計

這個專題採用Raspberry Pi 的主要原因,是讓你可以在第16 章使其和網路溝通。但你還是可以用Arduino 來製作;如果採用Arduino,就可以省略Adafruit 控制板,並透過麵包板和公對公跳線來連接伺服馬達和Arduino。會用到很多公對公跳線!
本專題會用到四顆小型9g伺服馬達,布偶的四肢各一顆。為了方便控制伺服馬達,我們會採用一個Adafruit的16頻道伺服馬達控制板,讓伺服馬達的導線可以直接插上控制板的腳位。
圖9-10是這個專題的電路圖。
圖片

圖9-10 布偶專題的電路圖
控制板的設計讓伺服馬達的插座可以直接套在排針腳位上(為避免干擾,圖9-10 僅顯示伺服馬達的中間導線)。
同時驅動四個伺服馬達代表我們需要為馬達準備獨立的電源,如此馬達產生的雜訊才不會影響Rasoberry Pi 穩定運作。
因為我們要讓佩佩的手腳靈活運動,伺服馬達隨附的塑膠伺服臂會不夠長,因此我們要用竹籤來延伸伺服臂的長度。

製作

本專題的機械組裝和電子元件及軟體同等重要。以下是製作跳舞布偶需要的步驟。

步驟1:延伸伺服臂

伺服馬達會附有各種可以裝上馬達的伺服臂。請挑一支比較直的伺服臂,將竹籤黏上去,如圖9-11所示。用熱融膠槍或環氧樹脂膠的效果最好。
圖片

圖9-11 延伸伺服臂
請注意我在每根竹籤的末端都加上一滴膠,如此可以防止布偶的繩子滑落。

步驟2:製作底盤

這四顆伺服馬達需要能夠靈活地上下運動來控制布偶四肢的動作。為了讓所有部件都能穩穩固定,我用裱背板(用來掛圖畫)做切割運用。
切割之前要先決定切割的路徑:將python/projects/puppet目錄裡的puppet.svg模板列印出來,接著黏到裱背板上,再用美工刀切割(圖9-12)。
圖片

圖9-12 用模板來切割底盤
用低黏性的黏膠把列印出的模板貼到裱背板上,這樣把馬達固定到底盤之前還可以把紙撕下來。在切除板子上的兩個範圍之外,還要鑽兩個孔來放連接到布偶頭部、支撐布偶主要重量的繩子(圖9-13)。
圖片

圖9-13 完成底盤

步驟3:黏上伺服馬達

將紙模板從裱背板撕下來,接著將改裝後的伺服臂裝到馬達上。先別裝得太緊,因為稍後調整伺服馬達位置時還需要將它們取下來。
用圖9-14 的方式來排列伺服馬達,讓它們的伺服臂都能靈活運動、不會互相碰撞。
圖片

圖9-14 固定伺服馬達
將伺服馬達黏到各自的位置前,可以先將一側的標籤撕下來,讓馬達更穩固。

步驟4:改裝布偶

圖9-15是我用的布偶。
圖片

圖9-15 布偶佩佩
布偶的頭連有一條繩子來支撐全身主要的重量。我們之後要用這條繩子穿過底盤的兩個孔,並在下方打結。
布偶的兩隻腳各有一條繩子連接,而它的雙手是由同一條繩子穿過木十字的一端來連接。最後這條繩子需要在中點切開。用火柴或熱風槍來熔化尼龍繩的端點,使它不易分岔。
如果你能直接將木十字這端打的結解開,會比將它切斷更好。
在將布偶綁上底盤前,我們要先完成伺服馬達的接線,並用軟體讓伺服臂轉到正確的位置。

步驟5:完成接線

Adafruit的模組是以幾乎組裝完成的形式販售,只需要再把排針腳位焊接上去。完整的操作說明可以參考Adafruit 的產品頁面:http://www.adafruit.com/products/815
我把和Raspberry Pi之間的I2C介面的排針腳位安裝在伺服馬達控制板的反面,這樣當我們進入第15章再度用這組硬體來為佩佩賦予聲音時,控制板就可以輕鬆裝到麵包板上。
如果你想要減少需要進行的焊接量,可以只焊接前四顆伺服馬達的排針腳位,因為這個專題只會用到四顆。
接下來參考圖9-10 把所有接線都完成,如圖9-16。
圖片

圖9-16 布偶專題的接線完成圖
要確定伺服馬達插座的方向正確:橘色控制導線在上、棕色或黑色的接地導線在下。
這時候可以接上5V電源和Raspberry Pi的獨立USB電源。

步驟6:執行測試程式

為了讓伺服馬達轉到正確的位置,我們要用一個能把所有伺服臂設定在特定角度的程式(set_servos.py)。這個程式和布偶的主程式位於/python/projects/puppet資料匣。
伺服馬達模組採用Raspberry Pi 的I2C介面,它並非預設為啟用。設定讓Raspberry Pi使用I2C的過程請參照第171頁「在Raspberry Pi設定I2C」段落。

在Raspberry Pi設定I2C

首先用以下的指令確認套裝軟體管理器是最新版本:
$ sudo apt-get update
接下來執行raspi-config工具:
$ sudo raspi-config
從出現的選單中選取Advanced(進階),接著選取「I2C」。接著程式會提示「Would you like the ARM I2C interface to be enabled?」(您想要啟用ARM I2C 介面嗎?)。回答「yes」。接著會看到「Would you like the I2C kernel module to be loaded by default?」(您想要預設載入I2C核模組嗎?)這選項個對你有幫助,所以再次回答「yes」。接下來選取「Finish」(完成)來離開raspiconfig。
你可以執行以下的指令來確認你的Raspberry Pi已經和Adafruit伺服馬達控制板連接、準備就緒:
從主目錄執行以下的指令來安裝一些好用的I2C工具:
sudo apt-get install python-smbus i2ctools
這時會看到以下的輸出(表內數字40 和70 代表已連接控制板):
$ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00:
10:
20:
30:
40: 40
50:
60:
70: 70
I2C設定完成後,將伺服臂從伺服馬達上卸下,並執行set_ser- vos.py程式,然後在獲得提示時輸入角度90:
$ sudo python set_servos.py
Angle:90
Angle:
這時伺服馬達會轉動到90度角,接著你就可以把四支伺服臂裝回去,同時儘量讓伺服臂在伺服馬達轉軸的齒輪允許的範圍內接近水平。

步驟7:連接布偶

我們已經把所有的伺服馬達都轉到90°位置,所以現在可以把木偶頭的線綁到底盤中間的孔,接著把布偶四肢的線分別綁到伺服臂上,讓手腳呈現吊在半空的狀態。
完成後,可以再次執行set_servos.py 並輸入不同的角度來確認四肢有完整的活動範圍。

軟體

這個專題使用的軟體其實只是個起點。它提供一個陣列的伺服馬達位置,讓你輸入自己的數據來控制布偶的動作。隨附的「dance」檔案的確充滿活力,但稱不上優雅。
在檢視程式碼前,你可以先嘗試執行程式;它為於puppet/目錄的dance.py檔案裡。記得要用sudo來執行:
from Adafruit_PWM_Servo_Driver import PWM  # ➊
import time
 
pwm = PWM(0x40)
 
servoMin = 150 # Min pulse length out of 4095  # ➋
servoMax = 600 # Max pulse length out of 4095
 
dance = [  ➌
     #lh lf rf rh
     [90, 90, 90, 90],
     [130, 30, 30, 130],
     [30, 130, 130, 30]
]
 
delay = 0.2  ➍
 
def map(value, from_low, from_high, to_low, to_high):  # ➎
     from_range = from_high – from_low
     to_range = to_high – to_low
     scale_factor = float(from_range) / float(to_range)
     return to_low + (value / scale_factor)
 
def set_angle(channel, angle):  ➏
     pulse = int(map(angle, 0, 180, servoMin, servoMax))
     pwm.setPWM(channel, 0, pulse)
 
def dance_step(step):  ➐
     set_angle(0, step[0])
     set_angle(1, step[1])
     set_angle(2, step[2])
     set_angle(3, step[3])
 
pwm.setPWMFreq(60)  ➑

while (True):  ➒
     for step in dance:
          dance_step(step)
          ​time.sleep(delay)
除了程式本身(dance.py),該資料匣還裝有程式會用到的一些Adafruit檔案。檔案的來源可以參考GitHub(https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code)。
➊ 這款Adafruit 開發板不只能用在伺服馬達,它的輸出還能用來以PWM 控制LED 和其他輸出裝置。這就是程式碼要匯入名為PWM 的類別的原因。
➋ servoMin 和servoMax 這兩個常數是0 和4095 之間的脈衝長度,其中4095 是100% 負載。這個數值範圍可以適用多數的伺服馬達,並提供接近180°的角度範圍。
➌ dance 陣列含有這套舞步需要的三個步法。在這裡想要多加幾行都行。每一行都由一個包含左手、左腳、右腳、右手角度四個數值的陣列組成。因為手臂和雙腳的伺服馬達安裝方向相反,超過90 度角時會舉起手,但放下腳(這是編舞時要注意到的)。
➍ delay 變數設定每個舞步之間的時間延遲。這個數值越小,布偶就動得越快。
➎ map 函數在第12 章第253 頁「Arduino 的map 函數」會詳細說明。
我們用它來將角度值展開成正確的脈衝長度值,用於set_angle 函數。
➏ set_angle 把第一個參數裡伺服頻道(0 到3)的位置設定成第二個參數裡指定的角度。
➐ dance_step 函數擷取指定給四肢伺服馬達的函數,並將每個伺服馬達設定成那些角度。
➑ 將PWM 頻率設定為每秒60 次,會產生每17 毫秒一次的脈衝列,對伺服馬達來說差不多適當。
➒ 主要迴圈會重複dance 中的每一個舞步,將伺服馬達設定到指定的角度,接著在delay 暫停後再進行下一個舞步。當所有舞步都跳過一遍,它會從頭再來。

使用布偶佩佩

試著變更舞步陣列的內容來教布偶新的舞步,像是走路、揮手和單腳站立。將延遲時間數值設高一點的話就有更多時間來看布偶動作的情形,並調整舞步陣列。
我們還會在第15和第16章再次使用佩佩,分別賦予它聲音和讓它用跳舞來回應推特的發文。
圖片

《DIY聲光動作秀:用Arduino和Raspberry Pi打造有趣的聲光動態專題》​

»清楚說明Arduino和Raspberry Pi之間的差異、使用時機和最佳用途!
»從基礎開始,熟悉並完成各種動作、燈光與聲音實驗專題。
»學習控制LED、各類馬達、加熱器、冷卻器和聲音等裝置,以及透過網路監控裝置的方法!
本書將帶領你由淺入深地用Arduino和Raspberry Pi創造並控制動作、燈光與聲音,從基礎開始進行各種動態實驗和專題!
Social media & sharing icons powered by UltimatelySocial