ไลบรารี 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 (องศา/วินาที) |
dps1000 | +/- 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 โปรดดูเอกสารประกอบของผู้จำหน่ายของคุณ