ทุกอย่างเริ่มต้นจากการที่ผู้เขียนซื้ออุปกรณ์ที่น่าสนใจในตลาดรอง - Smart Response XE (
อุปกรณ์เหล่านี้เลิกผลิตไปหลายปีแล้ว และโรงเรียนที่ซื้อในราคา 100-200 ดอลลาร์ต่อเครื่องก็กำลังปรากฏบน eBay ในราคา 10 ดอลลาร์หรือน้อยกว่านั้น ฮาร์ดแวร์นั้นเหมาะมากสำหรับการทดลองที่เกินบรรยาย:
- คีย์บอร์ด 60 คีย์
- จอแสดงผลที่มีความละเอียด 384×136, 2 บิตต่อพิกเซล - คล้ายกับ BC, CGA แต่ไม่ใช่ 4 สี แต่เป็นการไล่ระดับความสว่าง
- ไมโครคอนโทรลเลอร์ ATmega128RFA1 (หน่วยความจำแฟลช 128 kB, ROM 4 kB, RAM 16 kB, ตัวรับส่งสัญญาณ 802.15.4)
- ภายนอก (เกี่ยวข้องกับไมโครคอนโทรลเลอร์ ไม่ใช่อุปกรณ์ทั้งหมด) หน่วยความจำแฟลช 1 เมกะบิต (128 กิโลไบต์) พร้อมอินเทอร์เฟซ SPI
- ช่องสำหรับใส่ชิ้น AAA 4 ชิ้น
จากชื่อของไมโครคอนโทรลเลอร์เป็นที่ชัดเจนว่าอยู่ในตระกูล AVR ซึ่งหมายความว่าการทำให้อุปกรณ์ที่เข้ากันได้กับ Arduino นั้นเป็นมากกว่างานที่ไม่สำคัญ...
จากข่าวคราว.
แต่ผู้เขียนสนใจโอกาสที่จะไม่เล่นบนอุปกรณ์มากกว่า แต่เพื่อศึกษา:
- หน่วยความจำแฟลชพร้อมอินเทอร์เฟซ SPI แบบอนุกรม
- บูตโหลดเดอร์สำหรับ AVR
- มาตรฐาน 802.15.4
ผู้เขียนเริ่มต้นด้วยการเขียน
นี่เพียงพอที่จะอัปโหลด Arduino bootloader แต่ไม่ใช่ภาพร่าง - พอร์ตอนุกรมไม่ได้เชื่อมต่ออยู่ที่นั่นดังนั้นคุณจึงยังไม่สามารถทำได้โดยไม่ต้องเปิดเคส นอกจากนี้ เส้น TX0 และ RX0 ของพอร์ตอนุกรมแรกจะรวมกับเส้นโพลลิ่งของเมทริกซ์แป้นพิมพ์ ซึ่งก็คือเส้นที่โพลปุ่มฟังก์ชันที่ด้านข้างของจอแสดงผล แต่คุณจะทำอย่างไร - ผู้เขียนสร้างสิ่งนี้:
เขาเอาสาย JTAG ไว้ตรงนั้น และตอนนี้ก็ไม่ต้องเปิดช่องใส่แบตเตอรี่แล้ว และเพื่อให้สามารถอัปโหลดภาพร่างได้ ฉันจึงเชื่อมต่อพอร์ตอนุกรมทั้งสองพอร์ตเข้ากับขั้วต่อเดียวกัน และยังเพิ่มสวิตช์เข้าไปด้วย เนื่องจากเมื่อใส่แบตเตอรี่แล้ว จึงเป็นไปไม่ได้ทางกายภาพที่จะปิดอุปกรณ์ด้วยวิธีอื่นใด
ใช้เวลานานพอสมควรในการทำงานกับหัวแร้ง มีดอรรถประโยชน์ และปืนกาว โดยทั่วไปการอัปโหลดภาพร่างแบบ "ทางอากาศ" จะสะดวกกว่ามาก เราต้องคิดค้นบางสิ่งอย่างเร่งด่วนเพื่อสิ่งนี้
Arduino IDE ใช้โปรแกรมในการอัพโหลดภาพร่าง
หลังจากลองวิธีต่างๆ เพื่อแก้ไขปัญหานี้แล้ว ผู้เขียนก็ได้ข้อสรุปดังนี้ อุปกรณ์มีหน่วยความจำแฟลชขนาด 128 KB พร้อมอินเทอร์เฟซ SPI - เราได้รับข้อมูลผ่านสาย (โปรดจำไว้ว่าผู้เขียนมีอุปกรณ์หนึ่งเครื่องที่มีขั้วต่อที่ด้านข้างอยู่แล้ว) ใช้หน่วยความจำนี้เป็นบัฟเฟอร์และส่งข้อมูลทางวิทยุ ช่องสัญญาณไปยังอุปกรณ์อื่น สวัสดีจากไซบิโกะ
หลังจากเขียนโค้ดเพื่อทำงานกับช่องวิทยุและฟอนต์ ตัวโหลดก็มีความยาวมากกว่า 4 กิโลไบต์ ดังนั้นจึงต้องเปลี่ยนค่า HFUSE จาก 0xDA เป็น 0xD8 ตอนนี้ bootloader สามารถมีความยาวได้สูงสุด 8 กิโลไบต์ และที่อยู่เริ่มต้นคือ 0x1E000 สิ่งนี้สะท้อนให้เห็นใน Makefile แต่ควรนำมาพิจารณาเมื่อกรอกด้วย
ตัวรับส่งสัญญาณ 802.15.4 ใน ATmega128RFA1 เดิมได้รับการออกแบบให้ทำงานโดยใช้โปรโตคอล
ปรากฎว่าช่อง 15 และ 26 มีความไวต่อการรบกวนจาก WiFi น้อยที่สุด ผู้เขียนเลือกช่องที่สอง ข้อจำกัดความรับผิดชอบ: ผู้แปลไม่ทราบว่าได้รับอนุญาตให้ทำให้ ZigBee ง่ายขึ้นด้วยวิธีนี้หรือไม่ บางทีเราควรเขียนโปรแกรมเพิ่มเติมอีกเล็กน้อยและนำไปใช้งานให้สมบูรณ์?
บนอุปกรณ์เครื่องแรก จำเป็นต้องใช้เครื่องสถานะจำกัดที่ส่งข้อมูลผ่านโปรโตคอล STK500 ข้อความที่ส่งและรับส่วนใหญ่จะพึ่งตนเองได้ แต่บางข้อความก็เชื่อมโยงกับข้อความที่ส่งผ่านช่องทางก่อนหน้านี้ คำอธิบายของบทสนทนาจะได้รับ
องค์ประกอบที่สำคัญของบทสนทนานี้คือการส่งแพ็กเก็ตที่ตั้งใจจะเขียนลงในหน่วยความจำแฟลชของอุปกรณ์ปลายทาง สำหรับไมโครคอนโทรลเลอร์อย่างง่ายในตระกูล AVR ขนาดหน้าคือ 128 ไบต์ แต่สำหรับ ATmega128RFA1 จะเป็น 256 และสำหรับหน่วยความจำแฟลชที่เชื่อมต่อผ่านโปรโตคอล SPI ก็เหมือนกัน โปรแกรมในอุปกรณ์เครื่องแรกเมื่ออัปโหลดภาพร่างจะไม่ถ่ายโอนไปยังเครื่องที่สองทันที แต่เขียนลงในหน่วยความจำนี้ เมื่อ Arduino IDE ตรวจสอบความถูกต้องของรายการ รายการจะถูกส่งไปที่นั่น ตอนนี้เราต้องส่งข้อมูลที่ได้รับผ่านสถานีวิทยุไปยังอุปกรณ์ตัวที่สอง ในขณะเดียวกัน การเปลี่ยนจากการรับเป็นการส่งสัญญาณและย้อนกลับเกิดขึ้นค่อนข้างบ่อย โปรโตคอล STK500 ไม่แยแสกับความล่าช้า แต่ไม่ยอมให้ข้อมูลสูญหาย (แปลก แต่มีการกล่าวไว้ข้างต้นว่าความล่าช้ายังส่งผลต่อการถ่ายโอนข้อมูลด้วย) และความสูญเสียระหว่างการส่งสัญญาณไร้สายเป็นสิ่งที่หลีกเลี่ยงไม่ได้ ATmega128RFA1 มีการติดตั้งฮาร์ดแวร์ในตัวสำหรับคำขอซ้ำ ๆ เมื่อมีข้อสงสัยเกี่ยวกับความถูกต้องของการถ่ายโอน แต่ผู้เขียนตัดสินใจที่จะติดตั้งแบบเดียวกันในซอฟต์แวร์ด้วยตัวเอง เขาพัฒนาโปรโตคอลที่ข้อมูลไหลไปทางเดียวมากกว่าอีกทางหนึ่ง
มันไม่สมบูรณ์แบบแต่ก็ใช้งานได้ เพจขนาด 256 ไบต์แบ่งออกเป็นสี่ส่วน โดยแต่ละส่วนจะถูกส่งทางอากาศในรูปแบบแพ็กเก็ต แพ็กเก็ตสามารถเก็บข้อมูลได้สูงสุด 125 ไบต์บวกหนึ่งไบต์สำหรับความยาวและสองไบต์สำหรับ CRC ดังนั้นแฟรกเมนต์ที่มีความยาว 64 ไบต์พร้อมกับหมายเลขหน้าและเซ็กเมนต์ (ตั้งแต่ 0 ถึง 3) จึงถูกวางไว้ที่นั่น อุปกรณ์รับมีตัวแปรที่ช่วยให้ติดตามจำนวนเซ็กเมนต์ที่ได้รับ และเมื่อทั้งสี่เซ็กเมนต์มาถึง อุปกรณ์ส่งจะได้รับการยืนยันว่าได้รับทั้งเพจแล้ว ไม่มีการยืนยัน (CRC ไม่ตรงกัน) - ส่งทั้งหน้าอีกครั้ง ความเร็วนั้นยิ่งใหญ่กว่าเมื่อส่งสัญญาณผ่านสายเคเบิล ดู:
แต่โดยทั่วไปจำเป็นต้องจัดเตรียมวิธีที่สะดวกในการเชื่อมต่อสายเคเบิลเข้ากับอุปกรณ์สำหรับการอัพโหลดแบบร่างและผ่านมัน ตัวอย่างเช่น วางภายในตัวแปลงอินเทอร์เฟซบน CP2102 ดังในภาพ แล้วติดไว้กับบอร์ดเพื่อให้สามารถทนต่อแรงเมื่อเชื่อมต่อและถอดสาย Micro USB
นอกจากนี้ยังมีโคลง 3,3 โวลต์ (และวิธีใช้ในอุปกรณ์ที่มีแหล่งจ่ายไฟ 6 โวลต์ - หากมีเพียงโคลงเดียวกันและคุณสามารถเพิ่มไดโอดสองตัวเพื่อเลือกโดยอัตโนมัติว่าจะให้พลังงานแก่อุปกรณ์ใด) . ต้องถอด LED ทั้งสามดวงออกจากบอร์ดตัวแปลงอินเทอร์เฟซ มิฉะนั้นจะโหลดแบตเตอรี่เพิ่มเติมเมื่อใช้งาน และยังรบกวนการหยั่งเสียงแป้นพิมพ์และทำงานกับหน่วยความจำแฟลชด้วยอินเทอร์เฟซ SPI
การบรรลุเป้าหมายนั้นน่าสนใจยิ่งกว่าการบรรลุเป้าหมาย (และไม่จำเป็นต้องล้อเล่นเรื่องรถบัสด้วยซ้ำ) ผู้เขียนได้เรียนรู้มากมายเกี่ยวกับ AVR bootloaders, หน่วยความจำแฟลช SPI, โปรโตคอล STK500 และมาตรฐาน 802.15.4
รหัสอื่น ๆ ทั้งหมดนอกเหนือจากไลบรารีที่อธิบายไว้ข้างต้นคือ −
ที่มา: will.com