การฝึกแบบอินเทอร์วอล (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)