สารบัญ:

Arduino Atmospheric Tape Measure / MS5611 GY63 GY86 การสาธิต: 4 ขั้นตอน (พร้อมรูปภาพ)
Arduino Atmospheric Tape Measure / MS5611 GY63 GY86 การสาธิต: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Atmospheric Tape Measure / MS5611 GY63 GY86 การสาธิต: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Atmospheric Tape Measure / MS5611 GY63 GY86 การสาธิต: 4 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Altimeter using Arduino and GY63 board with MS5611 sensor 2024, กรกฎาคม
Anonim
Arduino บรรยากาศเทปวัด/ MS5611 GY63 GY86 สาธิต
Arduino บรรยากาศเทปวัด/ MS5611 GY63 GY86 สาธิต

นี่เป็นบารอมิเตอร์/เครื่องวัดระยะสูงจริงๆ แต่คุณจะเห็นสาเหตุของชื่อด้วยการดูวิดีโอ

เซ็นเซอร์ความดัน MS5611 ที่พบในบอร์ดฝ่าวงล้อม Arduino GY63 และ GY86 ให้ประสิทธิภาพที่น่าทึ่ง ในวันที่สงบ มันจะวัดส่วนสูงของคุณให้อยู่ภายใน 0.2 เมตร นี่คือการวัดระยะทางจากศีรษะของคุณไปยังพื้นที่รอบนอกอย่างมีประสิทธิภาพ และลบออกจากระยะห่างของเท้าของคุณไปยังพื้นที่รอบนอก (โดยการวัดความดัน - นั่นคือน้ำหนักของอากาศด้านบน) อุปกรณ์อันน่าทึ่งนี้มีช่วงที่สามารถวัดความสูงของเอเวอเรสต์ได้อย่างสบาย และยังสามารถวัดได้เหลือเพียงไม่กี่นิ้ว

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

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

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

โปรดทราบว่าบอร์ด GY63 มีเพียงเซ็นเซอร์ความดัน MS5611 GY86 เรียกว่ากระดานอิสระ 10 องศา และยังมีมาตรความเร่งแบบ 3 แกน ไจโร 3 แกน และเครื่องวัดค่าความเข้มข้นของสนามแม่เหล็กแบบ 3 แกนด้วยราคาที่จ่ายเพิ่มอีกเพียงไม่กี่เหรียญ

คุณจะต้องการ:

1. Arduino UNO (หรืออื่นๆ ที่มีพินเอาต์มาตรฐาน) และสาย USB

2. บอร์ดฝ่าวงล้อม GY63 หรือ GY86

3. 4 Dupont นำชาย - หญิง - หรือสายเชื่อมต่อ

4. แผงปุ่มกด Arduino LCD

5. แบตเตอรี่ 9v และตะกั่ว

6. แถบซ็อกเก็ต 2.54 มม. (อุปกรณ์เสริม แต่แนะนำ)

การตระเตรียม

ดาวน์โหลด Arduino IDE (สภาพแวดล้อมการพัฒนาแบบบูรณาการ) จาก:

เกร็ดความรู้ทางเทคนิคที่น่าสนใจ

MS5611 ให้ประสิทธิภาพที่ยอดเยี่ยมโดยการหาค่าเฉลี่ยของการวัดจำนวนมาก สามารถทำการวัดแบบอะนาล็อก 4096 3 ไบต์ (24 บิต) ในเวลาเพียง 8ms และให้ค่าเฉลี่ย ต้องวัดทั้งความดันและอุณหภูมิเพื่อให้สามารถแก้ไขข้อมูลความดันสำหรับอุณหภูมิภายในได้ ดังนั้นจึงสามารถอ่านค่าความดันและอุณหภูมิได้ประมาณ 60 คู่ต่อวินาที

แผ่นข้อมูลสามารถดูได้ที่:

การสื่อสารผ่าน I2C ดังนั้นเซ็นเซอร์ I2C อื่น ๆ สามารถแชร์บัสได้ (เช่นเดียวกับบอร์ด GY86 10DOF ที่ชิปทั้งหมดอยู่บน I2C)

ขั้นตอนที่ 1: รับไลบรารี MS5611

เซ็นเซอร์ Arduino หลายตัวใช้ไลบรารีมาตรฐานที่มาพร้อมกับ Arduino IDE หรือมาพร้อมกับไฟล์ zip ที่มีไลบรารี่ที่สามารถติดตั้งได้ง่าย ซึ่งมักจะไม่เป็นเช่นนั้นสำหรับเซ็นเซอร์ MS5611 อย่างไรก็ตาม พบการค้นหา: https://github.com/gronat/MS5611 ที่มีไลบรารีสำหรับ MS5611 รวมถึงทำการแก้ไขอุณหภูมิ

ตัวเลือกที่ 1

ไปที่เว็บไซต์ด้านบน คลิก 'โคลนหรือดาวน์โหลด' และเลือก 'ดาวน์โหลด ZIP' สิ่งนี้ควรส่ง MS5611-master.zip ไปยังไดเร็กทอรีการดาวน์โหลดของคุณ ตอนนี้ ถ้าคุณต้องการ ย้ายไปยังโฟลเดอร์ที่คุณสามารถค้นหาได้ในอนาคต ฉันใช้ไดเร็กทอรีชื่อ 'data' ที่เพิ่มลงในโฟลเดอร์ Arduino ของฉัน

น่าเสียดายที่ไฟล์.zip ที่ดาวน์โหลดมานั้นไม่มีภาพสเก็ตช์ตัวอย่างใดๆ และเป็นการดีที่จะเพิ่มไลบรารี่และตัวอย่างลงใน Arduino IDE มีตัวอย่างขั้นต่ำในไฟล์ README.md ที่สามารถคัดลอกและวางลงในแบบร่างและบันทึกได้ นี่เป็นวิธีหนึ่งในการไป

ตัวเลือก 2

เพื่อให้ง่ายต่อการเรียกใช้โค้ดในคำแนะนำนี้ ฉันได้เพิ่มตัวอย่างขั้นต่ำด้านบนและตัวอย่างที่แสดงที่นี่ในไลบรารีและแนบไฟล์.zip ด้านล่างที่จะติดตั้งลงใน Arduino IDE

ดาวน์โหลดไฟล์ zip ด้านล่าง ย้ายสิ่งนี้ไปยังโฟลเดอร์ที่ดีกว่าหากคุณต้องการ

เริ่ม Arduino IDE คลิก ร่าง>รวมไลบรารี>เพิ่มไฟล์ zip แล้วเลือกไฟล์ รีสตาร์ท IDE ตอนนี้ IDE ทั้งสองจะติดตั้งไลบรารี่พร้อมตัวอย่างทั้งหมดที่แสดงไว้ที่นี่ ตรวจสอบโดยคลิกไฟล์>ตัวอย่าง>>MS5611-master ควรมีการแสดงภาพร่างสามภาพ

ขั้นตอนที่ 2: เชื่อมต่อเซ็นเซอร์กับ Arduino และทดสอบ

เชื่อมต่อเซ็นเซอร์กับ Arduino และทดสอบ
เชื่อมต่อเซ็นเซอร์กับ Arduino และทดสอบ
เชื่อมต่อเซ็นเซอร์กับ Arduino และทดสอบ
เชื่อมต่อเซ็นเซอร์กับ Arduino และทดสอบ

บอร์ด GY63/GY86 มักจะมาพร้อมกับส่วนหัวแต่ไม่มีการบัดกรี ดังนั้นจึงเป็นทางเลือกของคุณที่จะประสานส่วนหัวเข้าที่และใช้สายสัญญาณ Dupont ตัวผู้-ตัวเมีย หรือ (ตามที่ฉันตัดสินใจ) ตะกั่วบัดกรีไปยังบอร์ดโดยตรง และเพิ่มหมุดเข้ากับสายนำเพื่อเสียบเข้ากับ Arduino ตัวเลือกหลังจะดีกว่าถ้าคุณคิดว่าคุณอาจต้องการประสานบอร์ดเข้ากับโครงการในภายหลัง อดีตจะดีกว่าถ้าคุณต้องการใช้บอร์ดสำหรับการทดลอง Unsoldering Lead นั้นง่ายกว่าส่วนหัวของพินมาก

การเชื่อมต่อที่จำเป็นคือ:

GY63/GY86 Arduino

VCC - 5v Power GND - GND Ground SCL - นาฬิกา A5 I2C >ข้อมูล SDA - A4 I2C

แนบบอร์ดเซ็นเซอร์เข้ากับ Arduino ตามด้านบน และเชื่อมต่อ Arduino กับพีซี/แล็ปท็อปผ่านสาย USB ปิดเซ็นเซอร์ด้วยวัสดุทึบแสง/สีดำ เซ็นเซอร์ไวต่อแสง (เช่นเดียวกับเซ็นเซอร์ประเภทนี้ส่วนใหญ่)

เริ่ม Arduino IDE คลิก:

ไฟล์>ตัวอย่าง>>MS5611-master>MS5611data2serial

อินสแตนซ์ใหม่ของ IDE จะปรากฏขึ้นพร้อมกับภาพร่าง คลิกปุ่มอัปโหลด (ลูกศรขวา)

ถัดไป เริ่มต้นพล็อตเตอร์แบบอนุกรม - คลิก เครื่องมือ>พล็อตเตอร์แบบอนุกรม และหากจำเป็น ให้ตั้งค่าบอดเป็น 9600 ข้อมูลที่ส่งคือความดันใน Pascals หลังจากนั้นประมาณหนึ่งวินาที มันจะปรับขนาดใหม่และเพิ่มและลดระดับเซ็นเซอร์โดยบอกว่า 0.3 ม. ควรแสดงว่าเป็นการลดและเพิ่มของร่องรอย (ความสูงที่ต่ำกว่าคือความดันที่สูงขึ้น)

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

สมการตัวกรองคือ:

ค่า = ค่า + K (ค่าใหม่)

โดยที่ 'ค่า' คือข้อมูลที่กรองแล้ว และ 'ใหม่' คือค่าที่วัดล่าสุด ถ้า K=1 ไม่มีการกรอง สำหรับค่าที่ต่ำกว่าของ K ข้อมูลจะปรับให้เรียบด้วยค่าคงที่เวลาของ T/K โดยที่ T คือเวลาระหว่างตัวอย่าง ที่นี่ T อยู่ที่ประมาณ 17ms ดังนั้นค่า 0.1 จะให้ค่าคงที่เวลา 170ms หรือประมาณ 1/6s

สามารถเพิ่มตัวกรองได้โดย:

เพิ่มตัวแปรสำหรับข้อมูลที่กรองก่อนการตั้งค่า ():

กรองลอย = 0;

แล้วเพิ่มสมการกรองหลังความดัน = …. ไลน์.

กรองแล้ว = กรองแล้ว + 0.1*(กรองด้วยแรงดัน);

เป็นความคิดที่ดีที่จะเริ่มต้นค่าที่กรองแล้วสำหรับการอ่านครั้งแรก ดังนั้นให้เพิ่มคำสั่ง 'if' รอบบรรทัดด้านบนที่มีลักษณะเช่นนี้:

ถ้า (กรอง != 0){

กรองแล้ว = กรองแล้ว + 0.1*(กรองด้วยแรงดัน); } อื่น ๆ { กรองแล้ว = ความดัน; // อ่านครั้งแรก ตั้งค่ากรองเป็นอ่าน }

การทดสอบ '!=' คือ 'ไม่เท่ากัน' ดังนั้นหาก 'กรองแล้ว' ไม่เท่ากับ 0 สมการของตัวกรองจะถูกดำเนินการ แต่ถ้าเป็นเช่นนั้น ค่าความดันจะถูกตั้งค่าเป็นค่าที่อ่านได้

สุดท้ายเราต้องเปลี่ยน 'ความดัน' เป็น 'กรอง' ในคำสั่ง Serial.println เพื่อให้เราเห็นค่าที่กรอง

การเรียนรู้ที่ดีที่สุดทำได้โดยการเปลี่ยนแปลงข้างต้นด้วยตนเอง อย่างไรก็ตาม ฉันได้รวมสิ่งเหล่านี้ไว้ในตัวอย่าง MS5611data2serialWfilter ดังนั้นหากมีปัญหาสามารถโหลดตัวอย่างได้

ตอนนี้อัปโหลดรหัสไปยัง Arduino และดูการปรับปรุง ดูพล็อตที่สองด้านบนและสังเกตว่าสเกล Y ขยาย x2

ลองใช้ค่าคงที่ตัวกรองที่ต่ำกว่า พูด 0.02 แทน 0.1 แล้วดูความแตกต่าง ข้อมูลราบรื่นขึ้นแต่มีการตอบสนองที่ช้ากว่า นี่คือการประนีประนอมที่ต้องหาเมื่อใช้ตัวกรองแบบง่ายนี้ ลักษณะนี้เหมือนกับตัวกรอง RC (ความต้านทานและความจุ) ที่ใช้กันอย่างแพร่หลายในวงจรอิเล็กทรอนิกส์

ขั้นตอนที่ 3: ทำให้เป็นแบบสแตนด์อโลน

ตอนนี้เราจะเพิ่มแผงปุ่มกด LCD แปลงความดันเป็นความสูงเป็นเมตร และแสดงบนหน้าจอ นอกจากนี้เรายังจะเพิ่มความสามารถในการทำให้ค่าเป็นศูนย์โดยกดปุ่ม 'เลือก' ของปุ่มกด

ด้วยแผงป้องกัน LCD บน Arduino เซ็นเซอร์จะต้องเชื่อมต่อกับแผงป้องกัน LCD น่าเสียดายที่แผงป้องกัน LCD มักจะมาโดยไม่มีซ็อกเก็ตที่เหมาะสม ดังนั้นตัวเลือกคือทำการเชื่อมต่อแบบบัดกรีหรือรับแถบซ็อกเก็ต แถบซ็อกเก็ตมีจำหน่ายบนอีเบย์ไม่เกินค่าไปรษณีย์ ค้นหา 'แถบซ็อกเก็ต 2.54 มม.' และค้นหาสิ่งที่คล้ายกับใน Arduino เหล่านี้มักจะมีความยาว 36 หรือ 40 พิน ฉันจะหลีกเลี่ยงหมุดเกลียวเนื่องจากไม่ลึกพอสำหรับลีดดูปองท์มาตรฐาน

ต้องตัดแถบซ็อกเก็ตให้ยาวและต้องทำการตัดในที่เดียวกับหมุด ดังนั้นสำหรับแถบ 6 พิน ให้ถอดพินที่ 7 ด้วยคีมบางๆ แล้วตัดตรงจุดนั้นโดยใช้เลื่อยเลือยตัดโลหะรุ่นจูเนียร์ ฉันตะไบปลายให้เรียบร้อย

ตรวจสอบให้แน่ใจว่าไม่มีสะพานประสานเมื่อทำการบัดกรีบนบอร์ด

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

เตรียมแบตเตอรี่และตะกั่วให้พร้อม ฉันสร้างสารตะกั่วจากชิ้นส่วนในถังขยะของฉัน แต่พวกมันก็มีขายบนอีเบย์ด้วย – รวมถึงตัวเลือกที่ดีที่มีกล่องแบตเตอรี่และสวิตช์ ค้นหา 'PP3 2.1mm lead'

การบริโภคในปัจจุบันอยู่ที่ประมาณ 80ma ดังนั้น หากคุณต้องการใช้งานนานกว่าสองสามนาที ให้พิจารณาใช้แบตเตอรี่ขนาด 9v ที่ใหญ่กว่า PP3

ขั้นตอนที่ 4: เพิ่มรหัสสำหรับระดับความสูงและ LCD

Image
Image

เราจำเป็นต้องเขียนโค้ดเพิ่มอีกเล็กน้อยเพื่อแปลงแรงกดเป็นความสูงและขับเคลื่อนจอแสดงผล

ในตอนเริ่มต้นของสเก็ตช์ ให้เพิ่มไลบรารีการแสดงผลและบอกว่าพินใดบ้างที่ใช้:

#รวม

// เริ่มต้นไลบรารีด้วยหมายเลขของพินอินเทอร์เฟซ LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

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

www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)#Sample_Code

เพิ่มรหัสนี้ก่อนการตั้งค่า ():

// กำหนดค่าบางอย่างที่ใช้โดยแผงควบคุมและปุ่ม

int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // อ่านปุ่ม int read_LCD_buttons () { adc_key_in = analogRead (0); // อ่านค่าจากเซ็นเซอร์ // ปุ่มของฉันเมื่ออ่านอยู่กึ่งกลางที่ค่าเหล่านี้: 0, 144, 329, 504, 741 // เราเพิ่มค่าประมาณ 50 ลงในค่าเหล่านั้นและตรวจสอบว่าเราอยู่ใกล้หรือไม่ (adc_key_in > 1000) คืน btnNONE; // เราทำให้ตัวเลือกนี้เป็นตัวเลือกแรกด้วยเหตุผลด้านความเร็ว เนื่องจากจะเป็นผลลัพธ์ที่น่าจะเป็นไปได้มากที่สุดหาก (adc_key_in < 50) ส่งคืน btnRIGHT; ถ้า (adc_key_in < 250) ส่งคืน btnUP; ถ้า (adc_key_in < 450) ส่งคืน btnDOWN; ถ้า (adc_key_in < 650) ส่งคืน btnLEFT; ถ้า (adc_key_in < 850) ส่งคืน btnSELECT; ส่งคืน btnNONE; // เมื่อคนอื่นล้มเหลว ส่งคืนสิ่งนี้… }

ระดับความสูงมักจะเป็นศูนย์ที่จุดเริ่มต้น ดังนั้นเราจึงต้องการตัวแปรสำหรับทั้งความสูงและการอ้างอิง เพิ่มสิ่งเหล่านี้ก่อน setup() และฟังก์ชันด้านบน:

ลอย mtr;

ลอยอ้างอิง = 0;

การแปลงจากแรงดันในภาษาปาสกาลเป็นเมตรเกือบจะเท่ากับหารด้วย 12 ที่ระดับน้ำทะเล สูตรนี้ใช้ได้ดีสำหรับการวัดตามพื้นดินส่วนใหญ่ มีสูตรที่แม่นยำกว่าซึ่งเหมาะสมกว่าสำหรับการแปลงที่ระดับความสูง ใช้สิ่งเหล่านี้หากคุณจะใช้สิ่งนี้เพื่อบันทึกความสูงของเที่ยวบินบอลลูน

ควรตั้งค่าการอ้างอิงเป็นการอ่านค่าแรงกดครั้งแรก ดังนั้นเราจึงเริ่มต้นที่ความสูงเป็นศูนย์และเมื่อกดปุ่ม SELECT เพิ่ม หลังโค้ดตัวกรอง และก่อนคำสั่ง Serial.println:

ถ้า (อ้างอิง == 0){

อ้างอิง = กรองแล้ว/12.0; } if(read_LCD_buttons() == btnSELECT) { อ้างอิง = กรองแล้ว/12.0; }

หลังจากนี้เพิ่มการคำนวณความสูง:

mtr = อ้างอิง - กรองแล้ว/12.0;

สุดท้ายให้เปลี่ยนคำสั่ง Serial.println เพื่อส่ง 'mtr' แทน 'filtered' และเพิ่มรหัสเพื่อส่ง 'mtr' ไปยัง LCD:

Serial.println(mtr); // ส่งความดันผ่านซีเรียล (UART)

lcd.setCursor(0, 1); // บรรทัดที่ 2 lcd.print(mtr);

การเปลี่ยนแปลงทั้งหมดนี้มีอยู่ในตัวอย่าง MS5611data2lcd โหลดสิ่งนี้ในขั้นตอนที่ 2

มีตัวดัดแปลงสุดท้ายที่มีประโยชน์ จอแสดงผลอ่านยากเมื่ออัปเดต 60 ครั้งต่อวินาที ตัวกรองของเรากำลังปรับข้อมูลให้เรียบโดยมีค่าคงที่เวลาประมาณ 0.8 วินาที ดังนั้นการอัปเดตจอแสดงผลทุกๆ 0.3 วินาทีจึงเพียงพอแล้ว

ดังนั้นให้เพิ่มตัวนับหลังจากคำจำกัดความตัวแปรอื่น ๆ ทั้งหมดที่จุดเริ่มต้นของร่าง (เช่น after float ref=0;):

int ผม = 0;

จากนั้นให้เพิ่มโค้ดเพื่อเพิ่มค่า 'i' และคำสั่ง 'if' ให้ทำงานเมื่อถึง 20 จากนั้นตั้งค่ากลับเป็นศูนย์และย้ายคำสั่ง Serial และ lcd ภายในคำสั่ง 'if' ดังนั้นคำสั่งเหล่านี้จะถูกดำเนินการทุกๆ การอ่านครั้งที่ 20 เท่านั้น:

ผม += 1;

ถ้า(i>=20) { Serial.println(mtr); // ส่งแรงดันผ่าน Serial (UART) lcd.setCursor(0, 1); // บรรทัดที่ 2 lcd.print(mtr); ผม = 0; }

ฉันไม่ได้รวมตัวอย่างกับการแก้ไขครั้งล่าสุดนี้เพื่อสนับสนุนการป้อนรหัสด้วยตนเองซึ่งช่วยในการเรียนรู้

โครงการนี้ควรเป็นจุดเริ่มต้นที่ดี เช่น บารอมิเตอร์ดิจิทัล สำหรับผู้ที่อาจต้องการพิจารณาใช้ในรุ่น RC - ค้นหา OpenXvario สำหรับรหัสที่เปิดใช้งานเครื่องวัดระยะสูงและเครื่องวัดความแปรปรวนสำหรับระบบ telemetry Frsky และ Turnigy 9x

แนะนำ: