สร้างสมาร์ทล็อคประตู DIY ด้วย Arduino และกลไก 3D Print (Rack & Pinion)

DIY Smart Lock with Arduino and 3D Printing

สวัสดีครับชาว Maker! วันนี้เราจะมาทำโปรเจกต์สนุกๆ ที่ผสมผสานทั้งงานโค้ดดิ้ง อิเล็กทรอนิกส์ และงาน 3D Printing เข้าด้วยกัน นั่นก็คือ สมาร์ทล็อคประตู (Smart Door Lock) แบบ DIY ที่ทำงานได้จริงครับ

ความพิเศษของโปรเจกต์นี้คือ มันไม่ได้เป็นแค่การเอาเซอร์โวมาหมุนเตะกลอนแบบทื่อๆ แต่เราจะใช้การออกแบบกลไก แร็คแอนด์พีเนียน (Rack and Pinion) ที่ปริ้นท์ 3D ขึ้นมาเอง เพื่อแปลงการ "หมุน" ของเซอร์โวให้กลายเป็นการ "เลื่อนเข้า-ออกในแนวตรง (Linear motion)" ทำให้มันดูสมจริงและใช้งานเป็นกลอนประตูได้จริงๆ ครับ!

อุปกรณ์ที่ต้องใช้ (Hardware & Software)

ของที่ต้องใช้ในโปรเจกต์นี้หาได้ทั่วไปเลยครับ (ถ้าเพื่อนๆ กำลังหาบอร์ด Arduino, เซอร์โวมอเตอร์, โมดูลจอ, หรือ เส้นพลาสติก 3D Print อย่าง PLA เกรดพรีเมียม เพื่อเอาไปปริ้นท์กลไกและเคสให้แข็งแรงทนทาน แนะนำให้แวะไปช้อปอุปกรณ์สายคราฟต์ได้ที่ Globalbyte เลยครับ รับรองว่าครบและจบในที่เดียว!)

  • บอร์ด Arduino UNO x1
  • หน้าจอ DFRobot I2C 16x2 Arduino LCD Display Module x1
  • ปุ่มกด 4x4 Keypad x1
  • ไมโครเซอร์โวมอเตอร์ SG90 x1
  • ลำโพง Buzzer x1
  • ไฟ LED สีแดง (5 mm) x1 และ LED สีเขียว x1
  • ตัวต้านทาน 330 ohm x2
  • อุปกรณ์บัดกรี (หัวแร้ง, ตะกั่ว, ฟลักซ์)
  • Software: Arduino IDE และโปรแกรมออกแบบ 3D เช่น Solid Edge 2025 Community Edition

หลักการทำงานของระบบ (How It Works)

เมื่อเราประกอบทุกอย่างเสร็จ ระบบจะทำงานเป็นสเตปตามนี้ครับ:

  1. หน้าจอ LCD จะแสดงข้อความ "Enter Password:" และรอให้เรากดรหัส
  2. ผู้ใช้กดรหัสผ่าน 4 หลักผ่าน Keypad (หน้าจอจะแสดงเครื่องหมาย * ทุกครั้งที่กด พร้อมเสียงบี๊บสั้นๆ)
  3. กดปุ่ม # เพื่อกดยืนยันรหัสผ่าน

✅ ถ้ารหัสผ่านถูกต้อง (Correct Password):

  • หน้าจอ LCD เปลี่ยนเป็น "Access Granted!"
  • ไฟ LED สีเขียวสว่างขึ้น
  • เซอร์โวมอเตอร์หมุน → เฟือง Pinion หมุน → ดันแกน Rack เลื่อนออก → ประตูปลดล็อค!
  • รอ 3 วินาที เซอร์โวจะหมุนกลับทาง → ดึงแกน Rack กลับ → ประตูล็อคอัตโนมัติ

❌ ถ้ารหัสผ่านผิด (Wrong Password):

  • หน้าจอ LCD แจ้งเตือน "Wrong Password!"
  • ไฟ LED สีแดงสว่างขึ้น
  • ลำโพง Buzzer ดังเตือน 4 ครั้งติดกัน
  • ระบบรีเซ็ตตัวเองแล้วกลับไปรอรับรหัสใหม่

กลไก 3D Print สุดเจ๋ง (Mechanical Design)

ส่วนที่สนุกที่สุดของโปรเจกต์นี้คือกลไก Rack & Pinion ครับ

  • ตัว เซอร์โวมอเตอร์ (Servo motor) จะถูกยึดอยู่ด้านในเคส โดยแกนหมุนของมันจะสวมเข้ากับ Pinion (เฟืองวงกลม)
  • ตัวเฟือง Pinion จะสบเข้ากับ Rack (แกนเฟืองเส้นตรง) ที่สอดทะลุช่องของเคสออกไป
  • เมื่อเซอร์โวหมุน เฟืองวงกลมจะไปผลัก/ดึงให้แกนเส้นตรงเลื่อนเข้า-ออก ทำหน้าที่เหมือนสลักกลอนประตูเป๊ะๆ ครับ!

ชิ้นส่วนทั้งหมด (รวมถึงเคสที่ซ่อนสายไฟ บอร์ด และเซอร์โวไว้ด้านในอย่างมิดชิด) ถูกออกแบบมาให้ปริ้นท์ด้วยเครื่องพิมพ์ 3D FDM ทั่วไปได้เลย โดยใช้วัสดุ PLA ครับ

การต่อวงจรและจำลองการทำงาน (Circuit & Simulation)

ก่อนจะลงมือต่อของจริง คุณสามารถเข้าไปทดลองรันระบบจำลองแบบ Interactive ได้ที่ลิงก์นี้ครับ: Tinkercad Smart Lock Simulation

ส่วนผังการต่อวงจรแบบเต็มๆ ดูได้ที่นี่เลยครับ → Circuit Diagram Image

ไลบรารีที่ต้องติดตั้งใน Arduino IDE:

  • Keypad.h — สำหรับรับค่าจาก Matrix keypad
  • LiquidCrystal_I2C.h — สำหรับคุมจอ LCD แบบ I2C
  • Servo.h — สำหรับคุมเซอร์โวมอเตอร์
  • Wire.h — สำหรับการสื่อสาร I2C

วิดีโอสาธิตการทำงาน (Video Demo)

ลองดูวิดีโอสาธิตการทำงานของโปรเจกต์จริงๆ ได้ที่คลิปด้านล่างนี้เลยครับ ว่าตัวกลไกมันสมูทและน่าใช้งานขนาดไหน!

โค้ด Arduino (Full Code)

ก๊อปปี้โค้ดด้านล่างนี้ไปวางในโปรแกรม Arduino IDE ได้เลยครับ (หรือ ดาวน์โหลดไฟล์โค้ดได้ที่นี่)

C/C++ (Arduino Code)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Keypad.h>

// --- LCD Configuration ---
LiquidCrystal_I2C lcd(0x27, 16, 2);

// --- Servo ---
Servo lockServo;

// --- Keypad Configuration ---
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 9, 8};  // Note: matches first code's pin order

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// --- Pin Definitions ---
#define RED_LED    12
#define GREEN_LED  13
#define SERVO_PIN  10
#define BUZZER     11

// --- Password Logic ---
String correctPassword = "1234";
String enteredPassword = "";

void setup() {
  Serial.begin(9600);

  // Initialize LCD
  lcd.init();
  lcd.backlight();

  // Initialize pins
  pinMode(RED_LED,   OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  pinMode(BUZZER,    OUTPUT);

  // Initialize Servo
  lockServo.attach(SERVO_PIN);
  lockServo.write(90);  // Locked position

  // Default state: locked
  digitalWrite(RED_LED,   HIGH);
  digitalWrite(GREEN_LED, LOW);

  // --- Startup Test (from first code) ---
  lcd.print("System Testing");

  // LED Test
  lcd.setCursor(0, 1);
  lcd.print("Testing LEDs... ");
  digitalWrite(RED_LED, HIGH);  delay(500);
  digitalWrite(RED_LED, LOW);
  digitalWrite(GREEN_LED, HIGH); delay(500);
  digitalWrite(GREEN_LED, LOW);

  // Buzzer Test
  lcd.clear();
  lcd.print("Buzzer: BEEP");
  digitalWrite(BUZZER, HIGH); delay(150);
  digitalWrite(BUZZER, LOW);

  // Servo Test
  lcd.clear();
  lcd.print("Servo: Testing");
  lockServo.write(0); delay(1000);
  lockServo.write(90);  delay(1000);

  lcd.clear();
  lcd.print("Test Complete!");
  delay(1000);

  // Set locked state and show prompt
  digitalWrite(RED_LED, HIGH);
  resetSystem();

  Serial.println("--- System Online: Waiting for Input ---");
}

void loop() {
  char key = keypad.getKey();  // Uses Keypad library (no manual scan needed)

  if (key) {
    Serial.print(key);

    if (key == '#') {
      Serial.println("\n--- SUBMIT BUTTON PRESSED ---");
      processPassword();
    }
    else if (key == '*') {
      Serial.println("\n--- CLEAR BUTTON PRESSED ---");
      resetSystem();
    }
    else {
      if (enteredPassword.length() < 8) {
        enteredPassword += key;

        // Show asterisk for each character
        lcd.setCursor(enteredPassword.length() - 1, 1);
        lcd.print('*');

        Serial.print("Typed: ");        Serial.print(key);
        Serial.print(" | Buffer: ");    Serial.println(enteredPassword);

        // Key press beep
        digitalWrite(BUZZER, HIGH); delay(50);
        digitalWrite(BUZZER, LOW);
      }
    }
  }
}

void processPassword() {
  Serial.print("Entered: [");   Serial.print(enteredPassword); Serial.println("]");
  Serial.print("Expected: [");  Serial.print(correctPassword); Serial.println("]");

  lcd.clear();
  enteredPassword.trim();

  if (enteredPassword == correctPassword) {
    Serial.println(">>> RESULT: MATCH FOUND! <<<");
    lcd.print("Access Granted!");

    digitalWrite(RED_LED,   LOW);
    digitalWrite(GREEN_LED, HIGH);

    lockServo.write(0);  // Unlock
    delay(3000);
    lockServo.write(90);   // Lock again

    digitalWrite(GREEN_LED, LOW);
    digitalWrite(RED_LED,   HIGH);
  }
  else {
    Serial.println(">>> RESULT: NO MATCH! <<<");
    lcd.print("Wrong Password!");

    for (int i = 0; i < 4; i++) {
      digitalWrite(BUZZER, HIGH); delay(150);
      digitalWrite(BUZZER, LOW);  delay(150);
    }
  }

  resetSystem();
}

void resetSystem() {
  enteredPassword = "";
  lcd.clear();
  lcd.print("Enter Password:");
  lcd.setCursor(0, 1);
}

ไอเดียพัฒนาต่อยอด (Future Improvements)

โปรเจกต์นี้สามารถเอาไปอัปเกรดความเจ๋งต่อได้อีกเยอะเลยครับ เช่น:

  • เพิ่มโค้ดส่วน EEPROM เพื่อให้ผู้ใช้สามารถเปลี่ยนรหัสผ่านใหม่ได้ผ่านปุ่มกด โดยไม่ต้องต่อคอมพิวเตอร์อัปโหลดโค้ดใหม่
  • เพิ่มเซอร์โวตัวที่สอง ทำเป็นระบบล็อคแบบสลักคู่ (Double-bolt locking) เพื่อความแน่นหนา
  • เปลี่ยนบอร์ดเป็น ESP8266 / ESP32 เพื่อเพิ่มการเชื่อมต่อ Bluetooth หรือ WiFi ให้ปลดล็อคผ่านแอปมือถือได้
  • เพิ่มโมดูล สแกนลายนิ้วมือ (Fingerprint sensor) เป็นการยืนยันตัวตนชั้นที่ 2 แบบล้ำๆ
  • ออกแบบแผ่นวงจรพิมพ์ (PCB) ของตัวเอง เพื่อให้ประหยัดพื้นที่ยิ่งขึ้น

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

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

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

 

แท็ก


Blog posts

เข้าสู่ระบบ

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

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