สารบัญ:
- ขั้นตอนที่ 1: ฮาร์ดแวร์
- ขั้นตอนที่ 2: การติดตามบรรทัด
- ขั้นตอนที่ 3: ก่อนที่เราจะเริ่มต้นได้จริงๆ…
- ขั้นตอนที่ 4: กอง
- ขั้นตอนที่ 5: ซอฟต์แวร์
- ขั้นตอนที่ 6: มาปรับปรุงโค้ดกันเถอะ
วีดีโอ: ส่วนที่ 3: GPIO: การประกอบ ARM: ผู้ติดตามสาย: TI-RSLK: 6 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
สวัสดี. นี่เป็นงวดถัดไปที่เรายังคงใช้แอสเซมบลี ARM ต่อไป (แทนที่จะเป็นภาษาระดับสูงกว่า) แรงบันดาลใจสำหรับคำแนะนำนี้คือ Lab 6 ของ Texas Instruments Robotics System Learning Kit หรือ TI-RSLK
เราจะใช้ไมโครคอนโทรลเลอร์จากชุดอุปกรณ์ ซึ่งเป็นบอร์ดพัฒนา MSP432 LaunchPad แต่บางทีคุณอาจพบว่ามีประโยชน์ในการดึงข้อมูลจากคำแนะนำนี้ แม้ว่าคุณจะไม่ได้ใช้ LaunchPad หรือติดตาม T. I. หลักสูตร
เราเริ่มต้นด้วยการแนะนำ ARM Assembly ที่สอนได้ สภาพแวดล้อมการพัฒนา และวิธีสร้างโปรเจ็กต์
คำแนะนำต่อไปใน ARM Assembly แนะนำวิธีโต้ตอบกับอินพุต / เอาต์พุต (GPIO)
จากนั้นเราได้ขยายความรู้ของเรา และแนะนำฟังก์ชันต่างๆ การควบคุม LED และสวิตช์
ด้วยคำแนะนำนี้ เราสามารถใช้สิ่งที่เราได้เรียนรู้เพื่อทำสิ่งที่สนุกและมีประโยชน์มากขึ้น: ตรวจจับเส้น
สิ่งนี้สามารถช่วยเราได้ในภายหลังเมื่อเราสร้างหุ่นยนต์ติดตามสาย
ในหลักสูตร การเขียนโปรแกรมส่วนใหญ่ใช้ภาษา C หรือ C++ แต่จะเป็นประโยชน์ในการทำความคุ้นเคยกับแอสเซมบลี ก่อนที่เราจะเริ่มต้นโดยขึ้นอยู่กับภาษาและไลบรารีระดับสูง
ขั้นตอนที่ 1: ฮาร์ดแวร์
ฉันไม่ต้องการแฮชฮาร์ดแวร์โดยละเอียด เนื่องจากมีแหล่งข้อมูลอยู่แล้ว แต่เราจะเพิ่มคำอธิบายเมื่อจำเป็น
สำหรับคำแนะนำนี้ เราจะใช้อาร์เรย์เซ็นเซอร์สะท้อนแสงจาก Pololu เนื่องจากเป็นส่วนหนึ่งของ TI-RSLK (ชุดหุ่นยนต์) เป็นแบบที่ใช้ในรายวิชา และในแล็บ 6 ของหลักสูตร
หากคุณไม่มี คุณสามารถใช้เครื่องตรวจจับ IR (หรือชุดอุปกรณ์เหล่านี้) ที่ส่งสัญญาณดิจิตอล สูง หรือ ต่ำ สำหรับการมีและไม่มี
เซ็นเซอร์อาร์เรย์นั้นดีที่สุดเพราะสามารถช่วยตรวจจับว่าเราอยู่ตรงกลางเส้นหรือออกไปด้านใดด้านหนึ่ง นอกจากนี้ อย่างที่เราเห็นในภายหลัง มันสามารถช่วยให้เราตรวจจับมุมของหุ่นยนต์ที่สัมพันธ์กับเส้นได้
อาร์เรย์การสะท้อนแสงมีเครื่องตรวจจับอยู่ใกล้กันมาก นั่นหมายความว่าเราควรได้รับสัญญาณการตรวจจับหลายแบบ ขึ้นอยู่กับความหนาของเส้น
ถ้าเป็นเช่นนั้น ถ้าหุ่นยนต์ไม่อยู่ในแนวเดียวกันกับเส้น มันควรจะส่งกลับผลลัพธ์ที่เส้นนั้นกว้างกว่าที่ควรจะเป็น (เพราะเราอยู่ในมุมหนึ่ง)
สำหรับคำอธิบายที่ดีกว่าข้างต้น โปรดดูเอกสาร Lab 6
สำหรับความช่วยเหลือในการเดินสาย/เชื่อมต่อเซ็นเซอร์กับบอร์ดพัฒนา MSP432 LaunchPad ต่อไปนี้เป็นคำแนะนำที่เป็นประโยชน์
ฉันได้เพิ่มคำแนะนำ PDF เดียวกัน (คล้ายกัน?) ในขั้นตอนนี้
หากคุณอ่านเอกสาร Pololu อย่างถี่ถ้วน เอกสารดังกล่าวจะอธิบายสาเหตุของ "3.3V บายพาส" ซึ่งคุณจะต้องการจัมเปอร์หากคุณใช้ 3.3V แทน 5V
เนื่องจากเรายังไม่ได้สร้างหุ่นยนต์ แต่เราเพียงแค่เรียนรู้เกี่ยวกับการประกอบ ARM และวิธีโต้ตอบกับชิ้นส่วน (ระบบย่อย) ของหุ่นยนต์ เราจึงไม่ต้องปฏิบัติตามคำแนะนำข้างต้นในจดหมาย
สำหรับตอนนี้ การเชื่อมต่ออาร์เรย์เซนเซอร์แบบเส้นจะทำให้เดือด/ลดดังต่อไปนี้:
- เชื่อมต่อ 3.3V และ GND จากบอร์ด MSP432 กับอาร์เรย์เซ็นเซอร์
- เชื่อมต่อพินพอร์ต (ฉันแนะนำ P5.3) จาก MSP432 กับพินเปิดใช้งาน LED บนอาร์เรย์เซ็นเซอร์สาย หมุดบนเซ็นเซอร์นั้นอยู่ระหว่าง 3.3V และ GND
- เชื่อมต่อทั้งแปดพิน/บิตของพอร์ตเดียว (ฉันแนะนำ P7.0 ถึง P7.7) กับแปดพินของอาร์เรย์เซ็นเซอร์ที่ระบุว่า "1" ถึง "8" เหล่านี้เป็นเส้นที่จะไปสูงหรือต่ำขึ้นอยู่กับสิ่งที่พวกเขารู้สึก
ดังที่คุณเห็นในภาพของขั้นตอนนี้ และในวิดีโอ ฉันไม่ได้ติดเซ็นเซอร์เข้ากับแชสซีของหุ่นยนต์ เพราะฉันต้องการความง่ายในการเขียนโปรแกรม การดีบัก การทดสอบ และการเรียนรู้
เมื่อเชื่อมต่อทุกอย่างแล้ว เราก็พร้อมที่จะเข้าสู่ซอฟต์แวร์
ขั้นตอนที่ 2: การติดตามบรรทัด
เซ็นเซอร์อาร์เรย์การสะท้อนแสงค่อนข้างดีเพราะสามารถช่วยได้อย่างน้อยสองวิธี
- กำหนดว่าหุ่นยนต์มีศูนย์กลางอยู่ที่เส้นหรือล่องลอยไปด้านใดด้านหนึ่ง
- หุ่นยนต์ถูกจัดแนวในทิศทางของเส้นหรือเป็นมุม
ตัวตรวจจับแต่ละตัวของอาร์เรย์ให้ข้อมูลเพียงบิตเดียว ไม่ว่าจะสูงหรือต่ำ
แนวคิดคือการรวมบิตทั้งหมดเหล่านั้นเป็นตัวเลขเดียวหรือรูปแบบบิตเดียว และใช้รูปแบบนั้นในการตัดสินใจ (เพื่อย้ายอย่างถูกต้อง)
ขั้นตอนที่ 3: ก่อนที่เราจะเริ่มต้นได้จริงๆ…
.. เราต้องเรียนรู้สิ่งใหม่เกี่ยวกับการเขียนโปรแกรมประกอบ ARM และฉันไม่ได้หมายถึงคำสั่งอื่น เหล่านั้นมีแนวโน้มที่จะเล็กน้อย
จนถึงตอนนี้ เรายังไม่ได้ใช้ "สแต็ก" ในโปรแกรมของเรา
เราอาศัยการใช้คอร์รีจิสเตอร์ซีพียูส่วนใหญ่ทั่วโลกในรูทีนย่อยต่างๆ
สิ่งหนึ่งที่เราทำคือการบันทึกและกู้คืนที่อยู่ LR (ลิงค์รีจิสเตอร์) สำหรับฟังก์ชันหนึ่ง ซึ่งเรียกว่าฟังก์ชันอื่นๆ อีกหลายอย่าง (ฉันใช้ "ฟังก์ชัน" และ "รูทีนย่อย" แทนกันได้ที่นี่)
สิ่งที่เราทำไม่ดี จะเป็นอย่างไรถ้าเราต้องการซ้อนฟังก์ชันอื่นๆ จะเกิดอะไรขึ้นถ้าเรามีรังมากกว่าหนึ่งระดับ
ในตัวอย่างก่อนหน้านี้ เราเลือกใช้ register R6 เป็นที่เก็บข้อมูลสำหรับ LR หรือที่อยู่ผู้ส่ง แต่ถ้าเราต้องการทำรังเพิ่มเติม/ลึกขึ้น เราไม่สามารถเปลี่ยนแปลงค่าของ R6 ต่อไปได้ เราจะต้องเลือกทะเบียนอื่น เเละอีกอย่าง. และจากนั้นมันก็กลายเป็นภาระหนักในการติดตามว่าคอร์รีจิสเตอร์ใดที่มี LR ที่จะกู้คืนไปยังฟังก์ชันใด
ทีนี้มาดูที่ "กอง"
ขั้นตอนที่ 4: กอง
นี่คือเอกสารการอ่านบางส่วนที่อธิบายสแต็ก
ฉันเป็นผู้สนับสนุนแนวคิดสองสามข้อที่ใหญ่กว่า:
- ทฤษฎีเท่าที่จำเป็น ลงมือปฏิบัติโดยเร็ว
- เรียนรู้เท่าที่จำเป็น มุ่งความสนใจไปที่การทำบางสิ่งจริงๆ ไม่ใช่แค่แบบฝึกหัดหรือตัวอย่างที่ไม่ตั้งใจ
มีเอกสาร ARM และ MSP432 ออนไลน์มากมายที่พูดถึงสแต็ก ดังนั้นจึงไม่ต้องแฮชทั้งหมด ฉันจะใช้สแต็กที่นี่ให้น้อยที่สุด - บันทึกที่อยู่ผู้ส่ง (ลิงค์ลงทะเบียน)
โดยพื้นฐานแล้ว เราต้องการเพียงคำแนะนำเท่านั้น:
ผลักดัน {รายการลงทะเบียน}
POP{รายการลงทะเบียน}
หรือในกรณีของเราโดยเฉพาะ:
ดัน {LR}
ป๊อป {LR}
ดังนั้น ฟังก์ชันแอสเซมบลี/รูทีนย่อยจะมีลักษณะดังนี้:
funcLabel:.asmfunc
PUSH{LR};นี่น่าจะเป็นหนึ่งในคำแนะนำแรกในการเข้า; ทำโค้ดเพิ่มเติมที่นี่..; อื่น ๆ…; ตกลง เราเสร็จสิ้นการทำงานกับฟังก์ชัน พร้อมที่จะกลับไปเรียกฟังก์ชัน POP{LR};นี้จะคืนค่าที่อยู่ผู้ส่งที่ถูกต้องกลับไปเรียก; การทำงาน. บีเอ็กซ์ แอลอาร์; ส่งคืน.endasmfunc
วิดีโอจะผ่านตัวอย่างสดของฟังก์ชันที่ซ้อนกันหลายอย่าง
ขั้นตอนที่ 5: ซอฟต์แวร์
ไฟล์แนบชื่อ "MSP432_Chapter…" มีข้อมูลดีๆ มากมายเกี่ยวกับพอร์ตของ MSP432 และจากเอกสารนั้น เราจะได้รับพอร์ต รีจิสเตอร์ ที่อยู่ ฯลฯ ต่อไปนี้ ค่อนข้างจะเก่าไปหน่อย อย่างไรก็ตาม ฉันไม่เห็นรายละเอียดที่อยู่สำหรับพอร์ต 5 ขึ้นไป (เฉพาะ "ฟังก์ชั่นสำรอง") แต่ก็ยังมีประโยชน์
เราจะใช้สองพอร์ต P5, P7, P1 และ P2
เอาต์พุต P5.3 (บิตเดียว) จะควบคุมการเปิดใช้ IR LED บนเซ็นเซอร์ เรากำลังใช้ P5.3 เนื่องจากเป็นหมุดเปิดบนส่วนหัวเดียวกันกับการเชื่อมต่อ MSP432 อื่นๆ ที่ไปยังอาร์เรย์เซ็นเซอร์
P7.0 ถึง P7.7 จะเป็นอินพุตแปดตัวที่รวบรวมข้อมูลจากเซ็นเซอร์ สิ่งที่ "เห็น"
P1.0 เป็น LED สีแดงดวงเดียว และเราสามารถใช้สิ่งนั้นเพื่อแสดงข้อมูลบางอย่างได้
P2.0, P2.1, P2.2 เป็น RGB LED และเราสามารถใช้สีนั้นได้เช่นกัน โดยมีความเป็นไปได้ของสีที่แตกต่างกัน เพื่อแสดงข้อมูลเซ็นเซอร์
หากคุณได้อ่าน Instructables ก่อนหน้านี้ที่เกี่ยวข้องกับทั้งหมดนี้ คุณรู้อยู่แล้วว่าต้องตั้งค่าโปรแกรมอย่างไร
เพียงแค่มีส่วนประกาศสำหรับพอร์ตและบิต ฯลฯ
คุณจะมีส่วน "หลัก"
ควรมีลูปที่เราอ่านข้อมูลจาก P7 อย่างต่อเนื่อง ตัดสินใจเกี่ยวกับข้อมูลนั้น และไฟ LED สองดวงสว่างขึ้นตามลำดับ
นี่คือที่อยู่ Port Register อีกครั้ง:
- GPIO P1: 0x4000 4C00 + 0 (ที่อยู่เท่ากัน)
- GPIO P2: 0x4000 4C00 + 1 (ที่อยู่คี่)
- GPIO P3: 0x4000 4C00 + 20 (เลขคู่)
- GPIO P4: 0x4000 4C00 + 21 (ที่อยู่คี่)
- GPIO P5: 0x4000 4C00 + 40 (เลขคู่)
- GPIO P6: 0x4000 4C00 + 41 (ที่อยู่คี่)
- GPIO P7: 0x4000 4C00 + 60 (เลขคู่)
- GPIO P8: 0x4000 4C00 + 61 (ที่อยู่คี่)
- GPIO P9: 0x4000 4C00 + 80 (เลขคู่)
- GPIO P10: 0x4000 4C00 + 81 (ที่อยู่คี่)
สิ่งที่เป็นตัวหนาคือสิ่งที่เราจะใช้สำหรับคำแนะนำนี้
ขั้นตอนของโปรแกรมในการอ่านเครื่องตรวจจับอินฟราเรด
ต่อไปนี้เป็นโค้ดหลอกสำหรับเขียนโปรแกรมในภาษา C แต่ยังคงมีประโยชน์อยู่ และเราจะติดตามอย่างใกล้ชิดในเวอร์ชันแอสเซมบลีของโปรแกรม
โปรแกรมหลัก0) เริ่มต้น // พอร์ตในขณะที่ (1) { 1) ตั้งค่า P5.3 สูง (เปิด IR LED) 2) สร้าง P7.0 เป็นเอาต์พุตและตั้งค่าให้สูง (ชาร์จตัวเก็บประจุ) 3) รอ 10 เรา Clock_Delay1us (10); 4) ทำให้ P7.0 เป็นอินพุต 5) เรียกใช้ลูปนี้ 10,000 ครั้ง a) อ่าน P7.0 (แปลงแรงดันไฟฟ้าบน P7.0 เป็นไบนารี) b) เอาต์พุตไบนารีเป็น P1.0 (ช่วยให้คุณเห็นไบนารีแบบเรียลไทม์) 6) ตั้งค่า P5.3 ต่ำ (ปิด IR LED, ประหยัดพลังงาน) 7) รอ 10 ms, Clock_Delay1ms(10); } // ทำซ้ำ (กลับไปในขณะที่ ())
ขั้นตอนที่ 6: มาปรับปรุงโค้ดกันเถอะ
วัตถุประสงค์หรือการใช้อาร์เรย์ Pololu IR LED คือการตรวจจับเส้น และเพื่อให้ทราบว่าหุ่นยนต์ (อนาคต) มีศูนย์กลางอยู่ที่เส้นตรงหรือออกไปด้านใดด้านหนึ่ง นอกจากนี้ เนื่องจากเส้นมีความหนาที่แน่นอน หากอาร์เรย์เซ็นเซอร์ตั้งฉากกับเส้นโดยตรง จำนวนเซ็นเซอร์ N จะมีการอ่านที่แตกต่างจากส่วนที่เหลือ ในขณะที่หากอาร์เรย์ IR LED อยู่ที่บางมุม (ไม่ตั้งฉาก) ดังนั้น คู่ IR LED/ตัวตรวจจับ N+1 หรือ N+2 ควรให้ค่าการอ่านที่ต่างออกไป
ดังนั้น ขึ้นอยู่กับจำนวนเซ็นเซอร์ที่บ่งบอกว่ามีเส้นอยู่ เราควรรู้ว่าเราอยู่กึ่งกลางหรือไม่ และเราทำมุมหรือไม่
สำหรับการทดลองสุดท้ายนี้ มาดูกันว่าเราจะได้รับ LED สีแดงและ RGB LED หรือไม่ เพื่อให้ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่อาร์เรย์เซ็นเซอร์บอกเรา
วิดีโอมีรายละเอียดทั้งหมด มีการแนบรหัสสุดท้ายด้วย
เสร็จสิ้นชุดของ ARM Assembly ที่เกี่ยวข้องกับ GPIO เราหวังว่าจะกลับมาพร้อมกับ ARM Assembly เพิ่มเติมในภายหลัง
ขอขอบคุณ.
แนะนำ:
หมวกนิรภัย Covid ส่วนที่ 1: บทนำสู่ Tinkercad Circuits!: 20 ขั้นตอน (พร้อมรูปภาพ)
Covid Safety Helmet ตอนที่ 1: บทนำสู่ Tinkercad Circuits!: สวัสดีเพื่อน ๆ ในชุดสองตอนนี้ เราจะเรียนรู้วิธีใช้วงจรของ Tinkercad - เครื่องมือที่สนุก ทรงพลัง และให้ความรู้สำหรับการเรียนรู้เกี่ยวกับวิธีการทำงานของวงจร! หนึ่งในวิธีที่ดีที่สุดในการเรียนรู้คือการทำ ดังนั้น อันดับแรก เราจะออกแบบโครงการของเราเอง: th
โมดูลไดรเวอร์ NIXIE TUBE - ส่วนที่ II: 11 ขั้นตอน
โมดูลไดรเวอร์ NIXIE TUBE - ส่วนที่ II: คำแนะนำนี้เป็นการติดตามผลของโมดูลไดรเวอร์ nixie tube (ส่วนที่ I) ที่ฉันโพสต์ไว้ที่นี่ บอร์ดไดรเวอร์ nixie ได้รับการออกแบบให้รับอินพุตแบบอนุกรมจากไมโครคอนโทรลเลอร์ภายนอก (Arduino เป็นต้น) และเอาต์พุตข้อมูลทศนิยมและกำลังเส้นทาง t
การสร้างเครื่องวัดระยะทาง Arduino - ส่วนที่ 1: 4 ขั้นตอน
การสร้าง Arduino Odometer - ส่วนที่ 1: เป็นเรื่องปกติที่นักปั่นจักรยานและผู้ใช้จักรยานออกกำลังกายจำเป็นต้องวัดความเร็วและระยะทางที่เดินทาง สำหรับสิ่งนี้ เราจำเป็นต้องมีอุปกรณ์ที่เรียกว่ามาตรระยะทาง มาตรระยะทางมีหน้าที่ในการวัดตัวแปรเหล่านี้และส่งข้อมูลนี้
กระดานไวท์บอร์ดห้องเรียน Wallrides ผู้ติดตามสาย Arduino: 8 ขั้นตอน (พร้อมรูปภาพ)
Arduino Line Follower Wallrides กระดานไวท์บอร์ดห้องเรียน: การทำตามบรรทัดบนพื้นดินน่าเบื่อเกินไป! เราได้ลองมองผู้ติดตามสายในมุมที่ต่างออกไปแล้วนำพวกเขาขึ้นเครื่องบินอีกลำ - ไปที่กระดานไวท์บอร์ดของโรงเรียนดูสิ ว่ามาจากอะไร
ส่วนที่ 2 - การประกอบ GPIO ARM - RGB - การเรียกฟังก์ชัน - สวิตช์: 6 ขั้นตอน
ส่วนที่ 2 - GPIO ARM ASSEMBLY - RGB - FUNCTION CALLS - Switches: ในส่วนที่ 1 เราได้เรียนรู้วิธีสลับ LED สีแดงเพียงดวงเดียวบนบอร์ดพัฒนา MSP432 LaunchPad จาก Texas Instruments โดยใช้การประกอบแทน C / C++ ในคำแนะนำนี้ เรา จะทำสิ่งที่คล้ายกัน - ควบคุม RGB LED ที่อยู่ในแซมนั้นด้วย