搜尋程式碼

課程第8課,共10課:Raspberry Pi Pico 智能車 – 第8課:舵機同物體跟隨

呢一課係……嘅一部分: Raspberry Pi Pico 四驱智能车

課程第8課,共10課:Raspberry Pi Pico 智能車 – 第8課:舵機同物體跟隨

呢堂課嚟自Robojax嘅Raspberry Pi Pico智能車課程,會探討伺服馬達嘅功能,以及點樣用佢嚟整一個跟住物件或者「跟住你隻手」嘅機械人。呢個項目唔止係簡單嘅摩打控制,仲示範咗點樣將伺服驅動嘅超聲波感應器同智能Python邏輯結合,整出一架會主動搵同跟住範圍內物件嘅車。呢個係機械人學入面一個基本概念,令你可以整到互動項目,好似跟住人嘅機械人、會玩拋接嘅智能寵物,或者會追蹤移動嘅自動保安鏡頭。呢堂課仲會講第二個簡單啲嘅項目:一架會自動接近、推開同後退離開特定距離範圍內物件嘅車。

pi_pico_4WD_follow-hand

硬件同零件

呢個項目係基於SunFounder Raspberry Pi Pico 4WD車套件。呢堂課用到嘅主要零件有:

  • Raspberry Pi Pico板
  • 4WD智能車底盤連摩打
  • 伺服摩打(最好用金屬齒輪伺服摩打,耐用啲)
  • 超聲波距離感應器(HC-SR04)
  • 摩打驅動板(車套件入面有)
  • RGB LED(用嚟做視覺回饋)
  • 電源(車用嘅電池盒)
PICOBOARDWHITEANGLE2_1200x857

伺服摩打係呢堂課功能嘅核心。同一般會不停轉嘅直流摩打唔同,伺服摩打係設計嚟轉到同保持喺一個特定角度位置,通常係0到180度之間。咁樣就非常適合用嚟精確咁瞄準超聲波感應器。伺服摩打嘅質素通常取決於佢嘅齒輪材料(膠定金屬)同埋扭力,呢啲會決定佢嘅強度同耐用性。

運作原理

下面嘅圖表解釋咗個程式點樣運作。 

pi_pico_4WD_follow-hand_flow_chart

接線指南

呢堂課嘅接線好直接,因為佢係建基於已經組裝好嘅車套件。最關鍵嘅連接係伺服摩打,佢一定要連去Pico上面一個特定嘅GPIO針腳。

喺影片入面,導師將伺服摩打連去Raspberry Pi Pico上面嘅18號針腳。超聲波感應器裝咗喺伺服摩打嘅舵盤上面,等佢可以左右轉動嚟掃描周圍。其餘摩打、RGB LED同電源嘅接線就假設喺之前嘅課程已經接好。

如果想睇詳細嘅視覺指南,請參考下面嘅接線圖。

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

程式碼解釋

呢堂課嘅Python程式碼係圍住一個自訂嘅pico_4wd函式庫嚟寫,呢個函式庫簡化咗複雜嘅硬件互動。用戶可以設定嘅部分喺程式最頂,用嚟控制架車嘅行為。

以下係你可以調整嘅主要變數,用嚟自訂你機械人嘅「跟手」行為:

  • car.RADAR_REFERENCE = 25:呢個係感應器「睇到」嘅最遠距離,以厘米計。任何超過呢個距離嘅物件都會被忽略。你可以加大呢個數值令架車更敏感,或者減細佢要求物件近啲。
  • car.RADAR_MAX_ANGLE = 45car.RADAR_MIN_ANGLE = -45:呢啲定義咗伺服摩打會掃描嘅最左(45)同最右(-45)角度。咁樣就形成咗架車前面一個90度嘅視野。
  • car.RADAR_STEP_ANGLE = 10:呢個係伺服摩打喺每個掃描點之間移動嘅增量(以度計)。較細嘅步距(例如5)會畀到更精細嘅解像度,但係完成一次完整掃描會耐啲。較大嘅步距(例如15)掃描快啲,但係精確度低啲。
  • MOTOR_FORWARD_POWER = 40:呢個設定架車向前移動去追蹤偵測到嘅物件時所用嘅摩打功率(0-100)。調整呢個可以改變架車追嘅速度。
  • MOTOR_TURNING_POWER = 40:呢個設定架車轉彎面向物件時所用嘅摩打功率。數值高啲會令架車轉彎轉得更進取。

main()函數嘅主要邏輯係一個不停循環。佢首先呼叫car.radar_scan(),呢個會返回一個由'1'同'0'組成嘅字串,代表每個掃描角度有冇偵測到物件('1'代表物件喺參考距離之內)。然後個程式會分析呢個字串,搵出最大嘅連續'1'群組,即係代表偵測到物件嘅中心位置。根據呢個中心喺掃描範圍入面嘅位置,架車就會被命令向左轉、向右轉或者向前移動,令自己對準個物件然後跟住佢。

現場項目示範

呢條影片清楚示範咗個項目嘅實際運作。導師首先執行一個測試腳本,展示點樣將伺服摩打移動到精確角度,例如90度、0度同負90度。呢個對於理解伺服摩打嘅範圍,以及正確安裝超聲波感測器嚟講係好重要。

安裝咗感測器之後,就會展示「跟手」功能。當導師將隻手喺車前面移動,裝喺伺服摩打上嘅感測器就會左右掃描。車嘅邏輯會處理感測器數據,然後轉動車輪,向偵測到嘅手嘅方向轉向, effectively 喺地板上面跟住隻手移動。呢個示範突出咗架車點樣追蹤一個移動嘅物體,並相應調整方向。另外仲展示咗第二個項目,就係如果偵測到物體喺10至20厘米之間,架車就會被編程去靠近並推開嗰個物體;如果物體太近(低過10厘米),架車就會後退。

重點要點

呢一課係一個好好嘅入門,教你點樣用伺服摩打嚟創造互動式機械人行為。透過將伺服摩打同距離感測器結合,你可以整到一個有「視覺」嘅機械人,能夠主動追蹤同回應周圍環境。能夠調整參數,例如掃描角度、步進大小同摩打功率,令你可以精細控制機械人嘅行為,呢個係任何機械人項目嘅關鍵技能。

章節

  • [00:00] 伺服摩打同物體跟隨簡介
  • [01:48] 課程套件功能同能力
  • [03:08] 了解伺服摩打運作
  • [06:08] 用Python代碼測試伺服摩打
  • [09:59] 解釋「跟手」功能
  • [10:49] 示範「跟手」功能
  • [15:37] 項目:推動物體同後退
  • [18:40] 推動物體項目示範
  • [19:25] 總結同下一步

圖片

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand_flow_chart
pi_pico_4WD_follow-hand_flow_chart
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
905-Lesson 8/10 Pi Pico 4WD card Python code: follow hand
語言: C++
# Lesson 8/10 Pi Car Pico 4WD: Follow hand
# Download and resource page https://robojax.com/RJT630

import pico_4wd as car

car.RADAR_REFERENCE = 25
car.RADAR_MAX_ANGLE = 45
car.RADAR_MIN_ANGLE = -45
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 40
MOTOR_TURNING_POWER = 40

def main():
    while True:
        radar_data = car.radar_scan()
        if isinstance(radar_data, int):
            continue
        radar_data = [str(i) for i in radar_data]
        radar_data = "".join(radar_data)
        paths = radar_data.split("1")
        length_list = []
        for path in paths:
            length_list.append(len(path))
        if max(length_list) == 0:
            car.move("stop") 
        else:
            i = length_list.index(max(length_list))
            pos = radar_data.index(paths[i])
            pos += (len(paths[i]) - 1) / 2
            delta = len(radar_data) / 3
            if pos < delta:
                car.move("right", MOTOR_TURNING_POWER)
            elif pos > 2 * delta:
                car.move("left", MOTOR_TURNING_POWER)
            else:
                #if radar_data[int(len(radar_data)/2-1)] == "0":
                #    car.move("stop")
                #else:
                car.move("forward", MOTOR_FORWARD_POWER)

try:
    main()
finally:
    car.move("stop")
    car.set_light_off()

資源與參考資料

暫時冇資源。

文件📁

冇文件可用。