Embedded Universal Interface Board - การควบคุม USB/Bluetooth/WIFI: 6 ขั้นตอน
Embedded Universal Interface Board - การควบคุม USB/Bluetooth/WIFI: 6 ขั้นตอน
Anonim
Embedded Universal Interface Board - การควบคุม USB/Bluetooth/WIFI
Embedded Universal Interface Board - การควบคุม USB/Bluetooth/WIFI
Embedded Universal Interface Board - การควบคุม USB/Bluetooth/WIFI
Embedded Universal Interface Board - การควบคุม USB/Bluetooth/WIFI

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

ฉันมักจะพบว่าฉันต้องการเชื่อมต่อโมดูลที่ฝังตัวกับพีซี หากโมดูลไม่มีการเชื่อมต่อ 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
การออกแบบ PCB
การออกแบบ PCB
การออกแบบ PCB
การออกแบบ PCB
การออกแบบ PCB
การออกแบบ PCB
การออกแบบ 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
เชื่อมต่อผ่าน Flowcode
เชื่อมต่อผ่าน Flowcode
เชื่อมต่อผ่าน Flowcode
เชื่อมต่อผ่าน Flowcode
เชื่อมต่อผ่าน 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 ได้หลายแบบ ตอนนี้ฉันสามารถตอกโค้ดได้อย่างสมบูรณ์ก่อนที่จะหันไปใช้คอมไพล์หรือการเขียนโปรแกรมแบบฉูดฉาด

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

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