วันนี้เรามาดูการใช้งานโมดูล GํY-80 เพื่อวัดค่าความเร่ง (Acceleration) ความเร็วเชิงมุม (Angular Speed) ระดับความสูง (ฺBarometer) สนามแม่เหล็กของโลก (Magnetometer) กันครับ
อ่านครั้งแรกอาจจะเห็นว่าทำไมหลายอย่างจัง แต่ทั้งหมดนี้อยู่บนโมดูลขนาดเท่าข้อนิ้วโป้งเราเองครับ Sensor แต่ละอย่างเท่าเม็ดถั่วเขียวเท่านั้น ทำให้สามารถบรรจุ อุปกรณ์ที่วัดค่าดังที่กล่าวมาได้ทัั้งหมดในโมดูลเดียวกันเลย โมดูล GํY-80 นี้ใน spec เขียนว่ามี 10 Degree of Freedom (DOF) ซึ่งประกอบด้วย ความเร่ง 3 แกน ความเร็วเชิงมุม 3 แกน สนามแม่เหล็ก 3 แกน และ ความสูง ครับ
การใช้งานนี้ก็มีตั้งแต่ Tablet Ipad Iphone Smart phone ของเรา remote Game Wii เครื่องบินบังคับวิทยุ multirotor Helicopter ไปจนกระทั้งระบบนำทางของเครื่องบิน ดาวเทียม ทั้งนี้ก็ขึ้นกับคุณภาพของ Sensor ว่าจะมีความแม่นยำ สัญญาณรบกวย (SN ratio) มากน้อยแค่ไหน แน่นอนครับ ในโทรศัพท์มือถือก็อาจจะเป็นรุ่นที่มีราคาถูกหน่อย แต่ถ้าใช้นำร่องเครื่องบินแล้วคงจะแพงมากๆครับ
การวัดค่าความเร่ง ความเร็วเชิงมุม สนามแม่เหล็ก นั่้นเอาไปทำอะไรเหรอครับ คำตอบคือเอาไปหาทิศทาง ลักษณะการวางตัวของ Rigid body ต่างๆ การหามุมต่างๆ เช่น Roll Pitch Yaw ของเครื่องบิน หรือวัตถุที่ต้องการครับ ถ้าเอาตัวอย่างที่ใกล้ตัวหน่อยก็คือ โทรศัพท์มือถือของเรารู้ได้ไงว่ามันเอียงไปทางไหน เขย่าเมื่อไหร่ คว่ำหรือหงายอยู่ หรือ เวลาเล่นเกมส์ที่ต้องใช้การเอียง เช่น Fligh simulator ครับ อุปกรณ์ไฟฟ้าที่ใช้ในการหาทิศทาง มุม และการเคลื่อนที่นี้ เรียกรวมๆ กันว่า Inertial Measurement Unit (IMU) ครับ
ทีนี้มาดูกันครับว่าแต่ละตัวมีรายละเอียดอะไรบ้าง ลองดูภาพประกอบด้านล่างนะครับ
อุปกรณ์ทั้งหมดนี้บางตัวสามาถคุยแบบ (Serial Peripheral Interface) SPI ก็ได้ และ (Inter - Integrated Circuit) I2C ก็ได้ แต่บางตัวก็ได้แค่ I2C ดังนั้น อุปกรณ์บนโมดูลนี้จึงต้องสารกับบอร์ด Arduino ด้วย I2C ทีมีมาให้ใน library มาตรฐาน (wire.h) ครับ
ทีนี้ปัญหาก็เกิดขึ้นตรงที่เราจะต้องติดต่อกับอุปกรณ์ต่างๆบนบอร์ดด้วย I2C ที่อยู่บนบัสเดียวกัน 3 ตัว ดังนั้นเราต้องทำให้มันคุยกันให้ดีครับ ต้องรู้ Address ของแต่ละอุปกรณ์ ต้องรู้วิธีการปรับตั้งค่าการทำงานของอุปกรณ์ ซึ่งหาได้จาก Specification ครับ แต่จะบอกให้นิดครับ กว่าจะอ่านเข้าใจและเอาไปใช้ได้แต่ละตัว ก็เหงื่อหยดกันทีเดียว ไม่เป็นไรครับ เรามีวิธีแก้ไข วิธีแรกคืออ่านบทความนี้ให้เข้าใจ และใช้ Library กับตัวอย่างที่จะให้ไปครับ
มาดูการทำงานของ ADXL345 Accelorometer กันก่อนครับ อุปกรณ์ตัวนี้วันค่าความเร่งได้ถึง +-16g ด้วยความละเอียดถึง 13 bit มีรายละเอียดให้ Setup registor กันมากมายเป็นสิบตัว สำหรับผู้ใช้แบบ Advanced แล้ว คงต้องลงไปดูกันเองครับว่ามันใช้แต่ละ registor ทำอะไรกันบ้าง สำหรับบทความนี้ผมขอเขียนสำหรับผู้ใช้งานทั่วไปกันนะครับ แต่ก็เพียงพอสำหรับการใช้ประโยชน์สำหรับการคำนวณหาความเร่ง มุมเอียงครับ
อีกนิดนะครับ สำหรับคนที่สนใจใช้งานแต่ตัว ADXL345 เพื่อการหามุมเอียง หรือ แจ้งเตือนการตก (Detect free fall) นั้น โมดูล GY-291 ก็เพียงพอครับ ซึ่งความสามารถของ Chip ADXL345 ก็ทำได้ทั้ง SPI และ I2C ครับ ดังนั้นจึงเห็น Library ทั้งสองแบบให้ใช้งานได้ครับ แต่ผมจะให้ดูวิธีการต่อกับ GํY-80 นะครับ ดังนั้นวันนี้เราใช้ I2C กัน
รายละเอียดการทำงานของ Protocol I2C สามารถหาอ่านได้ในบทความของร้าน Arduitronics.com ตาม Link นี้ครับ (เราไม่ได้ขายของอย่างเดียวนะ )
ทีนี้มาถึงการต่อและลง Sketch กันละครับ ก่อนอื่นนะครับ
Download Library ตามนี้ครับ แล้วเอาเฉพาะ 4 ไฟล์นี้ไปใส่ใน Libarries ของ Arduino นะครับ ตั้งชื่อ Folder ของ Library นี้ว่า ADXL345
https://github.com/Anilm3/ADXL345-Accelerometer
ถ้าบังเอิญเปิด Arduino IDE อยู่ ลง Library เสร็จแล้วปิด IDE แล้วเปิดใหม่ด้วยนะครับ ไม่งั้นจะหาไม่เจอ
จากนั้นต่อสายแบบ I2C ตามที่แต่ละบอร์ดกำหนดนะครับ VCC กับ GND ตามระเบียบ จากนั้นใครใช้บอร์ดอะไรก็ต้องไปเช็คนิดนึงที่นี่ครับ ว่า I2C หรือ TWI Port ของแต่ละบอร์ดมันอยู่ที่ไหน เช่น Arduino UNO ก็อยู่ที่ A4 -> SDA A5 -> SCL (ถ้า UNO ก็ตามรูปด้านล่างเลยครับ)
เสร็จแล้วเข้าไปที่ Examples -> ADXL345 -> pitch_roll เพื่อเปิด Sketch ตัวอย่างครับ
มาดูรายละเอียดของ Sketch กันนิดนึงครับ จะเห็นว่ามีการเรียกใช้ wire.h ซึ่งเป็น library ที่ใช้ในการติดต่อแบบ I2C กับตัวอุปกรณ์ภายนอกทั้งหลาย จากนั้นมี ADXL345.h ซึ่งเป็น header file ที่เก็บข้อมูล Address ของ register ที่สำคัญ ซึ่ง Library ต้องการใช้ setup ภายใน
ข้อมูลก็จะถูกเรียกด้วยคำสั่ง acc.read(&Xg, &Yg, &Zg); ซึ่งจะอ่านค่าความเร่งมาเก็บไว้ที่ตัวแปรที่ Xg, Yg, Zg ผ่านการป้อน Address เข้าไปในฟังก์ชั่น
จากนั้นข้อมูลจะถูกผ่านไปที่ Low pass filter เพื่อกรองเอาความถี่สูงทิ้ง เนื่องจาก Sensor ให้ค่าที่มี noise ที่มีความถี่สูงมามากครับ ต้องกรองออกหน่อย
และเราสามารถหามุมเอียงได้จากความสัมพันธ์ของตรีโกณมิติ
//Roll & Pitch Equations
roll = (atan2(-fYg, fZg)*180.0)/M_PI;
pitch = (atan2(fXg, sqrt(fYg*fYg + fZg*fZg))*180.0)/M_PI;
ซึ่งก็จะเห็นตัวเลขแสดงความเอียง roll และ pitch ตามรูปด้านล่างครับ
ลองเอียงพร้อมกับสังเกตตัวเลข และแกนที่ระบุบนตัวโมดูลนะครับ ว่ามันสัมพันธ์กันอย่างไร
หรือถ้าลองให้แสดงค่า G ที่วัดได้ตามแกน Z
Serial.print("G :");
Serial.println(fZg);
ก็จะเห็นช่วงที่อยู่นี่งๆ ว่าค่า G เป็น 1 เท่า (9.81 m/s^2)
แต่ถ้ายกขึ่้นเร็วๆ ก็จะเห็นค่า G เพิ่มขึ้น ในขณะที่ยกลงกลับมาที่เดิม จะเห็นค่า G ลดลงครับ
อันนี้ก็เหมือนกันกับเวลาเราขึ้นลิฟท์ละครับ ตอนขึ้นเหมือนตัวเราจะหนักขึ้น แต่ตอนลงก็เป็นตรงกันข้ามครับ
เอาละครับ วันนี้พอแค่นี้ เรายังมีอีกหลาย sensor บนตัว GY-80 แถมด้วยการใช้งานกับ Complementary filter และ Kalman filter กันอี่ก
ติดตามตอนต่อๆไปนะครับ
เราให้คำปรึกษาหลังการขายกับลูกค้าด้วยนะครับ
ติดต่อผ่าน facebook โทรศัพท์ หรือ line ได้ครับ
ไม่ได้คิดแต่จะขายของถูกๆ อย่างเดียวครับ
โดย Mountain A
www.facebook.com/arduitronics
หน้านี้เป็นสารบัญของบทความที่ปรากฏในเว็บของ Arduitronics.com นะครับ จะขอแบ่งออกเป็นหัวข้อตามกลุ่มของสินค้าในร้านดังต่อไปนี้
หน้าที่เข้าชม | 15,417,779 ครั้ง |
ผู้ชมทั้งหมด | 5,920,859 ครั้ง |
เปิดร้าน | 21 พ.ค. 2556 |
ร้านค้าอัพเดท | 3 ต.ค. 2568 |