SCIENCE & TECHNOLOGY · IoT

DINO AUTO-PLAYER

หุ่นยนต์เล่นเกมไดโนเสาร์อัตโนมัติด้วย ESP32 + เซอร์โวมอเตอร์ + เซนเซอร์แสง — เรียนรู้การอ่านค่าเซนเซอร์และควบคุมแอกชูเอเตอร์ในโปรเจคเดียว

โปรเจคนี้ทำอะไร?

เราจะสร้าง "ผู้ช่วยกลไก" ที่เล่นเกมไดโนเสาร์ของ Chrome (เปิดจาก chrome://dino) แทนคนได้ — โดยไม่ต้องแตะคีย์บอร์ดเลย ระบบจะมองหน้าจอด้วยเซนเซอร์แสง แล้วสั่งให้แขนกลกดกระโดดเองเมื่อเจอกระบองเพชร

หลักการทำงาน

1 · แสงพื้นหลังเกมสว่าง กระบองเพชรสีเข้ม
▶
2 · LDRวัตถุเข้มผ่าน แสงลด ความต้านทานเปลี่ยน
▶
3 · ESP32อ่านค่า ADC เทียบกับ threshold
▶
4 · SERVOขยับกดปุ่ม Spacebar ไดโนกระโดด

ลองกดปุ่มนี้เพื่อดูจังหวะกระโดด:

รู้จักอุปกรณ์

ESP32 สมอง

ไมโครคอนโทรลเลอร์มี Wi-Fi/Bluetooth อ่านค่าอนาล็อกได้ 0–4095 (12-bit) และสร้างสัญญาณ PWM คุมเซอร์โว

LDR ตา

ตัวต้านทานที่ค่าความต้านทานเปลี่ยนตามแสง แสงมาก = ต้านทานน้อย ใช้เป็นเซนเซอร์ตรวจจับกระบองเพชร

SG90 แขน

เซอร์โวมอเตอร์หมุนได้ 0–180° รับคำสั่งเป็นมุม ใช้ขยับก้านไปกดปุ่ม Spacebar

R 10kΩ คู่หู LDR

ต่อร่วมกับ LDR เป็นวงจรแบ่งแรงดัน (voltage divider) เพื่อแปลงแสงเป็นแรงดันที่ ESP32 อ่านได้

การต่อวงจร

ขาอุปกรณ์ต่อกับ ESP32หน้าที่
เซอร์โว สัญญาณ (ส้ม)GPIO 13ส่งสัญญาณ PWM คุมมุม
เซอร์โว + (แดง)5V / VINไฟเลี้ยงมอเตอร์
เซอร์โว GND (น้ำตาล)GNDกราวด์ร่วม
จุดกลาง LDR + R10kGPIO 34อ่านค่าแสง (ADC)
ปลาย LDR / ปลาย R3.3V / GNDวงจรแบ่งแรงดัน
ESP32 GPIO34 3.3V GND GPIO13 5V LDR divider LDR 10k Servo SG90 SERVO — เขียว: 3.3V เหลือง: สัญญาณ ADC แดง: 5V เทา: GND ร่วม —
ระวัง
เซอร์โวกินกระแสสูงตอนออกแรง ควรเลี้ยงไฟจาก 5V/VIN ไม่ใช่ 3.3V และต้องต่อ GND ร่วมกับ ESP32 เสมอ ไม่งั้นบอร์ดอาจรีเซ็ต

โค้ด Arduino (อธิบายทีละส่วน)

ติดตั้งไลบรารี ESP32Servo ก่อน (Library Manager) แล้วอัปโหลดโค้ดนี้

// เรียกใช้ไลบรารีควบคุมเซอร์โวสำหรับ ESP32
#include <ESP32Servo.h>

Servo jumpServo;

const int LDR_PIN   = 34;   // ขา ADC อ่านค่าแสง
const int SERVO_PIN = 13;   // ขาสัญญาณเซอร์โว

int threshold = 2000;         // ค่ากลาง ปรับจาก Serial Monitor
const int REST_ANGLE = 0;    // มุมพัก (ไม่กด)
const int JUMP_ANGLE = 45;   // มุมกด Spacebar

void setup() {
  Serial.begin(115200);
  jumpServo.attach(SERVO_PIN);
  jumpServo.write(REST_ANGLE);   // เริ่มที่ตำแหน่งพัก
}

void loop() {
  int light = analogRead(LDR_PIN);  // อ่านค่า 0–4095
  Serial.println(light);            // ดูค่าเพื่อ calibrate

  // วัตถุเข้มผ่าน แสงลด ค่าต่ำกว่า threshold = กระโดด
  if (light < threshold) {
    jumpServo.write(JUMP_ANGLE);   // กด
    delay(120);
    jumpServo.write(REST_ANGLE);   // ปล่อย
    delay(80);
  }
}
เคล็ดลับ calibrate
เปิด Serial Monitor (115200) จดค่าตอน "สว่าง" และตอน "เอามือบัง" แล้วตั้ง threshold ไว้ตรงกลางระหว่างสองค่า ถ้าเดินสายกลับด้าน ค่าจะสูงขึ้นตอนมืด ให้เปลี่ยน < เป็น >

แบบทดสอบท้ายบท

10 ข้อ · เลือกคำตอบที่ถูกที่สุด · มีเฉลยและคำอธิบายทุกข้อ

?