صفحه 1 از 5 123 ... آخرینآخرین
نمایش نتایج: از 1 به 10 از 49
Like Tree23 لایک

موضوع: آی ام یو ( 10dof imu / ahrs ) نه محوره gy-80 - ماژول قطب نمای دیجیتال ، سنسور شتاب

  1. #1
    max
    max آنلاین نیست.
    Member
    تاریخ عضویت
    Jul 2013
    محل سکونت
    iran-shiraz
    نوشته ها
    70

    Lightbulb آی ام یو ( 10dof imu / ahrs ) نه محوره gy-80 - ماژول قطب نمای دیجیتال ، سنسور شتاب

    یک ماژول قدرتمند برای ربات پرنده ، خودروی هوشمند و یا سایر پروژه های شما! این ماژول از چهار سنسور l3g4200d ( سنسور زاویه سنج سه محوره ) ، adxl345 (سنسور شتاب سنج سه محوره ) ، hmc5883l ( قطب نمای دیجیتال ) و bmp085 که یک سنسور فشار بارومتریک می باشد تشکیل شده است . این سنسور در کنار اتصال به یک ماژول موقعیت یاب ماهواره ای ( gps ) هر آنچه را که برای جهت یابی در کنترل هوشمند و خودکار ، سیستم های آتوپایلوت یا آتولندینگ ، ساخت یک هواپیمای مدل و یا سایر ربات های پرنده بدون سرنشین خودکار نیاز دارید در اختیار شما قرار می دهد. با استفاده از داده های قطب نمای دیجیتال ، می توانید جهت های جغرافیایی را معین نمایید ، با استفاده از شتاب سنج میزان سرعت و شتاب را اندازه گیری کنید ، سنسور زاویه سنج روی برد ، زاویه را در سه محور مشخص می نمایند و در نهایت فشارسنج نصب شده بر روی برد در اصل می تواند به صورت یک ارتفاع سنج عمل نموده و میزان ارتفاع را به شما اعلام کند. مصرف کم ، قیمت مناسب و رابط دیجیتال i2c این برد برای اتصال به برد آردوینو و یا سایر میکروکنترل ها از سایر ویژگی های این ماژول می باشند.
    10dof_imu-500x500.jpg gy-80-schemat.jpg gy-80-sch.jpg flight_dynamic.jpg
    امکانات:
    چیپ ها : L3g4200d + adxl345 + hmc5883l +bmp085
    رگلاتور داخلی برای پشتیبانی از ولتاژهای 3.3 و 5 ولت میکروکنترل ها
    رابط دیجیتال i2c
    کیفیت بالای مدار pcb

    برنامه زير پارامترهاي yaw,pitch,roll,temperature,pressure,altitude را از طريق serial monitor نمايش ميدهد.
    جهت سفارش این کالا، به این بخش در فروشگاه آفتاب رایانه مراجعه نمایید.
    فایل های پیوست شده فایل های پیوست شده
    ویرایش توسط max : 10-26-2013 در ساعت 07:24 PM

  2. #2
    Junior Member
    تاریخ عضویت
    Sep 2013
    محل سکونت
    Iran
    نوشته ها
    22

    Hmc5883l

    برای راه اندازی این ماژول و هر چهار سنسور اون فقط کافیه 5 سیم اول رو طبق عکس به آردوینو متصل کنید و هیچ نیازی به وصل کردن سیم های دیگه نیست
    screenshot-1-.jpg

    برای راه اندازی سنسور HMC5883L یا همون قطب نمای خودمون باید فایل HMC5883L.zip رو دانلود کنید و بعد از اکسترکت کردن اون رو تو پوشه Library برنامه آردوینو قرار بدید
    و بعد از نمونه کد زیر استفاده کنید

    این نمونه کد خروجی قطب نما رو به دو صورت زاویه و رادیان نمایش میده.

    کد:
    #include <Wire.h>
    // Reference the HMC5883L Compass Library
    #include <HMC5883L.h>
    
    // Store our compass as a variable.
    HMC5883L compass;
    // Record any errors that may occur in the compass.
    int error = 0;
    
    // Out setup routine, here we will configure the microcontroller and compass.
    void setup()
    {
      Serial.begin(9600);
      Wire.begin(); // Start the I2C interface.
      compass = HMC5883L(); // Construct a new HMC5883 compass.
      error = compass.SetScale(1.3); // Set the scale of the compass.
      if(error != 0)
      error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
      if(error != 0)
      Serial.println(compass.GetErrorText(error));
    }
    
    void loop()
    {
      MagnetometerRaw raw = compass.ReadRawAxis();
      MagnetometerScaled scaled = compass.ReadScaledAxis();
      
      // Values are accessed like so:
      int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)
    
      // Calculate heading when the magnetometer is level, then correct for signs of axis.
      float heading = atan2(scaled.YAxis, scaled.XAxis);
      
      float declinationAngle = 0.0457;
      heading += declinationAngle;
      
      if(heading < 0)
        heading += 2*PI;
        
      // Check for wrap due to addition of declination.
      if(heading > 2*PI)
        heading -= 2*PI;
       
      // Convert radians to degrees for readability.
      float headingDegrees = heading * 180/M_PI; 
      
       Serial.print("Heading: ");
       Serial.print(heading);
       Serial.print(" Radians ");
       Serial.print(headingDegrees);
       Serial.println(" Degrees");
    }
    فایل های پیوست شده فایل های پیوست شده
    ویرایش توسط ehsan_1990 : 02-04-2014 در ساعت 08:35 AM

  3. #3
    Junior Member
    تاریخ عضویت
    Sep 2013
    محل سکونت
    Iran
    نوشته ها
    22

    Bmp085

    برای راه اندازی سنسور BMP085 یا همون فشار سنج هوا نیازی به هیچ کتابخونه ای نیست
    فقط کافیه از کد زیر استفاده کنید
    این کد چهار پارامتر دمای محیط با واحد درجه سانتی گراد، ارتفاع از سطح دریا با واحد متر، فشار هوا با دو واحد پاسکال و اتمسفر به ما میده

    کد:
    #include <Wire.h>
    #define BMP085_ADDRESS 0x77  // I2C address of BMP085
    const unsigned char OSS = 0;  // Oversampling Setting
    // Calibration values
    int ac1;
    int ac2;
    int ac3;
    unsigned int ac4;
    unsigned int ac5;
    unsigned int ac6;
    int b1;
    int b2;
    int mb;
    int mc;
    int md;
    long b5; 
    
    void setup(){
      Serial.begin(9600);
      Wire.begin();
      bmp085Calibration();
    }
    
    void loop()
    {
      float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
      float pressure = bmp085GetPressure(bmp085ReadUP());
      float atm = pressure / 101325; // "standard atmosphere"
      float altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters 
    
      Serial.print("Temperature: ");
      Serial.print(temperature, 2);
      Serial.println("deg C");
    
      Serial.print("Pressure: ");
      Serial.print(pressure, 0);
      Serial.println(" Pa");
    
      Serial.print("Standard Atmosphere: ");
      Serial.println(atm, 4);
    
      Serial.print("Altitude: ");
      Serial.print(altitude, 2);
      Serial.println(" M");
    
      Serial.println();
    
      delay(1000);
    }
    
    void bmp085Calibration()
    {
      ac1 = bmp085ReadInt(0xAA);
      ac2 = bmp085ReadInt(0xAC);
      ac3 = bmp085ReadInt(0xAE);
      ac4 = bmp085ReadInt(0xB0);
      ac5 = bmp085ReadInt(0xB2);
      ac6 = bmp085ReadInt(0xB4);
      b1 = bmp085ReadInt(0xB6);
      b2 = bmp085ReadInt(0xB8);
      mb = bmp085ReadInt(0xBA);
      mc = bmp085ReadInt(0xBC);
      md = bmp085ReadInt(0xBE);
    }
    
    // Calculate temperature in deg C
    float bmp085GetTemperature(unsigned int ut){
      long x1, x2;
    
      x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
      x2 = ((long)mc << 11)/(x1 + md);
      b5 = x1 + x2;
    
      float temp = ((b5 + 8)>>4);
      temp = temp /10;
    
      return temp;
    }
    long bmp085GetPressure(unsigned long up){
      long x1, x2, x3, b3, b6, p;
      unsigned long b4, b7;
    
      b6 = b5 - 4000;
      // Calculate B3
      x1 = (b2 * (b6 * b6)>>12)>>11;
      x2 = (ac2 * b6)>>11;
      x3 = x1 + x2;
      b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
    
      // Calculate B4
      x1 = (ac3 * b6)>>13;
      x2 = (b1 * ((b6 * b6)>>12))>>16;
      x3 = ((x1 + x2) + 2)>>2;
      b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
    
      b7 = ((unsigned long)(up - b3) * (50000>>OSS));
      if (b7 < 0x80000000)
        p = (b7<<1)/b4;
      else
        p = (b7/b4)<<1;
    
      x1 = (p>>8) * (p>>8);
      x1 = (x1 * 3038)>>16;
      x2 = (-7357 * p)>>16;
      p += (x1 + x2 + 3791)>>4;
    
      long temp = p;
      return temp;
    }
    
    // Read 1 byte from the BMP085 at 'address'
    char bmp085Read(unsigned char address)
    {
      unsigned char data;
    
      Wire.beginTransmission(BMP085_ADDRESS);
      Wire.write(address);
      Wire.endTransmission();
    
      Wire.requestFrom(BMP085_ADDRESS, 1);
      while(!Wire.available())
        ;
    
      return Wire.read();
    }
    
    int bmp085ReadInt(unsigned char address)
    {
      unsigned char msb, lsb;
    
      Wire.beginTransmission(BMP085_ADDRESS);
      Wire.write(address);
      Wire.endTransmission();
    
      Wire.requestFrom(BMP085_ADDRESS, 2);
      while(Wire.available()<2)
        ;
      msb = Wire.read();
      lsb = Wire.read();
    
      return (int) msb<<8 | lsb;
    }
    
    // Read the uncompensated temperature value
    unsigned int bmp085ReadUT(){
      unsigned int ut;
    
      // Write 0x2E into Register 0xF4
      // This requests a temperature reading
      Wire.beginTransmission(BMP085_ADDRESS);
      Wire.write(0xF4);
      Wire.write(0x2E);
      Wire.endTransmission();
    
      // Wait at least 4.5ms
      delay(5);
    
      // Read two bytes from registers 0xF6 and 0xF7
      ut = bmp085ReadInt(0xF6);
      return ut;
    }
    
    // Read the uncompensated pressure value
    unsigned long bmp085ReadUP(){
    
      unsigned char msb, lsb, xlsb;
      unsigned long up = 0;
    
      // Write 0x34+(OSS<<6) into register 0xF4
      // Request a pressure reading w/ oversampling setting
      Wire.beginTransmission(BMP085_ADDRESS);
      Wire.write(0xF4);
      Wire.write(0x34 + (OSS<<6));
      Wire.endTransmission();
    
      // Wait for conversion, delay time dependent on OSS
      delay(2 + (3<<OSS));
    
      // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
      msb = bmp085Read(0xF6);
      lsb = bmp085Read(0xF7);
      xlsb = bmp085Read(0xF8);
    
      up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
    
      return up;
    }
    
    void writeRegister(int deviceAddress, byte address, byte val) {
      Wire.beginTransmission(deviceAddress); // start transmission to device 
      Wire.write(address);       // send register address
      Wire.write(val);         // send value to write
      Wire.endTransmission();     // end transmission
    }
    
    int readRegister(int deviceAddress, byte address){
    
      int v;
      Wire.beginTransmission(deviceAddress);
      Wire.write(address); // register to read
      Wire.endTransmission();
    
      Wire.requestFrom(deviceAddress, 1); // read a byte
    
      while(!Wire.available()) {
        // waiting
      }
    
      v = Wire.read();
      return v;
    }
    
    float calcAltitude(float pressure){
    
      float A = pressure/101325;
      float B = 1/5.25588;
      float C = pow(A,B);
      C = 1 - C;
      C = C /0.0000225577;
    
      return C;
    }
    ویرایش توسط ehsan_1990 : 02-04-2014 در ساعت 08:35 AM

  4. #4
    Junior Member
    تاریخ عضویت
    Sep 2013
    محل سکونت
    Iran
    نوشته ها
    22

    L3G4200D Tripple Axis Gyroscope

    برای راه اندازی سنسور ژیروسکوپ L3G4200D Tripple Axis Gyroscope نیاز به کتابخونه نداره
    برای دریافت سه پارامتر X Y Z
    از کد زیر استفاده کنید

    کد:
    #include <Wire.h>
    
    #define CTRL_REG1 0x20
    #define CTRL_REG2 0x21
    #define CTRL_REG3 0x22
    #define CTRL_REG4 0x23
    #define CTRL_REG5 0x24
    
    int L3G4200D_Address = 105; //I2C address of the L3G4200D
    
    int x;
    int y;
    int z;
    
    void setup(){
    
      Wire.begin();
      Serial.begin(9600);
    
      Serial.println("starting up L3G4200D");
      setupL3G4200D(2000); // Configure L3G4200  - 250, 500 or 2000 deg/sec
    
      delay(1500); //wait for the sensor to be ready 
    }
    
    void loop(){
       getGyroValues();  // This will update x, y, and z with new values
    
      Serial.print("X:");
      Serial.print(x);
    
      Serial.print(" Y:");
      Serial.print(y);
    
      Serial.print(" Z:");
      Serial.println(z);
    
      delay(100); //Just here to slow down the serial to make it more readable
    }
    
    void getGyroValues(){
    
      byte xMSB = readRegister(L3G4200D_Address, 0x29);
      byte xLSB = readRegister(L3G4200D_Address, 0x28);
      x = ((xMSB << 8) | xLSB);
    
      byte yMSB = readRegister(L3G4200D_Address, 0x2B);
      byte yLSB = readRegister(L3G4200D_Address, 0x2A);
      y = ((yMSB << 8) | yLSB);
    
      byte zMSB = readRegister(L3G4200D_Address, 0x2D);
      byte zLSB = readRegister(L3G4200D_Address, 0x2C);
      z = ((zMSB << 8) | zLSB);
    }
    
    int setupL3G4200D(int scale){
      //From  Jim Lindblom of Sparkfun's code
    
      // Enable x, y, z and turn off power down:
      writeRegister(L3G4200D_Address, CTRL_REG1, 0b00001111);
    
      // If you'd like to adjust/use the HPF, you can edit the line below to configure CTRL_REG2:
      writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000);
    
      // Configure CTRL_REG3 to generate data ready interrupt on INT2
      // No interrupts used on INT1, if you'd like to configure INT1
      // or INT2 otherwise, consult the datasheet:
      writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000);
    
      // CTRL_REG4 controls the full-scale range, among other things:
    
      if(scale == 250){
        writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000);
      }else if(scale == 500){
        writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000);
      }else{
        writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000);
      }
    
      // CTRL_REG5 controls high-pass filtering of outputs, use it
      // if you'd like:
      writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000);
    }
    
    void writeRegister(int deviceAddress, byte address, byte val) {
        Wire.beginTransmission(deviceAddress); // start transmission to device 
        Wire.write(address);       // send register address
        Wire.write(val);         // send value to write
        Wire.endTransmission();     // end transmission
    }
    
    int readRegister(int deviceAddress, byte address){
    
        int v;
        Wire.beginTransmission(deviceAddress);
        Wire.write(address); // register to read
        Wire.endTransmission();
    
        Wire.requestFrom(deviceAddress, 1); // read a byte
    
        while(!Wire.available()) {
            // waiting
        }
    
        v = Wire.read();
        return v;
    }
    ویرایش توسط ehsan_1990 : 02-04-2014 در ساعت 08:34 AM

  5. #5
    Junior Member
    تاریخ عضویت
    Sep 2013
    محل سکونت
    Iran
    نوشته ها
    22

    Adxl345

    برای راه اندازی سنسور شتاب سنج نیاز به کتابخونه دارید Adxl345.zip
    یه مثال جالب برای این سنسور پیدا کردم به این صورت که از این سنسور برای تشخیص وضعیت سکون ، حرکت ، وارد شدن ضربه به سنسور ، حس کردن ضربه دوبل و تشخیص سقوط آزاد میشه استفاده کرد.

    کد:
    #include <Wire.h>
    #include <ADXL345.h>
    ADXL345 adxl; //variable adxl is an instance of the ADXL345 library
    
    void setup(){
      Serial.begin(9600);
      adxl.powerOn();
    
      //set activity/ inactivity thresholds (0-255)
      adxl.setActivityThreshold(75); //62.5mg per increment
      adxl.setInactivityThreshold(75); //62.5mg per increment
      adxl.setTimeInactivity(10); // how many seconds of no activity is inactive?
     
      //look of activity movement on this axes - 1 == on; 0 == off 
      adxl.setActivityX(1);
      adxl.setActivityY(1);
      adxl.setActivityZ(1);
     
      //look of inactivity movement on this axes - 1 == on; 0 == off
      adxl.setInactivityX(1);
      adxl.setInactivityY(1);
      adxl.setInactivityZ(1);
     
      //look of tap movement on this axes - 1 == on; 0 == off
      adxl.setTapDetectionOnX(0);
      adxl.setTapDetectionOnY(0);
      adxl.setTapDetectionOnZ(1);
     
      //set values for what is a tap, and what is a double tap (0-255)
      adxl.setTapThreshold(50); //62.5mg per increment
      adxl.setTapDuration(15); //625μs per increment
      adxl.setDoubleTapLatency(80); //1.25ms per increment
      adxl.setDoubleTapWindow(200); //1.25ms per increment
     
      //set values for what is considered freefall (0-255)
      adxl.setFreeFallThreshold(7); //(5 - 9) recommended - 62.5mg per increment
      adxl.setFreeFallDuration(45); //(20 - 70) recommended - 5ms per increment
     
      //setting all interupts to take place on int pin 1
      //I had issues with int pin 2, was unable to reset it
      adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT,   ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT,    ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT,     ADXL345_INT1_PIN );
      adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT,   ADXL345_INT1_PIN );
     
      //register interupt actions - 1 == on; 0 == off  
      adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
      adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT,  1);
      adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT,   1);
      adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
    }
    
    void loop(){
      
      //Boring accelerometer stuff   
      int x,y,z;  
      adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables  x,y,z
    
      // Output x,y,z values - Commented out
      //Serial.print(x);
      //Serial.print(y);
      //Serial.println(z);
      
      //getInterruptSource clears all triggered actions after returning value
      //so do not call again until you need to recheck for triggered actions
       byte interrupts = adxl.getInterruptSource();
      
      // freefall
      if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
        Serial.println("freefall");
        //add code here to do when freefall is sensed
      } 
      
      //inactivity
      if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
        Serial.println("inactivity");
         //add code here to do when inactivity is sensed
      }
      
      //activity
      if(adxl.triggered(interrupts, ADXL345_ACTIVITY)){
        Serial.println("activity"); 
         //add code here to do when activity is sensed
      }
      
      //double tap
      if(adxl.triggered(interrupts, ADXL345_DOUBLE_TAP)){
        Serial.println("double tap");
         //add code here to do when a 2X tap is sensed
      }
      
      //tap
      if(adxl.triggered(interrupts, ADXL345_SINGLE_TAP)){
        Serial.println("tap");
         //add code here to do when a tap is sensed
      } 
    
     
    }
    فایل های پیوست شده فایل های پیوست شده
    • نوع فایل: zip Adxl345.zip (13.3 کیلو بایت, 219 مشاهده)

  6. #6
    Junior Member
    تاریخ عضویت
    Feb 2014
    نوشته ها
    2
    سلام به همه دوستان
    من میخام این ماژول رو با بسکام راه بندازم. کسی میتونه کمکم کنه؟ممنون میشم

  7. #7
    Junior Member
    تاریخ عضویت
    Feb 2014
    نوشته ها
    2
    یه سوال فنی با استفاده ار شتاب چه جوزی سرعت رو بدست می آرن ؟؟؟؟؟؟؟؟؟//
    با استفاده از شتاب میشه مسافت طی شده بدست آورد؟؟؟؟؟؟؟؟//
    چه جوری میشه خروجی هر کدوم از سنسور ها رو دید که فهمید دقیقا چه جوری خروجی میدن.؟؟؟؟

  8. #8
    مدیر اصلی
    تاریخ عضویت
    Aug 2012
    محل سکونت
    ایران
    نوشته ها
    440
    سلام
    با یکبار انتگرال گیری از شتاب ، سرعت و با دوبار انتگرال گیری مسافت طی شده به دست میاد البته این روش بیشتر قابل استفاده در ربات های پرنده مثل هواپیما و یا زیردریایی هاست که نوسانات حرکتی کمتری دارند .
    در مورد داده های سنسور ها اگر به کد نگاه بندازید متوجه میشین که هر کدام ب تفکیک قابل دسترس هست.

  9. #9
    Member
    تاریخ عضویت
    Mar 2014
    نوشته ها
    39
    نقل قول نوشته اصلی توسط spark نمایش پست ها
    سلام
    با یکبار انتگرال گیری از شتاب ، سرعت و با دوبار انتگرال گیری مسافت طی شده به دست میاد البته این روش بیشتر قابل استفاده در ربات های پرنده مثل هواپیما و یا زیردریایی هاست که نوسانات حرکتی کمتری دارند .
    در مورد داده های سنسور ها اگر به کد نگاه بندازید متوجه میشین که هر کدام ب تفکیک قابل دسترس هست.
    خوب شتابی که شتاب سنج اندازه گیری می کنه، هم شتاب استاتیک ه (ناشی از گرانش) و هم شتاب دینامیک (ناشی از حرکت) خوب برای بدست آوردن سرعت و مکان باید از شتاب دینامیک خالص انتگرال گیری بشه! در صورتی که سنسور شتاب سنج مجموع دو شتاب دینامیک و استاتیک رو می ده! چجوری می شه فقط شتاب دینامیک رو اندازه گیری کرد!

    در ضمن آیا کدهای موجود برای Ardu IMU برای این IMU کاربرد داره؟ مرسی

  10. #10
    مدیر اصلی
    تاریخ عضویت
    Aug 2012
    محل سکونت
    ایران
    نوشته ها
    440
    سلام
    در حرکت های خطی و بدون نوسان شتاب گرانش یک مقدار ثابت هست برای همین میشه تفکیکش کرد

صفحه 1 از 5 123 ... آخرینآخرین

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO