9 فایل پیوست
ماژول imu ده درجه آزادی و نه محور gy-87 - سنسور mpu6050 hmc5883l bmp180
gy-87 imu يك برد كوچك است كه تمامي سنسورهاي مورد نياز براي 10 درجه آزادي روي آن قرار گرفته است.ارتباط اين ماژول با آردوينو از طريق رابط i2c برقرار ميشود.
اجزاي تشكيل دهنده ماژول imu gy-87 :
Mpu6050 :سنسور gyro سه محوره ، سنسور شتاب سه محوره و دماسنج محصول invensense شامل مجموعه شتاب سنج و gyro با دقت بالا (16 بيتي) ميباشد. همچنين داراي بافر FIFO با ظرفيت 1024 بايت .و سنسور دما با رنج اندازه گيري 40- تا 85+ درجه سانتيگراد ميباشد. این ماژول با تجمیع و ترکیب یک ژیروسکوپ 3 محور با یک شتاب سنج 3 محور روی یک چیپ سیلیکونی و بهره گیری از یک پردازشگر دیجیتال حرکت، قادر است الگوریتم های پیچیده 9 محوری را اجرا کند.
Hmc5883l: قطب نماي الكترونيكي 3 محوره محصول Honeywell يك قطب نماي 3 محوره ديجيتال است كه ميتواند شدت ميدان مغناطيسي تا 8± گاوس را با دقت 5 ميلي گاوس اندازه گيري نمايد. توسط اين ماژول ميتوان به دقت 1 تا 2 درجه در جهت يابي و ناوبري رسيد.
bmp180:ماژول فشار بارومتريك با دقت بالا و جريان مصرفي پايين با رنج گسترده در اندازه گيري فشار بارومتريك (300 تا 1100 هكتوپاسكال).اين سنسور بر اساس تكنولوژي مقاومت پيزوالكتريك ياPiezo-resistive طراحي و توليد شده. استفاده از اين تكنولوژي دقت بالا، خطي بودن و پايداري طولاني مدت را براي اين سنسور فراهم نموده است.
اين سنسور اندازه گيري ارتفاع از 500 متر پايينتر از سطح دريا تا 9000 متر بالاتر از سطح دريا را ممكن ميسازد.
فایل پیوست 294 فایل پیوست 307
کد:
/**
* FreeIMU library serial communication protocol
*/
#include <ADXL345.h>
#include <bma180.h>
#include <HMC58X3.h>
#include <ITG3200.h>
#include <MS561101BA.h>
#include <I2Cdev.h>
#include <MPU60X0.h>
#include <EEPROM.h>
//#define DEBUG
#include "DebugUtils.h"
#include "CommunicationUtils.h"
#include "FreeIMU.h"
#include <Wire.h>
#include <SPI.h>
float q[4];
int raw_values[9];
float ypr[3]; // yaw pitch roll
char str[256];
float val[9];
// Set the FreeIMU object
FreeIMU my3IMU = FreeIMU();
//The command from the PC
char cmd;
void setup() {
Serial.begin(115200);
Wire.begin();
my3IMU.init(true);
// LED
pinMode(13, OUTPUT);
}
void loop() {
if(Serial.available()) {
cmd = Serial.read();
if(cmd=='v') {
sprintf(str, "FreeIMU library by %s, FREQ:%s, LIB_VERSION: %s, IMU: %s", FREEIMU_DEVELOPER, FREEIMU_FREQ, FREEIMU_LIB_VERSION, FREEIMU_ID);
Serial.print(str);
Serial.print('\n');
}
else if(cmd=='r') {
uint8_t count = serial_busy_wait();
for(uint8_t i=0; i<count; i++) {
my3IMU.getRawValues(raw_values);
sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,", raw_values[0], raw_values[1], raw_values[2], raw_values[3], raw_values[4], raw_values[5], raw_values[6], raw_values[7], raw_values[8], raw_values[9], raw_values[10]);
Serial.print(str);
Serial.print('\n');
}
}
else if(cmd=='b') {
uint8_t count = serial_busy_wait();
for(uint8_t i=0; i<count; i++) {
#if HAS_ITG3200()
my3IMU.acc.readAccel(&raw_values[0], &raw_values[1], &raw_values[2]);
my3IMU.gyro.readGyroRaw(&raw_values[3], &raw_values[4], &raw_values[5]);
#else // MPU6050
my3IMU.accgyro.getMotion6(&raw_values[0], &raw_values[1], &raw_values[2], &raw_values[3], &raw_values[4], &raw_values[5]);
#endif
writeArr(raw_values, 6, sizeof(int)); // writes accelerometer and gyro values
#if IS_9DOM()
my3IMU.magn.getValues(&raw_values[0], &raw_values[1], &raw_values[2]);
writeArr(raw_values, 3, sizeof(int));
#endif
Serial.println();
}
}
else if(cmd == 'q') {
uint8_t count = serial_busy_wait();
for(uint8_t i=0; i<count; i++) {
my3IMU.getQ(q);
serialPrintFloatArr(q, 4);
Serial.println("");
}
}
#ifndef CALIBRATION_H
else if(cmd == 'c') {
const uint8_t eepromsize = sizeof(float) * 6 + sizeof(int) * 6;
while(Serial.available() < eepromsize) ; // wait until all calibration data are received
EEPROM.write(FREEIMU_EEPROM_BASE, FREEIMU_EEPROM_SIGNATURE);
for(uint8_t i = 1; i<(eepromsize + 1); i++) {
EEPROM.write(FREEIMU_EEPROM_BASE + i, (char) Serial.read());
}
my3IMU.calLoad(); // reload calibration
// toggle LED after calibration store.
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
}
#endif
else if(cmd == 'C') { // check calibration values
Serial.print("acc offset: ");
Serial.print(my3IMU.acc_off_x);
Serial.print(",");
Serial.print(my3IMU.acc_off_y);
Serial.print(",");
Serial.print(my3IMU.acc_off_z);
Serial.print("\n");
Serial.print("magn offset: ");
Serial.print(my3IMU.magn_off_x);
Serial.print(",");
Serial.print(my3IMU.magn_off_y);
Serial.print(",");
Serial.print(my3IMU.magn_off_z);
Serial.print("\n");
Serial.print("acc scale: ");
Serial.print(my3IMU.acc_scale_x);
Serial.print(",");
Serial.print(my3IMU.acc_scale_y);
Serial.print(",");
Serial.print(my3IMU.acc_scale_z);
Serial.print("\n");
Serial.print("magn scale: ");
Serial.print(my3IMU.magn_scale_x);
Serial.print(",");
Serial.print(my3IMU.magn_scale_y);
Serial.print(",");
Serial.print(my3IMU.magn_scale_z);
Serial.print("\n");
}
else if(cmd == 'd') { // debugging outputs
while(1) {
my3IMU.getRawValues(raw_values);
sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,", raw_values[0], raw_values[1], raw_values[2], raw_values[3], raw_values[4], raw_values[5], raw_values[6], raw_values[7], raw_values[8], raw_values[9], raw_values[10]);
Serial.print(str);
Serial.print('\n');
my3IMU.getQ(q);
serialPrintFloatArr(q, 4);
Serial.println("");
my3IMU.getYawPitchRoll(ypr);
Serial.print("Yaw: ");
Serial.print(ypr[0]);
Serial.print(" Pitch: ");
Serial.print(ypr[1]);
Serial.print(" Roll: ");
Serial.print(ypr[2]);
Serial.println("");
}
}
}
}
char serial_busy_wait() {
while(!Serial.available()) {
; // do nothing until ready
}
return Serial.read();
}
const int EEPROM_MIN_ADDR = 0;
const int EEPROM_MAX_ADDR = 511;
void eeprom_serial_dump_column() {
// counter
int i;
// byte read from eeprom
byte b;
// buffer used by sprintf
char buf[10];
for (i = EEPROM_MIN_ADDR; i <= EEPROM_MAX_ADDR; i++) {
b = EEPROM.read(i);
sprintf(buf, "%03X: %02X", i, b);
Serial.println(buf);
}
}
فایل پیوست 295
جهت سفارش این کالا، به این بخش در فروشگاه آفتاب رایانه مراجعه نمایید.