สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ฉันมักจะพบว่าฉันสร้างไลบรารีสำหรับโมดูลฝังตัวใหม่ตั้งแต่เริ่มต้นตามแผ่นข้อมูลอุปกรณ์ ในการสร้างไลบรารี่ ฉันพบว่าฉันติดอยู่กับวงจรของโค้ด คอมไพล์ ตั้งโปรแกรม และทดสอบเมื่อทำให้แน่ใจว่าสิ่งต่างๆ ทำงานได้และไม่มีบั๊ก บ่อยครั้งที่เวลาในการคอมไพล์และโปรแกรมอาจยาวนานกว่าเวลาที่ใช้ในการแก้ไขโค้ด ดังนั้นวิธีตัดขั้นตอนเหล่านี้ออกเมื่อพัฒนาจะมีประโยชน์มาก
ฉันมักจะพบว่าฉันต้องการเชื่อมต่อโมดูลที่ฝังตัวกับพีซี หากโมดูลไม่มีการเชื่อมต่อ USB โดยเฉพาะซึ่งมักจะเป็นกรณีนี้ โดยทั่วไปแล้ว คุณจะต้องซื้อตัวแปลง USB ที่ราคาสูงเกินไป ซึ่งจะทำงานเพียงงานเดียว เช่น SPI หรือเพียง I2C
ด้วยเหตุผลเหล่านี้ ฉันจึงตัดสินใจสร้างบอร์ดอินเทอร์เฟซสากล ได้รับการออกแบบมาเพื่อให้สามารถสื่อสารกับพีซีได้ง่ายด้วยโมดูลฝังตัว
ฟีเจอร์อินเทอร์เฟซแบบฝังของบอร์ดที่ฉันเลือกนั้นรวมอยู่ด้วย
- ดิจิตอลไอ/โอ
- I2C
- SPI
- UART
- PWM
- เซอร์โวมอเตอร์
- อินพุต ADC
- เอาต์พุต DAC
ซึ่งทั้งหมดนี้สามารถใช้งานได้อย่างอิสระโดยสมบูรณ์
บอร์ดอินเทอร์เฟซสามารถควบคุมผ่านการเชื่อมต่อ USB กับพีซี แต่ยังมีตัวเลือกการเชื่อมต่อโมดูล WIFI หรือ Bluetooth เพื่อให้สามารถใช้งานบอร์ดจากระยะไกลหรือในสถานการณ์ประเภท IoT
ด้วยการใช้เฮดเดอร์ SIL พิทช์ขนาด 2.54 มม. มาตรฐาน ทำให้สามารถเชื่อมต่อสายเคเบิลดูปองท์ตัวเมียระหว่างบอร์ดกับโมดูลที่ฝังได้โดยตรง เพื่อให้สามารถเชื่อมต่อได้อย่างรวดเร็ว เชื่อถือได้ และปราศจากการบัดกรี
ฉันยังคิดเกี่ยวกับการเพิ่มสิ่งต่าง ๆ เช่น CAN, LIN, H-bridge เป็นต้น แต่สิ่งเหล่านี้อาจมาในภายหลังด้วยการแก้ไข v2
ขั้นตอนที่ 1: การออกแบบ PCB
เมื่อออกแบบ PCB ฉันชอบพยายามทำให้ทุกอย่างเรียบง่ายที่สุด เมื่อคุณกำลังจะสร้างบอร์ดด้วยมือ การเพิ่มส่วนประกอบเฉพาะเมื่อส่วนประกอบเหล่านั้นทำเพื่อวัตถุประสงค์เฉพาะ และใช้คุณลักษณะภายในของไมโครคอนโทรลเลอร์ให้ได้มากที่สุดเท่าที่จะเป็นไปได้
เมื่อพิจารณาจากซัพพลายเออร์อุปกรณ์อิเล็กทรอนิกส์ที่ฉันชอบ ฉันพบว่าชิปตัวหนึ่งที่ฉันพอใจกับคุณสมบัติที่ต้องการและมีราคาที่สมเหตุสมผล ชิปที่ฉันลงจอดคือ PIC18F24K50
ด้วยพิน I/O ที่มีอยู่ 23 ตัว ทำให้ฉันมีคุณสมบัติเหล่านี้
- ดิจิตัล I/O
- I2C
- SPI
- UART
- PWM x 2
- เซอร์โวมอเตอร์ x 6
- อินพุต ADC x 3
- เอาต์พุต DAC x 1
- I/O ขับเคลื่อนจาก 5V หรือ 3V3
- LED แสดงสถานะ
ข้อเสียเปรียบประการหนึ่งของ IC ที่ฉันเลือกคือมีอุปกรณ์ต่อพ่วง UART เพียงตัวเดียวเท่านั้น ดังนั้นการใช้วิธีการควบคุม Bluetooth หรือ Wifi จะทำให้คุณไม่สามารถใช้การเชื่อมต่อ UART ได้
แสดงในภาพด้านบนเป็นแผนผังและ PCB ที่เสร็จสิ้นแล้ว
ขั้นตอนที่ 2: การออกแบบโปรโตคอล
ขั้นตอนแรกในการออกแบบโปรโตคอลคือการตัดสินใจว่าคุณต้องการให้บอร์ดทำอะไรโดยเฉพาะ การแบ่งส่วนจะเพิ่มระดับการควบคุมที่ดีขึ้นในขณะที่การรวมสิ่งต่าง ๆ เข้าด้วยกันทำให้อินเทอร์เฟซง่ายขึ้นและลดการรับส่งข้อมูลระหว่างบอร์ดและพีซี มันเป็นเกมที่สมดุลและยากที่จะสมบูรณ์แบบ
สำหรับแต่ละหน้าที่ของบอร์ด คุณควรระบุพารามิเตอร์และผลตอบแทน ตัวอย่างเช่น ฟังก์ชันสำหรับอ่านอินพุต ADC อาจมีพารามิเตอร์เพื่อระบุอินพุตสำหรับตัวอย่างและค่าส่งคืนที่มีผลลัพธ์
ในการออกแบบของฉัน นี่คือรายการฟังก์ชันที่ฉันต้องการรวมไว้:
-
ดิจิตอลไอ/โอ
- SetPin (หมายเลขพิน, สถานะ)
- สถานะ = GetPin (หมายเลขพิน)
-
SPI
- เริ่มต้น (โหมด SPI)
- DataIn = การถ่ายโอน (DataOut)
- ControlChipSelect (ช่อง, สถานะ)
- SetPrescaler (อัตรา)
-
I2C
- เริ่มต้น ()
- เริ่ม ()
- เริ่มต้นใหม่ ()
- หยุด ()
- SlaveAck = ส่ง (DataOut)
- DataIn = รับ (ล่าสุด)
-
UART
- เริ่มต้น ()
- TX ไบต์ (DataOut)
- BytesAvailable = จำนวน RX ()
- DataIn = RX ไบต์ ()
- SetBaud (บอด)
-
PWM
- เปิดใช้งาน (ช่อง)
- ปิดการใช้งาน (ช่อง)
- SetFrequency (ช่อง, ความถี่)
- GetMaxDuty (หน้าที่)
- SetDuty (หน้าที่)
-
เซอร์โว
- เปิดใช้งาน (ช่อง)
- ปิดการใช้งาน (ช่อง)
- SetPosition (ช่อง, ตำแหน่ง)
-
ADC
ADCsample = ตัวอย่าง (ช่อง)
-
DAC
- เปิดใช้งาน
- ปิดการใช้งาน
- SetOutput (แรงดัน)
-
WIFI
- ชุดSSID (SSID)
- ตั้งรหัสผ่าน (รหัสผ่าน)
- สถานะ = CheckConnectionStatus ()
- IP = GetIPAddress ()
พารามิเตอร์จะแสดงในวงเล็บและผลตอบแทนจะแสดงก่อนสัญลักษณ์เท่ากับ
ก่อนที่ฉันจะเริ่มเขียนโค้ด ฉันกำหนดแต่ละฟังก์ชันด้วยรหัสคำสั่งที่เริ่มต้นจาก 128 (ไบนารี 0b10000000) และทำงานขึ้นไป ฉันจัดทำเอกสารโปรโตคอลอย่างสมบูรณ์เพื่อให้แน่ใจว่าเมื่อหัวของฉันอยู่ในรหัสแล้ว ฉันมีเอกสารที่ดีที่จะอ้างอิงกลับไป เอกสารโปรโตคอลฉบับสมบูรณ์สำหรับโปรเจ็กต์นี้แนบมาด้วยและมีรหัสคำสั่งที่เข้ามาและความกว้างของบิต
ขั้นตอนที่ 3: การออกแบบเฟิร์มแวร์
เมื่อสร้างโปรโตคอลแล้ว ก็เป็นกรณีของการนำฟังก์ชันการทำงานไปใช้กับฮาร์ดแวร์
ฉันใช้วิธีการประเภทเครื่องของรัฐอย่างง่ายเมื่อพัฒนาระบบทาสเพื่อลองและเพิ่มคำสั่งที่เป็นไปได้และปริมาณข้อมูลสูงสุดในขณะที่ทำให้เฟิร์มแวร์เข้าใจและดีบั๊กได้ง่าย ระบบที่ล้ำหน้ากว่าเช่น Modbus สามารถใช้แทนได้หากคุณต้องการปฏิสัมพันธ์ที่ดีขึ้นกับอุปกรณ์ที่เชื่อมต่ออื่น ๆ แต่สิ่งนี้จะเพิ่มค่าใช้จ่ายซึ่งจะทำให้สิ่งต่างๆ ช้าลง
เครื่องสถานะประกอบด้วยสามสถานะ:
1) รอคำสั่ง
2) รับพารามิเตอร์
3) ตอบกลับ
ทั้งสามรัฐมีปฏิสัมพันธ์ดังนี้:
1) เราผ่านไบต์ขาเข้าในบัฟเฟอร์จนกว่าเราจะมีไบต์ที่มีชุดบิตที่สำคัญที่สุด เมื่อเราได้รับไบต์ดังกล่าว เราจะตรวจสอบกับรายการคำสั่งที่ทราบ หากเราพบข้อมูลที่ตรงกัน เราจะกำหนดจำนวนไบต์ของพารามิเตอร์และคืนค่าไบต์ให้ตรงกับโปรโตคอล หากไม่มีพารามิเตอร์ไบต์ เราสามารถดำเนินการคำสั่งที่นี่และข้ามไปที่สถานะ 3 หรือรีสตาร์ทสถานะ 1 หากมีพารามิเตอร์ไบต์ เราจะย้ายไปที่สถานะ 2
2) เราผ่านไบต์ที่เข้ามาเพื่อบันทึกจนกว่าเราจะเก็บพารามิเตอร์ทั้งหมดไว้ เมื่อเราได้ Parameter ครบแล้ว เราก็ดำเนินการคำสั่ง หากมีไบต์ส่งคืน เราจะย้ายไปที่สเตจ 3 หากไม่มีไบต์ส่งคืนที่จะส่ง เราจะกลับไปยังสเตจ 1
3) เราผ่านไบต์ที่เข้ามาและสำหรับแต่ละไบต์เราจะเขียนทับ echo ไบต์ด้วยไบต์ส่งคืนที่ถูกต้อง เมื่อเราส่งไบต์ส่งคืนทั้งหมดแล้ว เราจะกลับไปยังขั้นตอนที่ 1
ฉันใช้ Flowcode เพื่อออกแบบเฟิร์มแวร์เนื่องจากแสดงให้เห็นอย่างชัดเจนว่าฉันกำลังทำอะไรอยู่ สิ่งเดียวกันสามารถทำได้ดีพอๆ กันใน Arduino หรือภาษาโปรแกรมฝังตัวอื่นๆ
ขั้นตอนแรกคือการสร้างการสื่อสารกับพีซี ในการดำเนินการนี้ ไมโครต้องได้รับการกำหนดค่าให้ทำงานด้วยความเร็วที่เหมาะสม และเราต้องเพิ่มโค้ดเพื่อขับเคลื่อนอุปกรณ์ต่อพ่วง USB และ UART ใน Flowcode ทำได้ง่ายดายเพียงแค่ลากส่วนประกอบ USB Serial และส่วนประกอบ UART ลงในโปรเจ็กต์จากเมนูส่วนประกอบ Comms
เราเพิ่มการขัดจังหวะ RX และบัฟเฟอร์เพื่อดักจับคำสั่งที่เข้ามาบน UART และเราสำรวจ USB เป็นประจำ จากนั้นเราสามารถประมวลผลบัฟเฟอร์ในยามว่าง
มีการแนบโครงการ Flowcode และรหัส C ที่สร้างขึ้น
ขั้นตอนที่ 4: เชื่อมต่อผ่าน Flowcode
การจำลอง Flowcode มีประสิทธิภาพมากและช่วยให้เราสร้างส่วนประกอบเพื่อพูดคุยกับบอร์ดได้ ในการสร้างส่วนประกอบ เราสามารถลากส่วนประกอบเข้าไปในโปรเจ็กต์ของเรา และให้ฟังก์ชั่นของบอร์ดใช้งานได้ทันที ส่วนประกอบที่มีอยู่ซึ่งมีอุปกรณ์ต่อพ่วง SPI, I2C หรือ UART เป็นโบนัสเพิ่มเติม สามารถใช้ในการจำลอง และข้อมูลการสื่อสารสามารถส่งไปยังบอร์ดอินเทอร์เฟซผ่านส่วนประกอบหัวฉีด รูปภาพที่แนบมาแสดงโปรแกรมง่ายๆ ในการพิมพ์ข้อความไปยังจอแสดงผล ข้อมูลการสื่อสารที่ส่งผ่าน Interface Board ไปยังฮาร์ดแวร์แสดงผลจริงและการตั้งค่าส่วนประกอบด้วย I2C Display, I2C Injector และส่วนประกอบ Interface Board
โหมด SCADA ใหม่สำหรับ Flowcode 8.1 เป็นโบนัสเพิ่มเติมโดยสมบูรณ์ โดยเราสามารถนำโปรแกรมที่ทำบางสิ่งในโปรแกรมจำลอง Flowcode และส่งออกเพื่อให้ทำงานแบบสแตนด์อโลนบนพีซีเครื่องใดก็ได้โดยไม่มีปัญหาเรื่องลิขสิทธิ์ ซึ่งอาจเป็นประโยชน์สำหรับโครงการต่างๆ เช่น แท่นทดสอบหรือกลุ่มเซ็นเซอร์
ฉันใช้โหมด SCADA นี้เพื่อสร้างเครื่องมือกำหนดค่า WIFI ที่สามารถใช้กำหนดค่า SSID และรหัสผ่าน ตลอดจนรวบรวมที่อยู่ IP ของโมดูล ซึ่งช่วยให้ฉันสามารถตั้งค่าทุกอย่างโดยใช้การเชื่อมต่อ USB แล้วโอนไปยังการเชื่อมต่อเครือข่าย WIFI เมื่อสิ่งต่างๆ ทำงาน
แนบตัวอย่างโครงการบางส่วน
ขั้นตอนที่ 5: วิธีการเชื่อมต่ออื่น ๆ
เช่นเดียวกับ Flowcode คุณสามารถใช้ภาษาการเขียนโปรแกรมที่คุณเลือกเพื่อสื่อสารกับบอร์ดอินเทอร์เฟซได้ เราใช้ Flowcode เนื่องจากมีไลบรารีของส่วนต่างๆ ที่รวมไว้แล้ว ซึ่งเราสามารถเริ่มต้นใช้งานได้ทันที แต่ยังใช้ได้กับภาษาอื่นๆ อีกมากมาย
นี่คือรายการภาษาและวิธีการสื่อสารกับบอร์ดส่วนต่อประสาน
Python - การใช้ไลบรารีอนุกรมเพื่อสตรีมข้อมูลไปยังพอร์ต COM หรือที่อยู่ IP
Matlab - การใช้คำสั่งไฟล์เพื่อสตรีมข้อมูลไปยังพอร์ต COM หรือที่อยู่ IP
C++ / C# / VB - ใช้ DLL ที่เขียนไว้ล่วงหน้า เข้าถึงพอร์ต COM หรือ Windows TCP/IP API โดยตรง
Labview - การใช้ DLL ที่เขียนไว้ล่วงหน้า ส่วนประกอบ VISA Serial หรือส่วนประกอบ TCP/IP
หากใครต้องการที่จะเห็นการใช้งานภาษาข้างต้นโปรดแจ้งให้เราทราบ
ขั้นตอนที่ 6: ผลิตภัณฑ์สำเร็จรูป
ผลิตภัณฑ์สำเร็จรูปนี้น่าจะเป็นคุณสมบัติเด่นในชุดเครื่องมือแบบฝังตัวของฉันในอีกหลายปีข้างหน้า มันช่วยให้ฉันพัฒนาส่วนประกอบสำหรับจอแสดงผลและเซ็นเซอร์ของ Grove ได้หลายแบบ ตอนนี้ฉันสามารถตอกโค้ดได้อย่างสมบูรณ์ก่อนที่จะหันไปใช้คอมไพล์หรือการเขียนโปรแกรมแบบฉูดฉาด
ฉันได้แจกบอร์ดให้กับเพื่อนร่วมงานเพื่อให้พวกเขาสามารถปรับปรุงเวิร์กโฟลว์ของพวกเขาได้เช่นกัน และสิ่งเหล่านี้ได้รับการตอบรับเป็นอย่างดี
ขอบคุณที่อ่านคำแนะนำของฉัน ฉันหวังว่าคุณจะพบว่ามีประโยชน์และหวังว่าจะเป็นแรงบันดาลใจให้คุณสร้างเครื่องมือของคุณเองเพื่อเร่งประสิทธิภาพการทำงานของคุณ