กลับไปหน้ารวมไฟล์
diy-speedometer-using-arduino-and-processing-android-app-ebc20b.md

ในโปรเจคนี้ เราจะมาทำสปีดโดมิเตอร์เจ๋งๆ สำหรับมอเตอร์ไซค์หรือรถอะไรก็ได้ โดยใช้ Arduino ส่งค่าความเร็วผ่าน Bluetooth ไปยังแอพพลิเคชั่น Android ที่เราสร้างขึ้นด้วย Processing โปรเจคนี้ใช้พลังงานจากแบตเตอรี่ลิเธียม 18650 ทำให้พกพาไปติดกับยานพาหนะได้ง่ายมาก แถมเพื่อเพิ่มความเท่ให้อีกนิด พี่ได้เพิ่ม ฟังก์ชันชาร์จมือถือไปพร้อมๆ กับที่มันแสดงความเร็วให้ดูด้วย ใช่แล้ว น้องสามารถใช้เจ้านี่เป็นพาวเวอร์แบงค์ชาร์จมือถือระหว่างทางได้เลย เพราะ 18650 นี่ความจุสูง ชาร์จ-ปล่อยไฟง่ายมาก

พี่จะสอนน้องตั้งแต่เริ่มต้นจนเสร็จเป็นชิ้นงาน - พอเสร็จแล้วก็เอาไปติดกับรถของน้องได้เลย แล้วทดลองใช้ได้ทันที สิ่งที่เจ๋งมากคือ น้องสามารถปรับแต่งแอพ Android เองได้ตามสไตล์ และเพิ่มฟีเจอร์อื่นๆ ตามความคิดสร้างสรรค์ได้เต็มที่ แต่ถ้าน้องไม่อยากเขียนแอพเอง แค่อยากทำส่วน Arduino ก็ไม่ต้องกังวลไป - แค่ดาวน์โหลดไฟล์ APK (อ่านต่อด้านล่าง) ไปติดตั้งในมือถือ Android ก็ใช้ได้แล้ว อย่าลืมดูวิดีโอเต็มท้ายบทความด้วยนะ

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

สิ่งที่ต้องใช้ (ฮาร์ดแวร์):

  • Arduino Pro Mini (5V 16MHz)
  • บอร์ด FTDI (สำหรับโปรแกรมมิ่ง Mini จะใช้ UNO แทนก็ได้)
  • ตัวแปลงแรงดัน DC-DC Boost 3V เป็น 5V พร้อมช่องชาร์จ USB
  • โมดูลชาร์จแบตเตอรี่ลิเธียม TP4056
  • โมดูล Bluetooth (HC-05/HC-06)
  • เซ็นเซอร์ฮอลล์เอฟเฟกต์ (US1881/04E)
  • แบตเตอรี่ลิเธียมเซลล์ 18650
  • แม่เหล็กชิ้นเล็กๆ
  • เพิร์ฟบอร์ด
  • ขาคอนเนคเตอร์แบบเบิร์กสติ๊ก (ตัวผู้และตัวเมีย)
  • ชุดบัดกรี
  • กล่องพลาสติกเล็กๆ สำหรับใส่ชุดอุปกรณ์

สิ่งที่ต้องใช้ (สำหรับโปรแกรมมิ่ง):

  • Arduino IDE
  • Processing IDE พร้อม Android ADK (ใช้เฉพาะตอนอยากเขียนแอพเอง)
  • คอมพิวเตอร์ Windows/Mac
  • โทรศัพท์มือถือระบบ Android

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

วัดความเร็วด้วยเซ็นเซอร์ฮอลล์และ Arduino:

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

การวัดความเร็ว เราต้องติดแม่เหล็กชิ้นเล็กๆ เข้ากับล้อรถ ทุกครั้งที่แม่เหล็กหมุนผ่านเซ็นเซอร์ฮอลล์ มันจะตรวจจับได้และส่งข้อมูลไปยัง Arduino

Arduino จะได้รับอินเตอร์รัปต์ทุกครั้งที่ตรวจจับแม่เหล็กได้ เราจะใช้ฟังก์ชัน

millis()

เพื่อรันตัวจับเวลาต่อเนื่อง และคำนวณเวลาที่ล้อหมุนครบสองรอบ (เพื่อลดความคลาดเคลื่อน) โดยใช้สูตรนี้:

Timetaken = millis() – pevtime;

เมื่อรู้เวลาที่ใช้แล้ว เราก็คำนวณรอบต่อนาที (rpm) ได้ด้วยสูตรนี้:

rpm = (1000/timetaken) * 60;

โดยที่ (1000/timetaken) จะให้ค่าหมุนต่อวินาที (rps) แล้วเราคูณด้วย 60 เพื่อแปลงเป็นรอบต่อนาที (rpm)

หลังจากคำนวณ rpm แล้ว เราก็สามารถคำนวณความเร็วของยานพาหนะได้ด้วยสูตรด้านล่างนี้ (ถ้าเรารู้รัศมีของล้อ)

v= radius_of_wheel * rpm * 0.37699;

Arduino หลังจากคำนวณความเร็วได้แล้ว จะส่งค่าออกไปผ่านโมดูล Bluetooth โค้ดเต็มๆ อยู่ด้านล่างในส่วน Code แล้ว อย่าลืมไปดูโปรเจคอื่นๆ ของเราที่เกี่ยวกับโมดูล Bluetooth ด้วยนะ

รายละเอียดเทคนิคแบบจัดเต็ม: การคำนวณความเร็วเชิงเส้น (คณิตศาสตร์แบบ Interrupt)

โปรเจคนี้ดึงข้อมูลการหมุนออกมาจากโลกจริงเลยนะเว้ย! Arduino จะคำนวณความเร็วการหมุนของล้อแบบเป๊ะๆ โดยใช้เซ็นเซอร์ฮอลล์เอฟเฟกต์, เอาเส้นรอบวงมาคิดเลขต่อเพื่อหาค่า กิโลเมตรต่อชั่วโมง (km/h) แล้วส่งข้อมูลนั้นผ่านไปทาง Bluetooth Serial ต่อ

แม่เหล็กที่ติดบนซี่ล้อจักรยานจะผ่านหน้าเซ็นเซอร์ฮอลล์ (เช่น A3144) หนึ่งครั้งต่อการหมุนหนึ่งรอบ Arduino ใช้ฟังก์ชัน attachInterrupt() เพื่อบันทึกเวลาที่แม่เหล็กผ่านแบบเป๊ะๆ ด้วย micros() ผลต่างเวลาระหว่างการผ่านแต่ละครั้งคือคาบเวลาของการหมุนหนึ่งรอบพอดี ส่วนเส้นรอบวงของยางจักรยานขนาด 26 นิ้วมาตรฐานนั้นประมาณ 2.07 เมตร

สูตรคำนวณ: ความเร็ว (km/h) = (3600 * เส้นรอบวง) / TimeDifferenceSeconds

มาดูแนวคิดของคณิตศาสตร์แบบขับเคลื่อนด้วย Interrupt กัน:

volatile unsigned long lastPassTime = 0;
volatile unsigned long revolutionTime = 0;

void magnetPassISR() { unsigned long now = micros(); revolutionTime = now - lastPassTime; // เวลาเป็นไมโครวินาทีต่อการหมุนหนึ่งรอบ lastPassTime = now; }

void loop() { // แปลงไมโครวินาทีเป็นชั่วโมง แล้วเอามาคิดเลขต่อ! float rpm = 60000000.0 / revolutionTime; float speedKmh = (rpm * 2.07 * 60) / 1000.0;

BTSerial.println(speedKmh); // ส่งค่าทศนิยมไปให้มือถือ Android! delay(250); // ป้องกันบัฟเฟอร์ล้น! }

แผนภาพวงจรและส่วนฮาร์ดแวร์:

แผนภาพวงจรสมบูรณ์ของโปรเจคมีดังนี้:

Speedometer-using-Arduino-and-Processing-Android-app-circuit-diagram

ในที่นี้ ส่วนฮาร์ดแวร์แบ่งเป็นสองบอร์ด บอร์ดแรกคือเมนบอร์ดที่มีไฟล์หลักทั้งหมด อีกบอร์ดมีแค่เซ็นเซอร์ฮอลล์กับตัวต้านทาน (Resistor) ซึ่งจะติดตั้งไว้ใกล้ล้อ เริ่มต้นด้วย การประกอบเมนบอร์ดกันก่อน

เมื่อต่อสายครบแล้ว ลองทดสอบการติดตั้งด้วย แบตเตอรี่ลิเธียม 18650 แบตเตอรี่ลิเธียมมีธรรมชาติที่ระเบิดง่ายมาก ดังนั้นต้องระวังให้ดี นี่คือเหตุผลที่เราใช้ โมดูลชาร์จแบตเตอรี่ลิเธียม TP4056 โมดูลนี้มีระบบป้องกันการชาร์จเกิน/คายประจุเกิน และป้องกันการต่อขั้วกลับ ดังนั้นเราจึงชาร์จแบตเตอรี่ได้ง่ายๆ ด้วยชาร์จเจอร์ micro USB ทั่วไป และคายประจุได้อย่างปลอดภัยจนกว่าจะถึงขีดจำกัดแรงดันต่ำสุด รายละเอียดสำคัญของโมดูลชาร์จ TP4056 แสดงในตารางด้านล่าง

พารามิเตอร์ ----- ค่าต่อเซลล์

แรงดันตัดเมื่อต่ำเกิน ----- 2.4V

แรงดันตัดเมื่อสูงเกิน ----- 4.2V

กระแสชาร์จ ----- 1A

การป้องกัน: ป้องกันแรงดันเกินและป้องกันการต่อขั้วกลับ

IC ที่ใช้: TP4056 (IC ชาร์จเจอร์) และ DW01 (IC ป้องกัน)

ไฟ LED แสดงสถานะ:

  • แดง - กำลังชาร์จ
  • เขียว – ชาร์จเสร็จแล้ว

ทีนี้มาดูที่ บอร์ดเซ็นเซอร์ฮอลล์ บอร์ดนี้มีแค่สองชิ้นส่วน: ตัวต้านทาน (Resistor) 10K กับเซ็นเซอร์ฮอลล์ ต่อสายตามแผนภาพวงจรด้านบนได้เลย พอบอร์ดพร้อมแล้ว ก็ต่อด้วยสายจัมเปอร์ตามแผนภาพ พอเสร็จแล้วควรออกมาหน้าตาประมาณนี้

อีกขั้นตอนสำคัญของโปรเจคคือ การต่อแบตเตอรี่ 18650 เข้ากับขั้ว B+ และ B- ของโมดูล TP4056 ด้วยสายไฟ เนื่องจากเซลล์ลิเธียมไอออนระเบิดง่าย ไม่แนะนำให้ใช้หัวแร้งบัดกรีกับเซลล์เหล่านี้โดยตรง ถึงจะมีคนทำได้ แต่เสี่ยงมากและอาจจบไม่สวยได้ง่ายๆ วิธีง่ายๆ คือใช้แม่เหล็กช่วยดึงสายไฟดังรูปด้านล่าง:

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

โปรแกรมมิ่ง Arduino:

โค้ดโปรเจคนี้โคตรง่ายเลยน้อง เราก็แค่คำนวณความเร็วของล้อที่หมุนโดยใช้สัญญาณอินเตอร์รัพต์จากเซ็นเซอร์ฮอลล์ แล้วส่งความเร็วที่คำนวณได้ผ่านอากาศด้วยโมดูลบลูทูธ **โค้ดเต็มๆ อยู่ด้านล่างในส่วน Code** นะ มีคอมเมนต์อธิบายไว้ให้แล้ว

ทุกครั้งที่เซ็นเซอร์ฮอลล์ตรวจจับแม่เหล็กได้ มันจะทริกอินเตอร์รัพต์ขึ้นมา ฟังก์ชันอินเตอร์รัพต์นี้จะถูกเรียกโดยฟังก์ชัน magnet_detect()
*นี่แหละจุดที่เราคำนวณค่า rpm ของยานพาหนะ*

พอได้ค่า rpm แล้ว เราก็จะไปคำนวณความเร็วเชิงเส้นของล้อในฟังก์ชัน loop ()
พอโค้ดพร้อมแล้ว ก็อัพโหลดลง Arduino Pro Mini ของเราเลย แล้วทดสอบว่ามันทำงานได้มั้ย ตามในวิดีโอท้ายบทความเลยจ้า

แอปพลิเคชันมือถือ Android สำหรับสปีดโดมิเตอร์:

แอป Android สำหรับโปรเจคนี้สร้างด้วยซอฟต์แวร์ชื่อ Processing ถ้าน้องไม่อยากสร้างแอปเอง อยากติดตั้งแอปที่ใช้ในบทความนี้ไปเลย ก็ดาวน์โหลดไฟล์ APK ไปติดตั้งลงสมาร์ทโฟนได้เลย ตามขั้นตอนด้านล่างนี้

1. **ดาวน์โหลดไฟล์ APK ได้จากลิงก์ด้านล่างเลย** ไฟล์ APK นี้สร้างสำหรับ Android เวอร์ชัน 4.4.2 ขึ้นไป (Kitkat ขึ้นไป) ดาวน์โหลดมาแล้วก็แตกไฟล์ zip ออกมาเอาไฟล์ .APK นะ

2. ย้ายไฟล์ .APK จากคอมพิวเตอร์ไปยังมือถือของน้อง

3. เปิดการตั้งค่า "อนุญาตการติดตั้งแอปจากแหล่งที่ไม่รู้จัก" (Unknown sources) ในเครื่อง Android ของน้อง

4. ติดตั้งแอปพลิเคชัน

ถ้าติดตั้งสำเร็จ น้องจะเห็นแอปชื่อ **"Processing_code"** อยู่ในเครื่องแล้ว ตามรูปด้านล่างเลย:

สร้างแอปพลิเคชันของตัวเองด้วย Processing:

น้องจะใช้ไฟล์ .APK ที่ให้ไว้ด้านบนก็ได้ หรือจะสร้างแอปของตัวเองด้วย Processing ตามที่อธิบายไว้ที่นี่ก็ได้ โค้ดแอปพลิเคชัน Android ที่เขียนด้วย Processing ทั้งหมดสามารถดาวน์โหลดได้ โปรแกรมมีคอมเมนต์อธิบายตัวเองไว้แล้ว แต่ถ้ามีปัญหาหรืออยากปรับแต่งแอปหน่อย ใช้ช่องคอมเมนต์ถามมาได้เลย เดี๋ยวรุ่นพี่ช่วย

EXPANDED TECHNICAL DETAILS: สร้างแอป Android ด้วย Processing

Arduino ของเราส่งแค่สตริงข้อมูลง่ายๆ เช่น "25.4" ส่วนสมาร์ทโฟนนี่แหละที่ทำหน้าที่เรนเดอร์กราฟิกส์หนักๆ! โดยใช้ **Processing IDE** ในโหมด Android ซึ่งน้องกำลังเขียน Java ดิบๆ อยู่เลย สเก็ตช์ Processing จะเปิด Bluetooth Socket, แยกวิเคราะห์สตริงที่เข้ามาจนเจอ newline '\n', แปลงเป็น Float, แล้วบังคับให้เข็มเสมือนบนหน้าปัดดิจิตอลขนาดใหญ่ที่เรนเดอร์บนหน้าจอมือถือกวาดไปตามค่าที่ได้!

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

  • เกมปิงปองด้วย Arduino และ Accelerometer
  • วิทยุ FM ควบคุมด้วยมือถือผ่าน Arduino และ Processing
  • ระบบเรดาร์ด้วย Arduino, Ultrasonic Sensor และ Processing

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

ติดตั้งชุดสปีดโดมิเตอร์เข้ากับยานพาหนะ:

พี่เคยติดตั้งชุดนี้กับจักรยานของพี่มาแล้ว ทดสอบแล้วเวิร์คสุดๆ การติดตั้งชุดนี้ก็ขึ้นอยู่กับความคิดสร้างสรรค์ของน้องเลย น้องสามารถหาตู้หรือกล่องเล็กๆ มาตัดเจาะรูสำหรับสายไฟและจุดต่อต่างๆ แล้วติดตั้งลงบนยานพาหนะได้เลย สิ่งสำคัญที่ต้องจำไว้คือ แม่เหล็กควรติดกับขอบล้อ และเซ็นเซอร์ฮอลล์ (Hall Sensor) ควรติดให้ใกล้แม่เหล็กมากที่สุด เพื่อที่ทุกครั้งที่แม่เหล็กผ่านหน้าเซ็นเซอร์ มันจะได้ตรวจจับได้ การจัดวางแสดงไว้ด้านล่าง

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

ถ้าน้องตัดสินใจใช้ไฟล์ดีไซน์ของพี่และพิมพ์กล่องของตัวเองออกมา ต้องแน่ใจว่าแผงวงจรหลัก (main perf board) ของน้องมีขนาดใกล้เคียงกับด้านล่างนี้

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

มาเริ่มกันที่ กล่องพิมพ์ 3D ขนาดเล็กสำหรับโมดูลเซ็นเซอร์ฮอลล์ ก่อน พิมพ์กล่องออกมา วางวงจรเข้าไป จัดสายไฟผ่านรูที่เตรียมไว้ แล้วติดตั้งลงบนยานพาหนะ โดยให้เซ็นเซอร์ฮอลล์อยู่ใกล้แม่เหล็กดังภาพด้านล่าง