ไลบรารี Arduino สำหรับการสื่อสารกับหน่วยวัดแรงเฉื่อย (IMU) หกแกน ICM42688
InvenSense ICM42688 รองรับ I2C สูงสุด 400 kHz และการสื่อสาร SPI สูงสุด 1 MHz สำหรับการตั้งค่าการลงทะเบียน และ 24 MHz สำหรับการอ่านข้อมูล ช่วงเซนเซอร์เต็มสเกลที่เลือกได้มีดังต่อไปนี้:
ไจโรสโคปช่วงเต็มสเกล | มาตรความเร่งเต็มช่วงสเกล |
---|---|
+/- 15.6 (องศา/วินาที) | - |
+/- 31.2 (องศา/วินาที) | - |
+/- 62.5 (องศา/วินาที) | - |
+/- 125 (องศา/วินาที) | - |
+/- 250 (องศา/วินาที) | +/- 2 (ก.) |
+/- 500 (องศา/วินาที) | +/- 4 (ก.) |
+/- 1,000 (องศา/วินาที) | +/- 8 (ก.) |
+/- 2000 (องศา/วินาที) | +/- 16 (ก.) |
ICM42688 สุ่มตัวอย่างไจโรสโคปและมาตรความเร่งด้วยตัวแปลงแอนะล็อกเป็นดิจิทัล 16 บิต นอกจากนี้ยังมีตัวกรองดิจิทัลที่ตั้งโปรแกรมได้ นาฬิกาที่แม่นยำ เซ็นเซอร์อุณหภูมิแบบฝัง การขัดจังหวะแบบตั้งโปรแกรมได้ (รวมถึงการปลุกเมื่อมีการเคลื่อนไหว) และบัฟเฟอร์ FIFO ขนาด 512 ไบต์
ไลบรารีนี้รองรับการสื่อสารทั้ง I2C และ SPI กับ ICM42688
เพียงโคลนหรือดาวน์โหลดไลบรารีนี้ลงในโฟลเดอร์ Arduino/libraries ของคุณ
ไลบรารีนี้รองรับการสื่อสารทั้ง I2C และ SPI กับ ICM42688 การประกาศอ็อบเจ็กต์ ICM42688 โอเวอร์โหลดด้วยการประกาศที่แตกต่างกันสำหรับการสื่อสาร I2C และ SPI ฟังก์ชั่นอื่นๆ ทั้งหมดยังคงเหมือนเดิม นอกจากนี้ ยังมีคลาสที่ได้รับ ICM42688FIFO รวมอยู่ด้วย ซึ่งมีฟังก์ชันการตั้งค่า FIFO และการรวบรวมข้อมูล นอกเหนือจากฟังก์ชันทั้งหมดที่รวมอยู่ในคลาส ICM42688 พื้นฐาน
ICM42688(TwoWire &bus, uint8_t address) ควรประกาศอ็อบเจ็กต์ ICM42688 โดยระบุบัส I2C และที่อยู่ ICM42688 I2C ที่อยู่ ICM42688 I2C จะเป็น 0x68 หากพิน AD0 ต่อสายดินหรือ 0x69 หากดึงพิน AD0 ไว้สูง ตัวอย่างเช่น รหัสต่อไปนี้ประกาศวัตถุ ICM42688 ที่เรียกว่า IMU พร้อมด้วยเซ็นเซอร์ ICM42688 ที่อยู่บนบัส I2C 0 โดยมีที่อยู่เซ็นเซอร์ 0x68 (AD0 ต่อสายดิน)
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, uint8_t address) ควรประกาศอ็อบเจ็กต์ ICM42688 โดยระบุบัส I2C และที่อยู่ ICM42688 I2C ที่อยู่ ICM42688 I2C จะเป็น 0x68 หากพิน AD0 ต่อสายดินหรือ 0x69 หากดึงพิน AD0 ไว้สูง ตัวอย่างเช่น รหัสต่อไปนี้ประกาศวัตถุ ICM42688 ที่เรียกว่า IMU พร้อมด้วยเซ็นเซอร์ ICM42688 ที่อยู่บนบัส I2C 0 โดยมีที่อยู่เซ็นเซอร์ 0x68 (AD0 ต่อสายดิน) คุณควรระบุพิน SDA และ SCL สำหรับการเชื่อมต่อ I2C ของคุณ (ค่าเริ่มต้นสำหรับ Arduino คือ SDA=18, SCL=19, ESP32 คือ SDA=21, SCL=22)
ICM42688 IMU (Wire, 0x68 , _sda_pin, _scl_pin);
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) ควรประกาศอ็อบเจ็กต์ ICM42688 โดยระบุบัส SPI และพินเลือกชิปที่ใช้ สามารถใช้ ICM42688 หรือวัตถุ SPI อื่นๆ หลายตัวบนบัส SPI เดียวกัน โดยแต่ละตัวมีพินเลือกชิปของตัวเอง พินเลือกชิปอาจเป็นพินดิจิทัลที่มีอยู่ก็ได้ ตัวอย่างเช่น รหัสต่อไปนี้ประกาศวัตถุ ICM42688 ที่เรียกว่า IMU พร้อมด้วยเซ็นเซอร์ ICM42688 ที่อยู่บนบัส SPI 0 พร้อมด้วยชิปเลือกพิน 10
ICM42688 IMU (SPI, 10 );
โปรดทราบว่านาฬิกาบัส SPI ความเร็วสูงเริ่มต้นตั้งค่าไว้ที่ 8 MHz แต่ ICM 42688-p รองรับนาฬิกา SPI สูงสุด 24 MHz ใช้นาฬิกาที่เร็วขึ้นเพื่อการถ่ายโอนข้อมูล SPI ที่เร็วขึ้นเมื่ออ่านข้อมูล
ฟังก์ชั่นต่อไปนี้ใช้ในการตั้งค่าเซ็นเซอร์ ICM42688 ควรเรียกสิ่งเหล่านี้หนึ่งครั้งก่อนที่จะรวบรวมข้อมูล โดยทั่วไปแล้วจะเสร็จสิ้นในฟังก์ชัน setup()
ควรใช้ฟังก์ชัน begin()
เสมอ อีกทางหนึ่ง ฟังก์ชัน setAccelFS
และ setGyroFS
, setAccelODR
และ setGyroODR
สามารถใช้เพื่อตั้งค่ามาตรความเร่งและไจโรสโคปเต็มช่วงสเกลและอัตราข้อมูลเอาท์พุตเป็นค่าอื่นที่ไม่ใช่ค่าเริ่มต้น enableDataReadyInterrupt
และ disableDataReadyInterrupt
จะควบคุมว่า ICM42688 สร้างการขัดจังหวะกับข้อมูลที่พร้อมหรือไม่ enableFifo
ตั้งค่าและเปิดใช้งานบัฟเฟอร์ FIFO ฟังก์ชั่นเหล่านี้มีการอธิบายโดยละเอียดด้านล่าง
int start() ควรเรียกสิ่งนี้ในฟังก์ชันการตั้งค่าของคุณ โดยเริ่มต้นการสื่อสารกับ ICM42688 ตั้งค่าเซ็นเซอร์สำหรับการอ่านข้อมูล และประมาณค่าอคติของไจโร ซึ่งจะถูกลบออกจากข้อมูลเซ็นเซอร์ ฟังก์ชันนี้ส่งคืนค่าบวกในการกำหนดค่าเริ่มต้นที่สำเร็จ และส่งกลับค่าลบในการกำหนดค่าเริ่มต้นที่ไม่สำเร็จ หากไม่สำเร็จ โปรดตรวจสอบสายไฟของคุณหรือลองรีเซ็ตพลังงานให้กับเซ็นเซอร์ ต่อไปนี้เป็นตัวอย่างการตั้งค่า ICM42688
int status = IMU.begin();
(ทางเลือก) int setAccelRange(ช่วง AccelRange) ฟังก์ชันนี้จะตั้งค่าช่วงมาตรวัดความเร่งเต็มช่วงให้เป็นค่าที่กำหนด ตามค่าเริ่มต้น หากไม่ได้เรียกใช้ฟังก์ชันนี้ ระบบจะใช้ช่วงเต็มสเกลที่ +/- 16 กรัม ช่วงเต็มสเกลของมาตรความเร่งที่แจกแจงคือ:
ชื่อมาตรความเร่ง | มาตรความเร่งเต็มช่วงสเกล |
---|---|
จีพีเอ็ม2 | +/- 2 (ก.) |
จีพีเอ็ม4 | +/- 4 (ก.) |
gpm8 | +/- 8 (ก.) |
จีพีเอ็ม16 | +/- 16 (ก.) |
ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว โปรดดู ตัวอย่าง Advanced_I2C ต่อไปนี้เป็นตัวอย่างของการเลือกช่วงความเร่งเต็มรูปแบบที่ +/- 8g
status = IMU.setAccelFS(ICM42688::gpm2);
(ทางเลือก) int setGyroRange(ช่วงของไจโรเรนจ์) ฟังก์ชันนี้จะตั้งค่าไจโรสโคปช่วงเต็มสเกลให้เป็นค่าที่กำหนด ตามค่าเริ่มต้น หากไม่ได้เรียกใช้ฟังก์ชันนี้ ระบบจะใช้ช่วงเต็มสเกล +/- 2000 องศา/วินาที ช่วงไจโรสโคปแบบเต็มสเกลที่แจกแจงคือ:
ชื่อไจโรสโคป | ไจโรสโคปช่วงเต็มสเกล |
---|---|
dps15_625 | +/- 15.625 (องศา/วินาที) |
dps31_25 | +/- 31.25 (องศา/วินาที) |
dps62_5 | +/- 62.5 (องศา/วินาที) |
ดีพีเอส125 | +/- 125 (องศา/วินาที) |
ดีพีเอส250 | +/- 250 (องศา/วินาที) |
ดีพีเอส500 | +/- 500 (องศา/วินาที) |
ดีพีเอส1000 | +/- 1,000 (องศา/วินาที) |
ดีพีเอส2000 | +/- 2000 (องศา/วินาที) |
ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว โปรดดู ตัวอย่าง Advanced_I2C ต่อไปนี้เป็นตัวอย่างของการเลือกไจโรสโคปช่วงเต็มสเกลที่ +/- 250 องศา/วินาที
status = IMU.setGyroFS(ICM42688::dps250);
(เป็นทางเลือก) int setFilters(bool gyroFilters, bool accFilters) นี่เป็นฟังก์ชันเสริมในการตั้งค่าตัวกรองที่ตั้งโปรแกรมได้ (Notch Filter, Anti-Alias Filter, UI Filter Block) ตามค่าเริ่มต้น ตัวกรองทั้งหมดจะเปิดอยู่ รูปต่อไปนี้แสดงแผนภาพบล็อกของเส้นทางสัญญาณสำหรับ ICM42688:
ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว ต่อไปนี้เป็นตัวอย่างของการเปิดตัวกรอง
status = IMU.setFilters( true , true );
(ทางเลือก) int EnableDataReadyInterrupt() การขัดจังหวะจะเชื่อมโยงกับอัตราการส่งออกข้อมูล พิน ICM42688 INT จะส่งสัญญาณพัลส์ 50us เมื่อข้อมูลพร้อม สิ่งนี้มีประโยชน์อย่างมากสำหรับการใช้การขัดจังหวะในการรวบรวมข้อมูลนาฬิกาที่ควรเกิดขึ้นในช่วงเวลาปกติ โปรดดู ตัวอย่าง Interrupt_SPI ฟังก์ชันนี้เปิดใช้งานการขัดจังหวะนี้ ซึ่งจะเกิดขึ้นที่ความถี่ที่กำหนดโดย SRD ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว ต่อไปนี้เป็นตัวอย่างของการเปิดใช้งานการขัดจังหวะข้อมูลพร้อม
status = IMU.enableDataReadyInterrupt();
(ทางเลือก) int DisableDataReadyInterrupt() ฟังก์ชันนี้ปิดใช้งานการขัดจังหวะข้อมูลที่พร้อมตามที่อธิบายไว้ข้างต้น ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว ต่อไปนี้เป็นตัวอย่างของการปิดใช้งานการขัดจังหวะข้อมูลพร้อม
status = IMU.disableDataReadyInterrupt();
(เป็นทางเลือก) uin8_t isInterrupted() ฟังก์ชันนี้อ่านข้อมูลการลงทะเบียนขัดจังหวะพร้อม ฟังก์ชันนี้จะคืนค่าเป็นจริงเมื่อถูกขัดจังหวะ ต่อไปนี้เป็นตัวอย่างของการอ่านข้อมูลพร้อมลงทะเบียนขัดจังหวะ
status = IMU.isInterrupted();
(ไม่บังคับ) int calibrateGyro() อคติของไจโรจะถูกประเมินโดยอัตโนมัติในระหว่างฟังก์ชัน beginning() และนำออกจากการวัดเซ็นเซอร์ ฟังก์ชันนี้จะประมาณค่าอคติของไจโรอีกครั้ง และลบอคติใหม่ออกจากการวัดเซ็นเซอร์ในอนาคต เซ็นเซอร์ควรอยู่กับที่ในระหว่างกระบวนการนี้ ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว ต่อไปนี้เป็นตัวอย่างของการประมาณค่าอคติของไจโรใหม่
status = IMU.calibrateGyro();
(เป็นทางเลือก) float getGyroBiasX() ฟังก์ชันนี้ส่งคืนไจโรไบแอสปัจจุบันในทิศทาง X ในหน่วย deg/s
float gxb;
gxb = IMU.getGyroBiasX();
(เป็นทางเลือก) float getGyroBiasY() ฟังก์ชันนี้ส่งคืนไจโรไบแอสปัจจุบันในทิศทาง Y ในหน่วย deg/s
float gyb;
gyb = IMU.getGyroBiasY();
(เป็นทางเลือก) float getGyroBiasZ() ฟังก์ชันนี้ส่งคืนไจโรไบแอสปัจจุบันในทิศทาง Z ในหน่วย deg/s
float gzb;
gzb = IMU.getGyroBiasZ();
(ทางเลือก) void setGyroBiasX(float bias) ฟังก์ชันนี้จะตั้งค่าไจโรไบแอสที่ใช้ในทิศทาง X ให้เป็นค่าอินพุตในหน่วย deg/s
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(ทางเลือก) void setGyroBiasY(float bias) ฟังก์ชันนี้จะตั้งค่าไจโรไบแอสที่ใช้ในทิศทาง Y ให้เป็นค่าอินพุตในหน่วย deg/s
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(ทางเลือก) ถือเป็นโมฆะ setGyroBiasZ(โฟลตไบแอส) ฟังก์ชันนี้จะตั้งค่าไจโรไบแอสที่ใช้ในทิศทาง Z ให้เป็นค่าอินพุตในหน่วย deg/s
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(เป็นทางเลือก) int calibrateAccel() ฟังก์ชันนี้จะประมาณค่าอคติและสเกลแฟกเตอร์ที่จำเป็นในการสอบเทียบมาตรความเร่ง ฟังก์ชันนี้ทำงานครั้งละหนึ่งแกน และจำเป็นต้องรันสำหรับการวางแนวเซ็นเซอร์ทั้ง 6 ทิศทาง หลังจากที่รวบรวมข้อมูลเซ็นเซอร์ได้เพียงพอแล้ว ระบบจะประมาณค่าอคติและปัจจัยขนาดสำหรับช่องมาตรความเร่งทั้งสามช่อง และใช้การแก้ไขเหล่านี้กับข้อมูลที่วัดได้ การสอบเทียบมาตรความเร่งจะต้องดำเนินการเพียงครั้งเดียวบน IMU โดยสามารถใช้ฟังก์ชันรับและตั้งค่าตามรายละเอียดด้านล่างเพื่อดึงค่าไบแอสและปัจจัยขนาดโดยประมาณ และใช้ในระหว่างรอบกำลังหรือการดำเนินการกับ IMU ในอนาคต ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว
status = IMU.calibrateAccel();
(เป็นทางเลือก) float getAccelBiasX_mss() ฟังก์ชันนี้ส่งคืนอคติของมาตรวัดความเร่งปัจจุบันในทิศทาง X ในหน่วย m/s/s
float axb;
axb = IMU.getAccelBiasX_mss();
(เป็นทางเลือก) float getAccelScaleFactorX() ฟังก์ชันนี้ส่งคืนตัวประกอบสเกลตัววัดความเร่งปัจจุบันในทิศทาง X
float axs;
axs = IMU.getAccelScaleFactorX();
(เป็นทางเลือก) float getAccelBiasY_mss() ฟังก์ชันนี้ส่งคืนอคติของมาตรวัดความเร่งปัจจุบันในทิศทาง Y ในหน่วย m/s/s
float ayb;
ayb = IMU.getAccelBiasY_mss();
(เป็นทางเลือก) float getAccelScaleFactorY() ฟังก์ชันนี้ส่งคืนตัวประกอบสเกลตัววัดความเร่งปัจจุบันในทิศทาง Y
float ays;
ays = IMU.getAccelScaleFactorY();
(เป็นทางเลือก) float getAccelBiasZ_mss() ฟังก์ชันนี้ส่งคืนอคติของมาตรวัดความเร่งปัจจุบันในทิศทาง Z ในหน่วย m/s/s
float azb;
azb = IMU.getAccelBiasZ_mss();
(เป็นทางเลือก) float getAccelScaleFactorZ() ฟังก์ชันนี้ส่งคืนตัวประกอบสเกลตัววัดความเร่งปัจจุบันในทิศทาง Z
float azs;
azs = IMU.getAccelScaleFactorZ();
(ทางเลือก) void setAccelCalX(float bias,float scaleFactor) ฟังก์ชันนี้ตั้งค่าไบอัสของมาตรวัดความเร่ง (m/s/s) และตัวประกอบสเกลที่ใช้ในทิศทาง X ให้เป็นค่าอินพุต
float axb = 0.01 ; // accel bias of 0.01 m/s/s
float axs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalX(axb,axs);
(ทางเลือก) void setAccelCalY(float bias,float scaleFactor) ฟังก์ชันนี้ตั้งค่าอคติของมาตรวัดความเร่ง (m/s/s) และตัวประกอบสเกลที่ใช้ในทิศทาง Y ให้เป็นค่าอินพุต
float ayb = 0.01 ; // accel bias of 0.01 m/s/s
float ays = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalY(ayb,ays);
(ทางเลือก) void setAccelCalZ(float bias,float scaleFactor) ฟังก์ชันนี้ตั้งค่าอคติของมาตรวัดความเร่ง (m/s/s) และตัวประกอบสเกลที่ใช้ในทิศทาง Z ให้เป็นค่าอินพุต
float azb = 0.01 ; // accel bias of 0.01 m/s/s
float azs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalZ(azb,azs);
ฟังก์ชันด้านล่างใช้เพื่อรวบรวมข้อมูลจากเซ็นเซอร์ ICM42688 โปรดดูเอกสารข้อมูลส่วนที่ 10.1 สำหรับการวางแนวของแกนที่ละเอียดอ่อน
int getAGT() อ่านเซ็นเซอร์และเก็บข้อมูลล่าสุดไว้ในบัฟเฟอร์ ซึ่งควรจะเรียกทุกครั้งที่คุณต้องการดึงข้อมูลจากเซ็นเซอร์ ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว
IMU.getAGT();
float accX() รับค่ามาตรความเร่งจากบัฟเฟอร์ข้อมูลในทิศทาง X และส่งกลับเป็นหน่วยของ g
float ax = IMU.accX();
float accY() รับค่ามาตรความเร่งจากบัฟเฟอร์ข้อมูลในทิศทาง Y และส่งกลับเป็นหน่วยของ g
float ay = IMU.accY();
float accZ() รับค่ามาตรความเร่งจากบัฟเฟอร์ข้อมูลในทิศทาง Z และส่งกลับเป็นหน่วยของ g
float az = IMU.accZ();
float gyrX() รับค่าไจโรสโคปจากบัฟเฟอร์ข้อมูลในทิศทาง X และส่งกลับเป็นหน่วย deg/s
float gx = IMU.gyrX();
float gyrY() รับค่าไจโรสโคปจากบัฟเฟอร์ข้อมูลในทิศทาง Y และส่งกลับเป็นหน่วย deg/s
float gy = IMU.gyrY();
float gyrZ() รับค่าไจโรสโคปจากบัฟเฟอร์ข้อมูลในทิศทาง Z และส่งกลับเป็นหน่วย deg/s
float gz = IMU.gyrZ();
float temp() รับค่าอุณหภูมิแม่พิมพ์จากบัฟเฟอร์ข้อมูลและส่งกลับเป็นหน่วย C
float temperature = IMU.temp();
คลาสที่ได้รับ ICM42688FIFO ขยายฟังก์ชันการทำงานที่มีให้โดยคลาสพื้นฐาน ICM42688 โดยให้การสนับสนุนสำหรับการตั้งค่าและการอ่านบัฟเฟอร์ ICM42688FIFO ฟังก์ชันทั้งหมดที่อธิบายไว้ข้างต้น โดยเป็นส่วนหนึ่งของคลาส ICM42688 ก็สามารถใช้ได้กับคลาส ICM42688FIFO เช่นกัน
ICM42688FIFO(TwoWire &bus, uint8_t address) ควรประกาศอ็อบเจ็กต์ ICM42688FIFO โดยระบุบัส I2C และที่อยู่ ICM42688 I2C ที่อยู่ ICM42688 I2C จะเป็น 0x68 หากพิน AD0 ต่อสายดินหรือ 0x69 หากดึงพิน AD0 ไว้สูง ตัวอย่างเช่น รหัสต่อไปนี้ประกาศวัตถุ ICM42688FIFO ที่เรียกว่า IMU พร้อมด้วยเซ็นเซอร์ ICM42688 ที่อยู่บนบัส I2C 0 โดยมีที่อยู่เซ็นเซอร์ 0x68 (AD0 ต่อสายดิน)
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) ควรประกาศอ็อบเจ็กต์ ICM42688FIFO โดยระบุบัส SPI และพินการเลือกชิปที่ใช้ สามารถใช้ ICM42688 หรือวัตถุ SPI อื่นๆ หลายตัวบนบัส SPI เดียวกัน โดยแต่ละตัวมีพินเลือกชิปของตัวเอง พินเลือกชิปอาจเป็นพินดิจิทัลที่มีอยู่ก็ได้ ตัวอย่างเช่น โค้ดต่อไปนี้ประกาศวัตถุ ICM42688FIFO ที่เรียกว่า IMU พร้อมด้วยเซ็นเซอร์ ICM42688 ที่อยู่บนบัส SPI 0 พร้อมด้วยชิปเลือกพิน 10
ICM42688FIFO IMU (SPI, 10 );
โปรดทราบว่านาฬิกาบัส SPI ความเร็วสูงเริ่มต้นตั้งค่าไว้ที่ 8 MHz แต่ ICM 42688-p รองรับนาฬิกา SPI สูงสุด 24 MHz ใช้นาฬิกาที่เร็วขึ้นเพื่อการถ่ายโอนข้อมูล SPI ที่เร็วขึ้นเมื่ออ่านข้อมูล
(ทางเลือก) int EnableFifo(bool accel,bool gyro,bool temp) ฟังก์ชันนี้จะกำหนดค่าและเปิดใช้งานบัฟเฟอร์ ICM42688 FIFO บัฟเฟอร์ขนาด 512 ไบต์นี้สุ่มตัวอย่างข้อมูลที่อัตราเอาต์พุตข้อมูลที่กำหนดโดย SRD และช่วยให้ไมโครคอนโทรลเลอร์สามารถอ่านข้อมูลจำนวนมากได้ ซึ่งช่วยลดภาระงานของไมโครคอนโทรลเลอร์สำหรับแอปพลิเคชันบางประเภท มีการกำหนดค่าด้วยชุดค่าบูลีนที่อธิบายว่าข้อมูลใดที่จะบัฟเฟอร์ใน FIFO: มาตรความเร่ง ไจโรสโคป หรืออุณหภูมิ ข้อมูลมาตรความเร่งและไจโรสโคปแต่ละอันใช้พื้นที่ 6 ไบต์ต่อตัวอย่าง และอุณหภูมิ 2 ไบต์ สิ่งสำคัญคือต้องเลือกเฉพาะแหล่งข้อมูลที่ต้องการเพื่อให้แน่ใจว่า FIFO จะไม่มากเกินไประหว่างการอ่านข้อมูล ตัวอย่างเช่น การเปิดใช้งานแหล่งข้อมูลทั้งหมดจะใช้เวลา 21 ไบต์ต่อตัวอย่าง ทำให้ FIFO สามารถเก็บตัวอย่างได้เพียง 24 ตัวอย่างก่อนที่จะล้น หากจำเป็นต้องใช้เฉพาะข้อมูลมาตรความเร่ง ค่านี้จะเพิ่มเป็น 85 ตัวอย่างก่อนที่จะล้น ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว โปรดดู ตัวอย่าง FIFO_SPI ต่อไปนี้เป็นตัวอย่างการเปิดใช้งาน FIFO เพื่อบัฟเฟอร์ข้อมูลมาตรความเร่งและไจโรสโคป
status = IMU.enableFifo( true , true , false , false );
int readFifo() อ่านบัฟเฟอร์ FIFO จาก ICM42688 แยกวิเคราะห์และจัดเก็บข้อมูลไว้ในบัฟเฟอร์บนไมโครคอนโทรลเลอร์ ควรเรียกทุกครั้งที่คุณต้องการดึงข้อมูลจากบัฟเฟอร์ FIFO ฟังก์ชันนี้จะส่งกลับค่าบวกเมื่อสำเร็จ และค่าลบเมื่อล้มเหลว
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data) รับค่า accelerometer จากบัฟเฟอร์ข้อมูลในทิศทาง X และส่งกลับค่าดังกล่าวในหน่วย m/s/s ข้อมูลจะถูกส่งกลับเป็นอาร์เรย์พร้อมกับจำนวนองค์ประกอบภายในอาร์เรย์นั้น ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังถ่ายโอนไปมีความจุเพียงพอที่จะจัดเก็บข้อมูล
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data) รับค่า accelerometer จากบัฟเฟอร์ข้อมูลในทิศทาง Y และส่งกลับค่าดังกล่าวในหน่วย m/s/s ข้อมูลจะถูกส่งกลับเป็นอาร์เรย์พร้อมกับจำนวนองค์ประกอบภายในอาร์เรย์นั้น ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังถ่ายโอนไปมีความจุเพียงพอที่จะจัดเก็บข้อมูล
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data) รับค่า accelerometer จากบัฟเฟอร์ข้อมูลในทิศทาง Z และส่งกลับค่าดังกล่าวในหน่วย m/s/s ข้อมูลจะถูกส่งกลับเป็นอาร์เรย์พร้อมกับจำนวนองค์ประกอบภายในอาร์เรย์นั้น ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังถ่ายโอนไปมีความจุเพียงพอที่จะจัดเก็บข้อมูล
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data) รับค่าไจโรสโคปจากบัฟเฟอร์ข้อมูลในทิศทาง X และส่งกลับเป็นหน่วย deg/s ข้อมูลจะถูกส่งกลับเป็นอาร์เรย์พร้อมกับจำนวนองค์ประกอบภายในอาร์เรย์นั้น ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังถ่ายโอนไปมีความจุเพียงพอที่จะจัดเก็บข้อมูล
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data) รับค่าไจโรสโคปจากบัฟเฟอร์ข้อมูลในทิศทาง Y และส่งกลับเป็นหน่วย deg/s ข้อมูลจะถูกส่งกลับเป็นอาร์เรย์พร้อมกับจำนวนองค์ประกอบภายในอาร์เรย์นั้น ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังถ่ายโอนไปมีความจุเพียงพอที่จะจัดเก็บข้อมูล
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data) รับค่าไจโรสโคปจากบัฟเฟอร์ข้อมูลในทิศทาง Z และส่งกลับเป็นหน่วย deg/s ข้อมูลจะถูกส่งกลับเป็นอาร์เรย์พร้อมกับจำนวนองค์ประกอบภายในอาร์เรย์นั้น ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังถ่ายโอนไปมีความจุเพียงพอที่จะจัดเก็บข้อมูล
float gz[ 100 ];
size_t samples;
IMU.getFifoGyroZ(&samples,gx);
void getFifoTemperature_C(size_t size,float data) รับค่าอุณหภูมิแม่พิมพ์จากบัฟเฟอร์ข้อมูลและส่งกลับเป็นหน่วย C ข้อมูลจะถูกส่งกลับเป็นอาร์เรย์พร้อมกับจำนวนองค์ประกอบภายในอาร์เรย์นั้น ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังถ่ายโอนไปมีความจุเพียงพอที่จะจัดเก็บข้อมูล
float temp[ 100 ];
size_t samples;
IMU.getFifoTemperature_C(&samples,temp);
โปรดดูเอกสารข้อมูล ICM42688 ไลบรารีนี้ควรทำงานได้ดีกับบอร์ดฝ่าวงล้อมหรือเซ็นเซอร์ฝังตัวอื่นๆ โปรดดูแผนภาพ pinout ของผู้จำหน่ายของคุณ
พิน ICM42688 ควรเชื่อมต่อดังนี้:
ควรใช้ตัวต้านทาน 4.7 kOhm เป็นตัวดึงข้อมูลบน SDA และ SCL ตัวต้านทานเหล่านี้ควรใช้แหล่งจ่าย 3.3V
พิน ICM42688 ควรเชื่อมต่อดังนี้:
บอร์ดฝ่าวงล้อมบางบอร์ด รวมถึงบอร์ดฝ่าวงล้อม Embedded Masters จำเป็นต้องมีการแก้ไขเล็กน้อยเพื่อเปิดใช้งาน SPI โปรดดูเอกสารประกอบของผู้จำหน่ายของคุณ