IMU Data to Motion: Tutorial for Translating Sensor Data into Real-World Movement
Contributors:
ROB-24601
Arduino Sketch
/* Movement to Motion: Using the SparkFun Micro Magnetometer (MMC5983MA) to control servo motors By: Rob Reynolds SparkFun Electronics Date: September 19th, 2024 Based on original code by Nathan Seidle and Ricardo Ramos License: SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT). Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/19921 This example demonstrates how to take raw X/Y/Z readings from the sensor over Qwiic and translate them to movement through servo motors on the X and Y axes Hardware Connections: Plug a Qwiic cable into the sensor and a RedBoard If you don't have a platform with a Qwiic connection use the SparkFun Qwiic Breadboard Jumper (https://www.sparkfun.com/products/17912) Open the serial monitor at 115200 baud to see the output */ #include <Wire.h> #include <SparkFun_MMC5983MA_Arduino_Library.h> //Click here to get the library: http://librarymanager/All#SparkFun_MMC5983MA SFE_MMC5983MA myMag; // Here's where we set up the servos #include <Servo.h> Servo servoPitchX; //Create object on X access Servo servoRollY; //Create object on Y access // initiate variables for servo positions int rollYVal; int pitchXVal; void setup() { Serial.begin(115200); Serial.println("Movement to Motion Example with the MMC5983MA"); Wire.begin(); if (myMag.begin() == false) { Serial.println("MMC5983MA did not respond - check your wiring. Freezing."); while (true) ; } myMag.softReset(); Serial.println("MMC5983MA connected"); servoPitchX.attach(8); servoRollY.attach(9); } void loop() { uint32_t currentX = 0; uint32_t currentY = 0; uint32_t currentZ = 0; // This reads the X, Y and Z channels consecutively // (Useful if you have one or more channels disabled) currentX = myMag.getMeasurementX(); currentY = myMag.getMeasurementY(); currentZ = myMag.getMeasurementZ(); // Z axis/Yaw not needed for this example // Or, we could read all three simultaneously //myMag.getMeasurementXYZ(¤tX, ¤tY, ¤tZ); Serial.print("X axis raw value: "); Serial.print(currentX/1000); rollYVal = map(currentX/1000, 123, 133, 15, 165); servoRollY.write(rollYVal); Serial.print("\tY axis raw value: "); Serial.print(currentY/1000); pitchXVal = map(currentY/1000, 131, 119, 35, 135); servoPitchX.write(pitchXVal); Serial.print("\tZ axis raw value: "); Serial.println(currentZ); //Z values are not necessary here, unless you want to add yaw on the Z axis Serial.println(); delay(50); // Don't overtax the I2C }