ห้องสมุดนี้สื่อสารกับ InvensenseMPU-6500 และ InvenSense MPU-9250 และ MPU-9255 Inertial Measuring Units (IMU) ไลบรารีนี้เข้ากันได้กับระบบ Arduino และ CMake build
Invense MPU-6500 เป็นไจโรสโคปแบบสามแกนและมาตรความเร่งแบบสามแกน InvenSense MPU-9250 คือ System in Package (SiP) ที่รวมชิปสองตัวเข้าด้วยกัน ได้แก่ ไจโรสโคปแบบสามแกน MPU-6500 และมาตรความเร่งแบบสามแกน และเครื่องวัดสนามแม่เหล็กแบบสามแกน AK8963 MPU-6500 และ MPU-9250 รองรับ I2C สูงสุด 400 kHz และการสื่อสาร SPI สูงสุด 1 MHz สำหรับการตั้งค่าการลงทะเบียนและ 20 MHz สำหรับการอ่านข้อมูล ช่วงเซนเซอร์เต็มสเกลที่เลือกได้มีดังต่อไปนี้:
ไจโรสโคปช่วงเต็มสเกล | มาตรความเร่งเต็มช่วงสเกล | แมกนีโตมิเตอร์เต็มสเกลช่วง (MPU-9250 เท่านั้น) |
---|---|---|
+/- 250 องศา/วินาที | +/-2ก | +/- 4800 ut |
+/- 500 องศา/วินาที | +/-4ก | |
+/- 1,000 องศา/วินาที | +/-8ก | |
+/- 2000 องศา/วินาที | +/-16ก |
IMU เก็บตัวอย่างไจโร มาตรความเร่ง และแมกนีโตมิเตอร์ด้วยตัวแปลงแอนะล็อกเป็นดิจิทัล 16 บิต นอกจากนี้ยังมีตัวกรองดิจิตอลที่ตั้งโปรแกรมได้ นาฬิกาที่แม่นยำ และเซ็นเซอร์อุณหภูมิแบบฝัง
ใช้ Arduino Library Manager เพื่อติดตั้งไลบรารีหรือโคลนนี้ลงในโฟลเดอร์ Arduino/libraries ของคุณ
สำหรับ MPU-6500 ไลบรารีนี้จะถูกเพิ่มเป็น:
# include " mpu6500.h "
สำหรับ MPU-9250 ไลบรารีนี้จะถูกเพิ่มเป็น:
# include " mpu9250.h "
ตัวอย่างโปรแกรม Arduino อยู่ใน: examples/arduino/ อุปกรณ์ Teensy 3.x, 4.x และ LC ใช้สำหรับการทดสอบภายใต้ Arduino และไลบรารีนี้ควรเข้ากันได้กับอุปกรณ์ Arduino อื่นๆ
CMake ใช้เพื่อสร้างไลบรารีนี้ ซึ่งส่งออกเป็นเป้าหมายไลบรารีที่เรียกว่า invensense_imu
สำหรับ MPU-6500 ไลบรารีนี้จะถูกเพิ่มเป็น:
# include " mpu6500.h "
สำหรับ MPU-9250 ไลบรารีนี้จะถูกเพิ่มเป็น:
# include " mpu9250.h "
ไลบรารียังสามารถคอมไพล์แบบสแตนด์อโลนได้โดยใช้สำนวน CMake ในการสร้างไดเร็กทอรี build จากนั้นจากภายในไดเร็กทอรีนั้นที่ออก:
cmake .. -DMCU=MK66FX1M0
make
สิ่งนี้จะสร้างไลบรารีและไฟล์เรียกทำงานตัวอย่างที่เรียกว่า i2c_example , spi_example , drdy_spi_example และ wom_example (MPU-9250 เท่านั้น) ไฟล์ต้นฉบับที่เรียกใช้งานได้ตัวอย่างอยู่ที่ example/cmake โปรดสังเกตว่าคำสั่ง cmake มีการกำหนดที่ระบุไมโครคอนโทรลเลอร์ที่กำลังคอมไพล์โค้ดอยู่ สิ่งนี้จำเป็นสำหรับการกำหนดค่าโค้ด ความถี่ของ CPU และตัวเลือกคอมไพล์/ลิงก์เกอร์อย่างถูกต้อง MCU ที่มีอยู่คือ:
เป็นที่ทราบกันว่าสิ่งเหล่านี้ใช้ได้กับแพ็คเกจเดียวกับที่ใช้ในผลิตภัณฑ์ Teensy เป็นที่รู้กันว่าการสลับแพ็คเกจทำงานได้ดี ตราบใดที่การเปลี่ยนแปลงแพ็คเกจเท่านั้น
เป้าหมายตัวอย่างจะสร้างปฏิบัติการสำหรับการสื่อสารกับเซ็นเซอร์โดยใช้การสื่อสาร I2C หรือ SPI โดยใช้การขัดจังหวะข้อมูลที่พร้อมใช้ และใช้การปลุกเมื่อขัดจังหวะการเคลื่อนไหว ตามลำดับ แต่ละเป้าหมายยังมี _hex สำหรับสร้างไฟล์ hex เพื่ออัปโหลดไปยังไมโครคอนโทรลเลอร์ และ _upload สำหรับการใช้ Teensy CLI Uploader เพื่อแฟลช Teensy โปรดทราบว่าคำแนะนำในการตั้งค่าสภาพแวดล้อม build ของคุณสามารถพบได้ใน repo build-tools ของเรา
ไลบรารีนี้อยู่ภายในเนมสเปซ bfs
ชั้นเรียนนี้ประกอบด้วยวิธีการอ่านและเขียนเพื่อลงทะเบียนบนเซนเซอร์เหล่านี้ คาดว่าสิ่งนี้ควรใช้งานได้กับ MPU-6000, MPU-6050, MPU-6500, MPU-9150 และ MPU-9250 เป็นอย่างน้อย แม้ว่ามันอาจจะใช้ได้กับเซ็นเซอร์อื่นๆ ก็ตาม ผู้ใช้ส่วนใหญ่จะชอบคลาสเฉพาะของเซ็นเซอร์ด้านล่าง อย่างไรก็ตาม คลาสนี้อาจช่วยให้ผู้ใช้ปลดล็อกฟังก์ชันการทำงานที่ดีขึ้นและใช้เป็นจุดเริ่มต้นสำหรับไดรเวอร์เซ็นเซอร์ของตนเอง
InvensenseImu() ตัวสร้างเริ่มต้น จำเป็นต้องเรียกใช้วิธี Config เพื่อตั้งค่าบัส I2C หรือ SPI และที่อยู่ I2C หรือพินเลือกชิป SPI
InvensenseImu (TwoWire * i2c, const uint8_t addr) สร้างวัตถุ InvensenseImu ตัวสร้างนี้ใช้สำหรับอินเทอร์เฟซการสื่อสาร I2C ตัวชี้ไปยังวัตถุบัส I2C จะถูกส่งไปพร้อมกับที่อยู่ I2C ของเซ็นเซอร์
InvensenseImu(SPIClass *bus, uint8_t cs) สร้างวัตถุ InvensenseImu ตัวสร้างนี้ใช้สำหรับอินเทอร์เฟซการสื่อสาร SPI ตัวชี้ไปยังวัตถุบัส SPI จะถูกส่งไปพร้อมกับพินเลือกชิปของเซ็นเซอร์ พินใดๆ ที่สามารถใช้งาน I/O ดิจิทัลได้สามารถใช้เป็นพินเลือกชิปได้
เป็นโมฆะการกำหนดค่า (TwoWire *bus, const uint8_t addr) สิ่งนี้จำเป็นเมื่อใช้ตัวสร้างเริ่มต้นและตั้งค่าบัส I2C และที่อยู่ I2C
การกำหนดค่าเป็นโมฆะ(SPIClass *spi, const uint8_t cs) สิ่งนี้จำเป็นเมื่อใช้ตัวสร้างเริ่มต้นและตั้งค่าบัส SPI และพินการเลือกชิป
void Begin() เริ่มต้นการสื่อสารกับเซ็นเซอร์ บัสการสื่อสารไม่ได้เตรียมใช้งานภายในไลบรารีนี้ และต้องเตรียมใช้งานแยกกัน สิ่งนี้ช่วยเพิ่มความเข้ากันได้กับเซ็นเซอร์อื่น ๆ ที่อาจอยู่บนบัสเดียวกัน
bool WriteRegister(const uint8_t reg, const uint8_t data, const int32_t spi_clock) เขียนข้อมูลรีจิสเตอร์ไปยังเซ็นเซอร์โดยระบุที่อยู่รีจิสเตอร์และข้อมูล ต้องระบุความเร็วสัญญาณนาฬิกา SPI หากใช้การสื่อสาร SPI
bool WriteRegister(const uint8_t reg, const uint8_t data) โอเวอร์โหลดด้านบนที่ใช้การสื่อสาร I2C
bool ReadRegisters(const uint8_t reg, const uint8_t count, const int32_t spi_clock, uint8_t * const data) อ่านข้อมูลรีจิสเตอร์จากเซ็นเซอร์ที่ระบุที่อยู่รีจิสเตอร์ จำนวนรีจิสเตอร์ที่จะอ่าน นาฬิกา SPI และตัวชี้สำหรับจัดเก็บข้อมูล
bool ReadRegisters(const uint8_t reg, const uint8_t count, uint8_t * const data) โอเวอร์โหลดด้านบนที่ใช้การสื่อสาร I2C
คลาสนี้ใช้ได้กับ IMU MPU-9250 และ MPU-9255
Mpu9250() ตัวสร้างเริ่มต้นต้องเรียกใช้วิธี Config เพื่อตั้งค่าบัส I2C หรือ SPI และที่อยู่ I2C หรือพินเลือกชิป SPI
Mpu9250(i2c_t3 *bus, I2cAddr addr) สร้างวัตถุ Mpu9250 ตัวสร้างนี้ใช้สำหรับอินเทอร์เฟซการสื่อสาร I2C ตัวชี้ไปยังวัตถุบัส I2C จะถูกส่งไปพร้อมกับที่อยู่ I2C ของเซ็นเซอร์ ที่อยู่จะเป็น I2C_ADDR_PRIM (0x68) หากพิน AD0 ต่อสายดิน และ I2C_ADDR_SEC (0x69) หากดึงพิน AD0 ไว้สูง
Mpu9250 mpu9250 (&Wire, bfs::Mpu9250::I2C_ADDR_PRIM);
Mpu9250(SPIClass *bus, uint8_t cs) สร้างวัตถุ Mpu9250 ตัวสร้างนี้ใช้สำหรับอินเทอร์เฟซการสื่อสาร SPI ตัวชี้ไปยังวัตถุบัส SPI จะถูกส่งไปพร้อมกับพินเลือกชิปของเซ็นเซอร์ พินใดๆ ที่สามารถใช้งาน I/O ดิจิทัลได้สามารถใช้เป็นพินเลือกชิปได้
Mpu9250 mpu9250 (&SPI, 2 );
เป็นโมฆะการกำหนดค่า (TwoWire *bus, const I2cAddr addr) สิ่งนี้จำเป็นเมื่อใช้ตัวสร้างเริ่มต้นและตั้งค่าบัส I2C และที่อยู่ I2C ที่อยู่จะเป็น I2C_ADDR_PRIM (0x68) หากพิน AD0 ต่อสายดิน และ I2C_ADDR_SEC (0x69) หากดึงพิน AD0 ไว้สูง
การกำหนดค่าเป็นโมฆะ(SPIClass *spi, const uint8_t cs) สิ่งนี้จำเป็นเมื่อใช้ตัวสร้างเริ่มต้นและตั้งค่าบัส SPI และพินการเลือกชิป
bool Begin() เริ่มต้นการสื่อสารกับเซ็นเซอร์และกำหนดค่าเริ่มต้นของช่วงเซ็นเซอร์ อัตราการสุ่มตัวอย่าง และการตั้งค่าตัวกรองความถี่ต่ำผ่าน ช่วงมาตรความเร่งเริ่มต้นคือ +/- 16g และช่วงไจโรเริ่มต้นคือ +/- 2,000 องศา/วินาที อัตราการสุ่มตัวอย่างเริ่มต้นคือ 1000 Hz และตัวกรองความถี่ต่ำผ่านถูกตั้งค่าเป็นความถี่ตัดที่ 184 Hz True จะถูกส่งกลับหากสามารถสร้างการสื่อสารด้วยเซ็นเซอร์และการกำหนดค่าเสร็จสมบูรณ์ ไม่เช่นนั้นจะส่งกลับ false บัสการสื่อสารไม่ได้เตรียมใช้งานภายในไลบรารีนี้ และต้องเตรียมใช้งานแยกกัน สิ่งนี้ช่วยเพิ่มความเข้ากันได้กับเซ็นเซอร์อื่น ๆ ที่อาจอยู่บนบัสเดียวกัน
Wire.begin();
Wire.setClock( 400000 );
bool status = mpu9250.Begin();
if (!status) {
// ERROR
}
bool EnableDrdyInt() เปิดใช้งานการขัดจังหวะข้อมูลพร้อม การขัดจังหวะ 50 us จะถูกทริกเกอร์บนพิน MPU-9250 INT เมื่อข้อมูล IMU พร้อม การขัดจังหวะนี้มีการใช้งานอยู่ในระดับสูง เมธอดนี้จะคืนค่าเป็นจริงหากเปิดใช้งานการขัดจังหวะสำเร็จ มิฉะนั้น จะส่งคืนค่าเท็จ
bool status = mpu9250.EnableDrdyInt();
if (!status) {
// ERROR
}
bool DisableDrdyInt() ปิดการใช้งานข้อมูลพร้อมขัดจังหวะ เมธอดนี้จะคืนค่าเป็นจริงหากปิดใช้งานการขัดจังหวะสำเร็จ มิฉะนั้น จะส่งคืนค่าเท็จ
bool status = mpu9250.DisableDrdyInt();
if (!status) {
// ERROR
}
bool ConfigAccelRange(const AccelRange range) ตั้งค่ามาตรวัดความเร่งเต็มช่วง ตัวเลือกคือ:
พิสัย | ค่าแจงนับ |
---|---|
+/-2ก | ACCEL_RANGE_2G |
+/-4ก | ACCEL_RANGE_4G |
+/-8ก | ACCEL_RANGE_8G |
+/-16ก | ACCEL_RANGE_16G |
ค่า True จะถูกส่งกลับเมื่อตั้งค่าช่วงความเร่งได้สำเร็จ มิฉะนั้นจะส่งคืนค่า false ช่วงเริ่มต้นคือ +/-16g
bool status = mpu9250.ConfigAccelRange(bfs::Mpu9250::ACCEL_RANGE_4G);
if (!status) {
// ERROR
}
AccelRange accel_range() ส่งกลับช่วงมาตรความเร่งปัจจุบัน
AccelRange range = mpu9250.accel_range();
bool ConfigGyroRange(const GyroRange range) ตั้งค่าไจโรเต็มสเกล ตัวเลือกคือ:
พิสัย | ค่าแจงนับ |
---|---|
+/- 250 องศา/วินาที | GYRO_RANGE_250DPS |
+/- 500 องศา/วินาที | GYRO_RANGE_500DPS |
+/- 1,000 องศา/วินาที | GYRO_RANGE_1000DPS |
+/- 2000 องศา/วินาที | GYRO_RANGE_2000DPS |
ค่า True จะถูกส่งกลับเมื่อตั้งค่าช่วงไจโรสำเร็จ มิฉะนั้นจะส่งคืนค่า false ช่วงเริ่มต้นคือ +/-2000 องศา/วินาที
bool status = mpu9250.ConfigGyroRange(bfs::Mpu9250::GYRO_RANGE_1000DPS);
if (!status) {
// ERROR
}
GyroRange gyro_range() ส่งกลับช่วงไจโรปัจจุบัน
GyroRange range = mpu9250.gyro_range();
bool ConfigSrd(const uint8_t srd) ตั้งค่าตัวแบ่งอัตราตัวอย่างเซ็นเซอร์ MPU-9250 สุ่มตัวอย่างมาตรความเร่งและไจโรในอัตราเป็น Hz ซึ่งกำหนดโดย:
การตั้งค่า srd เป็น 0 หมายความว่า MPU-9250 สุ่มตัวอย่างมาตรความเร่งและไจโรที่ 1,000 Hz การตั้ง ค่า srd เป็น 4 จะตั้งค่าการสุ่มตัวอย่างที่ 200 Hz ข้อมูล IMU พร้อมขัดจังหวะจะเชื่อมโยงกับอัตราที่กำหนดโดยตัวแบ่งอัตราตัวอย่าง แมกนีโตมิเตอร์จะถูกสุ่มตัวอย่างที่ 100 Hz สำหรับค่าตัวแบ่งอัตราตัวอย่างที่สอดคล้องกับ 100 Hz ขึ้นไป มิฉะนั้น แมกนีโตมิเตอร์จะถูกสุ่มตัวอย่างที่ 8 Hz
ค่า True จะถูกส่งกลับเมื่อตั้งค่าตัวแบ่งอัตราตัวอย่างสำเร็จ ไม่เช่นนั้นจะส่งกลับค่า false ค่าตัวแบ่งอัตราตัวอย่างเริ่มต้นคือ 0 ซึ่งส่งผลให้ได้อัตราตัวอย่าง 1000 Hz
/* Set sample rate divider for 50 Hz */
bool status = mpu9250.sample_rate_divider( 19 );
if (!status) {
// ERROR
}
uint8_t srd() ส่งกลับค่าตัวแบ่งอัตราตัวอย่างปัจจุบัน
uint8_t srd = mpu9250.srd();
bool ConfigDlpfBandwidth(const DlpfBandwidth dlpf) ตั้งค่าความถี่คัตออฟของตัวกรองความถี่ต่ำผ่านดิจิทัลสำหรับมาตรความเร่ง ไจโร และเซ็นเซอร์อุณหภูมิ แบนด์วิธที่ใช้ได้คือ:
แบนด์วิธ DLPF | ค่าแจงนับ |
---|---|
184 เฮิรตซ์ | DLPF_BANDWIDTH_184HZ |
92 เฮิรตซ์ | DLPF_BANDWIDTH_92HZ |
41 เฮิรตซ์ | DLPF_BANDWIDTH_41HZ |
20 เฮิรตซ์ | DLPF_BANDWIDTH_20HZ |
10 เฮิรตซ์ | DLPF_BANDWIDTH_10HZ |
5 เฮิรตซ์ | DLPF_BANDWIDTH_5HZ |
True จะถูกส่งกลับเมื่อตั้งค่าตัวกรองสัญญาณความถี่ต่ำแบบดิจิทัลสำเร็จ มิฉะนั้นจะส่งคืนค่า false แบนด์วิดท์เริ่มต้นคือ 184 Hz
bool status = mpu9250.ConfigDlpfBandwidth(bfs::Mpu9250::DLPF_BANDWIDTH_20HZ);
if (!status) {
// ERROR
}
DlpfBandwidth dlpf_bandwidth() ส่งกลับการตั้งค่าแบนด์วิดท์ตัวกรองความถี่ต่ำผ่านดิจิทัลปัจจุบัน
DlpfBandwidth dlpf = mpu9250.dlpf_bandwidth();
bool EnableWom(int16_t Threshold_mg, const WomRate wom_rate) เปิดใช้งานการขัดจังหวะ Wake-On-Motion โดยจะทำให้ MPU-9250 อยู่ในสถานะพลังงานต่ำ โดยจะเริ่มทำงานในช่วงเวลาที่กำหนดโดย WomRate หากมาตรความเร่งตรวจพบการเคลื่อนไหวที่เกินเกณฑ์ Threshold_mg จะสร้างพัลส์ 50us จากพินขัดจังหวะ MPU-9250 รองรับอัตรา WOM ที่ระบุต่อไปนี้:
อัตราตัวอย่าง WOM | ค่าแจงนับ |
---|---|
0.24 เฮิรตซ์ | WOM_RATE_0_24HZ |
0.49 เฮิรตซ์ | WOM_RATE_0_49HZ |
0.98 เฮิรตซ์ | WOM_RATE_0_98HZ |
1.95 เฮิรตซ์ | WOM_RATE_1_95HZ |
3.91 เฮิรตซ์ | WOM_RATE_3_91HZ |
7.81 เฮิรตซ์ | WOM_RATE_7_81HZ |
15.63 เฮิรตซ์ | WOM_RATE_15_63HZ |
31.25 เฮิรตซ์ | WOM_RATE_31_25HZ |
62.50 เฮิรตซ์ | WOM_RATE_62_50HZ |
125 เฮิรตซ์ | WOM_RATE_125HZ |
250 เฮิรตซ์ | WOM_RATE_250HZ |
500 เฮิรตซ์ | WOM_RATE_500HZ |
เกณฑ์การเคลื่อนไหวถูกกำหนดเป็นค่าระหว่าง 4 ถึง 1,020 มก. ซึ่งแมปภายในกับไบต์เดียว ค่า 1-255 ฟังก์ชันนี้จะคืนค่าเป็นจริงเมื่อเปิดใช้งาน Wake On Motion สำเร็จ มิฉะนั้นจะส่งคืนค่าเท็จ โปรดดูตัวอย่าง wom_i2c ต่อไปนี้เป็นตัวอย่างของการเปิดใช้งาน Wake On Motion ด้วยเกณฑ์ 40 มก. และ ODR ที่ 31.25 Hz
imu.EnableWom( 40 , bfs::Mpu9250::WOM_RATE_31_25HZ);
เป็นโมฆะรีเซ็ต () รีเซ็ต MPU-9250
bool Read() อ่านข้อมูลจาก MPU-9250 และเก็บข้อมูลไว้ในวัตถุ Mpu9250 คืนค่าเป็นจริงหากอ่านข้อมูลสำเร็จ มิฉะนั้นจะส่งคืนค่าเท็จ
/* Read the IMU data */
if (mpu9250.Read()) {
}
bool new_imu_data() คืนค่าเป็นจริงหากมีการส่งคืนข้อมูลใหม่จากมาตรความเร่งและไจโร
if (mpu9250.Read()) {
bool new_data = mpu9250. new_imu_data ();
}
bool new_mag_data() คืนค่าเป็นจริงหากมีการส่งคืนข้อมูลใหม่จากเครื่องวัดสนามแม่เหล็ก สำหรับอัตราตัวอย่าง MPU-9250 ที่ 100 Hz และสูงกว่า แมกนีโตมิเตอร์จะถูกสุ่มตัวอย่างที่ 100 Hz สำหรับอัตราตัวอย่าง MPU-9250 น้อยกว่า 100 Hz แมกนีโตมิเตอร์จะถูกสุ่มตัวอย่างที่ 8 Hz ดังนั้นจึงไม่ใช่เรื่องแปลกที่จะได้รับข้อมูล IMU ใหม่ แต่ไม่ใช่ข้อมูลแมกนีโตมิเตอร์ใหม่
if (mpu9250.Read()) {
bool new_mag = mpu9250. new_mag_data ();
}
float accel_x_mps2() ส่งกลับข้อมูล x accelerometer จากวัตถุ Mpu9250 ในหน่วย m/s/s มีวิธีการที่คล้ายกันสำหรับข้อมูลแกน y และ z
/* Read the IMU data */
if (mpu9250.Read()) {
float ax = mpu9250. accel_x_mps2 ();
float ay = mpu9250. accel_y_mps2 ();
float az = mpu9250. accel_z_mps2 ();
}
float gyro_x_radps() ส่งกลับข้อมูล x gyro จากวัตถุ Mpu9250 ในหน่วยของ rad/s มีวิธีการที่คล้ายกันสำหรับข้อมูลแกน y และ z
/* Read the IMU data */
if (mpu9250.Read()) {
float gx = mpu9250. gyro_x_radps ();
float gy = mpu9250. gyro_y_radps ();
float gz = mpu9250. gyro_z_radps ();
}
float mag_x_ut() ส่งกลับข้อมูล x magnetometer จากวัตถุ Mpu9250 ในหน่วยของ uT มีวิธีการที่คล้ายกันสำหรับข้อมูลแกน y และ z
/* Read the IMU data */
if (mpu9250.Read()) {
float hx = mpu9250. mag_x_ut ();
float hy = mpu9250. mag_y_ut ();
float hz = mpu9250. mag_z_ut ();
}
float die_temp_c() ส่งกลับอุณหภูมิแม่พิมพ์ของเซ็นเซอร์ในหน่วย C
/* Read the IMU data */
if (mpu9250.Read()) {
float temp = mpu9250. die_temp_c ();
}
คลาสนี้ใช้งานได้กับเซ็นเซอร์ MPU-6500
Mpu6500() ตัวสร้างเริ่มต้นจำเป็นต้องเรียกใช้วิธี Config เพื่อตั้งค่าบัส I2C หรือ SPI และที่อยู่ I2C หรือพินเลือกชิป SPI
Mpu6500(i2c_t3 *bus, I2cAddr addr) สร้างวัตถุ Mpu6500 ตัวสร้างนี้ใช้สำหรับอินเทอร์เฟซการสื่อสาร I2C ตัวชี้ไปยังวัตถุบัส I2C จะถูกส่งไปพร้อมกับที่อยู่ I2C ของเซ็นเซอร์ ที่อยู่จะเป็น I2C_ADDR_PRIM (0x68) หากพิน AD0 ต่อสายดิน และ I2C_ADDR_SEC (0x69) หากดึงพิน AD0 ไว้สูง
Mpu6500 mpu6500 (&Wire, bfs::Mpu6500::I2C_ADDR_PRIM);
Mpu6500(SPIClass *bus, uint8_t cs) สร้างวัตถุ Mpu6500 ตัวสร้างนี้ใช้สำหรับอินเทอร์เฟซการสื่อสาร SPI ตัวชี้ไปยังวัตถุบัส SPI จะถูกส่งไปพร้อมกับพินเลือกชิปของเซ็นเซอร์ พินใดๆ ที่สามารถใช้งาน I/O ดิจิทัลได้สามารถใช้เป็นพินเลือกชิปได้
Mpu6500 mpu6500 (&SPI, 2 );
เป็นโมฆะการกำหนดค่า (TwoWire *bus, const I2cAddr addr) สิ่งนี้จำเป็นเมื่อใช้ตัวสร้างเริ่มต้นและตั้งค่าบัส I2C และที่อยู่ I2C ที่อยู่จะเป็น I2C_ADDR_PRIM (0x68) หากพิน AD0 ต่อสายดิน และ I2C_ADDR_SEC (0x69) หากดึงพิน AD0 ไว้สูง
การกำหนดค่าเป็นโมฆะ(SPIClass *spi, const uint8_t cs) สิ่งนี้จำเป็นเมื่อใช้ตัวสร้างเริ่มต้นและตั้งค่าบัส SPI และพินการเลือกชิป
bool Begin() เริ่มต้นการสื่อสารกับเซ็นเซอร์และกำหนดค่าเริ่มต้นของช่วงเซ็นเซอร์ อัตราการสุ่มตัวอย่าง และการตั้งค่าตัวกรองความถี่ต่ำผ่าน ช่วงมาตรความเร่งเริ่มต้นคือ +/- 16g และช่วงไจโรเริ่มต้นคือ +/- 2,000 องศา/วินาที อัตราการสุ่มตัวอย่างเริ่มต้นคือ 1000 Hz และตัวกรองความถี่ต่ำผ่านถูกตั้งค่าเป็นความถี่ตัดที่ 184 Hz True จะถูกส่งกลับหากสามารถสร้างการสื่อสารด้วยเซ็นเซอร์และการกำหนดค่าเสร็จสมบูรณ์ ไม่เช่นนั้นจะส่งกลับ false บัสการสื่อสารไม่ได้เตรียมใช้งานภายในไลบรารีนี้ และต้องเตรียมใช้งานแยกกัน สิ่งนี้ช่วยเพิ่มความเข้ากันได้กับเซ็นเซอร์อื่น ๆ ที่อาจอยู่บนบัสเดียวกัน
Wire.begin();
Wire.setClock( 400000 );
bool status = mpu6500.Begin();
if (!status) {
// ERROR
}
bool EnableDrdyInt() เปิดใช้งานการขัดจังหวะข้อมูลพร้อม การขัดจังหวะ 50 us จะถูกทริกเกอร์บนพิน MPU-9250 INT เมื่อข้อมูล IMU พร้อม การขัดจังหวะนี้มีการใช้งานอยู่ในระดับสูง เมธอดนี้จะคืนค่าเป็นจริงหากเปิดใช้งานการขัดจังหวะสำเร็จ มิฉะนั้น จะส่งคืนค่าเท็จ
bool status = mpu6500.EnableDrdyInt();
if (!status) {
// ERROR
}
bool DisableDrdyInt() ปิดการใช้งานข้อมูลพร้อมขัดจังหวะ เมธอดนี้จะคืนค่าเป็นจริงหากปิดใช้งานการขัดจังหวะสำเร็จ มิฉะนั้น จะส่งคืนค่าเท็จ
bool status = mpu6500.DisableDrdyInt();
if (!status) {
// ERROR
}
bool ConfigAccelRange(const AccelRange range) ตั้งค่ามาตรวัดความเร่งเต็มช่วง ตัวเลือกคือ:
พิสัย | ค่าแจงนับ |
---|---|
+/-2ก | ACCEL_RANGE_2G |
+/-4ก | ACCEL_RANGE_4G |
+/-8ก | ACCEL_RANGE_8G |
+/-16ก | ACCEL_RANGE_16G |
ค่า True จะถูกส่งกลับเมื่อตั้งค่าช่วงความเร่งได้สำเร็จ มิฉะนั้นจะส่งคืนค่า false ช่วงเริ่มต้นคือ +/-16g
bool status = mpu6500.ConfigAccelRange(bfs::Mpu6500::ACCEL_RANGE_4G);
if (!status) {
// ERROR
}
AccelRange accel_range() ส่งกลับช่วงมาตรความเร่งปัจจุบัน
AccelRange range = mpu6500.accel_range();
bool ConfigGyroRange(const GyroRange range) ตั้งค่าไจโรเต็มสเกล ตัวเลือกคือ:
พิสัย | ค่าแจงนับ |
---|---|
+/- 250 องศา/วินาที | GYRO_RANGE_250DPS |
+/- 500 องศา/วินาที | GYRO_RANGE_500DPS |
+/- 1,000 องศา/วินาที | GYRO_RANGE_1000DPS |
+/- 2000 องศา/วินาที | GYRO_RANGE_2000DPS |
ค่า True จะถูกส่งกลับเมื่อตั้งค่าช่วงไจโรสำเร็จ มิฉะนั้นจะส่งคืนค่า false ช่วงเริ่มต้นคือ +/-2000 องศา/วินาที
bool status = mpu6500.ConfigGyroRange(bfs::Mpu6500::GYRO_RANGE_1000DPS);
if (!status) {
// ERROR
}
GyroRange gyro_range() ส่งกลับช่วงไจโรปัจจุบัน
GyroRange range = mpu6500.gyro_range();
bool ConfigSrd(const uint8_t srd) ตั้งค่าตัวแบ่งอัตราตัวอย่างเซ็นเซอร์ MPU-9250 สุ่มตัวอย่างมาตรความเร่งและไจโรในอัตราเป็น Hz ซึ่งกำหนดโดย:
การตั้งค่า srd เป็น 0 หมายความว่า MPU-9250 สุ่มตัวอย่างมาตรความเร่งและไจโรที่ 1,000 Hz การตั้ง ค่า srd เป็น 4 จะตั้งค่าการสุ่มตัวอย่างที่ 200 Hz ข้อมูล IMU พร้อมขัดจังหวะจะเชื่อมโยงกับอัตราที่กำหนดโดยตัวแบ่งอัตราตัวอย่าง แมกนีโตมิเตอร์จะถูกสุ่มตัวอย่างที่ 100 Hz สำหรับค่าตัวแบ่งอัตราตัวอย่างที่สอดคล้องกับ 100 Hz ขึ้นไป มิฉะนั้น แมกนีโตมิเตอร์จะถูกสุ่มตัวอย่างที่ 8 Hz
ค่า True จะถูกส่งกลับเมื่อตั้งค่าตัวแบ่งอัตราตัวอย่างสำเร็จ ไม่เช่นนั้นจะส่งกลับค่า false ค่าตัวแบ่งอัตราตัวอย่างเริ่มต้นคือ 0 ซึ่งส่งผลให้ได้อัตราตัวอย่าง 1000 Hz
/* Set sample rate divider for 50 Hz */
bool status = mpu6500.sample_rate_divider( 19 );
if (!status) {
// ERROR
}
uint8_t srd() ส่งกลับค่าตัวแบ่งอัตราตัวอย่างปัจจุบัน
uint8_t srd = mpu6500.srd();
bool ConfigDlpfBandwidth(const DlpfBandwidth dlpf) ตั้งค่าความถี่คัตออฟของตัวกรองความถี่ต่ำผ่านดิจิทัลสำหรับมาตรความเร่ง ไจโร และเซ็นเซอร์อุณหภูมิ แบนด์วิธที่ใช้ได้คือ:
แบนด์วิธ DLPF | ค่าแจงนับ |
---|---|
184 เฮิรตซ์ | DLPF_BANDWIDTH_184HZ |
92 เฮิรตซ์ | DLPF_BANDWIDTH_92HZ |
41 เฮิรตซ์ | DLPF_BANDWIDTH_41HZ |
20 เฮิรตซ์ | DLPF_BANDWIDTH_20HZ |
10 เฮิรตซ์ | DLPF_BANDWIDTH_10HZ |
5 เฮิรตซ์ | DLPF_BANDWIDTH_5HZ |
True จะถูกส่งกลับเมื่อตั้งค่าตัวกรองสัญญาณความถี่ต่ำแบบดิจิทัลสำเร็จ มิฉะนั้นจะส่งคืนค่า false แบนด์วิดท์เริ่มต้นคือ 184 Hz
bool status = mpu6500.ConfigDlpfBandwidth(bfs::Mpu6500::DLPF_BANDWIDTH_20HZ);
if (!status) {
// ERROR
}
DlpfBandwidth dlpf_bandwidth() ส่งกลับการตั้งค่าแบนด์วิดท์ตัวกรองความถี่ต่ำผ่านดิจิทัลในปัจจุบัน
DlpfBandwidth dlpf = mpu6500.dlpf_bandwidth();
bool Read() อ่านข้อมูลจาก MPU-6500 และเก็บข้อมูลไว้ในวัตถุ Mpu6500 คืนค่าเป็นจริงหากอ่านข้อมูลสำเร็จ มิฉะนั้นจะส่งคืนค่าเท็จ
/* Read the IMU data */
if (mpu6500.Read()) {
}
bool new_imu_data() คืนค่าเป็นจริงหากมีการส่งคืนข้อมูลใหม่จากมาตรความเร่งและไจโร
if (mpu6500.Read()) {
bool new_data = mpu6500. new_imu_data ();
}
float accel_x_mps2() ส่งกลับข้อมูล x accelerometer จากวัตถุ Mpu6500 ในหน่วย m/s/s มีวิธีการที่คล้ายกันสำหรับข้อมูลแกน y และ z
/* Read the IMU data */
if (mpu6500.Read()) {
float ax = mpu6500. accel_x_mps2 ();
float ay = mpu6500. accel_y_mps2 ();
float az = mpu6500. accel_z_mps2 ();
}
float gyro_x_radps() ส่งกลับข้อมูล x gyro จากวัตถุ Mpu6500 ในหน่วยของ rad/s มีวิธีการที่คล้ายกันสำหรับข้อมูลแกน y และ z
/* Read the IMU data */
if (mpu6500.Read()) {
float gx = mpu6500. gyro_x_radps ();
float gy = mpu6500. gyro_y_radps ();
float gz = mpu6500. gyro_z_radps ();
}
float die_temp_c() ส่งกลับอุณหภูมิแม่พิมพ์ของเซ็นเซอร์ในหน่วย C
/* Read the IMU data */
if (mpu6500.Read()) {
float temp = mpu6500. die_temp_c ();
}
ไลบรารีนี้จะแปลงข้อมูลทั้งหมดเป็นระบบแกนร่วมก่อนที่จะส่งคืน ระบบแกนนี้แสดงไว้ด้านล่าง เป็นระบบพิกัดสำหรับมือขวาโดยมีแกน z เป็นบวกอยู่ด้านล่าง ซึ่งพบได้ทั่วไปในพลศาสตร์ของเครื่องบิน
คำเตือน! ระบบแกนนี้แสดงโดยสัมพันธ์กับเซ็นเซอร์ MPU-6500 และ MPU-9250 เซ็นเซอร์อาจหมุนโดยสัมพันธ์กับแผงฝ่าวงล้อม