กลับไปหน้ารวมไฟล์
gymgeneral-a-sports-interval-timer-7e1337.md

การฝึกแบบอินเทอร์วอล (Interval training) คือการออกกำลังกายเป็นช่วงๆ สลับกับช่วงพัก มีโปรแกรมให้เลือกหลายแบบ ที่ดังสุดๆ ก็คงเป็น Tabata[1] ที่ทำหนัก 20 วินาที พัก 10 วินาที ทำทั้งหมด 8 รอบ รวมแล้วก็แค่ 4 นาทีเอง

การใช้จับเวลาด้วยนาฬิกาจับเวลาธรรมดามันเสี่ยงพลาด เลยมีตัวจับเวลาเฉพาะทางออกมาให้ใช้กัน

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

วิธีแก้ของผมคือ เก็บข้อมูลอินเทอร์วอลเป็นไฟล์ .txt ลงใน SD Card แก้ไขได้ง่ายๆ ด้วยโปรแกรมทั่วๆ ไปอย่าง Notepad จากนั้นก็เสียบการ์ดเข้า GymGeneral เลือกไฟล์ที่ต้องการ แล้วก็รันได้เลย ง่ายมั้ยล่ะ!

การเชื่อมต่อ:

Data logging shield (SD card) ต่อเข้ากับ SPI bus แบบนี้: MOSI - pin 11 MISO - pin 12 CLK - pin 1 CS - pin 10

เซ็นเซอร์แบบสัมผัส (Touch sensors): ไฟบวกและกราวด์ต่อตามปกติ สายสัญญาณต่อกับ Arduino external interrupt pins 2 และ 3

LCD backpack: ไฟบวกและกราวด์ต่อตามปกติ, SDA ต่อกับ Arduino SDA และ SCL ต่อกับ Arduino SCL

Piezo sounder: ขาบวกต่อกับ Arduino PWM pin 9, ขาลบต่อกับกราวด์

อธิบายซอฟต์แวร์:

โปรเจกต์นี้คือการฝึกรีไซเคิลโค้ดนั่นแหละน้อง

เจ้า display backpack ใช้ไลบรารี NewLiquidCrystal และผมก็ใช้โค้ดตั้งค่าจากหน้าเดียวกัน[2] สำหรับจอของผมด้วย ระวังนิดนึง จอของผมเป็นรุ่นแปลกที่ใช้แอดเดรส 0x3F ส่วนใหญ่จะใช้ 0x27 ถ้าเปิดแล้วมืดสนิท ให้ลองหาและเปลี่ยนเลขนี้ก่อนเลย

ผมไม่เคยใช้ SD Card กับ Arduino มาก่อน เลยต้องไปลองเล่นกับตัวอย่าง Arduino ReadWrite tutorial[3] เพื่อหาวิธีอ่านข้อมูลจาก SD Card

ขั้นต่อไปก็ไปลองงัดโค้ดจาก Arduino Listfiles tutorial[4] มาดูว่าจะไล่ดูไฟล์ใน SD Card ยังไง

ผมก็คัดลอกโค้ดก้อนใหญ่ๆ จากตัวอย่างพวกนี้มาใส่โปรเจกต์ แล้วก็ปรับแต่งนิดหน่อยเอง คือเพิ่มโค้ดให้หลังจากอ่านไฟล์สุดท้ายแล้วให้วนกลับไปไฟล์แรกใหม่ และก็เปลี่ยนวิธีแสดงผลไฟล์นิดหน่อย

ระบบแสดงผลออกแบบมาแบบคร่าวๆ ตามแนวคิด model, view controller ไอเดียคือแยกส่วนแสดงผลและควบคุมออกจากตัวโปรแกรมหลัก ข้อเสียคือต้องใช้ตัวแปร global เป็นตัวสื่อสารระหว่างบล็อคโค้ดต่างๆ

ผมใช้ hardware PWM ในการสร้างเสียงจาก piezo sounder ตัวจิ๋ว ต่อเสียงกับ pin 9 ซึ่งความถี่ของ PWM output ของพินนี้ควบคุมโดย timer 1 เลือกพินนี้เพราะผมสามารถเปลี่ยนความถี่ PWM ได้โดยไม่กระทบกับฟังก์ชัน delay() ที่ทำงานด้วย timer 0[5]

การหน่วงเวลาจัดการด้วย Arduino delay() ผมคิดว่าในบริบทนี้ความแม่นยำระดับนี้ก็โอเคแล้ว[6] ยอมรับว่าถ้าโปรแกรมยาวๆ เวลาอาจจะเพี้ยนไปบ้างเพราะการอ่านไฟล์และโค้ดในลูป ผมไม่ได้พยายามวัดค่าความเพี้ยนนี้ไว้หรอก

ข้อมูลอินเทอร์วอลในไฟล์ข้อความจะถูกอ่านเป็นบล็อคๆ แต่ละบล็อคมีค่าจำนวนเต็ม 4 ค่า คั่นด้วยคอมม่า[7]

รูปแบบข้อมูล: <จำนวนรอบ>,<โทนเสียง>,<เวลาทำงาน (หน่วยหนึ่งในสิบวินาที)>,<เวลาพัก (หน่วยหนึ่งในสิบวินาที)>,

โทนเสียง ใช้ 1 สำหรับความถี่ต่ำ และ 2 สำหรับความถี่สูง

ตัวอย่าง: 20,2,1,9, = ทำซ้ำ 20 รวด ด้วยเสียงความถี่สูง, ทำงาน 1 ในสิบวินาที, พัก 9 ในสิบวินาที

ดังนั้นสำหรับโปรแกรม Tabata ไฟล์ข้อความจะมีหน้าตาแบบนี้: 20,2,1,9,10,1,1,9,20,2,1,9,10,1,1,9,20,2,1,9,10,1,1,9,20,2,1,9,10,1,1,9,20,2,1,9,10,1,1,9,20,2,1,9,10,1,1,9,20,2,1,9,10,1,1,9,20,2,1,9,

อาจจะอยากเพิ่มดีเลย์สั้นๆ ตอนเริ่มให้ตัวเองได้เตรียมตัว ผมมักให้เวลาตัวเอง 15 วิ เช่น 15,1,1,9,

แล้วก็ชอบเพิ่มเสียงบีปยาวๆ ตอนจบเพื่อบอกว่าออกกำลังกายเสร็จแล้ว เช่น 3,1,10,0, (เสียงต่ำยาว 3 วินาที)

วิธีใช้งาน:

จัดเก็บไฟล์กำหนดช่วงเวลา (interval files) ลงใน SD Card ให้เรียบร้อย

ใช้เซ็นเซอร์สัมผัส (touch sensor) ที่ต่อกับขา 2 ของ Arduino เพื่อเลื่อนเลือกไฟล์ที่ต้องการ (ไฟล์จะแสดงชื่อขึ้นมา)

เซ็นเซอร์สัมผัสอีกตัวทำหน้าที่เป็นปุ่ม "Enter" พอกดปุ๊บ ระบบก็จะเริ่มเล่นช่วงเวลาตามไฟล์ที่เลือก

ไม่มีฟังก์ชันหยุดนะจ๊ะ (ห้ามช็อตนะตัวนี้)

หมายเหตุ:

วงจรตัวอย่างในรูปใช้อ่าน SD Card รุ่นที่ต่างจากที่ผมใช้และเขียนไว้ด้านบน

ชื่อ "GymGeneral" นี่ ผมไปตรวจสอบเครื่องหมายการค้าแล้ว ทั้งที่ UK Intellectual Property Office และ USA trademark electronic search (TESS) ไม่เจอชื่อที่คล้ายกันเลย (ตรวจเมื่อ 7/ก.ย./2017)

ในโปรเจคของผม ผมใช้คำว่า "interval training" หมายถึง "high intensity interval training (HIIT)" แบบสุดๆ แต่จริงๆ แล้วการฝึกแบบช่วงเวลาที่นานกว่าก็จัดอยู่ในหมวดนี้ได้เหมือนกัน ตัวอย่างเช่น สัปดาห์แรกของโปรแกรม Couch to 5K จะเป็นการวิ่ง 1 นาที สลับพัก 90 วินาที ทั้งหมด 8 รอบ [8]

รายละเอียดทางเทคนิคเพิ่มเติม

เครื่องจับเวลาแบบฝึกความเข้มข้นสูง (HIIT Chronometer)

GymGeneral เป็นเครื่องจับเวลาที่ทนทานและมองเห็นได้ชัดเจน ออกแบบมาเพื่อจัดการฝึกแบบ CrossFit, มวย, หรือเวทเทรนนิ่ง

  • เมทริกซ์รอบที่ตั้งโปรแกรมได้: ผู้ใช้สามารถตั้งค่าเวลา "ออกแรง (Work)" เวลา "พัก (Rest)" และ "จำนวนรอบ (Number of Rounds)" ได้ผ่านปุ่มกดแบบ tactile ตัว Arduino จะจัดการนับถอยหลังแบบแม่นยำสูงโดยใช้ฟังก์ชัน millis()
  • ระบบแจ้งเตือนสองเสียง: มีเสียงสัญญาณแยกชัดเจนสองแบบ เสียงบี๊บสูงสั้นสำหรับ "เริ่ม" และเสียงบัซเซอร์ต่ำยาวสำหรับ "พัก" ทำให้นักกีฬารู้สถานะได้โดยไม่ต้องมองนาฬิกา

ส่วนแสดงผล

  • หน้าจอ Segment ขนาด 1.2 นิ้ว: ใช้จอแสดงผล 7-Segment ความสว่างสูง (ควบคุมผ่าน TM1637) มองเห็นได้ชัดจากระยะไกลในพื้นที่ยิมขนาดใหญ่ แม้ในสภาพแสงสว่างจ้า

อ้างอิง:

[1] https://en.wikipedia.org/wiki/High-intensity_interval_training#Tabata_regimen (เรียกดูเมื่อ 7/ก.ย./2017)

[2] https://arduino-info.wikispaces.com/LCD-Blue-I2C (เรียกดูเมื่อ 5/ก.ย./2017)

[3] https://www.arduino.cc/en/Tutorial/ReadWrite (เรียกดูเมื่อ 24/ส.ค./2017)

[4] https://www.arduino.cc/en/Tutorial/listfiles (เรียกดูเมื่อ 24/ส.ค./2017)

[5] https://playground.arduino.cc/Main/TimerPWMCheatsheet (เรียกดูเมื่อ 8/ก.ย./2017)

[6] https://forum.arduino.cc/index.php?topic=53579.0 Topic: Accuracy of Arduino delay() command (เรียกดูเมื่อ 5/ก.ย./2017)

[7] http://forum.arduino.cc/index.php?topic=277648.0 Topic: Reading SD card with CSV format into chars and ints (เรียกดูเมื่อ 8/ก.ย./2017)

[8] http://www.nhs.uk/Livewell/c25k/Pages/couch-to-5k-plan.aspx (เรียกดูเมื่อ 11/ก.ย./2017)

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "glennedi"
category: "Wearables, Health & Fitness"
components:
  - "1x Serial I2C LCD Backpack"
  - "2x TTP223B capacitive touch switch"
  - "1x 2*16 LCD display"
  - "1x Piezo sounder"
  - "1x Arduino UNO"
  - "1x Deek robot data logging shield v1.0"
description: "ตั้งค่าตึงๆ ด้วยไฟล์ .txt ไฟล์เดียว จัดไปเลยวัยรุ่น!"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/dedfb8d0-42a5-47dd-8edd-e06d279af080.ino"
  - "https://projects.arduinocontent.cc/dedfb8d0-42a5-47dd-8edd-e06d279af080.ino"
encryptedPayload: "U2FsdGVkX1/PeXCRBTO+EoCk1cb7l6ugblXgQHb/Y8HZjaJWdzOo7w72s1NhAYyufGtMfV69YKQvhItIFd3VMQHGFezhf5YaRg5RS6wON7s="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/gymgeneral-a-sports-interval-timer-7e1337_cover.jpg"
lang: "en"
likes: 4
passwordHash: "c77b427029ab8075edc4cda9cc6fb3ae73fa1b290552754292af634a7a18529a"
price: 2450
seoDescription: "GymGeneral: A sports Interval Timer with easy setup via .txt file. Perfect for gym workouts and training."
tags:
  - "sport"
  - "timer"
  - "health"
title: "GymGeneral - จับเวลาเวิร์คเอาท์แบบเทพๆ ง่ายๆ แต่หล่อ!"
tools: []
videoLinks: []
views: 11586