LSM303C یک سنسور مگنومتر مبتنری بر MEMS شرکت ST می باشد . این سنسور توانایی سنجش میدان های مغناطیسی در سه جهت محور های x ، y و z را دارد . همچنین قابلیت اندازه گیری شتاب با دقت های 2 ، 4 و 8 g را دارد و دما را دارد . با استفاده از این ماژول می توانید زاویه /زیرو را به دست آورید . LSM303C بسیار کم مصرف می باشد و جهت استفاده در گجت های پرتابل همانند تلفن های همراه را دارد . در این پروژه قصد داریم ماژول LSM303C را با استفاده از آردوینو راه اندازی کنیم و مقادیر به دست آمده از سنسور را در محیط Serial monitor چاپ کنیم . در تصویر زیر پایه های این ماژول نشان داده شده اند :
این ماژول دارای 11 پین به شرح زیر است :
1- VIN ورودی تغذیه ماژول که 3 تا 5 ولت است
2- 3V3 خروجی 3.3 ولت رگولاتور ماژول
3- SCL و SDA پین های ارتباط I2C ماژول
4- CSA پین کنترل ارتباط ماژول برای شتاب سنج می باشد (در حالت عادی Pull up می باشد ) این پین اگر صفر شود ارتباط ماژول SPI خواهد بود و اگر یک باشد ارتباط به صورت I2C هست (تنها در خواندن مقدار شتاب )
5- CSM همانند پین CSA است با این تفاوت که برای خواندن مقدار مگنتومتر است .
6- INTA وقفه مربوط به شتاب
7- این در پایان هر داده برداری مگنتومتر تغییر وضعیت می دهد .
شماتیک اتصال ماژول به برد :
برنامه آردوینو :
#include "Wire.h" #include "SparkFunIMU.h" #include "SparkFunLSM303C.h" #include "LSM303CTypes.h" // #define DEBUG 1 in SparkFunLSM303C.h turns on debugging statements. // Redefine to 0 to turn them off. LSM303C myIMU; void setup() { Wire.begin();//set up I2C bus, comment out if using SPI mode Wire.setClock(400000L);//clock stretching, comment out if using SPI mode Serial.begin(57600);//initialize serial monitor, maximum reliable baud for 3.3V/8Mhz ATmega328P is 57600 if (myIMU.begin() != IMU_SUCCESS) { Serial.println("Failed setup."); while (1); } } void loop() { //Get all parameters Serial.print("\nAccelerometer:\n"); Serial.print(" X = "); Serial.println(myIMU.readAccelX(), 4); Serial.print(" Y = "); Serial.println(myIMU.readAccelY(), 4); Serial.print(" Z = "); Serial.println(myIMU.readAccelZ(), 4); // Not supported by hardware, so will return NAN Serial.print("\nGyroscope:\n"); Serial.print(" X = "); Serial.println(myIMU.readGyroX(), 4); Serial.print(" Y = "); Serial.println(myIMU.readGyroY(), 4); Serial.print(" Z = "); Serial.println(myIMU.readGyroZ(), 4); Serial.print("\nMagnetometer:\n"); Serial.print(" X = "); Serial.println(myIMU.readMagX(), 4); Serial.print(" Y = "); Serial.println(myIMU.readMagY(), 4); Serial.print(" Z = "); Serial.println(myIMU.readMagZ(), 4); Serial.print("\nThermometer:\n"); Serial.print(" Degrees C = "); Serial.println(myIMU.readTempC(), 4); Serial.print(" Degrees F = "); Serial.println(myIMU.readTempF(), 4); delay(1000);//slow down output to make it easier to read, adjust as necessary }