📘 ซีรีส์ออกแบบ IoT Product · EP.8/70 · บทที่ 2: พื้นฐานฮาร์ดแวร์และการเลือกชิ้นส่วน
ตอนนี้ตอบคำถามว่า ทำไมบอร์ดที่ต่อถูกทุกเส้นยังทำงานแปลก ๆ และสัญญาณแต่ละแบบควรใช้อินเทอร์เฟซไหน ต่อจาก EP.7 ที่คิดเรื่องแรงดันและกระแสไปแล้ว
Pull-up และ Pull-down: ขาที่ปล่อยลอยคือขาที่โกหก
ขา GPIO ที่ตั้งเป็นอินพุตแต่ไม่ได้ต่ออะไรแน่นอน จะ "ลอย" (floating) อ่านได้ทั้ง 0 และ 1 สลับไปมาตามสัญญาณรบกวน อาการที่เจอคือ ปุ่มกดเองทั้งที่ไม่มีใครแตะ
- Pull-up = ตัวต้านทานดึงขาขึ้นไฟเลี้ยง ปกติอ่านได้ 1 กดปุ่มลงกราวด์แล้วเป็น 0
- Pull-down = ดึงลงกราวด์ ปกติอ่านได้ 0
MCU ส่วนใหญ่มี pull-up ในตัวชิป (ค่าราวหลายสิบกิโลโอห์ม ดูใน datasheet) พอสำหรับปุ่มบนบอร์ด แต่ ไม่พอสำหรับบัส I2C ที่ต้องใช้ pull-up ภายนอก เพราะ I2C ขับสัญญาณได้แค่ทางลง ขาขึ้นต้องพึ่งตัวต้านทานล้วน ๆ
ปุ่มกดทางกลมีอาการ "เด้ง" (bounce) ส่งสัญญาณกระพริบหลายครั้งในเสี้ยววินาที ให้เฟิร์มแวร์รอให้ค่านิ่งราว 20–50 มิลลิวินาทีก่อนนับว่ากด
Decoupling: ถังน้ำเล็ก ๆ ข้างขาไฟ
ชิปดึงกระแสเป็นห้วง ๆ เร็วมาก สายไฟบนบอร์ดส่งให้ไม่ทัน แรงดันจึงกระตุกสั้น ๆ ตัวเก็บประจุ decoupling คือถังน้ำเล็ก ๆ ที่วางชิดขาไฟของชิปเพื่อจ่ายกระแสช่วงนั้นแทน
- แนวทางทั่วไปตามเอกสารผู้ผลิตชิปส่วนใหญ่: 100nF ชิดขาไฟทุกขา ยิ่งใกล้ยิ่งดี
- บวก ตัวเก็บประจุค่าใหญ่ (หลายไมโครฟารัด) ใกล้โมดูล Wi-Fi รับกระแสพุ่งช่วงส่งข้อมูล ค่าจริงให้ยึดตาม datasheet ของโมดูลที่เลือก
ขาด decoupling ตัวเดียว อาการคือรีเซ็ตสุ่ม ๆ ซึ่งหาสาเหตุยากที่สุด เพราะต่อออสซิลโลสโคปดูแล้วบางทีก็ไม่เห็น การออกแบบวงจรไฟทั้งชุดลงลึกใน EP.17
กราวด์ร่วม: ไม่มีกราวด์เดียวกัน ก็ไม่มีภาษาเดียวกัน
แรงดันคือ ความต่าง ระหว่างสองจุด ถ้าเซนเซอร์ใช้ไฟคนละแหล่งกับ MCU แล้วไม่ต่อกราวด์ถึงกัน คำว่า "3.3V" ของสองฝั่งไม่ได้วัดจากจุดเดียวกัน สัญญาณจึงอ่านเพี้ยนหรือไม่ได้เลย
กฎง่าย ๆ: ทุกอุปกรณ์ที่คุยกันด้วยสายสัญญาณ ต้องต่อกราวด์ถึงกัน (ยกเว้นวงจรที่ตั้งใจแยกด้วยตัวแยกสัญญาณ เช่น ฝั่งไฟบ้าน) และสายกราวด์ของโหลดกระแสสูงอย่างมอเตอร์ ไม่ควรวิ่งผ่านเส้นทางเดียวกับกราวด์ของเซนเซอร์
อินเทอร์เฟซที่เจอบ่อย: ใช้ตอนไหน
| อินเทอร์เฟซ | ใช้กับ | จำนวนสาย (ไม่รวมไฟ) | ข้อควรรู้ |
|---|---|---|---|
| GPIO | ปุ่ม LED สวิตช์ประตู | 1 ต่ออุปกรณ์ | ขาอินพุตต้องมี pull-up/down |
| ADC | เซนเซอร์แอนะล็อก วัดแรงดันแบต | 1 | แม่นยำแค่ไหนดูที่ datasheet ของ MCU |
| PWM | หรี่ไฟ คุมความเร็วพัดลม buzzer | 1 | โหลดกระแสสูงต้องผ่านทรานซิสเตอร์ |
| I2C | เซนเซอร์หลายตัวบนบัสเดียว | 2 (SDA, SCL) | ออกแบบมาสำหรับระยะสั้นบนบอร์ด |
| SPI | จอ หน่วยความจำ งานเร็ว | 4 ขึ้นไป | เร็วกว่า I2C แต่ใช้ขาเยอะ |
| UART | โมดูลซิม GPS ดีบัก | 2 (TX, RX) | ไขว้สาย TX ไป RX และตั้งความเร็วตรงกัน |
| 1-Wire | เซนเซอร์อุณหภูมิแบบสายเดียว | 1 | ต้องมี pull-up ภายนอกเช่นกัน |
ลองใช้กับโปรเจกต์ตัวอย่าง: ตัวเฝ้าโรงเห็ด
วงจรพื้นฐานมี 4 ส่วน: เซนเซอร์อุณหภูมิ-ความชื้นบน I2C, LED สถานะ, ปุ่มตั้งค่า (ต่อ GPIO ใช้ pull-up ในตัวชิป) และ buzzer (ขับผ่านทรานซิสเตอร์ เพราะอาจกินกระแสเกินขา GPIO)
เรื่องที่ต้องตัดสินใจจริงคือ pull-up ของ I2C เพราะเซนเซอร์อยู่ในโรงเรือน ส่วนกล่องหลักอยู่ใต้ชายคา สายยาวเพิ่ม ค่าความจุ (capacitance) ของบัส ขอบสัญญาณขาขึ้นจึงช้าลง ตามเอกสารคำนวณ pull-up ของ Texas Instruments (SLVA689) ซึ่งอิงสเปก I2C
R_max = t_r / (0.8473 × C_bus) t_r โหมด 100kHz ไม่เกิน 1000ns
R_min = (VDD − 0.4V) / 3mA = (3.3 − 0.4) / 0.003 ≈ 970Ω
สมมติสาย 3 เมตร ความจุรวมทั้งบัสราว 250pF (ตัวเลขห้องเรียน วัดจริงหรือดูสเปกสายที่ใช้)
- pull-up 10kΩ: ขอบขาขึ้นราว 0.8473 × 10k × 250p ≈ 2.1µs เกินสเปก ข้อมูลเพี้ยนเป็นพัก ๆ
- pull-up 2.2kΩ: ราว 0.47µs ผ่านโหมด 100kHz และยังมากกว่า R_min
การตัดสินใจ: pull-up 2.2kΩ ฝั่งบอร์ดหลัก + ความเร็วบัส 100kHz (เซนเซอร์อ่านทุกไม่กี่นาที ไม่ต้องเร็ว) ใช้สายคู่บิดเกลียว และวาง 100nF ชิดเซนเซอร์ปลายสายด้วย ถ้าฟาร์มไหนต้องลากสายไกลกว่านี้มาก ให้เปลี่ยนแนวทาง เช่นใช้ชิปขยายบัส แทนการลดค่า pull-up ไปเรื่อย ๆ การเลือกตัวเซนเซอร์จริงลงลึกใน EP.14
กับดักที่เจอบ่อย: ใช้โมดูลเซนเซอร์สำเร็จที่ใส่ pull-up มาให้บนบอร์ดแล้ว และใส่ซ้ำที่บอร์ดหลักอีก ตัวต้านทานขนานกันจนค่ารวมต่ำกว่า R_min ขา SDA ดึงลงไม่ถึง 0 ให้ไล่ดูทุกโมดูลบนบัสว่ามี pull-up ติดมาหรือไม่
เช็กลิสต์ก่อนไปตอนถัดไป
- ไล่ทุกขาอินพุตว่ามี pull-up/pull-down แล้ว ไม่มีขาไหนลอย
- ใส่ 100nF ชิดขาไฟของทุกชิปในแบบวงจร และเช็กตัวเก็บประจุค่าใหญ่ข้างโมดูล Wi-Fi ตาม datasheet
- ยืนยันว่าทุกอุปกรณ์ที่ต่อสายสัญญาณถึงกันมีกราวด์ร่วม
- วัดหรือประเมินความจุของสาย I2C แล้วคำนวณช่วง pull-up ด้วยสูตรข้างบน
บอร์ดที่ "ทำงานแปลก ๆ" ส่วนใหญ่ไม่ได้พังที่ชิป แต่พลาดที่ตัวต้านทานกับตัวเก็บประจุราคาไม่กี่สตางค์ และเลือกอินเทอร์เฟซโดยไม่คิดถึงความยาวสาย
ตอนต่อไป — EP.9: อ่าน Datasheet ให้เป็น: หาค่าที่สำคัญได้ใน 10 นาที
อยากให้ช่วยตรวจแบบวงจรและการต่อเซนเซอร์ของอุปกรณ์คุณก่อนทำต้นแบบ ดูบริการออกแบบอุปกรณ์ IoT เฉพาะงานได้ที่ /iot หรือ ปรึกษาฟรี และทัก LINE @spvtech ได้เลย
