Wa Koodu

Ẹkọ Ẹ̀kọ́ 9 nínú 10: Yíyẹra fún Ìdènà lílo Raspberry Pi Pico 4WD Ọkọ̀ Ọlọ́gbọ́n

Ikẹkọ yii jẹ apakan ti: Rasipibẹri Pi Pico 4WD Smart Car

Ẹkọ Ẹ̀kọ́ 9 nínú 10: Yíyẹra fún Ìdènà lílo Raspberry Pi Pico 4WD Ọkọ̀ Ọlọ́gbọ́n

Ìfáàṣí

Ìtọ́sọ́nà yìí, tí ó dá lórí Ẹ̀kọ́ 9 nínú 10 láti ọ̀dọ̀ Robojax, ṣàfihàn bí a ṣe kọ́ ọkọ̀ ayọ́kẹ́lẹ́ tí ń yẹra fún ìdíwọ́ nípa lílo SunFounder Raspberry Pi Pico 4WD Smart Car kit. Iṣẹ́ yìí darapọ̀ mọ́ ẹ̀rọ̀ ultrasonic tí ń yípo pẹ̀lú ìṣàkóso mọ́tò láti dá ọkọ̀ ayọ́kẹ́lẹ́ tí ó lè rìn ní àyíká rẹ̀ láìsí ìrànlọ́wọ́ ẹni. Nípa yíyí ẹ̀rọ̀ náà káàkiri bí radar, ọkọ̀ ayọ́kẹ́lẹ́ náà ń rí àwọn ìdíwọ́ ó sì yan ọ̀nà tí ó mọ́ dáradára láti tẹ̀ síwájú, tí ó sọ èyí di ìfáàṣí pípé sí ẹ̀rọ̀ robot, ìsopọ̀ mọ́ ẹ̀rọ̀, àti ìrìn àdáyọba.

Sunfounder_Pico4DW-09-Obstacle-avoidance ìtòlẹ́ pẹ̀lú ìdíwọ́ lórí ilẹ̀

Iṣẹ́ yìí kì í ṣe ìṣeré nìkan; ó jẹ́ ìpìlẹ̀ fún ọ̀pọ̀lọpọ̀ àwọn ìlò tí ó wúlò. Èrò díẹ̀ nìyí láti yó ọkàn rẹ:

  • Robot Ìṣàwárí Àdáyọba: Kọ́ robot tí ó lè ṣàwárí àti ṣàgbékalẹ̀ yàrá tàbí àgbègbè ìta láìsí ìrànlọ́wọ́ ènìyàn.
  • Ìkọ́lẹ̀ Ọlọ́gbọ́n: Lo àwọn ìlànà kanna láti dá robot tí ó ń lọ káàkiri yàrá, tí ó ń yẹra fún àwọn aga àti ògiri nígbà tí ó ń fọ.
  • Bot Ìṣọ́ Ààbò: Ṣètò ọkọ̀ ayọ́kẹ́lẹ́ láti ṣọ́ àgbègbè kan àti lo ẹ̀rọ̀ ultrasonic láti rí àti jàbọ̀ àwọn ìdíwọ́ àìròtẹ́lẹ̀ tàbí ìwọlé.
  • Pẹpẹ Ẹ̀kọ́ fún AI: Lo iṣẹ́ yìí gẹ́gẹ́ bí ìgbésẹ̀ àkọ́kọ́ láti kọ́ àwọn àlọ́gọ́rìdíìmù tí ó díjù bíi wíwá ọ̀nà àti ìwọ̀n àyè ní àkókò kanna (SLAM).

Ẹ̀kọ́ yìí dá lórí ìtọ́kànnà pàtàkì àti kóòdù tí ó jẹ́ kí ọkọ̀ ayọ́kẹ́lẹ́ náà ṣe ìpinnu. Ọkọ̀ ayọ́kẹ́lẹ́ náà ń lo mọ́tò servo láti yí ẹ̀rọ̀ ultrasonic, tí ó ń ṣiṣẹ́ bí radar láti díwọ̀n ààyè láti 0 sí 180 ìwọ̀n. Kóòdù náà ń ṣàyẹ̀wò dàtà yìí láti rí ọ̀nà tí ó gbòrò jùlọ tí ó sì darí ọkọ̀ ayọ́kẹ́lẹ́ láti lọ síwájú, òsì, tàbí ọ̀tún ní ìbámu. Fídíò náà ń ṣàfihàn gbogbo ìlànà náà, láti ìdánwò àwọn ẹ̀yà kọ̀ọ̀kan sí ṣíṣe àlọ́gọ́rìdíìmù ìyẹra fún ìdíwọ́ nígbẹ̀yìn nínú àkàwé labyrinth gidi.

Ohun èlò/Àwọn Ẹ̀yà

Iṣẹ́ yìí dá lórí SunFounder Raspberry Pi Pico 4WD Smart Car kit. Àwọn ẹ̀yà pàtàkì tí a lò nínú ẹ̀kọ́ yìí ni:

  • Bọ́ọ̀dù microcontroller Raspberry Pi Pico
  • SunFounder 4WD Smart Car chassis pẹ̀lú mọ́tò mẹ́rin
  • Bọ́ọ̀dù ìṣàkóso mọ́tò
  • Ẹ̀rọ̀ ààyè ultrasonic (HC-SR04 type)
  • Mọ́tò servo (fún yíyí ẹ̀rọ̀ ultrasonic)
  • Ìpèsè agbára (bàtìrí fún ọkọ̀ ayọ́kẹ́lẹ́)

Ìtọ́sọ́nà Ìsopọ̀

SunFounder kit jẹ́ àpẹrẹ fún ìpéjọ rọrùn, àti pé ìsopọ̀ wáyà ní ọ̀pọ̀ ìgbà ti sopọ̀ tẹ́lẹ̀ nípasẹ̀ bọ́ọ̀dù ìmúgbòòrò àkànṣe. Ẹ̀rọ̀ ultrasonic ti gbé sórí mọ́tò servo, èyí tí a sopọ̀ sí bọ́ọ̀dù ìṣàkóso àkọ́kọ́. Ìtòlẹ́ yìí jẹ́ kí ẹ̀rọ̀ náà yípo láti ṣàyẹ̀wò àyíká. Fún àwòrán ìsopọ̀ wáyà alápẹ̀rẹ́ tí ó ní ìsọ̀kan pẹ̀lú kit rẹ, jọ̀wọ́ tọ́ka sí ìwé àṣẹ SunFounder.

Àwọn ìsopọ̀ pàtàkì ní ìbámu pẹ̀lú àwọn pin trigger àti echo ti ẹ̀rọ̀ ultrasonic, àti pin ìfìhàn mọ́tò servo, gbogbo wọn ni a sopọ̀ sí àwọn pin GPIO pàtó lórí Raspberry Pi Pico. Ìṣàkóso mọ́tò náà ti sopọ̀ sí Pico láti ṣàkóso àwọn mọ́tò ìwakọ̀ mẹ́rin. Fídíò náà mẹ́nu kan pé ìwé àṣẹ kíkún, pẹ̀lú àwọn àwòrán ìsopọ̀ wáyà, wà fún ìgbàlẹ̀ pẹ̀lú kit.

Sunfounder_Pico4DW-09-Obstacle-avoidance_nígbà tí ultrasonic rí ìdíwọ́

Àlàyé Kóòdù

Ẹ̀kọ́ yìí dá lórí ìtọ́kànnà nínú àpẹrẹ `obstacle_avoid`. A kọ kóòdù náà ní MicroPython. Bí ó tilẹ̀ jẹ́ pé ètò kíkún wà fún ìgbàlẹ̀, a ó fojú sí àwọn àyípadà pàtàkì tí olùṣàmúlò lè ṣàtúnṣe tí ó ń ṣàkóso ìwà ọkọ̀ ayọ́kẹ́lẹ́. Àwọn wọ̀nyí ní ọ̀pọ̀ ìgbà wà ní ìbẹ̀rẹ̀ script.

Àwọn àyípadà àkọ́kọ́ tí o lè ṣàtúnṣe láti ṣàtúnṣe iṣẹ́ robot rẹ ni:


# Àwọn àyípadà radar àti ìrìn
radar_reference = 20  # Ààyè tí ó kéré jùlọ ní cm láti jẹ́ ààbò
step_angle = 10       # Ìgbésẹ̀ ìwọ̀n fún ìgbésẹ̀ ìṣàyẹ̀wò radar kọ̀ọ̀kan
forward_speed = 30    # Ìyára mọ́tò fún gbígbé síwájú (0-100)
turn_speed = 50       # Ìyára mọ́tò fún yíyí (0-100)
forward_scan_angle = 50  # Ìwọ̀n tí servo ń ṣàyẹ̀wò nígbà tí a kò rí ìdíwọ́
  • radar_reference: Èyí ni ààyè ààbò pàtàkì ní centimeters. Bí a bá rí ìdíwọ́ ní ààyè tí ó kéré ju èyí lọ, ọkọ̀ ayọ́kẹ́lẹ́ yóò kà á sí "eewu" yóò sì bẹ̀rẹ̀ ìgbésẹ̀ ìyẹra. Nínú fídíò, a ṣètò èyí sí 20 cm.
  • step_angle: Èyí ń ṣàlàyé ìwọ̀n ìṣàyẹ̀wò radar. Iye tí ó kéré (bíi 10 ìwọ̀n) túmọ̀ sí ìṣàyẹ̀wò alápẹ̀rẹ́ ṣùgbọ́n ó gba àkókò púpọ̀. Iye tí ó tóbi yóò yára ṣùgbọ́n ó lè pàdánù àwọn ìdíwọ́ tí ó tẹ́ńbẹ́lú.
  • forward_speed & turn_speed: Àwọn wọ̀nyí ń ṣàkóso agbára tí a fi sí àwọn mọ́tò. O lè ṣàtúnṣe wọn láti yí ìyára àti ìmúra ọkọ̀ ayọ́kẹ́lẹ́ padà. Ìyára yíyí ní ọ̀pọ̀ ìgbà ni a ṣètò sí iye tí ó ga láti rí i pé ọkọ̀ ayọ́kẹ́lẹ́ lè yípo dáradára.
  • forward_scan_angle: Nígbà tí kò sí eewu lójúkan níwájú, ọkọ̀ ayọ́kẹ́lẹ́ ń dín ìṣàyẹ̀wò rẹ̀ kù sí ìwọ̀n yìí (tí ó dá lórí ìwájú) láti ṣàyẹ̀wò àwọn ìdíwọ́ ní ọ̀nà tààrà rẹ̀ nígbà gbogbo, tí ó jẹ́ kí ìrìn síwájú dáǹdán.

Fídíò náà tún ṣàlàyé ìlànà pàtàkì tí a fi ń ṣe ìpinnu. Iṣẹ́-ìṣe kan `get_direction()` ń ṣàyẹ̀wò àkójọ àwọn ìwọ̀n ìjìnnà (tí a yí padà sí 1s àti 0s fún àìléwu/léwu) láti rí ọ̀nà tí ó gbòòrò jùlọ tí ó ń tẹ̀síwájú nínú "1s". Ní ìbámu pẹ̀lú ibi tí ọ̀nà tí ó gbòòrò jùlọ yìí wà, iṣẹ́-ìṣe náà ń dá ìtọ́sọ́nà padà: "iwájú", "òsì", tàbí "ọ̀tún". Àkójọpọ̀ àkọ́kọ́ náà wá ń ṣe ìgbésẹ̀ tí ó bá mu, tí ó ń yí ọkọ̀ ayọ́kẹ́kẹ́ padà tí ó sì ń tún ṣàyẹ̀wò títí tí ọ̀nà níwájú yóò fi kò sí ìdíwọ́.

Ìṣẹ̀lú Ààyè/Ìfihàn

Fídíò náà ń pèsè ìfihàn kíkún fún ìṣẹ̀lú náà. Ó bẹ̀rẹ̀ nípa dídánwò ẹ̀rọ ìmọ̀-ìjìnnà (ultrasonic sensor) nìkan láti fi hàn bí ó ṣe ń wọn ìjìnnà tí ó sì ń tẹ àwọn iye náà jáde sí ibi ìkọ̀wé (shell). Olùkọ́ náà wá ṣàlàyé ìlànà ìyẹ̀wò ìdíwọ́ nípa lílo àwòrán ṣíṣàn (flowchart), tí ó ń ṣàlàyé ìlànà ìpinnu fún yíyí padà sí òsì àti ọ̀tún. Ní ìparí, a gbé ọkọ̀ ayọ́kẹ́kẹ́ náà sínú ọ̀nà kékeré kan tí a ṣe láti inú àpótí láti fi hàn ìwà ìyẹ̀wò ìdíwọ́ kíkún ní ìgbà tí ó ń ṣiṣẹ́. Ọkọ̀ ayọ́kẹ́kẹ́ náà ń lọ káàkiri ọ̀nà náà ní àṣeyọrí, tí ó ń yí padà sí òsì àti ọ̀tún láti rí ọ̀nà tí ó kò sí níwájú.

Àwọn Ìpín Fídíò

  • [00:00] Ìfáàrà sí Ìyẹ̀wò Ìdíwọ́
  • [01:31] Àkópọ̀ SunFounder Smart Car Kit àti Àwọn Ẹ̀yà Rẹ̀
  • [02:47] Bí Ẹ̀yà Ìyẹ̀wò Ìdíwọ́ Ṣe ń Ṣiṣẹ́
  • [03:34] Dídánwò Ẹ̀rọ Ìmọ̀-Ìjìnnà (Ultrasonic Sensor)
  • [07:45] Ṣàlàyé Ìlànà Ìyẹ̀wò Ìdíwọ́ àti Àwòrán Ṣíṣàn
  • [12:49] Ṣàyẹ̀wò Kóòdù Ìyẹ̀wò Ìdíwọ́ Pàtàkì
  • [15:43] Ìfihàn Láàyè ti Ìlànà Ìyẹ̀wò Ìdíwọ́
  • [22:53] Ìfihàn Ìkẹyìn pẹ̀lú Ọ̀nà Àwọn Ìdíwọ́
  • [24:35] Ìparí àti Àwọn Ìgbésẹ̀ Tí Ó Tẹ̀lé

Aworan

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
909-Lesson 9/10 Pi Pico 4WD card Python code: obstacle avoid
Ede: C++
# Lesson 9/10 Pi Car Pico 4WD: Obstacle avoid
# Download and resource page https://robojax.com/RJT631
import pico_4wd as car
import time

car.RADAR_REFERENCE = 20
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 30
MOTOR_TURNING_POWER = 50

FORWARD_SCAN_ANGLE = 50

car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
status = "Danger"

def get_dir(radar_data):
    # get scan status of 0, 1
    # print(radar_data)
    radar_data = [str(i) for i in radar_data]
    radar_data = "".join(radar_data)
    # Split 0, leaves the free path
    paths = radar_data.split("0")
    # print(paths)
    # print("paths: %s" % paths)
    length_list = []
    # Calculate where is the widest
    for path in paths:
        length_list.append(len(path))
    if max(length_list) < 4:
        return "left"
    # Calculate the direction of the widest 
    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:
        return "left"
    elif pos > 2 * delta:
        return "right"
    else:
        return "forward"

def main():
    global status
    # General
    while True:
        radar_data = car.radar_scan()
        # print("radar_data: %s" % radar_data)
        # If radar data return a int, means scan not finished, and the int is current angle status
        if isinstance(radar_data, int):
            if radar_data == 0 and status != "Danger":
                print("Danger!")
                status = "Danger"
                car.move("stop")
                car.set_radar_scan_angle(180)
            continue
        else:
            status = "Save"
        
        direction = get_dir(radar_data)

        if direction == "left":
            print("turn left")
            distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("left", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        elif direction == "right":
            print("turn right")
            distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("right", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        else:
            print("forward")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
            car.move("forward", MOTOR_FORWARD_POWER)

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

Orisun & itọkasi

Ko si awọn orisun sibẹsibẹ.

Fáìlìs📁

Koodu Raspberry Pi