DIY Smartwatch ฉบับฮาร์ดคอร์! สร้างสมาร์ทวอทช์เองจากศูนย์ คุมเซนเซอร์เอง 100% ไม่ง้อแบรนด์ดัง

DIY Smartwatch from Scratch

สมาร์ทวอทช์แบรนด์ดังๆ ที่เราซื้อมาใส่กัน ไม่ว่าจะเป็น Fitbit, Garmin หรือ Apple Watch ล้วนมีสิ่งหนึ่งที่เหมือนกันครับ... นั่นคือเฟิร์มแวร์ของมันเป็น "กล่องดำ (Black box)" เราไม่มีทางรู้เลยว่าข้างในมันเขียน Register ยังไง, รัน Interrupt ตอนไหน, หรือแปลงค่าดิบๆ จาก ADC ออกมาเป็นตัวเลขอัตราการเต้นของหัวใจบนหน้าจอได้อย่างไร

แต่โปรเจกต์นี้เราจะมาแหกกฎนั้นครับ! เราจะพามาดูการสร้าง Smartwatch จากศูนย์ (From scratch) ตั้งแต่ออกแบบแผ่น PCB เอง เขียนเฟิร์มแวร์เองแบบคัสตอม และเจาะลึกควบคุมเซนเซอร์แบบถึงลูกถึงคน (Bare metal) ไม่มีไลบรารีสำเร็จรูปมาครอบให้เกะกะในจุดที่สำคัญครับ!

Smartwatch Side View Smartwatch Screen Data Smartwatch UI

ทำอะไรได้บ้าง? และทำไมต้องเจาะลึกถึงฮาร์ดแวร์?

โปรเจกต์นี้ไม่ใช่แค่งานต่อเลโก้นะครับ แต่มันทำสิ่งเหล่านี้ได้จริง:

  • วัดอัตราการเต้นหัวใจ (Heart rate) และออกซิเจนในเลือด (SpO2) ผ่านเซนเซอร์ MAX30100 (ใช้ Infrared/Red LED ratio)
  • นับก้าวเดิน (Step counting) ด้วยเซนเซอร์ BMI160 ผ่านระบบ Interrupt-driven detection
  • ✅ แสดงผลข้อมูลแบบเรียลไทม์บนหน้าจอ TFT จิ๋ว
  • 🔲 ระบบเชื่อมต่อสมาร์ทโฟน (BLE) อยู่ในแผนพัฒนาขั้นต่อไป

ทำไมเราถึงต้องสั่งงาน BMI160 แบบ Bare metal?
โปรเจกต์ Wearable ส่วนใหญ่มักจะใช้ไลบรารีสำเร็จรูป (แค่เรียกฟังก์ชันแล้วรอรับตัวเลข) แต่โปรเจกต์นี้เรา "ข้าม" สิ่งนั้นไปครับ เราเลือกที่จะส่งคำสั่งคุยกับฮาร์ดแวร์โดยตรงผ่าน I²C/SPI เขียนทับ Register ด้วยตัวเอง กำหนดความไวของการนับก้าวได้แบบเป๊ะๆ นี่แหละคือความมันส์ของการเป็น Maker สายฮาร์ดคอร์!

ชำแหละชิ้นส่วนที่ใช้ (Bill of Materials)

คุณอาจจะตกใจถ้ารู้ว่าชิ้นส่วนทั้งหมดนี้ รวมราคาแล้วตกประมาณ $12 USD (หรือราวๆ 400 กว่าบาทเท่านั้น!) (💡 Pro Tip: สำหรับเพื่อนๆ ที่อยากลองวิชา ประกอบ Smartwatch ด้วยตัวเอง หรือกำลังมองหา เส้นพลาสติก 3D Print (Filament) คุณภาพสูงเพื่อเอาไปปริ้นท์เคสนาฬิกาเท่ๆ และหาซื้อบอร์ดไมโครคอนโทรลเลอร์ แวะไปช้อปปิ้งของดีๆ ได้ที่ Globalbyte เลยครับ ครบจบพร้อมลุย!)

  • ESP32-C3 Super Mini (U1): สมองกลหลักที่มีทั้ง WiFi และ BLE
  • MAX30100: เซนเซอร์วัดชีพจรและออกซิเจน (สามารถใช้ MAX30102 แทนได้)
  • GY-BMI160: เซนเซอร์ IMU 6 แกน (Accelerometer + Gyroscope) ที่มีชิป DSP นับก้าวในตัว
  • หน้าจอ TFT 1.69 นิ้ว: ใช้ไดรเวอร์ ST7789 สื่อสารผ่าน SPI
  • แบตเตอรี่ LiPo 400 mAh: แหล่งพลังงานหลัก
  • วงจรจัดการพลังงาน: LTH7 (ชาร์จ LiPo), ST1340BB (Buck Converter แปลงไฟเป็น 3.3V), MOSFET (IRLML6401 / IRLML2502) และไดโอด 1N5819
  • ชิ้นส่วน Passive: Inductor 3.3 μH, ตัวต้านทานและตัวเก็บประจุไซส์ 0603, สวิตช์ปุ่มกด และแผ่น Custom PCB
Bill of Materials
ESP32-C3 Super Mini MAX30100 & BMI160 TFT Display Power Components Passive Components

Step 1: ลุยงานออกแบบ PCB (PCB Design Overview)

โปรเจกต์นี้ออกแบบแผ่นวงจรพิมพ์ (PCB) ผ่านโปรแกรม EasyEDA ครับ สิ่งสำคัญในการวาง Layout คือการจัดกลุ่มอุปกรณ์ให้เหมาะสม (เช่น เอาภาคจ่ายไฟไว้ด้วยกัน และทำเส้นทางเดินไฟให้สั้น) และที่ขาดไม่ได้เลยคือ Ground Plane หรือการเททองแดงลงกราวด์ให้เต็มแผ่น เพื่อลดสัญญาณรบกวน (Noise) ทำให้ I²C และ SPI สื่อสารกันได้เสถียรครับ

⚠️ บั๊กที่ต้องรู้ก่อนทำตาม (Known Issues)

  • ขั้วไฟ Backlight ของจอภาพสลับกัน: ในไฟล์ PCB เวอร์ชันนี้ ขั้ว Anode และ Cathode ของจอสลับกันอยู่ เวลาบัดกรีต้องใช้สายไฟจัมเปอร์ (Jumper wire) เล็กๆ โยงสลับขั้วแก้ไขหน้างานครับ
  • เพิ่มปุ่ม Deep Sleep: ถ้าอยากให้ประหยัดแบตขั้นสุด แนะนำให้ต่อปุ่มกด (Push button) เพิ่มที่พิน GPIO 5 ลงกราวด์ เพื่อใช้เป็นปุ่มปลุก (Wake button) ให้ ESP32 ตื่นจากโหมด Deep sleep ครับ
PCB Layout EasyEDA
Schematic 1 PCB Front PCB Back Schematic 2

สำหรับเพื่อนๆ ที่อยากเอาไฟล์ไปสั่งผลิต หรือนำไปแก้ไขต่อ สามารถโหลดไฟล์ JSON ของ EasyEDA ได้ที่ลิงก์ด้านล่างสุดของบทความครับ

Step 2: งานประกอบและบัดกรี (PCB Assembly)

เนื่องจากอุปกรณ์เป็นแบบ SMD (Surface Mount Device) ไซส์เล็กจิ๋วอย่าง 0603 ทริคสำคัญคือการตั้งอุณหภูมิหัวแร้งครับ: ถ้าใช้ตะกั่วผสมตะกั่ว (Sn63/Pb37) ให้ตั้งไฟที่ 300–320 °C แต่ถ้าเป็นตะกั่วไร้สารตะกั่ว (Lead-free) ให้ขยับไปที่ 340–360 °C

เทคนิคการบัดกรีคือ "Tin one pad first" (แต้มตะกั่วที่แพดฝั่งนึงก่อน) แล้วเอาแหนบคีบอุปกรณ์ไปวาง จี้หัวแร้งให้ตะกั่วละลายยึดขาไว้ แล้วค่อยไปบัดกรีขาที่เหลือครับ ก่อนจ่ายไฟเข้าบอร์ด อย่าลืมเอา Multimeter เช็คโหมด Continuity ระหว่าง GND กับ 3.3V ด้วยนะครับว่าช็อตกันหรือเปล่า!

Step 3: เจาะลึกเซนเซอร์นับก้าว BMI160 (Built-In Step Counter)

BMI160 Sensor

ความลับของการประหยัดแบตเตอรี่ในสมาร์ทวอทช์ คือการผลักภาระไปให้เซนเซอร์จัดการเองครับ ชิป BMI160 มีระบบนับก้าว (Pedometer engine) ด้วย DSP ในตัว เราแค่ส่งคำสั่งไปเซ็ตค่า Register ของมัน แล้วให้มันคอยรายงานตัวเลขกลับมา ESP32-C3 ของเราจะได้หลับ (Sleep) หรือไปทำอย่างอื่นได้ครับ

Register Address Description Value Used
REG_CHIP_ID 0x00 รหัสระบุตัวตนชิป (Silicon ID) — ต้องอ่านได้ 0xD1 0xD1 (verify)
REG_ACC_RANGE 0x41 ความไวของ Accelerometer 0x03 (±2G)
REG_STEP_CNT_0 0x78 ตัวนับก้าว (Low byte) dynamic read
REG_STEP_CNT_1 0x79 ตัวนับก้าว (High byte) dynamic read
REG_STEP_CONF0 0x7A ตั้งค่าการทำงาน Pedometer engine 0x15 (enable)
REG_STEP_CONF1 0x7B ความไวแสงและโหมดการนับ 0x0B (normal)
REG_CMD 0x7E รีจิสเตอร์รับคำสั่ง (เช่น รีเซ็ตค่า) 0xB2 (rst step)

ลำดับการสตาร์ทเครื่อง (Startup Sequence - ลำดับสำคัญมาก! ⚠️)
1. เขียน 0xB6 ไปที่ REG_CMD → สั่ง Soft reset → รอ 10ms
2. เขียน 0x11 ไปที่ REG_CMD → เปิดโหมด Accel normal → รอ 4ms
3. เขียน 0x15 ไปที่ REG_CMD → เปิดโหมด Gyro normal → รอ 81ms (ห้ามข้าม! ไม่งั้นเซนเซอร์จะนับก้าวรวน)
4. เขียน 0xB2 ไปที่ REG_CMD → รีเซ็ตตัวนับก้าวให้เริ่มที่ 0

Step 4: เฟิร์มแวร์วัดชีพจร MAX30100 (Firmware Development)

สำหรับ MAX30100 จะใช้วิธีฉายแสง LED สีแดงและอินฟราเรดทะลุผิวหนัง แล้ววัดแสงที่สะท้อนกลับมาเมื่อปริมาณเลือดเปลี่ยนไปตามจังหวะหัวใจเต้น (เทคนิคนี้เรียกว่า PPG) เซนเซอร์สองตัวนี้ใช้ I²C บัสร่วมกันได้สบายๆ (พิน 8 และ 9)

ทริคการเขียนโค้ดคือ ให้ ESP32 ดึงข้อมูลแบบ Burst Polling (อ่านรวดเดียวหลายคิวจาก FIFO buffer ของเซนเซอร์) เพื่อลดภาระของคอขวด I²C และเมื่อผู้ใช้ออกจากหน้าจอวัดชีพจร เฟิร์มแวร์จะส่งคำสั่งปิดเซนเซอร์ทันทีเพื่อเซฟแบตเตอรี่ครับ!

Step 5-6: ทริคลดความเร็ว CPU & การแก้ปัญหา (Optimization & Troubleshooting)

ปกติ ESP32-C3 จะวิ่งที่ความเร็ว 160 MHz ซึ่งกินไฟเอาเรื่อง เราเลยต้องใช้เทคนิค Dynamic Frequency Scaling (Underclock) ครับ:
ตอนที่ปัดหน้าจอ หรือเลื่อนเมนู → อัดความเร็วเต็ม 160 MHz ให้ลื่นปรู๊ดปราด
ตอนโชว์หน้าปัดนาฬิกาเฉยๆ → ลดความเร็วลงเหลือ 80 MHz

💡 ระวังบั๊กตอนเปิดเครื่อง (USB CDC Boot Issue)

บทเรียนสำคัญของวิศวกรสาย Embedded: อย่าใจร้อนรีบลดความเร็ว CPU ตั้งแต่เปิดเครื่อง!

ถ้าคุณสั่ง Underclock ทันทีที่บอร์ดจ่ายไฟ ระบบ USB CDC (ที่เอาไว้แฟลชโค้ดและคุย Serial) จะเอ๋อและค้างไปเลยครับ!
วิธีแก้ (Standard trick): บูตเครื่องด้วย 160 MHz → รอให้ระบบทุกอย่างเสถียร (Stabilize) → ค่อยลดสปีดเพื่อเซฟพลังงานครับ!

อ้างอิงข้อมูลจาก: Globalbyteshop Blog

ต้นฉบับโปรเจกต์โดย: Instructables | Original Link

แหล่งดาวน์โหลดไฟล์ที่เกี่ยวข้อง:

*คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงแนวคิดจากบทความโปรเจกต์ต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยและบริบทบางส่วนอาจถูกปรับแต่งเพื่อให้เข้าใจง่ายและสนุกขึ้น โปรดตรวจสอบรายละเอียดเชิงเทคนิค กระบวนการต่อวงจรอย่างละเอียด ได้ที่ เว็บไซต์ต้นฉบับภาษาอังกฤษ

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี