สารบัญ:

GiggleBot Line Follower โดยใช้ Python: 5 ขั้นตอน
GiggleBot Line Follower โดยใช้ Python: 5 ขั้นตอน

วีดีโอ: GiggleBot Line Follower โดยใช้ Python: 5 ขั้นตอน

วีดีโอ: GiggleBot Line Follower โดยใช้ Python: 5 ขั้นตอน
วีดีโอ: GiggleBot Line Follower - Program the micro:bit robot using the Line Follower 2024, พฤศจิกายน
Anonim
GiggleBot Line Follower โดยใช้ Python
GiggleBot Line Follower โดยใช้ Python
GiggleBot Line Follower โดยใช้ Python
GiggleBot Line Follower โดยใช้ Python
GiggleBot Line Follower โดยใช้ Python
GiggleBot Line Follower โดยใช้ Python

คราวนี้ เรากำลังตั้งโปรแกรมใน MicroPython Dexter Industries GiggleBot เพื่อติดตามเส้นสีดำโดยใช้เซ็นเซอร์ติดตามบรรทัดในตัว

GiggleBot ต้องจับคู่กับ BBC micro:bit เพื่อให้ควบคุมได้อย่างเหมาะสม

หากบทช่วยสอนนี้สูงเกินไปสำหรับคุณและการเขียนโปรแกรม GiggleBot มากเกินไปสำหรับตอนนี้ คุณสามารถอ่านบทแนะนำสำหรับผู้เริ่มต้นซึ่งจะแสดงให้คุณเห็นว่าสามารถตั้งโปรแกรมหุ่นยนต์ใน MakeCode ได้อย่างไร ที่นี่ บทช่วยสอนที่เชื่อมโยงจะแนะนำคุณเกี่ยวกับพื้นฐานเบื้องต้น

ขั้นตอนที่ 1: ส่วนประกอบที่จำเป็น

ส่วนประกอบที่จำเป็น
ส่วนประกอบที่จำเป็น

ต้องใช้ส่วนประกอบฮาร์ดแวร์ต่อไปนี้:

  1. แบตเตอรี่ AA x3 - ในกรณีของฉัน ฉันใช้แบตเตอรี่แบบชาร์จไฟได้ซึ่งมีแรงดันไฟฟ้าโดยรวมต่ำกว่า
  2. หุ่นยนต์ Dexter Industries GiggleBot สำหรับ micro:bit
  3. BBC micro:bit.

แน่นอน คุณต้องใช้สายไมโคร USB เพื่อตั้งโปรแกรม BBC micro:bit - โดยทั่วไปแล้วสายนี้จะอยู่ในแพ็คเกจของ BBC micro:bit หรือคุณสามารถใช้สายชาร์จสำหรับสมาร์ทโฟน (Android) ได้ตลอดเวลา

รับ GiggleBot สำหรับ micro:bit ที่นี่

ขั้นตอนที่ 2: ตั้งค่า Tracks

ตั้งค่าแทร็ก
ตั้งค่าแทร็ก

คุณจะต้องพิมพ์ไทล์และออกแบบแทร็กของคุณเอง คุณสามารถใช้ไทล์ของเราเองได้ เพื่อให้คุณแน่ใจ 100% ว่าคุณกำลังจำลองเงื่อนไขของเรา หรือถ้าคุณรู้สึกอยากผจญภัย คุณสามารถใช้เทปสีดำแล้วทำขึ้นมาเองได้ นี่คือ PDF สำหรับไทล์ที่เราใช้

แทร็กด้านบนประกอบด้วยไทล์ต่างๆ ดังต่อไปนี้:

  • 12 กระเบื้องประเภท #1
  • 5 กระเบื้องประเภท #2
  • 3 เทมเพลตของประเภทไทล์ #5
  • เทมเพลต 3 แบบของประเภทไทล์ #6 - ที่นี่ คุณจะมีไทล์พิเศษอีกหนึ่งไทล์

ถัดไป พิมพ์และตัดออก ลองวางพวกมันเหมือนในภาพด้านบน และจำไว้ว่าที่ด้านขวาบนของแทร็ก ไทล์ 2 แผ่นต้องซ้อนทับกัน - นี่ควรเผื่อไว้ในกรณีที่คุณสงสัยว่าคุณทำอะไรผิดหรือเปล่า

ขั้นตอนที่ 3: การตั้งค่าสภาพแวดล้อม

การตั้งค่าสิ่งแวดล้อม
การตั้งค่าสิ่งแวดล้อม

เพื่อให้คุณสามารถตั้งโปรแกรม BBC micro:bit ใน MicroPython ได้ คุณต้องตั้งค่าตัวแก้ไขสำหรับมัน (ตัวแก้ไข Mu) และตั้งค่า GiggleBot MicroPython Runtime เป็นรันไทม์ เพื่อที่ คุณต้องทำตามคำแนะนำในหน้านี้ ณ ขณะนี้ เวอร์ชัน v0.4.0 ของรันไทม์ถูกใช้

ขั้นตอนที่ 4: การเขียนโปรแกรม GiggleBot

ก่อนที่จะลงมือ รันไทม์ GiggleBot MicroPython มีรันไทม์แบบคลาสสิกสำหรับ BBC micro:bit และไลบรารีอื่นๆ เพื่อรองรับ GiggleBot และเซนเซอร์ Dexter Industries อื่นๆ

หลังจากตั้งค่าแล้ว ให้เปิดสคริปต์ต่อไปนี้ในตัวแก้ไข Mu และคลิกที่ Flash การดำเนินการนี้จะแฟลช GiggleBot MicroPython Runtime และสคริปต์ที่คุณเพิ่งเปิดไปยัง BBC micro:bit ของคุณ สคริปต์ยังแสดงอยู่ด้านล่าง

เมื่อกระบวนการแฟลชเสร็จสิ้น ให้ซ้อน BBC micro:bit ลงใน GiggleBot โดยให้นีโอพิกเซลของบอร์ดหันไปข้างหน้า วางบนรางแล้วเปิดสวิตช์

โปรดสังเกตว่าในสคริปต์ PID และค่าคงที่อื่นๆ 2 ค่า (ค่ากำหนดความเร็วและค่าคงที่ความเร็วต่ำสุด) ถูกตั้งค่าไว้แล้ว

หมายเหตุ: สคริปต์ต่อไปนี้อาจมีช่องว่างหายไป และดูเหมือนว่าจะเกิดจากปัญหาบางอย่างในการแสดง GitHub Gists คลิกที่ส่วนสำคัญเพื่อนำคุณไปยังหน้า GitHub ซึ่งคุณสามารถคัดลอกและวางโค้ดได้

GiggleBot PID Line Follower - ปรับแต่งด้วย NeoPixels

จากการนำเข้าไมโครบิต*
จากการนำเข้า gigglebot*
จาก utime นำเข้า sleep_ms, ticks_us
นำเข้า ustruct
# เริ่มต้น GB neopixels
นีโอ = init()
#จับเวลา
update_rate =50
# กำไร/ค่าคงที่ (สมมติว่าแรงดันแบตเตอรี่อยู่ที่ประมาณ 4.0 โวลต์)
Kp =25.0
กี่ = 0.5
Kd =35.0
trigger_point =0.3
min_speed_percent =0.3
base_speed =70
ค่าที่ตั้งไว้ =0.5
last_position = เซ็ตพอยต์
อินทิกรัล =0.0
run_neopixels =True
center_pixel =5# โดยที่พิกเซลตรงกลางของรอยยิ้มจะอยู่บน GB
# เทอร์ควอยซ์ = ทูเพิล(แผนที่(แลมบ์ดา x: int(x / 5), (64, 224, 208))) # สีที่จะใช้วาดข้อผิดพลาดด้วยนีโอพิกเซล
# เทอร์ควอยซ์ = (12, 44, 41) # ซึ่งเป็นสีเทอร์ควอยซ์ด้านบนที่แสดงความคิดเห็นไว้ข้างต้น
error_width_per_pixel =0.5/3# ข้อผิดพลาดสูงสุดหารด้วยจำนวนเซ็กเมนต์ระหว่างแต่ละ neopixel
defupper_bound_linear_speed_reducer (abs_error, trigger_point, upper_bound, smallest_motor_power, maximum_motor_power):
ฐานโลก_ความเร็ว
ถ้า abs_error >= trigger_point:
# x0 = 0.0
# y0 = 0.0
# x1 = ขอบเขตบน - trigger_point
# y1 = 1.0
# x = abs_error - trigger_point
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# เหมือนกับ
y = (abs_error - trigger_point) / (บน_bound - trigger_point)
motor_power = base_speed * (smallest_motor_power + (1- y) * (สูงสุด_motor_power - เล็กที่สุด_motor_power))
ส่งคืน motor_power
อื่น:
คืนค่า base_speed * maximum_motor_power
วิ่ง = เท็จ
Previous_error =0
ในขณะที่จริง:
# หากกดปุ่ม a ให้เริ่มติดตาม
ถ้า button_a.is_pressed():
วิ่ง = จริง
#แต่ถ้ากดปุ่ม b ให้หยุดผู้ติดตามไลน์
ถ้า button_b.is_pressed():
วิ่ง = เท็จ
อินทิกรัล =0.0
Previous_error =0.0
พิกเซล_off()
หยุด()
sleep_ms(500)
ถ้ารัน isTrue:
#อ่านเส้นเซ็นเซอร์
start_time = ticks_us()
ขวา, ซ้าย = read_sensor(LINE_SENSOR, ทั้งสอง)
# เส้นอยู่ด้านซ้ายเมื่อตำแหน่ง < 0.5
# เส้นอยู่ทางขวาเมื่อตำแหน่ง > 0.5
# เส้นอยู่ตรงกลางเมื่อตำแหน่ง = 0.5
#มันคือค่าเฉลี่ยเลขคณิตถ่วงน้ำหนัก
ลอง:
ตำแหน่ง = ขวา /float(ซ้าย + ขวา)
ยกเว้นข้อผิดพลาด ZeroDivision:
ตำแหน่ง =0.5
# ช่วงต้องเป็น (0, 1) และไม่ใช่ [0, 1]
ถ้าตำแหน่ง ==0: ตำแหน่ง =0.001
ถ้าตำแหน่ง ==1: ตำแหน่ง =0.999
# ใช้ตัวควบคุม PD
ข้อผิดพลาด = ตำแหน่ง - จุดตั้งค่า
อินทิกรัล += ข้อผิดพลาด
การแก้ไข = Kp * ข้อผิดพลาด + Ki * อินทิกรัล + Kd * (ข้อผิดพลาด - Previous_error)
Previous_error = ข้อผิดพลาด
#คำนวณความเร็วมอเตอร์
motor_speed = upper_bound_linear_speed_reducer (abs (ข้อผิดพลาด), setpoint * trigger_point, setpoint, min_speed_percent, 1.0)
leftMotorSpeed = motor_speed + การแก้ไข
rightMotorSpeed = motor_speed - การแก้ไข
# ทำให้ neopixels สว่างขึ้นตามข้อผิดพลาดที่กำหนด
ถ้า run_neopixels isTrue และ total_counts %3==0:
สำหรับผม'\x00\x01\x02\x03\x04\x05\x06\x07\x08':
นีโอ = (0, 0, 0)
สำหรับฉันใน'\x00\x01\x02\x03':
ifabs(ข้อผิดพลาด) > error_width_per_pixel * i:
ถ้าเกิดข้อผิดพลาด <0:
# neo[center_pixel + i] = เทอร์ควอยซ์
นีโอ[center_pixel + i] = (12, 44, 41)
อื่น:
# neo[center_pixel - i] = เทอร์ควอยซ์
นีโอ[center_pixel + i] = (12, 44, 41)
อื่น:
เปอร์เซ็นต์ =1- (error_width_per_pixel * i -abs(error)) / error_width_per_pixel
# สว่างขึ้นพิกเซลปัจจุบัน
ถ้าเกิดข้อผิดพลาด <0:
# neo [center_pixel + i] = tuple (แผนที่ (แลมบ์ดา x: int (x * เปอร์เซ็นต์), เทอร์ควอยซ์))
neo[center_pixel + i] = (int(64* เปอร์เซ็นต์ /5), int(224* เปอร์เซ็นต์ /5), int(208* เปอร์เซ็นต์ /5))
อื่น:
# neo [center_pixel - i] = tuple (แผนที่ (แลมบ์ดา x: int (x * เปอร์เซ็นต์), เทอร์ควอยซ์))
neo[center_pixel - i] = (int(64* เปอร์เซ็นต์ /5), int(224* เปอร์เซ็นต์ /5), int(208* เปอร์เซ็นต์ /5))
หยุดพัก
neo.show()
ลอง:
#หนีบความเร็วมอเตอร์
ถ้าเหลือความเร็วมอเตอร์ >100:
leftMotorSpeed =100
rightMotorSpeed = rightMotorSpeed - ซ้ายMotorSpeed +100
ถ้าใช่ความเร็วมอเตอร์ >100:
rightMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100
ถ้า leftMotorSpeed <-100:
leftMotorSpeed = -100
ถ้า rightMotorSpeed <-100:
rightMotorSpeed = -100
#สั่งงานมอเตอร์
set_speed(leftMotorSpeed, rightMotorSpeed)
ขับ()
# พิมพ์ ((ข้อผิดพลาด, motor_speed))
ยกเว้น:
#ในกรณีที่เราประสบปัญหาบางอย่างที่แก้ไขไม่ได้
ผ่าน
# และรักษาความถี่ลูป
end_time = ticks_us()
delay_diff = (end_time - start_time) /1000
if1000.0/ update_rate - delay_diff >0:
สลีป (1000.0/ update_rate - ล่าช้า_diff)

ดู rawgigglebot_tuned_line_follower.py โฮสต์ด้วย ❤ โดย GitHub

ขั้นตอนที่ 5: ปล่อยให้มันทำงาน

มี 2 ปุ่มบน BBC micro:bit: ปุ่ม A และปุ่ม B:

  • การกดปุ่ม A จะทำให้ GiggleBot ทำตามบรรทัด (ถ้ามี)
  • การกดปุ่ม B จะหยุด GiggleBot และรีเซ็ตทุกอย่างเพื่อให้คุณใช้งานได้อีกครั้ง

ขอแนะนำเป็นอย่างยิ่งว่าอย่ายก GiggleBot ขณะที่กำลังเดินตามเส้น แล้วใส่กลับเข้าไปใหม่ เนื่องจากข้อผิดพลาดในการคำนวณอาจสะสมและทำให้เส้นทางของหุ่นยนต์ยุ่งเหยิงโดยสิ้นเชิง หากต้องการยกขึ้น ให้กดปุ่ม B จากนั้นใส่กลับเข้าไปใหม่ ให้กด A อีกครั้ง

แนะนำ: