หน้าแรก ดูโปรเจกต์ทั้งหมด
Hard

โปรเจกต์ อุปกรณ์วัด Angle และ Distance โดยใช้ Arduino

Project นี้สาธิตการ interfacing ของ Accelerometer (ADXL335) กับ Arduino และการ calibrating เพื่อวัด Angle จาก reference plane

โปรเจกต์ อุปกรณ์วัด Angle และ Distance โดยใช้ Arduino

รายละเอียดและวิธีทำ

อุปกรณ์ที่จำเป็น:

Arduino (Atmega8),

ADXL335 Accelerometer,

HCSR04 Ultrasonic Module และ 16x2 LCD

โปรเจกต์นี้สาธิตการ interfacing ของ Accelerometer (ADXL335) กับ Arduino และการทำ calibrating เพื่อวัดค่า Angle จากระนาบอ้างอิง รวมถึงการวัดระยะห่างจากวัตถุในแนวเส้นสายตา (line of sight)

ข้อมูลจาก Sensor จะถูกส่งไปยัง Arduino (Analog Input) เพื่อประมวลผล จากนั้นค่าที่ได้จะถูกแสดงผลบน 16x2 LCD

ADXL335

ADXL335 คือ 3-axis accelerometer ที่มี output แบบ analog จาก Analog Devices โดยมีช่วงการวัดความเร่งอยู่ที่ +/- 3 g

แรงดัน Voltage ที่ IC-ADXL335 ต้องการโดยปกติคือ 3.3V แต่ตัว module มี regulator บนบอร์ด ซึ่งช่วยให้สามารถเชื่อมต่อกับแหล่งจ่ายไฟ 5V ได้ และเป็นอุปกรณ์ที่ใช้พลังงานต่ำมาก (Low-Power)

Module นี้มี 5 Pins ได้แก่ VCC(5V), GND และ X, Y, Z โดย Pins X, Y, Z จะให้ค่าความเร่งในรูปของ Voltage ซึ่งมีความไว (sensitivity) ปกติอยู่ที่ 300mV สัญญาณ Analog บน Pins เหล่านี้จะถูกเปลี่ยนเป็น Digital (Digitized) โดยใช้ ADC ของ Arduino และทำการ calibration ที่จำเป็นผ่าน Software

HCSR04 Ultrasonic Sensor Module:

Sensor module นี้มี 4-pins โดยที่ Pin-1 และ Pin-4 คือ +Vcc และ Gnd ตามลำดับ

Pin-2 คือ Trigger และ Pin-3 คือ Echo pin

การทำงานของ sensors สามารถอธิบายได้จากรูปด้านล่าง:

เมื่อมีการส่งสัญญาณ High pulse ขนาด 10us ไปยัง TRIG pin ตัวส่งสัญญาณ ultrasonic จะส่งคลื่นความถี่ 40kHz ออกไป 8 pulses ต่อเนื่องกัน

เมื่อส่ง pulses ที่แปดออกไป ECHO pin ของ sensor จะกลายเป็น HIGH

และเมื่อคลื่น ultrasonic สะท้อนจากพื้นผิวใดๆ กลับมายังตัวรับ (Receiver) ECHO pin จะกลายเป็น LOW

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

ระยะทางในหน่วยเซนติเมตร = (Time/58) cms

16x2 LCD:

16x2 alphanumeric LCD สามารถแสดงตัวอักษรได้ 16 ตัวในแต่ละแถว และมีทั้งหมดสองแถว ในการ interface กับ LCD เราจำเป็นต้องรู้เกี่ยวกับ internal registers และฟังก์ชันของ pin ต่างๆ

LCD มี register สำคัญสองตัวคือ command register และ Data register ทั้งคู่เป็น 8-bit registers โดย command register จะใช้สำหรับเขียนคำสั่งต่างๆ จากผู้ใช้ ซึ่งคำสั่งเหล่านี้ทำหน้าที่ควบคุมการทำงานของ LCD

ส่วน Data register จะถูกโหลดด้วยค่า ASCII ของข้อมูล (ตัวอักษร/ตัวเลข ฯลฯ) ที่ต้องการแสดงผล

Register ทั้งสองสามารถเข้าถึงได้ผ่าน 8-bit Data Line (D0-D7) และมีสายสัญญาณเลือกหนึ่งสายคือ R/S Pin ใน LCD Module ซึ่งทำหน้าที่เลือกระหว่าง register ทั้งสองนี้

R/S=0à Command Register

R/S=1à Data Register

นอกจาก R/S แล้ว ยังมีอีกสอง Pins คือ R/W และ EN

EN pin ใช้สำหรับ enable (1) หรือ disable (0) การทำงานของ LCD

R/W ใช้สำหรับเลือกการทำงาน ‘Read from LCD’ หรือ ‘Write to LCD’ ซึ่ง Logic 0 ที่ R/W หมายถึงการ Write และ 1 หมายถึงการ Read

นอกจาก pins เหล่านี้ สอง Pins สุดท้าย (15 และ 16) บน LCD คือ Backlight และ pins 1, 2, 3 คือ GND, +VCC และ +VEE (การปรับ contrast) ตามลำดับ

มีคำสั่งต่างๆ มากมายที่ต้องส่งไปยัง LCD เพื่อทำการ Initialize ให้ทำงานตามต้องการ คำสั่งเหล่านี้แสดงอยู่ในรายการด้านล่าง

การทำงาน

ค่า output ของ sensor ในตำแหน่งต่างๆ (ดังที่แสดงในรูป) ช่วยในการหาค่า sensitivity และค่าอ้างอิงของ ADC ในตำแหน่งที่ 1 ในรูป X-pin จะให้ voltage ที่สอดคล้องกับ -1g ส่วน Y และ Z จะสอดคล้องกับ 0g ในทำนองเดียวกัน สำหรับตำแหน่งอื่นๆ ค่าของ X, Y และ Z จะให้ analog voltage ที่สอดคล้องกัน

ค่า Analog Voltage เหล่านี้จะถูกส่งไปยัง Analog Input Pins ของ Arduino (เช่น A1, A2, A3) โดย ADC เป็นแบบ 8-bit และมีความละเอียด (resolution) 10 bit

ส่วนต่าง Voltage (range) ระหว่าง +1G และ -1G หารด้วย 2 จะเป็นค่าความไว (‘sensitivity_x’ ในสูตรด้านล่าง) และ Voltage ที่สอดคล้องกับ 0g จะให้ค่าแรงดัน ‘Zero’ (zero_x ในสูตรด้านล่าง) ค่า ‘Zero’ และค่า sensitivity จะแตกต่างกันไปตาม sensor แต่ละตัว ดังนั้นจึงต้องหาค่าโดยการลองผิดลองถูก (trial and error)

ค่าอ้างอิง ADC คือ 3.3V (จ่ายจากภายนอกจากบอร์ด) สูตรสำหรับคำนวณความเร่งในแกน ‘x’ คือ:

Xg=(value_x/1024) * (ADC_ref – zero_x) / (sensitivity_x)

ในทำนองเดียวกัน สามารถคำนวณ Yg ได้โดยใช้ค่า value_y, sensitivity_y และ zero_y สำหรับ ‘Y’ และทำแบบเดียวกันสำหรับ Zg

หมายเหตุ: หากทิศทางของแกนรับสัญญาณตรงกับทิศทางของแรงโน้มถ่วง ผลการวัดจะเป็นลบ (-1 g)

การวัดค่าความเอียง (Tilt)/ความลาดชัน (Slope)/มุม (Angle)

ในการคำนวณ Tilt/angle จากระนาบแนวนอน (XY Plane) เราจะใช้ฟังก์ชัน ‘arctangent’ หรือ ‘atan2’

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

สำหรับจำนวนจริงใดๆ (เช่น floating point) argument x และ y ที่ไม่เป็นศูนย์พร้อมกัน atan2(y,x) คือมุมในหน่วย radians ระหว่างแกน x ที่เป็นบวกของระนาบกับจุดที่กำหนดโดยพิกัด (x, y) บนระนาบนั้น (wikipedia)

ในที่นี้ เราจำเป็นต้องคำนวณมุมจากระนาบ XY โดยแนวราบคือแกน y และแนวตั้งคือแกน z ดังนั้นสูตรจึงกลายเป็น:

angle = atan2(-yg, -zg);

เนื่องจากค่าที่ได้อยู่ในหน่วย radians จึงต้องแปลงเป็น degrees โดยคูณด้วย 180/π ซึ่งคือ 57.295

นอกจากนี้ยังมีการบวก 180° เพื่อปรับค่าเริ่มต้น สูตรจึงกลายเป็น:

angle =atan2(-yg, -zg)*57.2957795+180;

ค่าที่ได้จะถูกแสดงบน 16x2 LCD Display

เพื่อความสะดวกในส่วน User Interface ได้มีการต่อ switch เพื่อควบคุม LCD ในการเลือกสิ่งที่ต้องการแสดงผลบนหน้าจอ เช่น เมื่อ switch เปิด (ON)à จะแสดงค่า Acceleration และเมื่อ switch ปิด (OFF) à จะแสดงค่า Angle/Tilt และ Distance.

LCD ถูกเชื่อมต่อในโหมด 4-bit โดยใช้ library มาตรฐานของ Arduino

ทำการเชื่อมต่อดังนี้:

· Pins X, Y และ Z ของ Accelerometer เชื่อมต่อกับ Analog Input Pins 1, 2 และ 3 ตามลำดับ

· ‘AREF’ เชื่อมต่อกับ 5V

· Pins D4, D5, D6 และ D7 ของ LCD เชื่อมต่อกับ Digital Pins 5, 4, 3 และ 2 ของ Arduino

· RS และ EN pins เชื่อมต่อกับ Pin 12 และ Pin 11 ของ Arduino

· RW pin ของ LCD เชื่อมต่อกับ GND

Switch เชื่อมต่อกับ Digital Pin 1 และมีการต่อตัวต้านทานจำกัดกระแส (10k) ร่วมด้วย

หมายเหตุ

กำหนดค่า Sensitivity และ Zero ตามค่า output ของ sensor ที่วัดได้จาก multimeter ฯลฯ เนื่องจากค่าที่ใช้ในที่นี้อาจแตกต่างกันไปตาม sensor แต่ละตัว

ADC_ref สามารถเปลี่ยนเป็น 3.3V ได้เช่นกัน แต่ต้องเปลี่ยนค่า ‘Zero’ ให้สอดคล้องกัน

สามารถคำนวณมุมจากระนาบอื่นๆ ได้เช่นกัน สำหรับการคำนวณมุมจากแกน x เมื่อ y อยู่ในแนวตั้ง สูตรจะเป็น:

angle= atan2(-yg, -xg)*57.2957795+180 //มุมจากแกน x

ในทำนองเดียวกัน สามารถคำนวณมุมจากแกน y ได้เช่นกัน

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: angle-and-distance-measurement-device-using-arduino-0ec66b
1120 บาท
PromptPay QR Code

ประเมิน Project

อยากได้งานคล้ายโปรเจคนี้? กดไปหน้าประเมินราคา

เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า

รีวิวจากคนใช้งานจริง

รีวิวจากลูกค้าและคนที่เคยใช้งาน

ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย

กำลังโหลดรีวิว...