สารบัญ:

BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3: 7 ขั้นตอน (พร้อมรูปภาพ)
BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3: 7 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: อะไรเอ่ย #สิว #สิวอุดตัน #สิวอักเสบ #สิวเห่อ #รอยสิว #รักษาสิว #เล็บเท้า #satisfying 2024, พฤศจิกายน
Anonim
BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3
BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3
BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3
BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3
BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3
BLE พลังงานต่ำมากง่าย ๆ ใน Arduino ตอนที่ 3 - การเปลี่ยน Nano V2 - Rev 3

อัปเดต: 7 เมษายน 2019 – Rev 3 ของ lp_BLE_TempHumidity เพิ่มพล็อตวันที่/เวลา โดยใช้ pfodApp V3.0.362+ และการควบคุมปริมาณอัตโนมัติเมื่อส่งข้อมูล

อัปเดต: 24 มีนาคม 2019 – Rev 2 ของ lp_BLE_TempHumidity เพิ่มตัวเลือกการลงจุดและ i2c_ClearBus เพิ่มการรองรับ GT832E_01

บทนำ

บทช่วยสอนนี้ การแทนที่ Redbear Nano V2 เป็นส่วนที่ 3 จาก 3 นี่คือการแก้ไข 2 ของโครงการนี้ PCB ฉบับที่ 2 ประกอบด้วยการติดตั้งสำหรับเซลล์แบบเหรียญและเซ็นเซอร์ ทำให้โครงสร้างง่ายขึ้นและปรับปรุงการไหลเวียนของอากาศรอบ ๆ เซ็นเซอร์ในขณะที่ป้องกันจากแสงแดดโดยตรง ฉบับที่ 1 มาแล้วค่ะ

ส่วนที่ 1 - การสร้างอุปกรณ์ BLE ที่ใช้พลังงานต่ำมากทำได้ง่ายด้วย Arduino ครอบคลุมการตั้งค่า Arduino เพื่อเข้ารหัสอุปกรณ์ที่ใช้พลังงานต่ำ nRF52 โมดูลการเขียนโปรแกรมและการวัดกระแสไฟ นอกจากนี้ยังครอบคลุมถึงตัวจับเวลาและตัวเปรียบเทียบพลังงานต่ำแบบพิเศษและอินพุตที่ถูกหักล้างและการใช้ pfodApp เพื่อเชื่อมต่อและควบคุมอุปกรณ์ nRF52

ส่วนที่ 2 – การตรวจสอบความชื้นอุณหภูมิพลังงานต่ำมากครอบคลุมโดยใช้โมดูล Redbear Nano V2 และเซ็นเซอร์อุณหภูมิ/ความชื้น Si7021 เพื่อสร้างแบตเตอรี่พลังงานต่ำ / จอภาพพลังงานแสงอาทิตย์ นอกจากนี้ยังครอบคลุมถึงการปรับเปลี่ยนไลบรารี Si7021 ให้เป็นพลังงานต่ำ การปรับอุปกรณ์ BLE เพื่อลดการใช้กระแสไฟให้เหลือ <29uA และการออกแบบการแสดงอุณหภูมิ/ความชื้นที่กำหนดเองสำหรับมือถือของคุณ

ส่วนที่ 3 – การเปลี่ยน Redbear Nano V2 ในส่วนนี้ ครอบคลุมโดยใช้โมดูลที่ใช้ nRF52 อื่นแทน Nano V2 ครอบคลุมการเลือกส่วนประกอบอุปทาน การสร้าง การถอดการป้องกันการเขียนโปรแกรมชิป nRF52 การใช้หมุด NFC เป็น GPIO ปกติ และการกำหนดบอร์ด nRF52 ใหม่ใน Arduino

คำแนะนำนี้เป็นแอปพลิเคชั่นที่ใช้งานได้จริงของส่วนที่ 1 การสร้างอุปกรณ์ BLE ที่ใช้พลังงานต่ำมากซึ่งทำได้ง่ายด้วย Arduino โดยการสร้างเครื่องวัดอุณหภูมิและความชื้น BLE พลังงานต่ำมากโดยใช้บอร์ด SKYLAB SBK369 เพื่อทดแทน Nano V2 บทช่วยสอนนี้ครอบคลุมถึงวิธีสร้างคำจำกัดความของบอร์ดใหม่และวิธีลบการป้องกันการเขียนโปรแกรม nRF52 เพื่อให้สามารถตั้งโปรแกรมใหม่ได้ บทช่วยสอนนี้ใช้ภาพร่างเดียวกันกับส่วนที่ 2 ที่มีพารามิเตอร์ BLE ที่ปรับแต่งเหมือนกันสำหรับการใช้พลังงานต่ำและสามารถใช้พลังงานจากแบตเตอรี่หรือแบตเตอรี่ + พลังงานแสงอาทิตย์หรือพลังงานแสงอาทิตย์เท่านั้น การปรับค่าพารามิเตอร์ BLE สำหรับพลังงานต่ำครอบคลุมอยู่ในส่วนที่ 2

Rev 3 ของ lp_BLE_TempHumidity แปลงข้อมูลเทียบกับวันที่และเวลาโดยใช้ Arduino millis() ดูวันที่และเวลาของ Arduino โดยใช้มิลลิวินาที () และ pfodApp โดยใช้ pfodApp เวอร์ชันล่าสุด (V3.0.362+)

Rev 4 ของ pfod_lp_nrf52.zip ยังสนับสนุนโมดูล GT832E_01 และบทช่วยสอนนี้ครอบคลุมการใช้หมุด NFC nRF52 เป็น GPIO มาตรฐาน

จอภาพที่สร้างขึ้นที่นี่จะใช้งานได้นานหลายปีกับเซลล์แบบเหรียญหรือแบตเตอรี่ AAA 2 ก้อน นานกว่าด้วยระบบช่วยพลังงานแสงอาทิตย์ นอกจากการแสดงอุณหภูมิและความชื้นในปัจจุบันแล้ว จอภาพยังเก็บค่าการอ่าน 10 นาทีล่าสุด 36 ชั่วโมง 10 นาที และ 10 วันล่าสุดของการอ่านรายชั่วโมง สิ่งเหล่านี้สามารถสร้างแผนภูมิได้บนมือถือ Android ของคุณและค่าที่บันทึกไว้ในไฟล์บันทึก ไม่จำเป็นต้องมีการเขียนโปรแกรม Android pfodApp จัดการทั้งหมดนั้น การแสดงผลและการสร้างแผนภูมิของ Android ถูกควบคุมโดยร่าง Arduino ของคุณอย่างสมบูรณ์ เพื่อให้คุณสามารถปรับแต่งได้ตามต้องการ

ส่วนที่ 2 ใช้บอร์ด Redbear Nano V2 สำหรับส่วนประกอบ nRF52832 BLE โครงการนี้แทนที่ด้วยบอร์ด SKYLAB SKB369 ที่ถูกกว่า เช่นเดียวกับในส่วนที่ 2 บอร์ดฝ่าวงล้อม Sparkfun Si7021 ใช้สำหรับเซ็นเซอร์อุณหภูมิ / ความชื้น ไลบรารีพลังงานต่ำที่ได้รับการดัดแปลงใช้กับ Si7021

ขั้นตอนที่ 1: ทำไมต้องเปลี่ยน Nano V2

i) Nano V2 เลิกผลิตมาหลายเดือนแล้ว และดูเหมือนว่าจะไม่เหมาะกับผลิตภัณฑ์ Particle.io จึงไม่ชัดเจนว่าจะใช้งานได้นานเท่าใด

ii) Nano V2 มีราคาแพงกว่า แต่ก็ยังมีคุณสมบัติพิเศษ ดูด้านล่าง

iii) Nano V2 มีส่วนประกอบทั้งสองด้านซึ่งทำให้มีโปรไฟล์ที่สูงขึ้นและทำให้ติดตั้งได้ยากขึ้น

iv) Nano V2 มีพิน I/O ที่จำกัด และการใช้ D6 ถึง D10 ต้องใช้สายจูง

แม้ว่าบอร์ด Nano V2 จะมีราคาแพงกว่าบอร์ด SKYLAB SKB369, ~US17 เทียบกับ ~US5 แต่ Nano V2 มีคุณสมบัติมากกว่า Nano V2 มีตัวควบคุม 3.3V และตัวเก็บประจุจ่าย ส่วนประกอบเพิ่มเติมสำหรับการใช้ตัวเลือกตัวแปลง DC/DC nRF52 เสาอากาศแบบชิป และขั้วต่อเสาอากาศ uFL SMT

อีกทางเลือกหนึ่งคือโมดูล GT832E_01 ที่ใช้โดย www.homesmartmesh.com Rev 4 ของ pfod_lp_nrf52.zip ยังสนับสนุนการเขียนโปรแกรมโมดูล GT832E_01 SKYLAB SKB369 และ GT832E_01 มีอยู่ใน

Redbear (Particle.io) ยังมีโมดูลเปล่าที่ไม่มีตัวควบคุม 3V3, ส่วนประกอบ DC/DC หรือส่วนประกอบคริสตัล 32Khz

เค้าร่าง

โครงการนี้มี 4 ส่วนที่เกี่ยวข้องกัน:-

การเลือกส่วนประกอบและการก่อสร้าง การถอดแฟล็กการป้องกันการเข้ารหัส nRF52 และการเขียนโปรแกรมแบบร่าง การสร้างนิยามใหม่ของบอร์ด Arduino nRF52 การกำหนดค่าหมุด NFC ของ nRF52 ใหม่เป็น GPIO

ขั้นตอนที่ 2: การเลือกส่วนประกอบและการก่อสร้าง

การเลือกส่วนประกอบ

นอกจากส่วนประกอบ nRF52832 และ Si7021 ที่เลือกไว้ในส่วนที่ 2 แล้ว โครงการนี้ยังเพิ่มตัวควบคุม 3.3V และตัวเก็บประจุจ่าย

ส่วนประกอบตัวควบคุมแรงดันไฟฟ้า

ตัวควบคุมที่ใช้ในที่นี้คือ MC87LC33-NRT สามารถรองรับอินพุตสูงสุด 12V และมีกระแสไฟนิ่งที่ <3.6uA ซึ่งปกติคือ 1.1uA Nano V2 ใช้ตัวควบคุม TLV704 มีกระแสไฟที่นิ่งกว่าเล็กน้อย ซึ่งโดยทั่วไปคือ 3.4uA และสามารถรองรับแรงดันไฟฟ้าขาเข้าที่สูงขึ้นได้ถึง 24V MC87LC33-NRT ได้รับเลือกแทนเนื่องจากแผ่นข้อมูลระบุว่าจะตอบสนองอย่างไรเมื่อแรงดันไฟฟ้าขาเข้าต่ำกว่า 3.3V โดยที่แผ่นข้อมูล TLV704 ไม่ทำ

TLV704 ระบุแรงดันไฟฟ้าขาเข้าขั้นต่ำ 2.5V และไม่ชัดเจนจากแผ่นข้อมูลว่าจะเกิดอะไรขึ้นด้านล่าง nRF52832 จะลดลงเหลือ 1.7V และ Si7023 จะลดลงเหลือ 1.9V ในทางกลับกัน MC87LC33-NRT จะระบุความแตกต่างของแรงดันอินพุต/เอาต์พุตลงไปที่ 0V สำหรับกระแสต่ำ (รูปที่ 18 ของแผ่นข้อมูล) ด้วยการเลือกส่วนประกอบ MC87LC33-NRT จึงถูกเลือกเนื่องจากมีประสิทธิภาพที่ระบุ

ตัวเก็บประจุ

ตัวควบคุม MC87LC33-NRT ต้องการตัวเก็บประจุบางตัวเพื่อความเสถียรและการตอบสนอง แนะนำให้ใช้ตัวเก็บประจุเอาต์พุต > 0.1uF ในแผ่นข้อมูล SKYLAB SBK369 ยังระบุตัวเก็บประจุ 10uF/0.1uF บนแหล่งจ่ายใกล้กับบอร์ด ตัวเก็บประจุขนาดใหญ่ช่วยในการจ่ายกระแสไฟแหลม nRF52 TX ที่นี่ใช้ตัวเก็บประจุเซรามิกขนาด 4 x 22uF 25V และ 3 x 0.1uF 50V วางตัวเก็บประจุขนาด 22uF และ 0.1uF หนึ่งตัวไว้ใกล้กับ SKYLAB SBK369 โดยวาง 0.1uF ไว้ใกล้กับเอาต์พุตของ MC87LC33-NRT เพื่อให้แน่ใจว่ามีความเสถียรและวาง 22uF และ 0.1uF บนอินพุตของ MC87LC33-NRT และ ตัวเก็บประจุ 2 x 22uF เพิ่มเติมที่บัดกรีข้ามพิน Vin / GND เป็นอ่างเก็บน้ำปัจจุบันเพิ่มเติม สำหรับการเปรียบเทียบ บอร์ด NanoV2 มีอินพุต 22uF / 0.1uF กับตัวควบคุม TLV704 และเอาต์พุต 0.1uF

มีการติดตั้งตัวเก็บประจุอ่างเก็บน้ำกระแสพิเศษบนอินพุตไปยังตัวควบคุม 3.3V เพื่อให้ประจุไฟฟ้าสูงขึ้นเมื่อทำงานกับเซลล์แสงอาทิตย์ การชาร์จด้วยไฟฟ้าแรงสูงจะเท่ากับการเก็บกระแสไฟให้มากขึ้นเพื่อจ่ายกระแสไฟให้แหลม Tx

ตัวเก็บประจุเซรามิก X5R ใช้เพราะมีความต้านทานอนุกรมต่ำและมีกระแสไฟรั่วต่ำ ความต้านทานโดยทั่วไปคือ 100, 000MΩ หรือ 1000MΩ – µF ซึ่งน้อยกว่า ดังนั้นสำหรับ 22uF เรามี 22000MΩ นั่นคือ 0.15nA รั่วที่ 3.3V หรือ 0.6nA สำหรับตัวเก็บประจุ 22uF สี่ตัว นั่นเป็นเรื่องเล็กน้อย สำหรับการเปรียบเทียบ Low ESR ตัวเก็บประจุ Panasonic Electrolytic แบบ Low Leakage มีกระแสไฟรั่วที่ <0.01CV ดังนั้นสำหรับตัวเก็บประจุ 22uF 16V การรั่วไหลคือ <10uA หมายเหตุ: นี่คือการรั่วที่แรงดันไฟฟ้า 16V ในกรณีนี้ การรั่วไหลต่ำกว่าที่แรงดันไฟฟ้าต่ำกว่า เช่น <2.2uA ที่ 3.3V

ส่วนรายการ

ค่าใช้จ่ายโดยประมาณต่อหน่วย ณ ธันวาคม 2018 ~ 61 ดอลลาร์สหรัฐ ไม่รวมค่าขนส่งและโปรแกรมเมอร์จากตอนที่ 1

  • SKYLAB SKB369 ~ US$5 เช่น Aliexpress
  • Sparkfun Si7021 กระดานฝ่าวงล้อม ~US$8
  • เซลล์แสงอาทิตย์ขนาด 2 x 53 มม. x 30 มม. 0.15W 5V เช่น บินเกิน ~ US$1.10
  • 1 x PCB SKYLAB_TempHumiditySensor_R2.zip ~US$25 for 5 off www.pcbcart.com
  • 1 x MC78LC33 ตัวควบคุม 3.3V เช่น Digikey MC78LC33NTRGOSCT-ND ~US$1
  • 2 x 0.1uF 50V เซรามิก C1608X5R1H104K080A เช่น Digikey 445-7456-1-ND ~US$0.3
  • 4 x 22uF 16V เซรามิก GRM21BR61C226ME44L เช่น Digikey 490-10747-1-ND ~US$2
  • 1 x BAT54CW เช่น Digikey 497-12749-1-ND ~US$0.5
  • ตัวต้านทาน 1 x 470R 0.5W 1% เช่น Digikey 541-470TCT-ND ~US$0.25
  • 1 x 10V 1W ซีเนอร์ SMAZ10-13-F เช่น Digikey SMAZ10-FDICT-ND ~US$0.5
  • สกรูไนลอน 3 มม. x 12 มม. เช่น สกรู Jaycar HP0140 ~ AUD$3
  • น็อตไนลอน 3 มม. x 12 มม. เช่น น็อตไนลอน Jaycar HP0146 ~AUD$3
  • สก๊อตช์ เทปกาวติดถาวร Cat 4010 e.g. จากอเมซอน ~US$6.6
  • ที่ใส่แบตเตอรี่ CR2032 เช่น ที่ใส่แบตเตอรี่ HU2032-LF ~ US$1.5
  • แบตเตอรี่ CR2032 ~ US$1
  • แผ่น Perspex, 3.5mm และ 8mm
  • pfodApp ~US$10
  • วางประสานเช่น Jaycar NS-3046 ~ AUD$13

ขั้นตอนที่ 3: การก่อสร้าง

การก่อสร้าง
การก่อสร้าง
การก่อสร้าง
การก่อสร้าง
การก่อสร้าง
การก่อสร้าง

โครงการนี้สร้างขึ้นบน PCB ขนาดเล็ก PCB ผลิตโดย pcbcart.com จากไฟล์ Gerber เหล่านี้ SKYLAB_TempHumiditySensor_R2.zip PCB เลียนแบบพิน Nano V2 และมีวัตถุประสงค์ทั่วไปเพียงพอที่จะใช้สำหรับโครงการ BLE อื่นๆ

นี่คือแผนผัง (เวอร์ชัน pdf)

ขั้นแรกให้ประสานส่วนประกอบ SMD จากนั้นติดตั้งบอร์ด SKYLAB SKB369

ส่วนประกอบเกือบทั้งหมดเป็นอุปกรณ์ยึดพื้นผิว (SMD) ตัวเก็บประจุและไอซีอาจบัดกรีด้วยมือได้ยาก วิธีที่แนะนำคือการจับ PCB ไว้ในคีมคีบและทาบัดกรีจำนวนเล็กน้อยบนแผ่นอิเล็กโทรด และวางส่วนประกอบ SMD ยกเว้นบอร์ด SKB369 บน PCB จากนั้นใช้ปืนฉีดความร้อน ทาความร้อนที่ด้านล่างของ PCB จนกว่าสารบัดกรีจะละลาย จากนั้นจึงผ่านส่วนบนของบอร์ดอย่างรวดเร็วโดยระวังอย่าให้ส่วนประกอบหลุดออก ในที่สุดสัมผัสส่วนประกอบด้วยหัวแร้งขนาดเล็ก โปรดใช้ความระมัดระวังกับตัวเก็บประจุและตัวต้านทาน เนื่องจากสามารถละลายปลายทั้งสองข้างได้ง่าย และให้ส่วนประกอบหลวมขณะบัดกรีที่ปลายด้านหนึ่ง

การแก้ไขนี้เพิ่มตัวเก็บประจุเซรามิกขนาด 22uF 16V พิเศษ ตัวเก็บประจุพิเศษเหล่านี้ช่วยลดกระแสไฟกระชากที่ดึงออกมาจากแบตเตอรี่และยังช่วยลดแรงดันไฟตกเมื่อใช้พลังงานจากเซลล์แสงอาทิตย์ ตราบใดที่แรงดันไฟฟ้าจากเซลล์แสงอาทิตย์ยังคงอยู่เหนือแรงดันแบตเตอรี่ จะไม่มีกระแสไฟฟ้าไหลออกจากแบตเตอรี่

หลังจากติดตั้งส่วนประกอบ SMD แล้ว คุณสามารถบัดกรีในบอร์ด SKYLAB SKB369 ได้ มีจุดทดสอบสองรูที่ด้านหนึ่งของแท็บ SKB369 ใช้หมุดสองตัวบนฐานกระดาษแข็งเพื่อจัดตำแหน่งบอร์ด SKB369 และจัดตำแหน่งหมุดอย่างระมัดระวัง (ดูภาพตัวอย่างด้านบนโดยใช้ Revision 1 PCB) จากนั้นประสานพินด้านตรงข้ามหนึ่งอันเพื่อยึดบอร์ดให้เข้าที่ก่อนที่จะบัดกรีพินอื่นๆ

สังเกตสายลิงค์ Gnd จาก CLK ถึง GND ในส่วนที่เสร็จแล้ว มีการติดตั้งโปรแกรม AFTER เพื่อป้องกันสัญญาณรบกวนบนอินพุต CLK ไม่ให้ทริกเกอร์ชิป nRF52 เข้าสู่โหมดดีบักกระแสสูง

เคสติดตั้ง

ตัวเคสทำจากเพอร์สเปกซ์ 2 ชิ้น ขนาด 110 มม. x 35 มม. หนา 3 มม. ชิ้นส่วนขนาด 3.5 มม. ใต้แผงโซลาร์เซลล์ถูกเคาะเพื่อขันสกรูไนลอน 3 มม. โครงสร้างที่แก้ไขนี้ทำให้ง่ายขึ้นเมื่อเทียบกับ Rev 1 และปรับปรุงการไหลเวียนของอากาศรอบๆ เซ็นเซอร์ รูพิเศษที่ปลายแต่ละด้านใช้สำหรับยึด เช่น ใช้สายรัด

ขั้นตอนที่ 4: การลบแฟล็กการป้องกันการเข้ารหัส NRF52

การถอดแฟล็กการป้องกันการเข้ารหัส NRF52
การถอดแฟล็กการป้องกันการเข้ารหัส NRF52
การถอดแฟล็กการป้องกันการเข้ารหัส NRF52
การถอดแฟล็กการป้องกันการเข้ารหัส NRF52
การถอดแฟล็กการป้องกันการเข้ารหัส NRF52
การถอดแฟล็กการป้องกันการเข้ารหัส NRF52

เชื่อมต่อแผงอุณหภูมิ/ความชื้นกับโปรแกรมเมอร์ที่อธิบายไว้ในส่วนที่ 1 ดังที่แสดงไว้ด้านบน

เมื่อถอดปลั๊กเซลล์แสงอาทิตย์และแบตเตอรี่ Vin และ Gnd จะเชื่อมต่อกับ Vdd และ Gnd ของโปรแกรมเมอร์ (สายสีเหลืองและสีเขียว) และ SWCLK และ SWDIO จะเชื่อมต่อกับ Clk และ SIO ของแผงส่วนหัวของโปรแกรมเมอร์ (สายสีขาวและสีเทา)

การลบการป้องกันโปรแกรม nRF52

จาก Nordic Semi – Debug and Trace หน้า DAP - Debug Access Port ดีบักเกอร์ภายนอกสามารถเข้าถึงอุปกรณ์ผ่าน DAP DAP ใช้ ARM® CoreSight™ Serial Wire Debug Port (SW-DP) มาตรฐาน SW-DP ใช้โปรโตคอล Serial Wire Debug (SWD) ซึ่งเป็นอินเทอร์เฟซซีเรียลแบบสองพิน SWDCLK และ SWDIO

สำคัญ: สาย SWDIO มีตัวต้านทานแบบดึงขึ้นภายใน สาย SDWCLK มีตัวต้านทานแบบดึงลงภายใน

CTRL-AP - ควบคุมพอร์ตการเข้าถึง Control Access Port (CTRL-AP) เป็นพอร์ตการเข้าถึงแบบกำหนดเองที่ช่วยให้สามารถควบคุมอุปกรณ์ได้ แม้ว่าพอร์ตการเข้าถึงอื่นๆ ใน DAP จะถูกปิดใช้งานโดยการป้องกันพอร์ตการเข้าถึง การป้องกันพอร์ตการเข้าถึงจะบล็อกดีบักเกอร์ไม่ให้เข้าถึงการอ่านและเขียนไปยังการลงทะเบียน CPU ทั้งหมดและที่อยู่ที่แมปหน่วยความจำ ปิดใช้งานการป้องกันพอร์ตการเข้าถึง การป้องกันพอร์ตการเข้าถึงสามารถปิดใช้งานได้โดยการออกคำสั่ง ERASEALL ผ่าน CTRL-AP เท่านั้น คำสั่งนี้จะลบ Flash, UICR และ RAM

เลือก CMSIS-DAP เป็นโปรแกรมเมอร์สำหรับโปรแกรมแก้ไขข้อบกพร่องของอนุภาค และเลือก nRF5 Flash SoftDevice

หากแฟลชใช้งานได้ก็ไม่เป็นไร แต่บ่อยครั้งโมดูลจะได้รับการปกป้องจากการตั้งโปรแกรมซ้ำ และคุณจะได้รับเอาต์พุตข้อผิดพลาดนี้ในหน้าต่าง Arduino

Open On-Chip Debugger 0.10.0-dev-00254-g696fc0a (2016-04-10-10:13) ได้รับอนุญาตภายใต้ GNU GPL v2 สำหรับรายงานข้อผิดพลาด อ่าน https://openocd.org/doc/doxygen/bugs.html debug_level: 2 ข้อมูล: ตัวเลือกการขนส่งเดียวเท่านั้น เลือกอัตโนมัติ 'swd' อะแดปเตอร์ความเร็ว: 10000 kHz cortex_m reset_config sysresetreq ข้อมูล: CMSIS-DAP: SWD ข้อมูลที่รองรับ: CMSIS-DAP: ข้อมูลเริ่มต้นของอินเทอร์เฟซ (SWD): CMSIS-DAP: เวอร์ชัน FW = 1.10 ข้อมูล: SWCLK/TCK = 1 SWDIO/ TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1 ข้อมูล: CMSIS-DAP: ข้อมูลพร้อมอินเทอร์เฟซ: ลดคำขอความเร็ว: สูงสุด 10000kHz ถึง 5000kHz ข้อมูล: ความเร็วสัญญาณนาฬิกา 10000 kHz ข้อมูล: SWD IDCODE 0x2ba01477 ข้อผิดพลาด: ไม่พบ MEM -AP เพื่อควบคุมข้อผิดพลาดหลัก: ยังไม่ได้ตรวจสอบเป้าหมาย เกิดข้อผิดพลาดขณะกระพริบ SoftDevice

ในกรณีนั้น คุณต้องตั้งค่าคำสั่ง ERASEALL รีจิสเตอร์ใน nRF52 เพื่อล้างหน่วยความจำและทำให้อุปกรณ์สามารถตั้งโปรแกรมได้อีกครั้ง เวอร์ชันของ openOCD ที่มาพร้อมกับ sandeepmistry nRF52 ไม่มีคำสั่ง apreg ที่จำเป็นในการเขียนไปยังรีจิสเตอร์คำสั่ง ERASEALL ดังนั้นคุณต้องติดตั้งเวอร์ชันที่ใหม่กว่า

ติดตั้ง OpenOCD เวอร์ชัน OpenOCD-20181130 หรือสูงกว่า เวอร์ชันที่คอมไพล์ล่วงหน้าของ Windows มีให้ที่ https://gnutoolchains.com/arm-eabi/openocd/ รหัสล่าสุดหาได้จาก

เปิดพรอมต์คำสั่งและเปลี่ยน dir เป็นไดเร็กทอรีการติดตั้ง OpenOCD และป้อนคำสั่ง

bin\openocd.exe -d2 -f ส่วนต่อประสาน/cmsis-dap.cfg -f target/nrf52.cfg

คำตอบคือ

Open On-Chip Debugger 0.10.0 (2018-11-30) [https://github.com/sysprogs/openocd]Licensed under GNU GPL v2 สำหรับรายงานข้อผิดพลาด อ่าน https://openocd.org/doc/doxygen/ bugs.html debug_level: 2 ข้อมูล: การเลือก "swd" การขนส่งเซสชันแรกที่มีให้โดยอัตโนมัติ หากต้องการแทนที่ให้ใช้ ' ขนส่งเลือก ' ความเร็วอะแดปเตอร์: 1000 kHz cortex_m reset_config sysresetreq ข้อมูล: ฟังพอร์ต 6666 สำหรับการเชื่อมต่อ tcl ข้อมูล: ฟังพอร์ต 4444 สำหรับการเชื่อมต่อ telnet ข้อมูล: CMSIS-DAP: SWD ข้อมูลที่รองรับ: CMSIS-DAP: FW เวอร์ชัน = 1.10 ข้อมูล: CMSIS-DAP: ข้อมูลเริ่มต้นของอินเทอร์เฟซ (SWD): SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1 ข้อมูล: CMSIS-DAP: ข้อมูลพร้อมสำหรับอินเทอร์เฟซ: ความเร็วสัญญาณนาฬิกา 1000 kHz ข้อมูล: SWD DPIDR 0x2ba01477 ข้อผิดพลาด: ไม่พบ MEM-AP เพื่อควบคุมข้อมูลหลัก: กำลังฟังพอร์ต 3333 สำหรับการเชื่อมต่อ gdb

จากนั้นเปิดหน้าต่างเทอร์มินัลเช่น TeraTerm (Windows) หรือ CoolTerm (Mac) และเชื่อมต่อกับพอร์ต 127.0.0.1 4444

หน้าต่าง telnet จะแสดง a > และพรอมต์คำสั่งจะแสดงข้อมูล: ยอมรับการเชื่อมต่อ 'telnet' บน tcp/4444

ในหน้าต่าง telnet (เช่น TeraTerm) typenrf52.dap apreg 1 0x04นี่จะคืนค่า 0x00000000 แสดงว่าชิปได้รับการปกป้อง จากนั้น typenrf52.dap apreg 1 0x04 0x01 และ thennrf52.dap apreg 1 0x04this จะคืนค่า 0x00000001 แสดงว่าชิปได้รับการตั้งค่าเป็น ERASEALL ในการรีสตาร์ทครั้งถัดไป

ปิดการเชื่อมต่อ telnet และใช้ Ctrl-C เพื่อออกจากโปรแกรม openOCD ในพรอมต์คำสั่ง จากนั้นเปิดเครื่องโมดูล nRF52 และตอนนี้ก็พร้อมที่จะตั้งโปรแกรม

ตอนนี้ลองแฟลช softdevice อีกครั้ง

ตอนนี้คุณสามารถตั้งโปรแกรมโมดูล nRF52 จาก Arduino ได้แล้ว

ขั้นตอนที่ 5: การเขียนโปรแกรม SKYLAB SKB369

การเขียนโปรแกรม SKYLAB SKB369
การเขียนโปรแกรม SKYLAB SKB369
การเขียนโปรแกรม SKYLAB SKB369
การเขียนโปรแกรม SKYLAB SKB369
การเขียนโปรแกรม SKYLAB SKB369
การเขียนโปรแกรม SKYLAB SKB369

ปิด Arduino และติดตั้งเวอร์ชันล่าสุดของการสนับสนุน pfod_lp_nrf52 โดยทำตามคำแนะนำในการติดตั้งฮาร์ดแวร์ pfod_lp_nrf52 pfod_lp_nrf52 ล่าสุดมีบอร์ดสำรอง SKYLAB SKB369 Nano2 เลือกให้เป็นบอร์ด จากนั้นคุณสามารถตั้งโปรแกรมด้วยการแก้ไข 3 ของ lp_BLE_TempHumidity, lp_BLE_TempHumidity_R3.zip ตามที่อธิบายไว้ในส่วนที่ 2

หากการเขียนโปรแกรมล้มเหลว ปิดหน้าต่าง Arduino ทั้งหมด ถอดสาย USB ออก รีสตาร์ท Arduino แล้วเสียบสาย USB ของโปรแกรมเมอร์กลับเข้าไป แล้วเสียบอุปกรณ์จ่าย USB ของโมดูล nRF52 กลับเข้าไปแล้วลองอีกครั้ง

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

ไฟล์บันทึกยังมีข้อมูลเพิ่มเติมที่จำเป็นในการสร้างพล็อตวันที่และเวลาใหม่ในสเปรดชีต ดูวันที่และเวลาของ Arduino โดยใช้มิลลิวินาที () และ pfodApp สำหรับรายละเอียด

ขั้นตอนที่ 6: การสร้างนิยามบอร์ด Arduino NRF52 ใหม่

การสร้างนิยามใหม่ของบอร์ด Arduino NRF52
การสร้างนิยามใหม่ของบอร์ด Arduino NRF52
การสร้างนิยามบอร์ด Arduino NRF52 ใหม่
การสร้างนิยามบอร์ด Arduino NRF52 ใหม่
การสร้างนิยามใหม่ของบอร์ด Arduino NRF52
การสร้างนิยามใหม่ของบอร์ด Arduino NRF52
การสร้างนิยามบอร์ด Arduino NRF52 ใหม่
การสร้างนิยามบอร์ด Arduino NRF52 ใหม่

เพื่อรองรับบอร์ด nRF52 ใหม่ คุณต้อง a) เพิ่มไดเร็กทอรีใหม่ภายใต้ไดเร็กทอรีตัวแปรด้วยไฟล์บอร์ด และ b) แก้ไขไฟล์ boards.txt เพื่อเพิ่มบอร์ดใหม่ให้กับ Arduino

การเพิ่มตัวแปรบอร์ด nRF52 ใหม่

ตามที่อธิบายไว้ในส่วนที่ 1 การติดตั้งการสนับสนุนฮาร์ดแวร์ pfod_lp_nrf52 ค้นหาไดเร็กทอรีย่อยฮาร์ดแวร์ของแพ็คเกจ sandeepmistry ที่คุณได้อัปเดตด้วยการสนับสนุน pfod_lp_nrf52 เปิดไดเร็กทอรีย่อย \hardware\nRF5\0.6.0\variants และสร้างไดเร็กทอรีใหม่สำหรับบอร์ดใหม่ของคุณ เช่น SKYLAB_SKB369_Nano2replacement ในไดเร็กทอรีย่อย \hardware\nRF5\0.6.0\variants\SKYLAB_SKB369_Nano2replacement ใหม่ ให้สร้างไฟล์ Variant.h สามไฟล์, Variant.cpp และ pins_arduino.h คุณสามารถคัดลอกจากไดเร็กทอรีตัวแปรของบอร์ดอื่นๆ สำหรับ SKYLAB_SKB369_Nano2replacement ฉันเริ่มคัดลอกไฟล์จากตัวแปร RedBear_BLENano2

ไฟล์ pins_arduino.h

ไม่จำเป็นต้องเปลี่ยนไฟล์ pins_arduino.h มันรวมไฟล์ Variant.h ไว้ด้วย

ไฟล์ Variation.h

แก้ไขไฟล์ Variant.h เพื่อกำหนดจำนวนพินทั้งหมดที่บอร์ดของคุณจะมี PINS_COUNT

หมายเหตุ: ในแพ็คเกจ sandeepmistry การตั้งค่า NUM_DIGITAL_PINS, NUM_ANALOG_INPUTS และ NUM_ANALOG_OUTPUTS จะถูกละเว้น

หากบอร์ดของคุณมีพินอะนาล็อกมากหรือน้อย ให้อัปเดตส่วน /* Analog Pins */ ของไฟล์ Varians.h

หมายเหตุ: สำหรับบอร์ด NanoV2 และ SKYLAB หมุดอะนาล็อกจะถูกจับคู่กับหมุดดิจิทัล A0 == D0 เป็นต้น

นี้ไม่จำเป็น คุณสามารถกำหนดอินพุตแบบอะนาล็อกให้กับพิน Arduino ที่สะดวก ดูตัวอย่างไฟล์ blue/variant.h และ blue/variant.cpp

ชิป nRF52832 มีพินอินพุตแบบอะนาล็อก 8 พิน แต่บอร์ดเปลี่ยน SKYLAB_SKB369_Nano2 มีเพียง 6 อันเพื่อให้ตรงกับ Nano2

หมายเลขพินทั้งหมด ยกเว้น RESET_PIN ในไฟล์ Variant.h คือหมายเลขพินของ Arduino นั่นคือ #define PIN_A0 (0) หมายความว่า D0 ในแบบร่าง Arduino เป็นพินเดียวกับ A0 RESET_PIN เป็นข้อยกเว้น หมายเลขนั้นเป็นหมายเลขพินชิป nRF52823 และ 21 เป็นตัวเลือกที่ถูกต้องเท่านั้น อย่างไรก็ตาม การรองรับ pfod_lp_nrf52 ไม่ได้เปิดใช้งานพินรีเซ็ตบน nRF52832

ไฟล์ Variant.cpp

มีเพียงรายการเดียวในไฟล์ Variant.cpp คืออาร์เรย์ g_ADigitalPinMap ที่จับคู่หมายเลขพิน Arduino กับพิน nRF52832 ชิป P0..

หมายเหตุ: ในบอร์ด NanoV2 และ SKYLAB หมุดอะนาล็อก Arduino A0, A1 … เหมือนกับหมุดดิจิทัล Arduino D0, D1 … ดังนั้นรายการแรกใน g_ADigitalPinMap ต้องจับคู่กับหมายเลขพิน AINx บนชิป nRF52832

สำหรับ Analog Inputs ที่บอร์ดของคุณมีให้ รายการเหล่านั้นใน g_ADigitalPinMap จะต้องจับคู่หมายเลขพิน nRF52832 AIN0, AIN1, AIN2 และอื่นๆ เช่น AIN0 คือพินชิป P0.02, AIN1 คือพินชิป P0.03 เป็นต้น โปรดดูรูปแบบพิน nRF52832 ด้านบน

ใช้ (uint32_t)-1 สำหรับการแมปที่ไม่ถูกต้อง ตัวอย่างเช่น SKYLAB_SKB369_Nano2replacement board ไม่มี LED ในตัว, D13 ดังนั้นตำแหน่งจึงถูกแมปกับ (uint32_t)-1

ใน pfod_lp_nrf52.zip ไดเรกทอรีย่อยตัวแปร Redbear NanoV2, SKYLAB SKB369 และ GT832E_01 มีรูปภาพที่แสดงการแมปที่ตั้งค่าโดย Variation.cpp (ดูภาพด้านบน)

ในกรณีของ SKYLAB SKB369 มีพินให้เลือกมากมาย เพียงพอที่จะจับคู่กับ NanoV2 เท่านั้น ในกรณีของ GT832E_01 จะต้องทำการแมปพินที่มีอยู่ทั้งหมด แม้ว่าจะมีอินพุตแบบอะนาล็อกเพียงสาม (3) รายการแทนที่จะเป็นหก (6) บน NanoV2 นอกจากนี้ หมุด NFC สองตัว P0.09 และ P0.10 ยังต้องกำหนดค่าใหม่เป็น GPIO ดูการกำหนดค่าพิน nRF52 NFC ใหม่เป็น GPIO ด้านล่าง

กำลังอัปเดตไฟล์ board.txt

นี่คือรายการแทนที่ SKYLAB_SKB369_Nano2 ในไฟล์ boards.txt

## การเปลี่ยน SKYLAB_SKB369 Nano2 SKYLAB_SKB369_NANO2_REPLACEMENT.name=*SKYLAB SKB369 Nano2 เปลี่ยน

SKYLAB_SKB369_NANO2_REPLACEMENT.upload.tool=sandeepmistry:openocd

SKYLAB_SKB369_NANO2_REPLACEMENT.upload.protocol=cmsis-dap SKYLAB_SKB369_NANO2_REPLACEMENT.upload.target=nrf52 SKYLAB_SKB369_NANO2_REPLACEMENT.upload.maximum_size=524288 SKYLAB_transupd; SKYLAB_SKB369_NANO2_REPLACEMENT.upload.use_1200bps_touch=เท็จ SKYLAB_SKB369_NANO2_REPLACEMENT.upload.wait_for_upload_port=เท็จ SKYLAB_SKB369_NANO2_REPLACEMENT.upload.native_usb=false

SKYLAB_SKB369_NANO2_REPLACEMENT.bootloader.tool=sandeepmistry:openocd

SKYLAB_SKB369_NANO2_REPLACEMENT.build.mcu=cortex-m4

SKYLAB_SKB369_NANO2_REPLACEMENT.build.f_cpu = 16000000 SKYLAB_SKB369_NANO2_REPLACEMENT.build.board = SKYLAB_SKB369_Nano2replacement SKYLAB_SKB369_NANO2_REPLACEMENT.build.core = nRF5 SKYLAB_SKB369_NANO2_REPLACEMENT.build.variant = SKYLAB_SKB369_Nano2replacement SKYLAB_SKB369_NANO2_REPLACEMENT.build.variant_system_lib = = SKYLAB_SKB369_NANO2_REPLACEMENT.build.extra_flags -DNRF52 SKYLAB_SKB369_NANO2_REPLACEMENT.build.float_flags = -mfloat -abi=hard -mfpu=fpv4-sp-d16 SKYLAB_SKB369_NANO2_REPLACEMENT.build.ldscript=nrf52_xxaa.ld

SKYLAB_SKB369_NANO2_REPLACEMENT.menu.lfclk.lfrc.build.lfclk_flags=-DUSE_LFXO

SKYLAB_SKB369_NANO2_REPLACEMENT.menu.softdevice.s132=S132

SKYLAB_SKB369_NANO2_REPLACEMENT.menu.softdevice.s132.softdevice = s132 SKYLAB_SKB369_NANO2_REPLACEMENT.menu.softdevice.s132.softdeviceversion = 2.0.1 SKYLAB_SKB369_NANO2_REPLACEMENT.menu.softdevice.s132.upload.maximum_size = 409600 SKYLAB_SKB369_NANO2_REPLACEMENT.menu.softdevice.s132.build.extra_flags = - DNRF52 -DS132 -DNRF51_S132 SKYLAB_SKB369_NANO2_REPLACEMENT.menu.softdevice.s132.build.ldscript=armgcc_s132_nrf52832_xxaa.ld

board.txt การตั้งค่า

ความคิดเห็น – บรรทัดที่ขึ้นต้นด้วย # คือความคิดเห็น

คำนำหน้า – แต่ละกระดานต้องมีคำนำหน้าที่ไม่ซ้ำกันเพื่อระบุค่าของมัน คำนำหน้าคือSKYLAB_SKB369_NANO2_REPLACEMENT

ชื่อ – บรรทัด SKYLAB_SKB369_NANO2_REPLACEMENT.name ระบุชื่อของบอร์ดนี้เพื่อแสดงในเมนูบอร์ดของ Arduino

เครื่องมืออัปโหลด – บล็อก SKYLAB_SKB369_NANO2_REPLACEMENT.upload ระบุเครื่องมือที่จะใช้สำหรับการอัปโหลด หากคุณกำลังใช้ Particle Debugger ให้ใช้ protocol=cmsis-dap ดังที่แสดงด้านบน

Bootloader – บรรทัดนี้เหมือนกันสำหรับบอร์ดทั้งหมดในบอร์ดนี้.txt

บิลด์ – ต้องอัปเดตเพียงสองบรรทัดในบล็อกนี้ บรรทัด SKYLAB_SKB369_NANO2_REPLACEMENT.build.variant ระบุชื่อไดเร็กทอรีของบอร์ดนี้ในไดเร็กทอรีย่อยของตัวแปร SKYLAB_SKB369_NANO2_REPLACEMENT.build.board เป็นค่าที่ผนวกเข้ากับ ARDUINO_ แล้วกำหนดไว้ขณะคอมไพล์โค้ด เช่น. -DARDUINO_SKYLAB_SKB369_Nano2replacement ช่วยให้คุณสามารถเปิด/ปิดบางส่วนของรหัสสำหรับบอร์ดเฉพาะได้

นาฬิกาความถี่ต่ำ – บรรทัดนี้ SKYLAB_SKB369_NANO2_REPLACEMENT.menu.lfclk.lfrc.build.lfclk_flags ระบุแหล่งที่มาของนาฬิกาความถี่ต่ำที่ใช้สำหรับ lp_timer มีสามตัวเลือก -DUSE_LFXO, -DUSE_LFRC และ -DUSE_LFSYNT ตัวเลือกที่ดีที่สุดคือ -DUSE_LFXO หากบอร์ดมีคริสตัล 32Khz ภายนอก หากไม่เป็นเช่นนั้นให้ใช้ -DUSE_LFRC ซึ่งใช้ RC oscillator ภายในและดึงกระแสไฟเพิ่มขึ้นเล็กน้อย ~ 10uA มากกว่าและมีความแม่นยำน้อยกว่ามาก อย่าใช้ -DUSE_LFSYNT เนื่องจากจะทำให้ชิปทำงานตลอดเวลาส่งผลให้มีการดึงกระแส mAs

Softdevice – pfod_lp_nrf52 รองรับเฉพาะชิป nRF52 และ softdevice s132 เท่านั้น จึงไม่ต้องทำการเปลี่ยนแปลงใดๆ สำหรับบล็อกนี้ นอกเหนือจากคำนำหน้า

กำหนดค่าพิน nRF52 NFC ใหม่เป็น GPIO's

เป็นค่าเริ่มต้นบนพิน nRF52, P0.09 และ P0.10 ได้รับการกำหนดค่าเพื่อใช้เป็น NFC และคาดว่าจะเชื่อมต่อกับเสาอากาศ NFC หากคุณต้องการใช้สิ่งเหล่านี้เป็นพิน I/O วัตถุประสงค์ทั่วไป (GPIO) คุณต้องเพิ่มการกำหนด -DCONFIG_NFCT_PINS_AS_GPIOS ลงใน …menu.softdevice.s132.build.extra_flags การตั้งค่าคอมไพล์ในไฟล์ board.txt

ตัวอย่างเช่น pfod_lp_nrf52.zip กำหนดค่าพิน GT832E_01 ใหม่เพื่อใช้เป็น I/O ส่วน GT832E_01 สำหรับบอร์ดนี้ ในไฟล์ boards.txt มีการเพิ่มคำจำกัดความดังต่อไปนี้

GT832E_01.menu.softdevice.s132.build.extra_flags=-DNRF52 -DS132 -DNRF51_S132 -DCONFIG_NFCT_PINS_AS_GPIOS

สคริปต์ตัวเชื่อมโยงใน pfod_lp_nrf52.zip ยังได้รับการแก้ไขเพื่อรักษาการตั้งค่านี้ไว้และไม่จำเป็นต้องเปลี่ยนแปลง

ขั้นตอนที่ 7: บทสรุป

บทช่วยสอนนี้ได้นำเสนอการแทนที่ Redbear NanoV2 โดยใช้โมดูล SKYLAB SKB369 ตัวตรวจสอบความชื้นอุณหภูมิแบตเตอรี่/พลังงานแสงอาทิตย์ถูกใช้เป็นตัวอย่างโครงการ BLE ที่ใช้พลังงานต่ำมากใน Arduino สำหรับโมดูล SKYLAB จ่ายกระแส ~ 29uA ซึ่งทำได้โดยการปรับพารามิเตอร์การเชื่อมต่อ ส่งผลให้แบตเตอรี่แบบเหรียญ CR2032 มีอายุการใช้งานประมาณ 10 เดือน ยาวขึ้นสำหรับเซลล์เหรียญและแบตเตอรี่ความจุสูง การเพิ่มโซลาร์เซลล์ราคาถูกสองเซลล์ช่วยยืดอายุแบตเตอรี่ได้อย่างง่ายดาย 50% หรือมากกว่านั้น ไฟส่องสว่างในห้องสว่างหรือโคมไฟตั้งโต๊ะเพียงพอที่จะจ่ายไฟให้กับจอภาพจากเซลล์แสงอาทิตย์

บทช่วยสอนนี้ยังครอบคลุมถึงการลบการป้องกันชิปออกจาก nRF52 ที่ตั้งโปรแกรมไว้ล่วงหน้าและวิธีตั้งค่าคำจำกัดความของบอร์ดใหม่เพื่อให้ตรงกับ PCB/วงจรของคุณเอง

ไม่จำเป็นต้องมีการเขียนโปรแกรม Android pfodApp จัดการทั้งหมดนั้น

แนะนำ: