สารบัญ:

ส่วนที่ 3: GPIO: การประกอบ ARM: ผู้ติดตามสาย: TI-RSLK: 6 ขั้นตอน
ส่วนที่ 3: GPIO: การประกอบ ARM: ผู้ติดตามสาย: TI-RSLK: 6 ขั้นตอน

วีดีโอ: ส่วนที่ 3: GPIO: การประกอบ ARM: ผู้ติดตามสาย: TI-RSLK: 6 ขั้นตอน

วีดีโอ: ส่วนที่ 3: GPIO: การประกอบ ARM: ผู้ติดตามสาย: TI-RSLK: 6 ขั้นตอน
วีดีโอ: Raspberry Pi LESSON 6: Understanding GPIO Inputs, Pull Up and Pull Down Resistors 2024, กรกฎาคม
Anonim
Image
Image
ฮาร์ดแวร์
ฮาร์ดแวร์

สวัสดี. นี่เป็นงวดถัดไปที่เรายังคงใช้แอสเซมบลี 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 เพิ่มเติมในภายหลัง

ขอขอบคุณ.

แนะนำ: