บทความ › โปรเจกต์

กล่องดนตรี NFC ฝังแท็ก NTAG215 ในตัวหมากพิมพ์ 3 มิติ อ่านด้วย ESP32 กับ PN532

ฝังแท็ก NTAG215 ในตัวหมากด้วยการหยุดพิมพ์กลางงาน แล้วให้ ESP32 กับเครื่องอ่าน PN532 อ่าน UID ของแท็ก วางตัวไหนเล่นเพลงนั้น พร้อมคำนวณความลึกช่องและจุดหยุดพิมพ์

กลาง อ่าน 9 นาที 23 ตุลาคม 2569 ของใหม่ที่ช่างควรลอง 2026 · บทที่ 15/20

อ่านจบแล้วจะรู้
  • แท็ก NTAG215 ทุกใบมี UID 7 ไบต์ที่โรงงานตั้งมา ใช้เป็นรหัสตัวหมากได้เลยโดยไม่ต้องเขียนข้อมูลลงแท็ก
  • ออกแบบช่องลึกเท่าความหนาแท็ก แล้วตั้ง pause ที่ชั้นแรกเหนือช่อง พลาสติกที่พิมพ์ต่อจะปิดแท็กไว้ในเนื้อ
  • พลาสติกปิดทับแท็กราว 1–2 mm อ่านได้ดี ทดสอบแท็กก่อนฝังทุกใบ เพราะฝังแล้วเอาออกไม่ได้
  • PN532 มีสามโหมดสื่อสาร ตั้งสวิตช์บนบอร์ดเป็น SPI ก่อนจ่ายไฟ ไม่งั้นโค้ดหาเครื่องอ่านไม่เจอ

กล่องดนตรี NFC คือกล่องที่มีเครื่องอ่าน NFC อยู่ใต้ฝา วางตัวหมากพิมพ์ 3 มิติตัวไหนลงไป กล่องก็เล่นเพลงของตัวนั้น ความลับอยู่ในตัวหมาก: ฝังแท็ก NTAG215 ไว้ข้างในด้วยการหยุดพิมพ์กลางงาน แท็กแต่ละใบมีเลขประจำตัว (UID) ไม่ซ้ำกัน ESP32 กับเครื่องอ่าน PN532 แค่อ่านเลขนี้แล้วเลือกเพลง

บทนี้เป็นคู่มือวิธีสร้าง ยังไม่ใช่บันทึกงานที่ทำเสร็จแล้ว ขนาดและตัวเลขในตัวอย่างเป็นจุดเริ่ม ต้องวัดแท็กจริงของคุณก่อนออกแบบ

ชิ้นส่วนที่ใช้

  • บอร์ด ESP32 รุ่นไหนก็ได้ที่มี SPI (บทนี้ใช้ขาของ ESP32 รุ่นแรก)
  • โมดูลเครื่องอ่าน PN532 ที่มีสวิตช์เลือกโหมด
  • แท็ก NTAG215 แบบสติกเกอร์กลม
  • passive buzzer สำหรับเล่นทำนอง (หรือโมดูลเล่นเสียงถ้าอยากได้เพลงจริง)
  • ฟิลาเมนต์ PLA หรือ PETG สำหรับตัวหมากและกล่อง

รู้จักแท็ก NTAG21x

เอกสาร NXP ของชิปตระกูลนี้ระบุว่าเป็นแท็ก NFC Forum Type 2 ทำงานที่ 13.56 MHz มี UID 7 ไบต์ที่โรงงานโปรแกรมไว้ เก็บข้อมูลได้ 10 ปี และเขียนซ้ำได้ 100,000 ครั้ง ความต่างระหว่างสามรุ่นคือหน่วยความจำ

รุ่นหน่วยความจำผู้ใช้เหมาะกับ
NTAG213144 ไบต์ลิงก์สั้น ๆ หรืออ่านแค่ UID
NTAG215504 ไบต์ใช้กันแพร่หลาย อ่านกับมือถือได้
NTAG216888 ไบต์เก็บข้อมูลยาว เช่น JSON

โปรเจกต์ OpenSpool ที่ใช้ ESP32 กับ PN532 อ่านแท็กติดม้วนฟิลาเมนต์ รองรับ NTAG215/216 เพราะเก็บข้อมูล JSON ลงแท็ก แต่กล่องดนตรีของเราใช้แค่ UID รุ่นไหนก็ได้ เลือก NTAG215 เพราะหาง่ายและเผื่อไว้ถ้าภายหลังอยากเขียนข้อมูลลงไป

ตัวอย่าง: ออกแบบช่องและคำนวณจุดหยุดพิมพ์

วัดแท็กจริงด้วยเวอร์เนียก่อนเสมอ ขนาดและความหนาต่างกันตามยี่ห้อ สมมุติวัดสติกเกอร์กลมได้กว้าง 25 mm หนาไม่เกิน 0.4 mm ทำช่องกว้าง 26 mm เผื่อรอบละ 0.5 mm

ตัวหมากทรงกระบอกสูง 4 mm พิมพ์ชั้นละ 0.2 mm ฐานของตัวหมากคือด้านที่วางลงบนฝากล่อง จึงให้แท็กอยู่ใกล้ฐาน

  1. ฐานใต้แท็ก 1.2 mm = ชั้นที่ 1 ถึง 6 (6 × 0.2) นี่คือพลาสติกที่คั่นระหว่างแท็กกับเครื่องอ่าน อยู่ในช่วง 1–2 mm ที่ printpal บอกว่าอ่านได้ดี
  2. ช่องใส่แท็ก ลึก 0.4 mm = ชั้นที่ 7–8 จบที่ความสูง 1.6 mm
  3. จุดหยุด ก่อนชั้นที่ 9 ซึ่งพิมพ์ที่ 1.8 mm (ใน PrusaSlicer เลื่อนแถบชั้นไปที่ 1.80 แล้ว Insert pause print คำสั่งจะหยุด ก่อน ชั้นที่เลือก)
  4. ส่วนที่พิมพ์ทับแท็ก ชั้นที่ 9 ถึง 20 = 12 ชั้น × 0.2 = 2.4 mm รวมเป็น 4 mm พอดี

ทำไมช่องต้องลึกเท่าแท็ก: ถ้าช่องลึกกว่าแท็ก ชั้นแรกที่พิมพ์ต่อจะต้องข้ามช่องว่างเป็นสะพานลอยในอากาศ ผิวด้านในย้อยและอาจกดแท็กเอียง ถ้าช่องตื้นกว่า แท็กโผล่ หัวพิมพ์จะชน ถ้าเปลี่ยน layer height ต้องคำนวณใหม่ทั้งหมด

ทดสอบแท็กกับเครื่องอ่านก่อนฝังทุกใบ แท็กเสียที่ฝังแล้วแก้ไม่ได้ ต้องพิมพ์ตัวหมากใหม่

ส่วนความสูงชั้นฐาน0-1.2 mm1-6ช่องใส่แท็ก1.2-1.6 mm7-8หยุดใส่แท็กที่ 1.8 mmก่อนชั้น 9พิมพ์ทับแท็ก1.6-4.0 mm9-20
ตัวหมากสูง 4 mm แท็กอยู่ห่างฐาน 1.2 mm

ขั้นตอนฝังแท็ก

  1. สแกนแท็กกับเครื่องอ่าน จด UID ไว้ (โค้ดด้านล่างพิมพ์ UID ออก Serial ให้)
  2. slice โมเดล ใส่ pause ที่ชั้นตามที่คำนวณ ใน OrcaSlicer หรือ Bambu Studio ใช้ปุ่มเพิ่ม pause บนแถบชั้นในหน้า Preview
  3. พิมพ์จนเครื่องหยุด เช็กว่าช่องสะอาด ไม่มีเส้นใยค้าง
  4. วางแท็กราบในช่อง ด้านเสาอากาศหงายขึ้น จะแตะกาวนิดเดียวกันเลื่อนก็ได้
  5. สั่งพิมพ์ต่อ เฝ้าชั้นแรกที่พิมพ์ทับแท็ก

ต่อวงจร

ตั้งสวิตช์บน PN532 เป็นโหมด SPI ก่อนจ่ายไฟ (คู่มือผู้ผลิตโมดูลรุ่นหนึ่ง: สวิตช์ 1 = 0, สวิตช์ 2 = 1 แต่เลขสวิตช์อาจต่างตามรุ่นบอร์ด ดูตัวหนังสือบนบอร์ด) แล้วต่อสาย

PN532ESP32
VCC3V3
GNDGND
SCKGPIO18
MISOGPIO19
MOSIGPIO23
NSS (SS)GPIO5

buzzer ต่อ GPIO25 กับ GND ถ้าใช้ลำโพงหรือโมดูลเสียงที่มีแม่เหล็ก วางให้ห่างเครื่องอ่าน โลหะใกล้เสาอากาศรบกวนการอ่าน ทดสอบระยะจริงหลังประกอบเสร็จ

โค้ด: อ่าน UID แล้วเล่นทำนอง

ใช้ไลบรารี Adafruit PN532 แบบ hardware SPI ฟังก์ชัน readPassiveTargetID ใส่ timeout ได้ เครื่องจะไม่ค้างรอแท็กตลอดไป

#include <SPI.h>
#include <Adafruit_PN532.h>

const int PN532_SS = 5;
const int BUZZER = 25;
Adafruit_PN532 nfc(PN532_SS);   // hardware SPI: SCK 18, MISO 19, MOSI 23

struct Note { int hz; int ms; };
const Note TWINKLE[] = {{262,400},{262,400},{392,400},{392,400},{440,400},{440,400},{392,800}};
const Note SCALE[]   = {{262,250},{294,250},{330,250},{349,250},{392,250},{440,250},{494,250},{523,500}};

struct Token { uint8_t uid[7]; const Note* song; int len; };
Token tokens[] = {   // ใส่ UID จริงที่อ่านได้จาก Serial
  {{0x04,0x11,0x22,0x33,0x44,0x55,0x66}, TWINKLE, 7},
  {{0x04,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}, SCALE,   8},
};

uint8_t lastUid[7];
unsigned long lastSeen = 0;

void play(const Note* s, int n) {
  for (int i = 0; i < n; i++) { tone(BUZZER, s[i].hz, s[i].ms); delay(s[i].ms + 50); }
}

void setup() {
  Serial.begin(115200);
  nfc.begin();
  if (!nfc.getFirmwareVersion()) { Serial.println("PN532 not found: check SPI switches"); while (1) delay(10); }
}

void loop() {
  uint8_t uid[7]; uint8_t len;
  if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &len, 200) && len == 7) {
    bool same = memcmp(uid, lastUid, 7) == 0 && millis() - lastSeen < 1000;
    lastSeen = millis();
    if (same) return;                       // ตัวหมากยังวางอยู่ ไม่เล่นซ้ำ
    memcpy(lastUid, uid, 7);
    for (int i = 0; i < 7; i++) Serial.printf("%02X ", uid[i]);
    Serial.println();
    for (auto& t : tokens)
      if (memcmp(uid, t.uid, 7) == 0) { play(t.song, t.len); lastSeen = millis(); }
  }
}

ตัวเลขความถี่คือโน้ต C4 = 262 Hz ไล่ถึง C5 = 523 Hz ทำนองแรกคือ “Twinkle Twinkle” ซึ่งเป็นเพลงพื้นบ้าน ทำนองที่สองเป็นบันไดเสียง แก้หรือเพิ่มเพลงได้ในตาราง tokens

ทำกล่อง

พิมพ์กล่องให้เครื่องอ่านแนบชิดใต้ฝา ฝายิ่งบางยิ่งอ่านง่าย ทำร่องวงกลมบนฝาให้ตัวหมากวางตรงกลางเสาอากาศพอดี บอร์ดอยู่ในกล่องปิด ดูวิธีออกแบบให้ใส่พอดีได้ในกล่องใส่บอร์ด ถ้าใช้แบต อ่านการใช้แบตลิเธียมอย่างปลอดภัยก่อน

ข้อผิดพลาดที่เจอบ่อย

  • สวิตช์ PN532 ผิดโหมด โค้ดพิมพ์ว่าหาเครื่องอ่านไม่เจอ ปิดไฟ ตั้งสวิตช์ใหม่ แล้วเปิดใหม่
  • ช่องลึกเกิน ชั้นปิดย้อยเป็นสะพาน แท็กเอียง
  • ไม่ได้ทดสอบแท็กก่อนฝัง แท็กเสียหรือเป็นคนละชนิดฝังไปแล้วแก้ไม่ได้
  • ลืมคำนวณจุดหยุดใหม่หลังเปลี่ยน layer height เครื่องหยุดผิดชั้น
  • ผิวปิดหนาเกิน แท็กอ่านไม่ติดหรือต้องวางชิดมาก ทำผิวด้านที่หันหาเครื่องอ่านให้บาง
  • ไม่มี timeout ใน readPassiveTargetID ค่าเริ่มต้นคือรอตลอดไป loop จะค้างจนกว่าจะมีแท็ก

ตัวหมากชิ้นเล็กที่มีแท็กอยู่ข้างในไม่ใช่ของเล่นสำหรับเด็กเล็กที่ยังเอาของเข้าปาก ทำตัวหมากให้ใหญ่พอ และพิมพ์ผิวปิดให้แน่นจนแกะแท็กออกไม่ได้

แหล่งข้อมูล

คำถามที่พบบ่อย

ใช้ NTAG213 หรือ NTAG216 แทนได้ไหม

ได้สำหรับงานนี้ เพราะเราอ่านแค่ UID ซึ่งทั้งสามรุ่นมีเหมือนกัน ความต่างอยู่ที่หน่วยความจำ 144, 504 และ 888 ไบต์ ซึ่งสำคัญเฉพาะเมื่ออยากเก็บข้อมูลลงแท็กด้วย

อ่านผ่านฝากล่องได้ไกลแค่ไหน

เอกสาร NXP ระบุระยะทำงานได้ถึง 100 mm แต่ขึ้นกับความแรงสนามและขนาดเสาอากาศ โมดูลเล็กกับแท็กเล็กมักได้น้อยกว่านั้นมาก ให้ทำฝาบางและวัดระยะจริงกับชุดของคุณเอง

อยากเปลี่ยนเพลงโดยไม่ต้องแก้โค้ดทำได้ไหม

ทำได้โดยเขียนข้อมูลลงแท็กก่อนฝัง เช่น เลขเพลงในรูปแบบ NDEF แล้วให้โค้ดอ่านหน้าข้อมูลแทน UID แต่ต้องเขียนและทดสอบให้เสร็จก่อนฝัง

วงจรและโค้ดในบทความทดสอบกับบอร์ดตัวอย่าง บอร์ดต่างรุ่นอาจใช้ขาต่างกัน ตรวจ pinout ของบอร์ดที่ใช้ก่อนต่อไฟเสมอ

อ่านต่อ

#โปรเจกต์กลาง

บังคับรถหุ่นยนต์ ESP32 ด้วยจอยเกมคอนโซล ผ่าน Bluepad32

ใช้ Bluepad32 ให้ ESP32 รับจอยเกมคอนโซลผ่าน Bluetooth แล้วขับรถสองล้อด้วย TB6612FNG ESP32 รุ่นแรกรองรับจอยทุกแบบ ส่วน S3/C3/C6 ได้เฉพาะ BLE และต้องแยกไฟมอเตอร์

อ่าน 9 นาที
#โปรเจกต์เริ่มต้น

พิมพ์ 3 มิติ ลงบน ผ้าตาข่าย tulle ทำของเล่นที่งอได้ ด้วยการหยุดพิมพ์กลางงาน

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

อ่าน 6 นาที
#โปรเจกต์กลาง

ของเล่น AI พูดได้ ด้วย ESP32-S3 และ xiaozhi-esp32 คำปลุกบนบอร์ด สมองบนคลาวด์

ทำของเล่นคุยได้ด้วยโปรเจกต์โอเพนซอร์ส xiaozhi-esp32 บอร์ดฟังคำปลุกเอง ส่วน LLM อยู่บนคลาวด์ พร้อมเรื่องที่ต้องคิดก่อนให้เด็กเล่น ทั้งความเป็นส่วนตัวและไฟบอกไมค์

อ่าน 7 นาที