สารบัญ:

การเขียนโปรแกรม Micro:Bit Robot & Joystick:Bit Controller ด้วย MicroPython: 11 ขั้นตอน
การเขียนโปรแกรม Micro:Bit Robot & Joystick:Bit Controller ด้วย MicroPython: 11 ขั้นตอน

วีดีโอ: การเขียนโปรแกรม Micro:Bit Robot & Joystick:Bit Controller ด้วย MicroPython: 11 ขั้นตอน

วีดีโอ: การเขียนโปรแกรม Micro:Bit Robot & Joystick:Bit Controller ด้วย MicroPython: 11 ขั้นตอน
วีดีโอ: การเขียนโปรแกรมบน ESP32 ด้วย microPython เริ่มต้นรู้จักคำสั่งงานพื้นฐาน EP.02 2024, พฤศจิกายน
Anonim
การเขียนโปรแกรม Micro:Bit Robot & Joystick:Bit Controller ด้วย MicroPython
การเขียนโปรแกรม Micro:Bit Robot & Joystick:Bit Controller ด้วย MicroPython

สำหรับ Robocamp 2019 ค่ายหุ่นยนต์ภาคฤดูร้อนของเรานั้น คนหนุ่มสาวอายุ 10-13 ปีกำลังบัดกรี ตั้งโปรแกรม และสร้าง 'หุ่นยนต์น้ำหนักเกิน' ของ BBC micro:bit รวมถึงการเขียนโปรแกรม micro:bit เพื่อใช้เป็นรีโมทคอนโทรล

หากคุณกำลังอยู่ที่ Robocamp ให้ข้ามไปที่ขั้นตอนที่ 3 เนื่องจากเราได้ทำสองขั้นตอนแรกเป็นกลุ่มแล้ว

นี่คือคำแนะนำทีละขั้นตอนเพื่อให้หุ่นยนต์ micro:bit สื่อสารกับตัวควบคุมจอยสติ๊ก:บิต

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

สำหรับกิจกรรมนี้ เราใช้หุ่นยนต์แบบกำหนดเอง แต่จะทำงานร่วมกับหุ่นยนต์ทุกตัวที่ใช้ไดรเวอร์มอเตอร์ที่คล้ายกัน เช่น L9110

ไฟล์การออกแบบสำหรับหุ่นยนต์ของเราสามารถพบได้ที่นี่:

คู่มือนี้เขียนขึ้นสำหรับผู้เริ่มต้น แต่ถ้าคุณไม่เคยใช้ micro:bit กับ MicroPython มาก่อน เราขอแนะนำให้คุณลองใช้โปรแกรมที่ง่ายกว่านี้ก่อน เช่น ป้ายชื่อของเรา คำแนะนำ: https://www.instructables.com/id/Felt -ไมโครบิต-น้ำ…

เสบียง

2x BBC micro:บิต

หุ่นยนต์ที่ทำงานร่วมกับ BBC micro:bit (ดูคำอธิบายด้านบน)

joystick:bit controller (เราได้มาจาก Cool Components)

ขั้นตอนที่ 1: การตั้งค่าหุ่นยนต์

คุณมีตัวเลือกสองสามอย่างในการเขียนโค้ด MicroPython สำหรับ micro:bit ของคุณ:

  • Mu ซึ่งคุณสามารถดาวน์โหลดและติดตั้งได้จากที่นี่:
  • ตัวแก้ไขออนไลน์ที่คุณสามารถพบได้ที่นี่:

คำแนะนำเหล่านี้ถือว่าคุณกำลังใช้ Mu

เปิด Mu แล้วเสียบ micro:bit เข้ากับคอมพิวเตอร์ Mu ควรตระหนักว่าคุณกำลังใช้ micro:bit และเลือก micro:bit 'Mode' แต่หากไม่เป็นเช่นนั้น ให้เปลี่ยนด้วยตนเอง

เลือกโหมด
เลือกโหมด

รับสำเนารหัสทดสอบมอเตอร์หุ่นยนต์จากที่นี่:

หากคุณไม่คุ้นเคยกับ Github อาจทำให้คุณใช้งานไม่ได้! สองวิธีง่าย ๆ ในการรับรหัสนี้คือ:

  1. บันทึกไฟล์ Raw ลงในคอมพิวเตอร์ของคุณแล้วโหลดลงใน Mu:
  2. คัดลอกและวางรหัสที่กำหนดทั้งหมดลงในไฟล์ใหม่ใน Mu
บันทึกไฟล์ดิบ
บันทึกไฟล์ดิบ

ตอนนี้ให้คลิกปุ่ม 'Flash' จากแถบเครื่องมือของ Mu เพื่อส่งรหัสใหม่ของคุณไปยัง micro:bit

สิ่งนี้จะไม่ทำงานเว้นแต่จะเสียบ micro:bit

ไฟสีเหลืองที่ด้านหลังของ micro:bit จะเริ่มกะพริบ เมื่อเสร็จแล้ว รหัสของคุณได้ถูกโอนแล้ว

การตั้งค่าทิศทางมอเตอร์

โปรแกรมนี้จะเปิดมอเตอร์ในทิศทางต่างๆ เมื่อคุณกดปุ่ม 'A' บน micro:bit

สิ่งที่คุณต้องการเกิดขึ้นคือ:

  • เมื่อ 'A' ปรากฏขึ้น ให้มอเตอร์ไปข้างหน้า
  • เมื่อ 'B' ปรากฏขึ้น ให้มอเตอร์ถอยหลัง
  • เมื่อ 'C' ปรากฏขึ้น มอเตอร์ด้านขวาจะเดินหน้า
  • เมื่อ 'D' ปรากฏขึ้น มอเตอร์ขวาจะถอยหลัง

อาจจะไม่เป็นเช่นนั้นเพราะมันขึ้นอยู่กับว่าคุณเชื่อมต่อหุ่นยนต์ของคุณอย่างไร!

ที่ด้านบนของโค้ด คุณจะพบรายการของตัวแปร ซึ่งจะกำหนดพินที่ micro:bit ควบคุมทิศทางของมอเตอร์

หากคุณกำลังใช้หนึ่งในโรบ็อตของเรา (ไฟล์) ให้สลับชื่อตัวแปรไปรอบๆ เพื่อให้หุ่นยนต์เคลื่อนที่ไปในทิศทางที่ถูกต้อง:

สลับตัวแปรพิน
สลับตัวแปรพิน

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

ทดลองขับ

ตอนนี้ตรวจสอบว่าหุ่นยนต์ของคุณขับเคลื่อนอย่างไรโดยแทนที่รหัสทดสอบในลูปหลักด้วยรหัสของคุณเอง

คุณบอกให้หุ่นยนต์ขับรถโดยเรียกใช้ฟังก์ชัน drive() ต้องใช้สองอาร์กิวเมนต์ - ค่าสำหรับมอเตอร์ด้านซ้ายและค่าสำหรับมอเตอร์ด้านขวา ระหว่าง 0 (ปิด) และ 1023 (ความเร็วสูงสุด)

โดยการเรียกไดรฟ์ (500, 500) ตัวอย่างเช่น คุณกำลังบอกให้มอเตอร์ทั้งสองเปิด ในทิศทางไปข้างหน้า ที่ความเร็วประมาณครึ่งหนึ่ง

ลองใช้ตัวเลือก 2-3 อย่างเพื่อดูว่ามันขับตรงแค่ไหนและเลี้ยวได้ดีแค่ไหน

คำแนะนำ: การทดสอบมอเตอร์อยู่ภายในทั้ง True loop และ if statement - มอเตอร์จะไม่หมุนจนกว่าคุณจะกดปุ่ม A บน micro:bit และจะเป็นการตรวจสอบตลอดไปว่าคุณได้กดปุ่ม A หรือไม่

คำแนะนำ: มอเตอร์จะไม่ปิดจนกว่าคุณจะบอกให้ทำ! พวกเขาจะทำตามคำแนะนำสุดท้ายต่อไปเสมอ

ไม่บังคับ: ปรับปรุงการขับขี่ในแนวตรง

หากหุ่นยนต์ของคุณไม่ขับเป็นเส้นตรง มอเตอร์ตัวใดตัวหนึ่งของคุณอาจหมุนเร็วกว่าอีกตัวหนึ่ง

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

เลื่อนขึ้นเพื่อค้นหาคำจำกัดความของฟังก์ชันไดรฟ์ และดูคำแนะนำสองข้อด้านบน:

def ไดรฟ์ (L, R):

# ด้านล่างนี้เป็นการปรับแก้ความคลาดเคลื่อนของความเร็วมอเตอร์ L = int(L*1) R = int(R*1)

สองบรรทัดนี้ในปัจจุบันใช้ค่าของ L และ R คูณด้วย 1 จากนั้นตรวจสอบให้แน่ใจว่ายังคงเป็นจำนวนเต็ม (int)

ตัวอย่างเช่น หากมอเตอร์ด้านซ้ายของคุณเร็วขึ้น ให้เปลี่ยน *1 ในบรรทัดเป็น *0.9 และดูว่าจะช่วยปรับปรุงสิ่งต่างๆ ได้หรือไม่

คุณจะไม่สามารถทำให้มันสมบูรณ์แบบได้ แต่คุณสามารถปรับตัวต่อไปได้จนกว่ามันจะขับตรงขึ้น

การตั้งค่าวิทยุ

ตอนนี้ตั้งค่าวิทยุโดยเพิ่มบรรทัดต่อไปนี้ที่ด้านบนของรหัสของคุณ:

นำเข้าวิทยุ

radio.config(channel=7, group=0, queue=1) radio.on()

ซึ่งจะทำให้หุ่นยนต์ของคุณได้รับคำสั่งจาก micro:bit อื่น แต่ในขณะนี้ หุ่นยนต์จะได้รับคำแนะนำจาก micro:bit อื่นๆ

เนื่องจากช่อง 7 และกลุ่ม 0 เป็นช่องเริ่มต้น

เปลี่ยนตัวเลขเหล่านี้โดยเลือกช่องสัญญาณระหว่าง 0-82 และกลุ่มระหว่าง 0-255 ตอนนี้ micro:bit ของคุณจะได้รับคำแนะนำจากผู้อื่นที่มีข้อมูลการกำหนดค่าเดียวกันเท่านั้น

Queue=1 หมายถึง micro:bit จะเก็บข้อความขาเข้าครั้งละหนึ่งข้อความเท่านั้น ซึ่งให้เวลาตอบสนองเร็วกว่าค่าเริ่มต้นเล็กน้อย ซึ่งก็คือ 3

ตอนนี้ คุณต้องแก้ไขรหัสลูปหลักของคุณ แทนที่จะรันคำแนะนำเมื่อคุณกดปุ่ม ให้รอข้อความวิทยุที่เข้ามาและตอบกลับอย่างเหมาะสม

ลองใช้รหัสต่อไปนี้เพื่อทดสอบ (จะไม่ดำเนินการใดๆ จนกว่าคุณจะตั้งค่าจอยสติ๊กในขั้นตอนที่ 2):

ในขณะที่จริง:

message = radio.receive() ถ้าข้อความ == 'forward': ไดรฟ์ (500, 500)

ขั้นตอนที่ 2: การตั้งค่าจอยสติ๊ก

ถอดปลั๊ก micro:bit ของหุ่นยนต์แล้วเสียบ micro:bit ของจอยสติ๊กแทน

รับสำเนาของรหัสตั้งค่าจอยสติ๊กจากที่นี่:

ตั้งค่าวิทยุโดยใช้การกำหนดค่าเดียวกัน (ช่องและหมายเลขกลุ่ม) เหมือนกับที่คุณทำกับหุ่นยนต์ - ซึ่งจะทำให้ทั้งสองสามารถสื่อสารกันได้

เมื่อสิ้นสุดโปรแกรม ให้เริ่มลูปหลักของคุณ:

ในขณะที่จริง:

ถ้า button_a.was_pressed(): radio.send('forward')

รหัสนี้ยังไม่ได้ใช้จอยสติ๊ก:บิต ใช้ปุ่ม A บน micro:bit เพื่อส่งข้อความ

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

หากได้รับข้อความสำเร็จ และหุ่นยนต์ของคุณเคลื่อนที่… ทำได้ดีมาก! คุณทำตามคำแนะนำในการตั้งค่าเสร็จแล้ว

เคล็ดลับการแก้ปัญหา

หากคุณได้รับข้อความแสดงข้อผิดพลาดบนไมโครคอนโทรลเลอร์ของคุณ: บิต… ดีบักโค้ดคอนโทรลเลอร์ของคุณ

หากคุณได้รับข้อความแสดงข้อผิดพลาดบนหุ่นยนต์ micro:bit… ข้อความวิทยุของคุณถูกส่งเรียบร้อยแล้ว! แต่หุ่นยนต์ไม่สามารถเข้าใจมันได้ ดังนั้นโปรดตรวจสอบว่าข้อความที่คุณส่งและข้อความที่คุณบอกให้หุ่นยนต์ฟังการจับคู่

ถ้าไม่มีอะไรเกิดขึ้นเลย

  • ตรวจสอบให้แน่ใจว่าคุณได้แฟลชโค้ดที่ถูกต้องในแต่ละ micro:bit - ง่ายต่อการแฟลชผิดอันโดยไม่ได้ตั้งใจ!
  • ตรวจสอบให้แน่ใจว่าหมายเลขช่องและกลุ่มของคุณตรงกันในแต่ละ micro:bit

ขั้นตอนที่ 3: ตรวจสอบค่าจอยสติ๊ก

ขั้นตอนต่อไปคือการใช้รหัสควบคุมทั้งหมด

ก่อนที่คุณจะใช้จอยสติ๊กบนคอนโทรลเลอร์ได้ คุณจำเป็นต้องรู้ว่าค่าใดบ้างที่คุณได้รับเมื่อกดก้าน

แทนที่ลูปหลักของคุณด้วยรหัสต่อไปนี้:

ในขณะที่จริง:

จอยสติ๊ก = joystick_push() พิมพ์ (จอยสติ๊ก) สลีป (500)

แฟลชโค้ดนี้ไปที่ micro:bit จากนั้นคลิกปุ่ม REPL บนแถบเครื่องมือของ Mu การดำเนินการนี้จะเปิดเทอร์มินัลที่ด้านล่างของตัวแก้ไข ซึ่งจะให้ลิงก์แบบเรียลไทม์ไปยัง micro:bit

เปิด REPL
เปิด REPL

สิ่งนี้จะไม่ทำงานเว้นแต่จะเสียบ micro:bit

เมื่อ REPL เปิดอยู่ ให้กดปุ่มรีเซ็ตที่ด้านหลังของ micro:bit

ภาพ
ภาพ

คุณควรเห็นค่าบางค่าที่นำ 'พิมพ์' มาที่หน้าจอของคุณ:

ค่าในเทอร์มินัล
ค่าในเทอร์มินัล

ดันก้านของจอยสติ๊กและดูว่าเกิดอะไรขึ้นกับตัวเลข

จดค่าที่กำหนดเมื่อจอยสติ๊กอยู่ในตำแหน่งกึ่งกลาง - ในกรณีของฉัน (518, 523)

คลิกปุ่ม REPL บนแถบเครื่องมือของ Mu อีกครั้งเพื่อปิด คุณจะไม่สามารถแฟลชโค้ดใหม่ไปที่ micro:bit ได้ในขณะที่เปิดอยู่

ขั้นตอนที่ 4: การปรับตัวแปร X และ Y

คุณต้องการเปลี่ยนค่าที่กำหนดโดยฟังก์ชันจอยสติ๊ก เพื่อที่:

  • ตรงกลางเป็นศูนย์
  • ขึ้นเป็นบวก
  • ลงเป็นลบ

ซึ่งตรงกับคำสั่งที่หุ่นยนต์ต้องการ - ตัวเลขบวกเพื่อขับไปข้างหน้า และจำนวนลบเพื่อขับถอยหลัง

ดูตัวเลขที่คุณได้รับในขั้นตอนสุดท้าย ตัวเลขแรกคือ x และตัวเลขที่สองคือ y

แก้ไขนิยาม joystick_push() ที่มีอยู่แล้วในโปรแกรม เพื่อลบค่าของคุณจากต้นฉบับ:

def joystick_push():

x = pin0.read_analog() - 518 y = pin1.read_analog() - 523 ส่งคืน x, y

ใช้หมายเลขของคุณเอง ตัวเลขอาจแตกต่างจากของฉัน

แฟลชโค้ดใหม่ของคุณ เปิด REPL กดปุ่มรีเซ็ตของ micro:bit และตรวจสอบค่าของคุณ

คุณได้รับ (0, 0)?

ขั้นตอนที่ 5: แปลง X และ Y เป็นค่าสำหรับมอเตอร์ซ้ายและขวา

ในขณะนี้ จอยสติ๊กนี้ไม่ค่อยมีประโยชน์ในการขับหุ่นยนต์ด้วย ผลักไปข้างหน้าจนสุด คุณจะได้รับค่าเช่น (0, 500)

หากคุณให้ตัวเลขเหล่านี้กับหุ่นยนต์ มันจะเปิดมอเตอร์ด้านขวา แต่ไม่ใช่มอเตอร์ด้านซ้าย ซึ่งไม่ใช่สิ่งที่คุณต้องการให้เกิดขึ้น!

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

ไดอะแกรม
ไดอะแกรม

คุณต้องใช้คณิตศาสตร์ในการผสมค่า x และ y เพื่อให้มีประโยชน์มากขึ้น

NS

คณิตศาสตร์

เริ่มต้นด้วยการดันจอยสติ๊กไปข้างหน้าจนสุด

ตัวอย่างของค่าที่คุณอาจได้รับคือ:

x = 0

y = 500

เพื่อให้เป็นประโยชน์กับหุ่นยนต์ คุณต้องการรับค่าเหล่านี้:

ซ้าย = 500

ขวา = 500

ลองบวก x และ y ด้วยวิธีต่างๆ เพื่อดูว่าเราได้ตัวเลขอะไรบ้าง:

x + y = 0 + 500 = 500

x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500

ทีนี้มาดูกันว่าจะเกิดอะไรขึ้นถ้าเราดันจอยสติ๊กไปทางขวาจนสุด

ตัวอย่างของค่าที่คุณอาจได้รับคือ:

x = 500

y = 0

ในการทำให้หุ่นยนต์เลี้ยวขวา คุณต้องการให้มอเตอร์ด้านซ้ายขับเคลื่อนไปข้างหน้า และมอเตอร์ด้านขวาขับถอยหลัง:

ซ้าย = 500

ขวา = -500

ลองใช้สูตรของเราอีกครั้ง:

x + y = 500 + 0 = 500

x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500

เปรียบเทียบสูตรทั้งสองชุดเพื่อหาว่าตัวเลือกใดจะให้ค่าที่ถูกต้องทางซ้าย และตัวเลือกใดจะให้ค่าที่ถูกต้องแก่คุณ

ลองใช้ค่าบางอย่างที่คุณได้รับจากจอยสติกของคุณเอง เพื่อให้แน่ใจว่าสูตรที่คุณเลือกใช้ได้ผลตลอดเวลา

NS

การขยายฟังก์ชันจอยสติ๊ก

ขยายและแก้ไขฟังก์ชันจอยสติ๊กเพื่อสร้างตัวแปรใหม่สองตัวสำหรับด้านซ้ายและขวา และเพื่อคืนค่าเหล่านั้นแทน x และ y:

def joystick_push():

x = pin0.read_analog() - 518 y = pin1.read_analog() - 523 ซ้าย = ขวา = กลับซ้าย ขวา

แฟลชโค้ดใหม่ของคุณ เปิด REPL กดปุ่มรีเซ็ตของ micro:bit และตรวจสอบค่าของคุณ

คุณได้รับค่าที่คุณคาดหวังหรือไม่?

หากคุณต้องการความช่วยเหลือเพิ่มเติม โปรดดูโค้ดตัวอย่างของเราที่นี่:

ขั้นตอนที่ 6: การส่งค่าเป็นข้อความวิทยุ

ตอนนี้คุณมีค่าบางอย่างพร้อมที่จะส่งไปยังหุ่นยนต์ของคุณ

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

ในขณะที่จริง:

จอยสติ๊ก = joystick_push() ข้อความ = str(จอยสติ๊ก[0]) + " " + str(จอยสติ๊ก[1])

นี่จะไม่ส่งข้อความจริง ๆ !

เกิดอะไรขึ้นในโค้ดบรรทัดใหม่นี้

  • จอยสติ๊ก[0] หมายถึงข้อมูลบิตแรกที่ออกมาจากฟังก์ชันจอยสติ๊ก (ซ้าย)
  • จอยสติ๊ก [1] เป็นบิตถัดไปของข้อมูล (ขวา)
  • str() แปลงตัวเลขทั้งสองนี้เป็นรูปแบบสตริง (ข้อความแทนตัวเลข) - นี่เป็นสิ่งจำเป็นเพื่อให้สามารถส่งข้อมูลทางวิทยุได้

คุณจะคุ้นเคยกับการเห็น + หมายถึงการบวก - สามารถเพิ่มตัวเลขเข้าด้วยกันและเชื่อมสตริงเข้าด้วยกัน ซึ่งหมายความว่าจะรวมข้อมูลสองบิตเข้าด้วยกัน

ตัวอย่าง:

150 + 100 = 250

str(150) + str(100) = 150100

ดังนั้นการต่อกันจะยึดค่าซ้ายและขวาของคุณไว้ด้วยกัน

ในการบังคับให้แยกข้อมูลสองบิต (เพื่อให้หุ่นยนต์รู้ว่าเป็นข้อมูลสองบิต) ให้เชื่อมสตริงพิเศษระหว่างข้อมูลทั้งสองเข้าด้วยกันโดยใช้ " " เครื่องหมายคำพูดรอบๆ ช่องว่างหมายความว่าเป็นสตริงอยู่แล้ว

สุดท้าย ขยายรหัสของคุณเพื่อส่งข้อความที่สร้างขึ้นใหม่ทางวิทยุ:

radio.send (ข้อความ)

นอนหลับ(10)

การสลีปทำให้การส่งข้อความช้าลง ดังนั้นไมโครบิตที่ได้รับจะไม่ได้รับข้อมูลมากเกินไป!

แฟลชโค้ดนี้ไปที่ไมโครคอนโทรลเลอร์ของคุณ: บิตและแก้ไขข้อผิดพลาดก่อนที่จะไปยังขั้นตอนถัดไป

ขั้นตอนที่ 7: การรับข้อความบน Robot ของคุณ

กลับไปที่โค้ดหุ่นยนต์ของคุณตั้งแต่เริ่มต้น - อย่าลืมถอดปลั๊กคอนโทรลเลอร์ micro:bit ออก คุณจะได้ไม่เผลอแฟลชโค้ดหุ่นยนต์ไปโดยไม่ได้ตั้งใจ

เลื่อนลงไปที่ลูปหลักของคุณ - ลบโค้ดทดสอบและเพิ่มสิ่งนี้แทน:

ในขณะที่จริง:

ข้อความ = radio.receive() พิมพ์ (ข้อความ) นอนหลับ (100)

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

แฟลชรหัสใหม่ของคุณ เชื่อมต่อกับ REPL จากนั้นกดจอยสติ๊ก

คุณควรได้รับสิ่งนี้:

ค่า REPL
ค่า REPL

เคล็ดลับการแก้ปัญหา

หากคุณได้รับข้อความแสดงข้อผิดพลาดบนไมโครคอนโทรลเลอร์ของคุณ: บิต… ดีบักโค้ดคอนโทรลเลอร์ของคุณ

หากคุณได้รับข้อความแสดงข้อผิดพลาดบนหุ่นยนต์ micro:bit… ข้อความวิทยุของคุณถูกส่งเรียบร้อยแล้ว! แต่หุ่นยนต์ไม่สามารถเข้าใจมันได้ ดังนั้นโปรดตรวจสอบว่าข้อความที่คุณส่งและข้อความที่คุณบอกให้หุ่นยนต์ฟังการจับคู่

ถ้าไม่มีอะไรเกิดขึ้นเลย

  • ตรวจสอบให้แน่ใจว่าคุณได้แฟลชโค้ดที่ถูกต้องในแต่ละ micro:bit - ง่ายต่อการแฟลชผิดอันโดยไม่ได้ตั้งใจ!
  • ตรวจสอบให้แน่ใจว่าหมายเลขช่องและกลุ่มของคุณตรงกันในแต่ละ micro:bit

ขั้นตอนที่ 8: การใช้ข้อความขาเข้าเพื่อควบคุมมอเตอร์ของหุ่นยนต์

ขณะนี้คุณได้รับหมายเลขสองหมายเลขที่ส่งทางวิทยุเป็นสตริง

คุณต้องแยกข้อความนี้เป็นสองสตริง จากนั้นแปลงสตริงกลับเป็นตัวเลขอีกครั้ง และส่งผ่านไปยังฟังก์ชันของไดรฟ์ หลายอย่างเกิดขึ้นพร้อมกัน!

ก่อนดำเนินการนี้ คุณต้องตรวจสอบว่าข้อความที่คุณได้รับอยู่ในรูปแบบที่ถูกต้องหรือไม่

หากไม่มีการส่งข้อความ คุณจะได้รับ 'ไม่มี' แทน หากคุณลองแยกสิ่งนี้ คุณจะได้รับข้อความแสดงข้อผิดพลาด

ในขณะที่จริง:

message = radio.receive() ถ้าข้อความไม่ใช่ None: message = message.split() drive(int(message[0]), int(message[1]))

เกิดอะไรขึ้นที่นี่?

  • รหัสใหม่จะทำงานหากข้อความเป็นอย่างอื่นที่ไม่ใช่ "ไม่มี"
  • message.split() ตรวจสอบช่องว่างในข้อความ (ซึ่งเราเพิ่มในขั้นตอนที่แล้ว) และใช้สิ่งนี้เพื่อแยกข้อความออกเป็นสองส่วน
  • int(message[0]), int(message[1]) ทำสิ่งที่ตรงกันข้ามกับสิ่งที่เราทำในขั้นตอนก่อนหน้านี้ - รับข้อมูลแต่ละส่วนแยกกันและแปลงเป็นจำนวนเต็ม (จำนวนเต็ม)
  • int(message[0]) ถูกใช้เป็นค่าสำหรับมอเตอร์ด้านซ้ายในฟังก์ชันการขับเคลื่อน และใช้ int(message[1]) เป็นค่าสำหรับมอเตอร์ด้านขวา

ตรวจสอบว่าใช้งานได้ - มอเตอร์หมุนเมื่อคุณกดจอยสติ๊กหรือไม่

ถ้าไม่ - ถึงเวลาแก้จุดบกพร่อง!

ถ้าใช่ สุดยอด! คุณมีหุ่นยนต์ควบคุมระยะไกลที่ใช้งานได้!

ใช้เวลาฝึกฝนกับหุ่นยนต์ของคุณก่อนที่จะไปยังขั้นตอนต่อไป มันขับเคลื่อนอย่างที่คุณคาดหวังหรือไม่?

ขั้นตอนต่อไปจะแสดงให้คุณเห็นถึงวิธีการใช้ปุ่มต่างๆ บนจอยสติ๊กเพื่อเพิ่มฟังก์ชันพิเศษให้กับหุ่นยนต์ของคุณ

หากคุณต้องการดูเวอร์ชันของรหัสนี้จนถึงตอนนี้:

  • หุ่นยนต์:
  • ตัวควบคุม:

ขั้นตอนที่ 9: การใช้ปุ่ม -- การรับข้อความเพิ่มเติม

ในขณะนี้ รหัสของคุณจะพยายามแยกข้อความที่ไม่ใช่ไม่มี ซึ่งหมายความว่าหากได้รับ เช่น 'สวัสดี' คุณจะได้รับข้อความแสดงข้อผิดพลาด

เพื่อให้ micro:bit ของคุณตีความข้อความอื่นๆ ได้ จะต้องตรวจสอบแต่ละข้อความที่คาดไว้ก่อน จากนั้นจึงแยกข้อความเฉพาะในกรณีที่ไม่ได้รับคำสั่งให้ทำอย่างอื่นกับข้อความนั้น

ขยายรหัสของคุณดังนี้:

ถ้าข้อความไม่ใช่ไม่มี:

if message == 'hello': display.show(Image. HAPPY) elif message == 'duck': display.show(Image. DUCK) else: message = message.split() ไดรฟ์ (int(message[0])), int(ข้อความ[1]))

ก่อนอื่นจะตรวจสอบว่าได้รับข้อความ 'สวัสดี' หรือไม่ หากมี จะแสดงรูปภาพที่มีความสุข จากนั้นกลับไปที่ด้านบนสุดของลูปแล้วตรวจสอบข้อความถัดไป

หากข้อความไม่ใช่สวัสดี ระบบจะตรวจสอบว่าข้อความเป็น "เป็ด" หรือไม่

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

เครื่องหมายเท่ากับคู่มีความสำคัญ - มันหมายถึง 'เท่ากับ' เมื่อเทียบกับเครื่องหมายเท่ากับเดียวซึ่งกำลังตั้งค่าบางอย่าง (ข้อความ = 'สวัสดี' หมายความว่าเรากำลังตั้งค่าตัวแปรเป็น 'สวัสดี' ข้อความ == 'สวัสดี' หมายความว่าเรากำลังถามว่าข้อความเท่ากับ 'สวัสดี' หรือไม่)

ลองใช้เพียงสองตัวเลือกในตอนนี้ เพื่อทดสอบ - คุณสามารถเพิ่มข้อความอื่นๆ ได้มากเท่าที่ต้องการในภายหลัง

ลิงก์ไปยังรหัสการทำงาน:

ขั้นตอนที่ 10: การส่งข้อความเพิ่มเติมโดยใช้ปุ่มของคอนโทรลเลอร์

ถอดปลั๊ก micro:bit ของหุ่นยนต์แล้วเสียบ micro:bit ของจอยสติ๊กแทน

กลับไปที่โค้ดคอนโทรลเลอร์ของคุณเพื่อแก้ไข

เช่นเดียวกับรหัสหุ่นยนต์ เราต้องการให้ผู้ควบคุมตรวจสอบว่าคุณกำลังพยายามส่งข้อความอื่นๆ หรือไม่ ก่อนที่จะส่งค่าจอยสติ๊ก

ที่ด้านบนของลูป เรายังต้องการให้ตรวจสอบค่าปัจจุบันของจอยสติ๊ก แต่เราต้องการให้ตรวจสอบด้วยว่ามีการกดปุ่มอยู่หรือไม่:

ในขณะที่จริง:

จอยสติ๊ก = joystick_push () ปุ่ม = button_press ()

button_press() ส่งคืนค่า A, B, C, D, E หรือ F ขึ้นอยู่กับว่ากำลังกดปุ่มใดอยู่ (ถ้าไม่มีการกดปุ่มใด ๆ มันจะคืนค่า None)

ตอนนี้เราสามารถสร้างคำสั่ง if-elif-else ได้ เช่นเดียวกับที่เราทำกับโค้ดหุ่นยนต์ โดยใช้สองปุ่ม และส่งค่าจอยสติ๊กหากไม่มีการกดปุ่มใดๆ

ถ้าปุ่ม == 'A':

radio.send('hello') sleep(500) ปุ่ม elif == 'B': radio.send('duck') sleep(500) อื่น: message = str(joystick[0]) + " " + str(joystick [1]) radio.send(ข้อความ) นอนหลับ(10)

เมื่อกดปุ่ม ให้ส่งข้อความที่คุณบอกให้หุ่นยนต์ระวังในขั้นตอนก่อนหน้า

ข้อความจะถูกส่งทุกครั้งที่กดปุ่ม และคอมพิวเตอร์จะเร็วกว่าคนมาก! ดังนั้นมันอาจส่งข้อความหลายครั้งก่อนที่คุณจะเอานิ้วออกจากปุ่ม

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

มันทำงาน?

หากคุณได้รับข้อความแสดงข้อผิดพลาด ให้คิดให้รอบคอบเกี่ยวกับสิ่งที่คุณเพิ่งเปลี่ยนแปลง และสิ่งที่เกิดขึ้น

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

ลิงก์ไปยังรหัสการทำงาน:

ขั้นตอนที่ 11: ขั้นตอนต่อไป

ตอนนี้คุณมีความรู้ที่จำเป็นในการทำงานกับมอเตอร์ของหุ่นยนต์ และด้วยตัวควบคุมจอยสติ๊ก:บิต

ใช้ความรู้นี้เพื่อปรับปรุงทั้งสองโปรแกรมและทำให้เป็นของคุณเอง แนวคิดบางอย่างด้านล่าง!

คุณมีหกปุ่มบนคอนโทรลเลอร์ของคุณ! คุณต้องการให้พวกเขาทำอะไร?

  • แล้วการเขียนโปรแกรมรูทีนการเต้นให้หุ่นยนต์ของคุณทำตามคำสั่งล่ะ เขียนอัลกอริทึมของคำสั่ง drive() คั่นด้วยคำสั่ง sleep()!
  • คุณต้องการเปลี่ยนทิศทางที่หุ่นยนต์เคลื่อนที่เข้าไปเพื่อให้สามารถขับกลับหัวได้ง่ายหรือไม่? คิดถึงค่า x และ y ของจอยสติกของคุณ สิ่งเหล่านี้แสดงถึงอะไรและคุณจะจัดการกับพวกเขาอย่างไร?
  • หุ่นยนต์ของคุณมีคุณสมบัติพิเศษ (หรือคุณสามารถเพิ่มได้) เช่น LED, ลำโพง หรือเซ็นเซอร์หรือไม่?

แนวคิดในการปรับปรุงโค้ด

  • คุณช่วยหุ่นยนต์ของคุณจัดการกับข้อความที่ไม่รู้จักโดยใช้รหัสลอง/ยกเว้นได้หรือไม่?
  • คณิตศาสตร์ที่ใช้ในการคำนวณค่าซ้ายและขวาจากจอยสติ๊กไม่ได้ให้ค่าที่ครบถ้วนแก่เรา (ไดรฟ์ของหุ่นยนต์สามารถรับตัวเลขได้มากถึง 1023) คุณแก้ไขโค้ดนี้เพื่อให้ได้ช่วงที่ดีขึ้นได้ไหม
  • มีวิธีอื่นในการผสมค่าจอยสติ๊ก - คุณมีวิธีที่ดีกว่านี้ไหม

แนะนำ: