این برد یک ماژول بر پایه چیپ BMI160 می باشد . BMI160 توانایی اندازه گیری شتاب و زاویه ژیرو با دقت 16 بیتی و در سه محور را دارد . همچنین این سنسور دارای تکنولوژی MEMS با مصرف انرژی بسیار پایین می باشد که در جهت استفاده های پرتابل ساخته شده است . یکی از مزیت های این برد پشتیبانی آن از رابط های I2C و SPI است که می توان آن را توسط انواع مختلی از MCU ها و یا توسط برد های آردوینو راه اندازی نمود . این ماژول قابلیت تنظیم دقت در اندازه گیری شتاب و نیز تعداد نمونه برداری در زاویه ژیروسکوپی را دارد .
پین های ماژول BMI160 :
VIN پین تغذیه ماژول می باشد که می توان به 3.3 یا 5 ولت متصل کرد .
3V3 خروجی 3.3 ولت رگولاتور ماژول
GND زمین ماژول
SCL و SDA پین های ارتباط I2C ماژول
CS پین انتخاب یا فعال ساز ماژول در ارتباط SPI
مشخصات :
- ولتاژ تغذیه 3.3 ولابخا
- اندازه گیری شتاب در سه محور
- اندازه گیری زاویه ژیرسکوپ در سه محور
- دارای دقت های ±2g ، ±4g ، ±8g و ±16g در اندازه گیری شتاب
- دارای سرعت نمونه برداری زاویه ژیرو ±125/±250/±500/±1000/±2000
- دارای 8Kbyte حافظه FIFO
- دارای رابط ارتباطی I2C و SPI
- دارای وقفه خارجی ضربه
راه اندازی توسط آردوینو :
ابتدا لازم است کتابخانه این ماژول را از لینکزیر دانلود کنید و آن را در آردوینو IDE نصب کنید :
https://github.com/hanyazou/BMI160-Arduino/archive/master.zip
پس از نصب کتابخانه پین های ماژول را مطابق شکل زیر به آردوینو متصل کرده و کد های زیر را بر روی برد خود آپلود کنید . مقادیر شتاب در Serial monitor آردوینو IDE چاپ می شود :
#include <BMI160Gen.h> void setup() { Serial.begin(9600); // initialize Serial communication while (!Serial); // wait for the serial port to open // initialize device Serial.println("Initializing IMU device..."); BMI160.begin(BMI160GenClass::SPI_MODE, /* SS pin# = */10); //BMI160.begin(BMI160GenClass::I2C_MODE); uint8_t dev_id = BMI160.getDeviceID(); Serial.print("DEVICE ID: "); Serial.println(dev_id, HEX); // Set the accelerometer range to 250 degrees/second BMI160.setGyroRange(250); Serial.println("Initializing IMU device...done."); } void loop() { int gxRaw, gyRaw, gzRaw; // raw gyro values float gx, gy, gz; // read raw gyro measurements from device BMI160.readGyro(gxRaw, gyRaw, gzRaw); // convert the raw gyro data to degrees/second gx = convertRawGyro(gxRaw); gy = convertRawGyro(gyRaw); gz = convertRawGyro(gzRaw); // display tab-separated gyro x/y/z values Serial.print("g:\t"); Serial.print(gx); Serial.print("\t"); Serial.print(gy); Serial.print("\t"); Serial.print(gz); Serial.println(); delay(500); } float convertRawGyro(int gRaw) { // since we are using 250 degrees/seconds range // -250 maps to a raw value of -32768 // +250 maps to a raw value of 32767 float g = (gRaw * 250.0) / 32768.0; return g; }