【ฉบับสมบูรณ์】ไร้ความหน่วง ไร้ข้อผิดพลาด คู่มือระดับมืออาชีพสำหรับการสร้าง "ปุ่มทริกเกอร์ทางกายภาพอเนกประสงค์" สำหรับ Android ด้วยตัวเองตั้งแต่เริ่มต้น

【ฉบับสมบูรณ์】ไร้ความหน่วง ไร้ข้อผิดพลาด คู่มือระดับมืออาชีพสำหรับการสร้าง "ปุ่มทริกเกอร์ทางกายภาพอเนกประสงค์" สำหรับ Android ด้วยตัวเองตั้งแต่เริ่มต้น

|เครื่องมือ

ในบทความนี้ ผมจะอธิบายขั้นตอนการสร้าง "ปุ่มทริกเกอร์ทางกายภาพอเนกประสงค์" (Universal Physical Trigger Button) ที่เกิดจากความมุ่งมั่นในการแก้ปัญหาหน้างาน สำหรับไรเดอร์ส่งอาหารที่ประสบปัญหาการทำงานผิดพลาดในวันฝนตกหรือความล่าช้าในการปลุกเครื่องจากโหมดสลีป รวมถึงเหล่า Geek ที่ต้องการเพิ่มประสิทธิภาพการใช้งานอุปกรณ์ Android ให้ถึงขีดสุด

โพสต์ X ตอนสร้างชิ้นงานที่ 1 โพสต์ X ตอนสร้างชิ้นงานที่ 2 โพสต์ X ตอนสร้างชิ้นงานที่ 3 โพสต์ X ตอนสร้างชิ้นงานที่ 4 โพสต์ X ตอนสร้างชิ้นงานที่ 5

1. แนวคิด: ทำไมถึงลงเอยที่การ "ทำเอง"

แม้คู่มือนี้จะเน้นไปที่ขั้นตอนการสร้างฮาร์ดแวร์และซอฟต์แวร์ในทางปฏิบัติ แต่กระบวนการลองผิดลองถูกและความล้มเหลวซ้ำแล้วซ้ำเล่าบนท้องถนนในวันฝนตกจนกว่าจะเกิด "ปุ่มทางกายภาพขั้นสุดยอด" นี้ขึ้นมา ได้ถูกบันทึกไว้ในบทความ note ด้านล่างนี้ หากคุณสนใจเรื่องราวเบื้องหลังที่ขรุขระว่าทำไมผลิตภัณฑ์ที่มีอยู่เดิมถึงใช้ไม่ได้ผล สามารถเข้าไปอ่านเพิ่มเติมได้ครับ

ปุ่ม Bluetooth หรือมีเดียคอนโทรลเลอร์ราคาถูกที่มีวางจำหน่ายทั่วไป มีจุดอ่อนร้ายแรงในสภาพแวดล้อมการทำงานที่โหดร้ายระดับมืออาชีพ (ฝนตก, การใช้งานต่อเนื่อง, การสั่งการที่ต้องตัดสินใจในเสี้ยววินาที) ดังนี้:

  • ความล่าช้าในการปลุกเครื่องจากโหมดสลีป: เนื่องจากฟังก์ชันประหยัดพลังงาน ทำให้เมื่อต้องการกดใช้งานจริง การคลิกครั้งแรกมักจะไม่ถูกรับรู้

  • การรบกวนเลย์เอาต์: ในบางแอปพลิเคชัน (เช่น Uber Eats) สัญญาณอินพุตจากผลิตภัณฑ์ทั่วไปอาจทำให้เกิดการทำงานที่ไม่คาดคิด

  • การเกิด Chattering และการจมน้ำ: ความสามารถในการป้องกันน้ำเข้าต่ำ ทำให้เกิดการทำงานผิดพลาด (Chattering) บ่อยครั้งจากความชื้นสูงหรือหยดน้ำในวันฝนตก

เพื่อแก้ไขปัญหาเหล่านี้จากรากฐาน ในโปรเจกต์นี้เราจะใช้วิธีการ สร้างเฟิร์มแวร์ด้วย C++ โดยใช้ไมโครคอนโทรลเลอร์ที่รองรับ Arduino และทำให้ OS จดจำอุปกรณ์ว่าเป็น "มีเดียรีโมทที่ทำงานได้อย่างเหมาะสมที่สุด" ด้วยวิธีนี้ เราจะสามารถสร้างสภาพแวดล้อมการทำงานที่ไร้รอยต่อ ไม่มีความล่าช้า และเชื่อถือได้

เพื่อแก้ไขปัญหาเหล่านี้จากรากฐาน ในโปรเจกต์นี้เราจะใช้วิธีการ สร้างเฟิร์มแวร์ด้วย C++ โดยใช้ไมโครคอนโทรลเลอร์ที่รองรับ Arduino และทำให้ OS จดจำอุปกรณ์ว่าเป็น "มีเดียรีโมทที่ทำงานได้อย่างเหมาะสมที่สุด" ด้วยวิธีนี้ เราจะสามารถสร้างสภาพแวดล้อมการทำงานที่ไร้รอยต่อ ไม่มีความล่าช้า และเชื่อถือได้

2. ชิ้นส่วนที่จำเป็น (BOM: รายการวัสดุ)

นี่คือรายการชิ้นส่วนที่ผ่านการทดสอบจากการใช้งานจริง ซึ่งสามารถหาซื้อได้จากร้านขายชิ้นส่วนอิเล็กทรอนิกส์ในอากิฮาบาระหรือ Amazon โดยเน้นการเลือกที่ความเสถียรเป็นหลัก

ชื่อชิ้นส่วนรุ่น / รายละเอียดราคาอ้างอิงที่ถูกที่สุด (รวมภาษี)แหล่งที่มาเหตุผลที่เลือก
บอร์ดไมโครคอนโทรลเลอร์Seeed Studio XIAO nRF528401,800 เยนSengoku Denshoขนาดเล็กพิเศษ รองรับ Bluetooth 5.0 มีวงจรชาร์จแบตเตอรี่ในตัว เป็นบอร์ดที่เป็นคำตอบที่ดีที่สุดสำหรับการใช้งานนี้
Amazon
แบตเตอรี่Li-po แบตเตอรี่ชาร์จได้ 3.7v 110mAh880 เยนSengoku Denshoความจุที่พอดีกับขนาดของ XIAO และเพียงพอต่อระยะเวลาการใช้งาน
Amazon
สวิตช์คีย์บอร์ดKailh Choc Brown (แกนน้ำตาล)60 เยน/ชิ้นYusha Koboเลือกใช้แกนน้ำตาลแบบ Low-profile ที่ให้สัมผัสการคลิกที่ชัดเจน ช่วยป้องกันการกดผิด
Yusha Kobo
คีย์แคปchocfox CFX 1U keycap550 เยน/10 ชิ้นYusha Koboสำหรับสวิตช์ Choc โดยเฉพาะ รูปทรงแบนราบกดง่าย
Yusha Kobo
สายไฟสายไฟแกนในจากสาย USB ที่ไม่ใช้แล้ว ฯลฯ0 เยนใช้วัสดุเหลือใช้มีความบางและยืดหยุ่น เหมาะสำหรับการเดินสายในพื้นที่ขนาดเล็กมาก
เคสผลงานจากเครื่องพิมพ์ 3 มิติ ฯลฯ-ทำเองสามารถทำเองจากเคสราคา 100 เยนก็ได้ ผมสร้างขึ้นโดยใช้เครื่องพิมพ์ 3 มิติ

3. เครื่องมือและวัสดุสิ้นเปลืองที่จำเป็น

เนื่องจากเป็นงานที่ต้องใช้ความละเอียด การเตรียมเครื่องมือที่เหมาะสมคือกุญแจสู่ความสำเร็จ

  • หัวแร้ง: แนะนำแบบปรับอุณหภูมิได้ ปลายหัวแร้งไม่ควรเล็กเกินไปเพื่อให้การนำความร้อนดี

  • ตะกั่วบัดกรี: goot สำหรับงานประกอบความหนาแน่นสูง SD-81 (0.6mm)\ Amazon - อุปกรณ์ยึด: ขาตั้งช่วยจับแบบแขนอ่อน\ Amazon - เทปกาวเจลสองหน้า: ยี่ห้อ Can Do (ความหนา 1.8mm) ※เนื่องจากผมออกแบบเคส 3D Print โดยอิงจากความหนา 1.8mm นี้ หากคุณสร้างเคสเอง ไม่จำเป็นต้องใช้ หรืออาจใช้วิธีอื่นในการยึดบอร์ดกับแบตเตอรี่ก็ได้

4. การประกอบฮาร์ดแวร์: เคล็ดลับสู่การประกอบที่มั่นคง

ความผิดพลาดในขั้นตอนนี้จะนำไปสู่การทำงานที่บกพร่องโดยตรง โดยเฉพาะพื้นฐานการบัดกรีและการจัดการแบตเตอรี่ โปรดใช้ความระมัดระวังเป็นพิเศษ

4-1. การเตรียมสายไฟ

ปอกเปลือกนอกของสายชาร์จที่ไม่ใช้แล้ว (เช่น สาย USB) ออก แล้วดึงสายไฟเส้นเล็กๆ (แกนใน) ที่อยู่ข้างในออกมา ตัดให้ได้ความยาวที่ต้องการ ปอกฉนวนที่ปลายทั้งสองด้านออกประมาณ 2-3 มม. แล้วแต้มตะกั่วไว้ล่วงหน้าเล็กน้อย (Pre-soldering)

4-2. การบัดกรีสวิตช์และบอร์ด

เชื่อมต่อ XIAO nRF52840 เข้ากับสวิตช์คีย์บอร์ด

  1. จุดเชื่อมต่อ:

    • ปุ่มที่ 1 (ปุ่มหลัก): ขาข้างหนึ่งของสวิตช์เข้ากับพิน D0 ของ XIAO และอีกข้างเข้ากับพิน GND

    • ปุ่มที่ 2 (ปุ่มรอง): ขาข้างหนึ่งของสวิตช์เข้ากับพิน D1 ของ XIAO และอีกข้างเข้ากับพิน GND

      (※เนื่องจาก GND เป็นจุดร่วม คุณสามารถต่อแบบ Daisy Chain ที่ฝั่งสวิตช์ได้)

  2. เคล็ดลับการบัดกรี (การอุ่น):

    สาเหตุส่วนใหญ่ที่ตะกั่วไม่ติดคือ "ความร้อนไม่พอ" ให้แตะปลายหัวแร้งลงบนทั้งแพดของบอร์ด (ส่วนที่เป็นโลหะ) และสายไฟพร้อมกัน อุ่นไว้ประมาณ 1-2 วินาที ก่อนจะป้อนตะกั่วเข้าไป หากตะกั่วแผ่ออกเป็นรูปภูเขาไฟถือว่าสำเร็จ หากเป็นก้อนกลมแสดงว่าความร้อนไม่พอหรือฟลักซ์ไม่เพียงพอ

4-3. การเชื่อมต่อแบตเตอรี่ (คำเตือน: ระวังไฟฟ้าลัดวงจร)

แบตเตอรี่จะถูกบัดกรีโดยตรงเข้ากับแพดสำหรับเชื่อมต่อแบตเตอรี่ที่อยู่ด้านหลังบอร์ด (BAT+ และ BAT-)

  • ห้ามลัดวงจรเด็ดขาด: เมื่อตัดสายแบตเตอรี่ Li-po ห้ามใช้คีมตัดสายบวกและสายลบพร้อมกันเด็ดขาด เพราะจะเกิดการลัดวงจรผ่านใบมีดและเสี่ยงต่อการเกิดไฟไหม้ ต้องตัดทีละเส้น และใช้เทปพันสายไฟฉนวนปิดปลายสายที่ยังไม่ได้ทำจนกว่าจะถึงขั้นตอนของสายนั้น

  • ขั้นตอนการเชื่อมต่อ: เพื่อความปลอดภัย ให้บัดกรี สายลบ (สีดำ) เข้ากับ BAT- ของบอร์ดก่อน จากนั้นจึงบัดกรี สายบวก (สีแดง) เข้ากับ BAT+

บัดกรี01

บัดกรี02

บัดกรี03

4-4. การติดตั้งและยึด (มาตรการป้องกันสายขาด)

ในงานอิเล็กทรอนิกส์ขนาดจิ๋ว ปัญหาที่พบบ่อยที่สุดคือ "สายขาดที่โคน"

เมื่อบัดกรีเสร็จแล้ว อย่าขยับ บอร์ดหรือสายไฟโดยไม่จำเป็น

เพื่อป้องกันสายขาด หลังจากบัดกรีเสร็จให้ใช้ เทปกาวเจลสองหน้าความหนา 1.8mm ที่เตรียมไว้ ยึดบอร์ด แบตเตอรี่ และสวิตช์คีย์บอร์ดเข้ากับเคส 3D Print ให้แน่นหนา ความหนาและความยืดหยุ่นของเทปนี้ทำหน้าที่ทั้งดูดซับแรงกระแทกและปรับตำแหน่งให้เหมาะสมไปในตัว

※เทปกาวเจลสองหน้าความหนา 1.8mm มีไว้เพื่อให้พอดีกับเคสที่ผมสร้างขึ้นเท่านั้น หากคุณสร้างในสภาพแวดล้อมของคุณเอง สามารถใช้วิธีอื่นได้ ※แนะนำให้รีบยึดด้วยเทปทันที เพราะหากขยับไปมาเพื่อเตรียมบัดกรีจุดถัดไป สายไฟอาจขาดได้ จึงแนะนำให้ยึดให้แน่นทันทีครับ

5. ซอฟต์แวร์: การเขียนเฟิร์มแวร์

ใส่สมองกลเพื่อให้ไมโครคอนโทรลเลอร์ทำงานเป็น "ปุ่ม Bluetooth ประสิทธิภาพสูง" ได้

5-1. การตั้งค่าและการอัปโหลดบน Arduino IDE

ติดตั้ง Arduino IDE จาก https://www.google.com/search?q=https://www.arduino.cc/en/software ลงบน PC ของคุณ และเพิ่มแพ็กเกจของบอร์ดที่จำเป็น (Seeed nRF52 mbed-enabled Boards)

288

หลังจากติดตั้ง IDE แล้ว ให้เปิดโปรแกรมขึ้นมา จากนั้นเชื่อมต่อ Seeed Studio XIAO nRF52840 เข้ากับ PC ด้วยสาย USB

  1. การค้นหาบอร์ด: เปิดเมนู Select Other Board and Port แล้วค้นหาและเลือก Seeed Studio XIAO nRF52840

    (※หมายเหตุ: ในซีรีส์ Seeed Studio XIAO จะมีบอร์ดอื่นที่มีชื่อคล้ายกัน เช่น "รุ่นปกติ (SAMD21)" หรือ "ESP32C3" โปรดตรวจสอบให้แน่ใจว่าเลือก "nRF52840" หากเลือกผิดจะไม่สามารถอัปโหลดได้)

    การเลือกบอร์ด: เมื่อค้นหาแล้ว Seeed Studio XIAO nRF52840 จะปรากฏในช่องตัวเลือก ให้เลือกบอร์ดนั้น โปรดระวังเนื่องจากมีเวอร์ชันที่แตกต่างกัน เช่น Plus หรือ Seeed เป็นต้น

  2. การเลือกพอร์ต:

    จาก Tools -> Port ให้เลือกพอร์ตที่ Seeed Studio XIAO nRF52840 เชื่อมต่ออยู่ (เช่น พอร์ต COM) ※สำหรับ Mac เมนู Tools จะไม่ได้อยู่ในหน้าต่างโปรแกรม แต่อยู่ที่แถบงาน (Taskbar)

    การอัปโหลด: เมื่อเตรียมบอร์ดและพอร์ตเรียบร้อยแล้ว ให้คัดลอกโค้ดด้านล่างนี้ไปวางในช่องแก้ไขข้อความตรงกลาง

#include <bluefruit.h>

// --- カスタマイズ設定 ---
#define DEVICE_NAME "D-Remote" // 11文字以内の好きな名前に変更してください
#define BTN1_PIN 0             // D0 (Vol Up / 長押し機能)
#define BTN2_PIN 1             // D1 (Vol Down)
// ----------------------

BLEDis bledis;
BLEBas blebas; // バッテリーサービス
BLEHidGeneric blehid(1, 0, 0);

static uint16_t inputReportLen[] = { 1 };
#define REPORT_ID_CONSUMER_CONTROL 1

// メディアリモコン設計図
uint8_t const hidReportDescriptor[] = {
  0x05, 0x0C,                   // Usage Page (Consumer Devices)
  0x09, 0x01,                   // Usage (Consumer Control)
  0xA1, 0x01,                   // Collection (Application)
  0x85, REPORT_ID_CONSUMER_CONTROL, // Report ID (1)
  0x15, 0x00,                   // Logical Minimum (0)
  0x25, 0x01,                   // Logical Maximum (1)
  0x75, 0x01,                   // Report Size (1 bit)
  0x95, 0x03,                   // Report Count (3)
  0x09, 0xE9,                   // Usage 1: Volume Increment (Bit 0)
  0x09, 0xEA,                   // Usage 2: Volume Decrement (Bit 1)
  0x09, 0xCD,                   // Usage 3: Play/Pause       (Bit 2)
  0x81, 0x02,                   // Input (Data, Variable, Absolute)
  0x75, 0x01,                   // Report Size (1 bit)
  0x95, 0x05,                   // Report Count (5) - パディング
  0x81, 0x03,                   // Input (Constant, Variable, Absolute)
  0xC0                          // End Collection
};

// 実際のバッテリー残量をパーセントで計算する関数
uint8_t getBatteryPercentage() {
  // バッテリー電圧読み取り用のスイッチ(VBAT_ENABLE)をONにする
  pinMode(VBAT_ENABLE, OUTPUT);
  digitalWrite(VBAT_ENABLE, LOW);
  delay(5); // 電圧が安定するまで待機

  analogReference(AR_INTERNAL); // 基準電圧3.6V
  analogReadResolution(12);     // 12bit解像度
  int raw = analogRead(PIN_VBAT); // 電圧読み取り

  // 読み取りが終わったらスイッチをOFFにして放電を防ぐ
  digitalWrite(VBAT_ENABLE, HIGH);
  pinMode(VBAT_ENABLE, INPUT);

  // XIAO nRF52840の正確な抵抗比(1MΩと510kΩ)に基づいた電圧計算(mV)
  // 計算式: 読み取り値 * (基準電圧/分解能) * (分圧比補正)
  float mv = raw * (3600.0 / 4096.0) * (1510.0 / 510.0);

  // リチウムイオン電池の特性に合わせる (4200mV=100%, 3300mV=0%)
  if (mv >= 4200.0) return 100;
  if (mv <= 3300.0) return 0;
  return (uint8_t)((mv - 3300.0) / (4200.0 - 3300.0) * 100.0);
}

void setup() {
  pinMode(BTN1_PIN, INPUT_PULLUP);
  pinMode(BTN2_PIN, INPUT_PULLUP);

  Bluefruit.begin();
  Bluefruit.setTxPower(8);
  Bluefruit.setName(DEVICE_NAME);
  Bluefruit.setAppearance(BLE_APPEARANCE_HID_GAMEPAD);

  bledis.setManufacturer("HI-JA");
  bledis.setModel("Delivery Controller");
  bledis.begin();

  blebas.begin();
  blebas.write(getBatteryPercentage()); // 起動時に実際のバッテリー残量を送信

  blehid.setReportLen(inputReportLen);
  blehid.setReportMap(hidReportDescriptor, sizeof(hidReportDescriptor));
  blehid.begin();

  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
  Bluefruit.Advertising.addTxPower();
  Bluefruit.Advertising.addAppearance(BLE_APPEARANCE_HID_GAMEPAD);
  Bluefruit.Advertising.addService(blehid);
  Bluefruit.Advertising.addService(blebas);
  Bluefruit.Advertising.addName();
  Bluefruit.Advertising.restartOnDisconnect(true);
  Bluefruit.Advertising.setInterval(32, 244);
  Bluefruit.Advertising.setFastTimeout(30);
  Bluefruit.Advertising.start(0);
}

void loop() {
  bool raw1 = (digitalRead(BTN1_PIN) == LOW);
  bool raw2 = (digitalRead(BTN2_PIN) == LOW);

  static int state = 0;
  static unsigned long pressTime = 0;
  static uint8_t lastReport = 0;
  uint8_t newReport = 0;
  unsigned long now = millis();

  // --- 同時押し判定ステートマシン ---
  if (state == 0) {
    if (raw1 || raw2) {
      state = 1;
      pressTime = now;
    }
  } else if (state == 1) {
    if (!raw1 && !raw2) {
      state = 0;
    } else if (now - pressTime > 40) {
      if (raw1 && raw2) state = 4;
      else if (raw1) state = 2;
      else if (raw2) state = 3;
    }
  } else {
    if (state == 2 && !raw1) state = 0;
    if (state == 3 && !raw2) state = 0;
    if (state == 4 && (!raw1 && !raw2)) state = 0;
  }

if (state == 2) newReport = 0x01;
  else if (state == 3) newReport = 0x02;
  else if (state == 4) newReport = 0x04;
  else newReport = 0x00;

  if (newReport != lastReport) {
    blehid.inputReport(0, &newReport, 1);
    lastReport = newReport;
  }

  // --- ฟังก์ชันกดค้าง ---
  static unsigned long d0StartTime = 0;
  static bool d0Long10s = false;
  static bool d0Long15s = false;

  if (state == 2 && raw1) {
    if (d0StartTime == 0) d0StartTime = now;
    unsigned long duration = now - d0StartTime;

    if (duration >= 15000 && !d0Long15s) {
      d0Long15s = true;
      uint8_t releaseReport = 0;
      blehid.inputReport(0, &releaseReport, 1);
      delay(100);
      nrf_gpio_cfg_sense_input(g_ADigitalPinMap[BTN1_PIN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
      NRF_POWER->SYSTEMOFF = 1;
    }
    else if (duration >= 10000 && !d0Long10s && !d0Long15s) {
      d0Long10s = true;
      NVIC_SystemReset();
    }
  } else {
    d0StartTime = 0;
    d0Long10s = false;
    d0Long15s = false;
  }

  // อัปเดตระดับแบตเตอรี่จริงทุกๆ 60 วินาที
  static unsigned long lastBatteryTime = 0;
  if (now - lastBatteryTime > 60000) {
    lastBatteryTime = now;
    blebas.write(getBatteryPercentage());
  }
  delay(5);
}

  • เมื่อวางโค้ดเรียบร้อยแล้ว ให้กดที่ (ไอคอนลูกศรขวา) ที่มุมซ้ายบนของหน้าจอเพื่อดำเนินการเขียนข้อมูล

    เกจแสดงสถานะ # จะเริ่มทำงาน เมื่อเสร็จสิ้นแล้วสามารถถอดออกได้เลย ห้ามถอดออกในระหว่างที่กำลังเขียนข้อมูล

    หากเกิดข้อผิดพลาดในการเขียนข้อมูล อาจเป็นไปได้ว่าเกิดปัญหาจากการตั้งค่าหรือการวางโค้ด ให้คัดลอกรหัสข้อผิดพลาดแล้วลองสอบถาม Gemini หรือ ChatGPT ดูครับ

5-2. การแก้ไขปัญหา: พอร์ตไม่ถูกตรวจพบหรือเครื่องค้าง

ในระหว่างการพัฒนา บ่อยครั้งที่บอร์ดอาจไม่ถูกตรวจพบโดย PC (ไม่แสดงพอร์ต)

  • การรีเซ็ตพื้นฐาน: การใช้แหนบหรืออุปกรณ์อื่นแตะที่จุด "RST" บนบอร์ดให้ลัดวงจรกันอย่างรวดเร็ว 2 ครั้ง (ดับเบิลคลิก) มักจะทำให้เข้าสู่โหมด Bootloader และถูกตรวจพบได้

  • ทางเลือกสุดท้าย (กรณีเครื่องค้างสนิท): หากรีเซ็ตแล้วไม่มีการตอบสนองใดๆ เลย เป็นไปได้ว่าบอร์ดค้างสนิท ในกรณีนี้ปุ่มรีเซ็ตจะไม่สามารถช่วยได้ วิธีเดียวที่จะบังคับรีสตาร์ทได้คือวิธีแบบดิบๆ คือ ปล่อยทิ้งไว้โดยที่ยังต่อแบตเตอรี่อยู่ จนกว่าแบตเตอรี่จะหมดเกลี้ยง

5-3. พฤติกรรมและสเปกของปุ่มที่ตั้งโปรแกรมไว้

โค้ดที่เขียนลงไปได้มีการใช้ State Machine ขนาด 40ms เพื่อกำจัดปัญหาการสั่นของหน้าสัมผัส (Chattering) ให้เหลือน้อยที่สุด นอกจากนี้ยังมีการควบคุมฟังก์ชันการอ่านแรงดันไฟฟ้า (VBAT_ENABLE) เพื่อส่งระดับแบตเตอรี่ที่แม่นยำไปยังสมาร์ทโฟน

【สเปกการทำงานของปุ่ม】

  • ปุ่ม 0 (D0) กดสั้น: เพิ่มระดับเสียง

  • ปุ่ม 1 (D1) กดสั้น: ลดระดับเสียง

  • ปุ่ม 0 + ปุ่ม 1 กดพร้อมกัน: เล่น / หยุดชั่วคราว

  • ปุ่ม 0 กดค้าง 10 วินาที: ล้างข้อมูลการจับคู่ Bluetooth (รีเซ็ต)

  • ปุ่ม 0 กดค้าง 15 วินาที: ปิดเครื่อง

【ระยะเวลาการใช้งานแบตเตอรี่】

ในโหมดสแตนด์บายที่ไม่มีการกดปุ่ม จะสามารถใช้งานได้นาน ประมาณ 20-30 วัน ในสภาพแวดล้อมการใช้งานจริง เช่น งานเดลิเวอรี่ที่มีการใช้งานบ่อย ระยะเวลาจะสั้นลงตามจำนวนครั้งที่กด

เมื่อการเขียนข้อมูลเสร็จสมบูรณ์และเริ่มทำงาน ไฟ LED สีฟ้าบนบอร์ดจะกะพริบ ซึ่งแสดงว่าอยู่ในสถานะรอการจับคู่

6. การตั้งค่าฝั่ง Android: เปลี่ยนปุ่มธรรมดาให้เป็นทริกเกอร์ที่ทรงพลังที่สุด

เมื่อฮาร์ดแวร์เสร็จสมบูรณ์และจับคู่ Bluetooth กับสมาร์ทโฟนแล้ว ขั้นตอนต่อไปคือการดักจับอินพุตนี้ที่ฝั่ง Android OS และแปลงเป็นการทำงานที่ต้องการ หากไม่ตั้งค่าส่วนนี้ ปุ่มก็จะทำหน้าที่ได้เพียงแค่ปรับระดับเสียงเท่านั้น

6-1. การเตรียมตัวล่วงหน้า: ปลดล็อกตัวเลือกสำหรับนักพัฒนา

เพื่อให้สามารถใช้สิทธิ์ระบบขั้นสูงของ Android ได้ ก่อนอื่นต้องเปิดใช้งานโหมดนักพัฒนาก่อน

  1. เปิด การตั้งค่า > เกี่ยวกับโทรศัพท์ บน Android

  2. แตะที่ หมายเลขบิลด์ ติดต่อกัน 7 ครั้งเพื่อเปิดใช้งานโหมดนักพัฒนา

  3. เปิด การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนา แล้วเปิด "การแก้ไขข้อบกพร่อง USB" (USB Debugging) และ "การแก้ไขข้อบกพร่องแบบไร้สาย" (Wireless Debugging)

6-2. การติดตั้ง FRep2 และการสร้างมาโครโดยละเอียด (การแตะด้วยการจดจำภาพ)

หากคุณต้องการใช้มาโครขั้นสูงที่ "ทำการแตะเฉพาะเมื่อมีปุ่ม (รูปภาพ) ปรากฏขึ้นบนหน้าจอ" แทนที่จะใช้ฟังก์ชันการแตะตำแหน่งคงที่ของ Key Mapper คุณจำเป็นต้องสร้างมาโครใน FRep2 ให้เสร็จสิ้นก่อนที่จะตั้งค่า Key Mapper

(※ หากคุณเพียงต้องการให้แตะตำแหน่งเดิมซ้ำๆ โดยตรง ให้ข้ามขั้นตอนนี้ไปที่ "6-3. การติดตั้ง Shizuku")

① การติดตั้ง FRep2 และการเปลี่ยนเป็น "โหมดแม่นยำ" (จำเป็น)

ในการดำเนินการแตะแบบฮาร์ดแวร์ด้วยการค้นหาภาพใน FRep2 คุณจำเป็นต้องเปลี่ยนจาก "โหมดปกติ" (Simple Mode) เริ่มต้น เป็น "โหมดแม่นยำ" (Precision Mode) และให้สิทธิ์ในการจับภาพหน้าจอ

  1. ติดตั้ง "FRep2" จาก Play Store

  2. เข้าไปที่คู่มือการตั้งค่าบนเว็บไซต์ทางการของ FRep2 ( https://strai.x0.com/frep2-ja/setup )

  3. จากหัวข้อ 【精密モード設定・画面キャプチャ権限付与】 (การตั้งค่าโหมดแม่นยำ/การให้สิทธิ์จับภาพหน้าจอ) ในหน้าเว็บ ให้ดาวน์โหลด [画面キャプチャ権限付与ツール] (เครื่องมือให้สิทธิ์จับภาพหน้าจอ) ที่เหมาะสมกับสภาพแวดล้อมการทำงานของคุณ (Windows / Mac / Linux / Android)

  4. ดำเนินการตามคำแนะนำบนเว็บไซต์ทางการเพื่อรันเครื่องมือ (※ขั้นตอนนี้จะใช้ "USB Debugging" หรือ "Wireless Debugging") เพื่อให้สิทธิ์และเปิดใช้งานบริการในโหมดแม่นยำ

② การเตรียมการล่วงหน้า (ภาพหน้าจอของเป้าหมาย)

เปิดแอปที่คุณต้องการใช้งาน (เช่น Uber Eats) และ บันทึกภาพหน้าจอของหน้าจอที่มีปุ่มที่คุณต้องการแตะปรากฏอยู่

(※ ไม่สามารถใช้การแตะด้วยการจดจำภาพได้ในแอปที่ไม่สามารถจับภาพหน้าจอได้เนื่องจากเหตุผลด้านความปลอดภัย)

③ การสร้างมาโครใหม่และการตั้งค่าการแสดงผล

  1. เปิด FRep2 และจากหน้าจอหลัก ให้แตะ บันทึก (Record) > ใหม่ (New)

  2. จากรายการการตั้งค่าทางด้านขวา ให้เปิด 【การตั้งค่าการแสดงผล】 (Display Settings) แตะที่ แสดงในทุกแอป (Show in any app) แล้วเลือก คลัง (ไม่แสดง) (Warehouse (No display))

    (※ ไม่จำเป็นต้องแสดงแผงควบคุมการทำงาน เนื่องจากเราจะเรียกใช้งานจากเบื้องหลังผ่านทางชอร์ตคัท)

④ การเขียนโปรแกรมจดจำภาพ

  1. ในเมนู 【โปรแกรม】 (Program) ให้แตะ แก้ไขเนื้อหาที่เล่น (Edit Trace)

  2. กดปุ่ม บนหน้าจอ แล้วแตะ การจดจำภาพ (Image Recognition) > จากไฟล์ภาพ (From image file)

    (※ หากไม่สามารถเลือกรูปภาพได้ที่นี่ ให้ไปที่ "การตั้งค่า" ของเครื่อง > "แอป" แล้วเปิด FRep2 เพื่อให้สิทธิ์การเข้าถึงไฟล์รูปภาพ)

  3. เปิดภาพหน้าจอที่เตรียมไว้ล่วงหน้า แล้วกด ตกลง (Apply) ที่ด้านขวาล่าง

⑤ การระบุกรอบเป้าหมายที่ต้องการจดจำ

  1. หน้าจอจะแสดงกรอบสี่เหลี่ยมสีน้ำเงิน กรอบสีน้ำเงินนี้คือ "เป้าหมายที่จะจดจำ"

  2. ปรับจุดศูนย์กลางของกรอบให้ตรงกับตำแหน่งที่ต้องการแตะ (เช่น จุดศูนย์กลางของเครื่องหมาย "×" สำหรับการปฏิเสธงานใน Uber Eats)

  3. สำคัญ: ยิ่งกรอบที่จดจำ "มีขนาดเล็ก" การประมวลผลก็จะยิ่งเร็วขึ้น หากเป็นปุ่มปฏิเสธ ให้ปรับกรอบให้แคบและยาว แล้วระบุให้ครอบคลุมเฉพาะบริเวณจุดศูนย์กลางของเครื่องหมาย × ก็เพียงพอแล้ว เมื่อระบุเสร็จแล้วให้กด ตกลง (Apply) ที่ด้านขวาล่าง

⑥ การตั้งค่าการจดจำและการปรับขอบเขตการค้นหาให้เหมาะสม (หัวใจสำคัญของความเร็ว)

  1. ในหน้าจอถัดไปที่ 【การตั้งค่าการจดจำ】 (Recognition Settings) ให้แตะที่ ความคล้ายคลึงของสี (Color similarity) แล้วเปลี่ยนเป็น ค้นหา:ความคล้ายคลึง (Search: Similarity)

  2. ทำเครื่องหมายที่ แตะที่จุดศูนย์กลางของพื้นที่จดจำ (Tap center of recognition area)

  3. เมื่อแตะที่ ขอบเขตการค้นหา:ทั้งหน้าจอ (Search area: Full screen) จะมีรูปภาพที่มีตัวเลข 4 จุดปรากฏขึ้น

  4. แตะที่ "แสดงภาพ" (ไอคอนรูปนิ้วชี้ที่ภาพถ่าย) ที่มุมขวาบน

    ตัวเลขในภาพจะเปลี่ยนไปตามขนาดหน้าจอ ดังนั้นอย่าอ้างอิงตัวเลขดังกล่าว แต่ให้ปรับขนาดด้วยอุปกรณ์ของคุณเองเสมอ

  5. เฉพาะส่วนที่เป็นเป้าหมายที่คุณตั้งค่ากรอบสีน้ำเงินไว้ก่อนหน้านี้จะสว่างขึ้น

    ในกรณีของปุ่มที่ตำแหน่งแนวตั้งเปลี่ยนไปตามป๊อปอัป เช่น ปุ่มปฏิเสธของ Uber Eats ให้ ขยายพื้นที่สว่างให้ครอบคลุมความกว้างสูงสุดที่ปุ่มนั้นอาจเลื่อนไป

    (※ ในส่วนนี้ ยิ่งขอบเขตการค้นหาเล็กเท่าไหร่ การประมวลผลก็จะยิ่งเร็วขึ้นอย่างมหาศาล โปรดจำกัดไว้ให้เล็กที่สุดเท่าที่จำเป็น)

  6. กด ตกลง (Apply) เพื่อบันทึกการตั้งค่า

  7. ใน 【การตั้งค่าขั้นสูง】 (Advanced Settings) ให้เอาเครื่องหมายถูกออกหากไม่จำเป็นต้องบันทึกภาพหน้าจอ

  8. กด ปิด (Close) ที่ด้านขวาล่างเพื่อเสร็จสิ้นการตั้งค่าการค้นหาภาพ

  9. "รอ 5.0" (Wait 5.0) ที่มีอยู่ตั้งแต่ต้นในหน้าจอแก้ไขนั้นไม่จำเป็นและจะทำให้เสียเวลาโดยเปล่าประโยชน์ คุณสามารถลบออกได้เลย

⑦ การบันทึกการตั้งค่าและการตรวจสอบ

  1. แตะ "ไอคอนฟลอปปีดิสก์" ที่มุมขวาบนเพื่อบันทึกการตั้งค่า

  2. แตะ บันทึก (Record) จากลูกศรย้อนกลับ (หรือไอคอนขีดสามขีด) ที่มุมซ้ายบนเพื่อกลับไปยังรายการการตั้งค่า

  3. แตะ แผงมาตรฐาน (Standard Panel) ที่แถบด้านบน แล้วเปลี่ยนเป็น คลัง (Warehouse)

  4. หากมาโครที่คุณเพิ่งสร้างขึ้นปรากฏขึ้นมา แสดงว่าการเตรียมการในฝั่ง FRep2 เสร็จสมบูรณ์แล้ว

6-3. การติดตั้งและการเปิดใช้งาน Shizuku (การรักษาความปลอดภัยของสิทธิ์ระบบและการปรับปรุงการตอบสนอง)

เพื่อให้สามารถดำเนินการระดับระบบที่ปกติแล้วต้องมีการ Root (เช่น การแตะหน้าจอแบบฮาร์ดแวร์ผ่าน ADB) เราจะให้ Shizuku ทำงานอยู่เบื้องหลังตลอดเวลา

(※ หากใช้การแตะด้วยการจดจำภาพใน FRep2 แม้ไม่มีการตั้งค่า Shizuku ก็สามารถทำงานได้ในระดับหนึ่ง แต่การมีสภาพแวดล้อม Shizuku จะทำให้การตอบสนองรวดเร็วขึ้นอย่างมาก จึงขอแนะนำให้ติดตั้งเป็นอย่างยิ่ง)

  1. ติดตั้ง "Shizuku" จาก Google Play Store

    (※ ข้อควรระวัง: ในอุปกรณ์บางรุ่นหรือบางประเทศ/ภูมิภาค เช่น Pixel 9a ในญี่ปุ่น อาจไม่พบ Shizuku ใน Play Store ในกรณีนั้น เพื่อความปลอดภัย โปรดดาวน์โหลดไฟล์ APK ล่าสุดโดยตรงจากหน้า Releases ของ GitHub ทางการที่ https://github.com/RikkaApps/Shizuku/releases แล้วทำการติดตั้ง (Sideload) ไม่แนะนำให้ดาวน์โหลดจากเว็บไซต์บุคคลที่สามที่ไม่ทราบแหล่งที่มา)

  2. การเตรียมสภาพแวดล้อมเครือข่าย (สำคัญ): เนื่องจากต้องใช้ "Wireless Debugging" ในการเปิดใช้งาน Shizuku จึงจำเป็นต้องมีสภาพแวดล้อมที่สามารถเชื่อมต่อ Wi-Fi หรือเชื่อมต่อผ่าน Tethering จากสมาร์ทโฟนเครื่องอื่น โปรดเชื่อมต่อ Wi-Fi หรือ Tethering ในขั้นตอนนี้

    (※ ไม่ต้องกังวล การเชื่อมต่อนี้มีไว้เพื่อเปิดใช้งาน Shizuku เท่านั้น หลังจากเปิดใช้งานสำเร็จแล้ว คุณสามารถยกเลิกการเชื่อมต่อได้ และจะไม่เป็นการใช้ข้อมูล (Packet) ของสมาร์ทโฟนเครื่องที่เป็นตัวปล่อย Tethering อย่างต่อเนื่อง)

  3. การตรวจสอบตัวเลือกสำหรับนักพัฒนา: เพื่อความแน่ใจ ให้ตรวจสอบว่าใน การตั้งค่าระบบตัวเลือกสำหรับนักพัฒนา ของเครื่องมีการเปิดใช้งาน "Wireless Debugging" ไว้แล้ว (หากไม่พบตัวเลือกสำหรับนักพัฒนา ให้แตะที่ การตั้งค่าเกี่ยวกับโทรศัพท์หมายเลขบิลด์ 7 ครั้งติดต่อกันเพื่อเปิดใช้งาน)

  4. เปิดแอป Shizuku แล้วแตะ การจับคู่ (Pairing) ในส่วน "เริ่มจาก Wireless Debugging"

  5. ระบบจะนำคุณไปยังหน้าจอ Wireless Debugging ในตัวเลือกสำหรับนักพัฒนา ให้แตะที่ จับคู่อุปกรณ์ด้วยรหัสจับคู่ (Pair device with pairing code)

  6. ป้อนรหัส 6 หลักที่ปรากฏขึ้นลงในช่องแจ้งเตือน (หรือป๊อปอัป) ของ Shizuku

  7. กลับไปที่แอป Shizuku แล้วแตะ เริ่ม (Start) หากมีข้อความ "Shizuku กำลังทำงานอยู่" ปรากฏขึ้นที่ด้านบน แสดงว่าสำเร็จ หลังจากยืนยันการเปิดใช้งานแล้ว คุณสามารถยกเลิกการเชื่อมต่อ Wi-Fi หรือ Tethering ได้ (※ หากรีสตาร์ทเครื่อง อาจจำเป็นต้องทำตามขั้นตอนการเปิดใช้งานนี้อีกครั้ง)

6-4. การตั้งค่า Key Mapper (การรีแมปอินพุตและการกำหนดการทำงาน)

นี่คือการตั้งค่าหลักเพื่อตรวจจับอินพุตจากปุ่มกดทางกายภาพและแปลงเป็นคำสั่งการทำงานตามต้องการ โดยขั้นตอนนี้จะเป็นการเชื่อมโยงการทำงานทั้งหมดเข้าด้วยกัน

※ ในการตั้งค่านี้ จำเป็นต้องกดปุ่มจริงเพื่อบันทึกสัญญาณ ดังนั้นโปรดเชื่อมต่อ (Pairing) ปุ่ม Bluetooth ที่คุณสร้างขึ้นเข้ากับสมาร์ทโฟนไว้ล่วงหน้า

  1. ติดตั้งและเปิดแอป "Key Mapper" จาก Play Store

  2. ในการเปิดใช้งานครั้งแรก ให้ทำตามคำแนะนำบนหน้าจอเพื่ออนุญาตสิทธิ์การเข้าถึง (Accessibility) และอนุญาตสิทธิ์ Shizuku ด้วย

  3. แตะปุ่ม (หรือ + new key map) ที่ด้านล่างของหน้าจอ เพื่อเปิดหน้าจอสร้างกฎ ซึ่งจะมี Trigger และ Actions ปรากฏอยู่ที่ด้านบนของหน้าจอ

  4. การบันทึกทริกเกอร์ (จุดเริ่มต้นการทำงาน):

    1. แตะที่ปุ่มสีแดง tap to record trigger (หรือ Record Trigger) ที่ด้านล่างของหน้าจอ

    2. ในขณะที่หน้าจอเปลี่ยนเป็น "Press your keys" ให้กด "ปุ่ม 1 (เช่น ปุ่มเพิ่มเสียง)" บนปุ่มกดทางกายภาพที่คุณสร้างขึ้น

    3. หากหน้าจอแสดงชื่ออุปกรณ์ Bluetooth ที่คุณกดและสัญญาณอย่าง "Volume Up" แสดงว่าสำเร็จ

      (※ ข้อควรทราบ: สัญญาณที่ส่งมาคือ "เพิ่มเสียง" แต่การผ่าน Key Mapper จะช่วยให้คุณสามารถแปลงเป็นคำสั่งอื่นที่คุณกำหนดไว้ได้ โดยที่ระดับเสียงของเครื่องจริงจะไม่เพิ่มขึ้น)

  5. การตั้งค่าการทำงาน (2 แนวทาง):

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

    • 【วิธี A】 เชื่อมต่อกับมาโคร FRep2 (การแตะด้วยการจดจำภาพ / การใช้ทางลัด)

      เรียกใช้มาโคร FRep2 ที่สร้างไว้ล่วงหน้าใน "6-2" ด้วยปุ่มกดทางกายภาพ

      1. เลือก Launch app shortcut จากรายการคำสั่ง

      2. รายการทางลัดจะปรากฏขึ้น ให้เลือก ทางลัดของ FRep2

      3. หน้าจอการตั้งค่า FRep2 จะเปิดขึ้น เนื่องจากมาโครที่สร้างไว้จะอยู่ใน "คลัง (Warehouse)" ให้เปลี่ยนรายการเป็น คลัง (ซ่อนอยู่) แล้วเลือกมาโครที่เกี่ยวข้อง

      4. สำหรับรายการเล่น ให้เลือก เล่นตั้งแต่ต้น

        (※ วิธีนี้สามารถทำงานได้โดยไม่ต้องตั้งค่า Shizuku แต่หากอยู่ในสภาพแวดล้อมที่เปิดใช้งาน Shizuku การตอบสนองจะรวดเร็วกว่า)

    • 【วิธี B】 ใช้ Shell command (การแตะแบบ ADB Hard Tap)

      ※ ในที่นี้จะขอยกตัวอย่างการตั้งค่าสำหรับคำสั่ง "ปฏิเสธ" ของ Uber Eats หากต้องการใช้เพื่อวัตถุประสงค์อื่น โปรดอ้างอิงจาก "6-5. การปรับแต่ง" เพื่อแก้ไข

      1. เลือก Shell command จากรายการคำสั่ง

      2. เมื่อหน้าจอการตั้งค่า Shell command เปิดขึ้น ให้ใส่ชื่อในช่อง Description (เช่น ปฏิเสธ Uber เป็นต้น)

      3. จากนั้น ให้คัดลอกและวางโค้ดด้านล่างนี้ลงในช่อง Script

        # 1. 取得画面サイズ
        size=$(wm size | awk '{print $NF}'); w=${size%x*}; h=${size#*x}
        x=$((w * 86 / 100))
        
        # 2. 座標計算(何度も使うので変数に入れます)
        y1=$((h * 565 / 1000))
        y2=$((h * 528 / 1000))
        y3=$((h * 491 / 1000))
        y4=$((h * 454 / 1000))
        y5=$((h * 417 / 1000))
        
        # 3. 「動かないスワイプ」を実行 (75ミリ秒 = 0.075秒 押す)
        # tapではなくswipeを使い、始点と終点を同じにすることで「長押しタップ」になります
        input swipe $x $y1 $x $y1 75; sleep 0.2
        input swipe $x $y2 $x $y2 75; sleep 0.2
        input swipe $x $y3 $x $y3 75; sleep 0.2
        input swipe $x $y4 $x $y4 75; sleep 0.2
        input swipe $x $y5 $x $y5 75
        
      4. เปลี่ยนการตั้งค่า Execution Mode ที่ด้านล่างเป็น ADB

        (※ สำคัญ: ADB จะไม่ทำงานหากไม่ได้เชื่อมต่อกับ Shizuku นอกจากนี้ แอปอย่าง Uber Eats จะไม่สามารถแตะได้ในโหมด "Standard")

      5. เมื่อตั้งค่าเสร็จแล้ว ให้แตะ Done ที่มุมขวาล่างเพื่อบันทึก Shell command

      6. จากนั้นกลับไปที่หน้าจอตั้งค่าคำสั่ง แล้วกด Done ที่มุมขวาล่างอีกครั้งเพื่อบันทึกคำสั่ง

  6. การยกเลิกการเปลี่ยนระดับเสียง (สำคัญมาก) และการบันทึก:

    ตรวจสอบให้แน่ใจว่าได้ทำเครื่องหมายถูก (เปิดใช้งาน) ที่ "Bypass" ซึ่งอยู่ที่ด้านล่างของหน้าจอกฎหรือในการตั้งค่า (Settings) สิ่งนี้จะทำให้เกิดสถานะที่ "ระดับเสียงของเครื่องจริงจะไม่เปลี่ยนแม้จะกดปุ่มทริกเกอร์ก็ตาม" เมื่อตรวจสอบเรียบร้อยแล้ว ให้แตะ Done ที่มุมขวาล่างของหน้าจอเพื่อบันทึกการตั้งค่า

  7. การตรวจสอบการทำงานของ Key Mapper (สำคัญ):

    เพื่อให้ Key Mapper ทำงานได้อย่างถูกต้อง จำเป็นต้องเปิด สวิตช์การทำงานทั้ง 2 จุด ให้เป็น ON

    • การเปิดใช้งานมาโครเฉพาะ: ตรวจสอบว่า Enabled ที่มุมขวาบนของรายการมาโครที่บันทึกไว้เป็น ON หรือไม่

    • การเปิดใช้งานตัว Key Mapper เอง: ตรวจสอบว่า Running ↔️ Paused ที่ด้านบนของหน้าจอหลักเป็น Running หรือไม่

      หากไม่เปิดทั้งสองจุด ปุ่มกดทางกายภาพจะไม่ตอบสนอง

ทำตามขั้นตอนเดียวกันนี้เพื่อสร้างกฎสำหรับ "ปุ่ม 2 (ลดเสียง)" หรือ "การกดพร้อมกัน (เล่น/หยุดชั่วคราว)" ตามลำดับ

6-5. การปรับแต่ง: สู่เครื่องมือสุดแกร่งในแบบของคุณเอง

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

  • การเปลี่ยนทริกเกอร์หรือคำสั่ง: ลองเปลี่ยนปุ่มที่ใช้ตั้งค่า "ทริกเกอร์" หรือเปลี่ยนรายการคำสั่งเพื่อตั้งค่าเป็นการเปิดแอปพลิเคชัน (เช่น เปิด Google Maps) และทดลองใช้งานในรูปแบบต่างๆ

  • การปรับพิกัดของ Shell command: ในโค้ดวิธี B ครั้งนี้ เราคำนวณพิกัด X, Y เป็น % (เปอร์เซ็นต์) เทียบกับขนาดหน้าจอ หากคุณเปลี่ยนตัวเลข คุณจะสามารถเปลี่ยนตำแหน่งการแตะได้อย่างอิสระ และเนื่องจากเป็นการระบุเป็น % จึงง่ายต่อการปรับใช้แม้จะเปลี่ยนไปใช้เครื่องอื่น แน่นอนว่าคุณสามารถระบุเป็นพิกเซล (px) โดยตรงได้เช่นกัน

  • ความได้เปรียบด้านความเร็วในการประมวลผล: การใช้ Shell command เพื่อตั้งค่าพิกัดและแตะ จะให้ความเร็วในการประมวลผลที่เร็วกว่าการใช้ฟังก์ชันการแตะพิกัด X, Y มาตรฐานของ Key Mapper อย่างเห็นได้ชัด

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

  • การตั้งค่าที่แนะนำ: ขอแนะนำอย่างยิ่งให้ตั้งค่าปุ่มอื่นเพื่อใช้คำสั่ง "กลับไปยังแอปนำทาง (เช่น Google Maps)" หลังจากได้รับงานในขณะขับขี่

7. ข้อควรระวังและข้อจำกัดในการใช้งาน (เกี่ยวกับคุณสมบัติกันน้ำ)

อุปกรณ์นี้ถูกออกแบบมาเพื่อใช้งานในสภาพแวดล้อมที่สมบุกสมบัน แต่ก็มีข้อจำกัดทางโครงสร้าง

ไม่สามารถกันน้ำได้ 100%

คุณสามารถเพิ่มคุณสมบัติกันน้ำให้กับพื้นผิวของแผงวงจรได้โดยการทาสเปรย์เคลือบแผงวงจรหรือยาทาเล็บ อย่างไรก็ตาม เนื่องจากพอร์ต USB Type-C สำหรับชาร์จยังคงเปิดโล่งอยู่ จึงไม่สามารถปิดผนึกอุปกรณ์ทั้งหมดได้อย่างสมบูรณ์

หากจำเป็นต้องใช้งานในขณะฝนตก โปรดถือเป็นหลักการสำคัญว่าต้อง ติดตั้งไว้ภายในที่ครอบแฮนด์รถจักรยานยนต์ หรือใช้งานใน สภาพแวดล้อมที่มีหลังคา เท่านั้น หากน้ำเข้าทางพอร์ตเชื่อมต่อ อุปกรณ์จะเกิดไฟฟ้าลัดวงจรและเสียหายทันที

8. ข้อมูล STL สำหรับการพิมพ์ 3 มิติ (100 เยน)

เรามี ไฟล์ข้อมูล STL สำหรับการพิมพ์ 3 มิติ ของเคสที่แนะนำในบทความนี้จำหน่ายบน BOOTH ข้อมูลนี้ถูกออกแบบมาโดยเฉพาะเพื่อให้บอร์ดและแบตเตอรี่ประกอบกันได้อย่างพอดีในระดับมิลลิเมตร

หากคุณมีเครื่องพิมพ์ 3 มิติ สามารถดาวน์โหลดข้อมูลไปพิมพ์และใช้งานด้วยตัวเองได้เลย

【ข้อควรระวังก่อนสั่งซื้อ】 เคสนี้ได้รับการปรับขนาดให้เหมาะสมที่สุดสำหรับส่วนประกอบที่ระบุไว้ในคู่มือนี้ (โดยเฉพาะ Kailh Choc Brown และเทปกาวสองหน้าแบบเจลหนา 1.8 มม.) โปรดทราบว่าหากคุณใช้สวิตช์ที่แตกต่างออกไป หรือใช้เทปที่มีความหนาต่างกัน หรือมีสภาพแวดล้อมในการประกอบที่แตกต่างกัน ชิ้นส่วนอาจไม่สามารถประกอบเข้ากันได้พอดีและอาจไม่สามารถใช้งานได้

9. ความเป็นไปได้ที่ไร้ขีดจำกัด: สู่การแฮ็กครั้งต่อไป

ปุ่มนี้เดิมทีถูกออกแบบมาเพื่อใช้จัดการการ "รับ" หรือ "ปฏิเสธ" ออเดอร์ในการส่งอาหาร เพื่อให้สามารถดำเนินการได้ทันทีโดยไม่ต้องมองหน้าจอแม้ในขณะที่ฝนตก อย่างไรก็ตาม เมื่อคุณได้รับ "Physical Trigger" ที่ใช้งานได้หลากหลายแล้ว ขอบเขตการประยุกต์ใช้งานก็จะขยายออกไปอย่างไร้ขีดจำกัด

  • การเรียกใช้งาน AI ทันที: ใช้เป็นสวิตช์ทางกายภาพเพื่อเปิดโหมดป้อนข้อมูลด้วยเสียงหรือ API ของ ChatGPT ฯลฯ ได้ในทันที

  • การควบคุม IoT และสมาร์ทโฮม: เชื่อมต่อกับ Tasker ฯลฯ เพื่อควบคุมเครื่องใช้ไฟฟ้าจากระยะไกล หรือใช้เป็นทริกเกอร์สำหรับเรียก Webhook

  • การเล่นเกม: ใช้เป็นคอนโทรลเลอร์แบบกำหนดเองสำหรับเกมเฉพาะ โดยใช้โค้ดจัดการความหน่วงในการป้อนข้อมูลที่เป็นเอกลักษณ์

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

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