Arduino Lab Akcelerometr MMA7455 Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
Akcelerometr cyfrowy MMA7455 Trzy osie XYZ ±2g/±4g/±8g Wyjście cyfrowe (10-bitowe) I²C/SPI Obudowa LGA-14 3mm x 5mm x 1mm 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Autotest dla osi Z Zasilanie 2,4V – 3,6V Wykrywanie przekroczenia zadanego poziomu przyspieszenia i swobodnego spadania 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Uproszczony model fizyczny sensora przyspieszeń Sensor zbudowany jest z elementów stałych i ruchomych Od strony elektrycznej sensor tworzy układ zmiennych pojemności (półmostek) 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Uproszczony model fizyczny sensora przyspieszeń Sensor zbudowany jest z elementów stałych i ruchomych Od strony elektrycznej sensor tworzy układ zmiennych pojemności (półmostek) 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Wykonanie Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Interfejs I²C Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Interfejs I²C (adres układu 0x1D) Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Interfejs I²C (adres układu 0x1D) Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Interfejs SPI Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Interfejs SPI 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Interfejs SPI Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Moduł z układem MMA7455 Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Połączenie z Arduino (I²C) Sensor zbudowany jest z !!! Uwaga rezystory podciągające są już na płytce 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 http://playground.arduino.cc/Main/MMA7455 Sensor zbudowany jest z Od strony elektrycznej sensor 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) // MMA7455 Accelerometer // --------------------- // // By arduino.cc user "Krodal". // May 2012 // Open Source / Public Domain // // Fixes to union and type conversions by Arduino.cc user "Afroviking" // August 2014 // // Using Arduino 1.0.1 // It will not work with an older version, since Wire.endTransmission() // uses a parameter to hold or release the I2C bus. // 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd // Documentation: // - The Freescale MMA7455L datasheet // - The AN3468 Application Note (programming). // - The AN3728 Application Note (calibrating offset). // // The MMA7455 can be used by writing and reading a single byte, // but it is also capable to read and write multiple bytes. // // The accuracy is 10-bits. // 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd #include <Wire.h> // Nazwy rejestrów zgodne z dokumentacją // Rejestr 0x1C czasami nazywany jest 'PW', a czasami 'PD'. // The two reserved registers can not be used. #define MMA7455_XOUTL 0x00 // Read only, Output Value X LSB #define MMA7455_XOUTH 0x01 // Read only, Output Value X MSB #define MMA7455_YOUTL 0x02 // Read only, Output Value Y LSB #define MMA7455_YOUTH 0x03 // Read only, Output Value Y MSB #define MMA7455_ZOUTL 0x04 // Read only, Output Value Z LSB #define MMA7455_ZOUTH 0x05 // Read only, Output Value Z MSB 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd #define MMA7455_XOUT8 0x06 // Read only, Output Value X 8 bits #define MMA7455_YOUT8 0x07 // Read only, Output Value Y 8 bits #define MMA7455_ZOUT8 0x08 // Read only, Output Value Z 8 bits #define MMA7455_STATUS 0x09 // Read only, Status Register #define MMA7455_DETSRC 0x0A // Read only, Detection Source Register #define MMA7455_TOUT 0x0B // Temperature Output Value (Optional) #define MMA7455_RESERVED1 0x0C // Reserved #define MMA7455_I2CAD 0x0D // Read/Write, I2C Device Address #define MMA7455_USRINF 0x0E // Read only, User Information (Optional) #define MMA7455_WHOAMI 0x0F // Read only, "Who am I" value (Optional) #define MMA7455_XOUT8 0x06 // Read only, Output Value X 8 bits #define MMA7455_YOUT8 0x07 // Read only, Output Value Y 8 bits #define MMA7455_ZOUT8 0x08 // Read only, Output Value Z 8 bits #define MMA7455_STATUS 0x09 // Read only, Status Register #define MMA7455_DETSRC 0x0A // Read only, Detection Source Register #define MMA7455_TOUT 0x0B // Temperature Output Value (Optional) #define MMA7455_RESERVED1 0x0C // Reserved #define MMA7455_I2CAD 0x0D // Read/Write, I2C Device Address #define MMA7455_USRINF 0x0E // Read only, User Information (Optional) #define MMA7455_WHOAMI 0x0F // Read only, "Who am I" value (Optional) 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 #define MMA7455_XOFFL 0x10 // Read/Write, Offset Drift X LSB #define MMA7455_XOFFH 0x11 // Read/Write, Offset Drift X MSB #define MMA7455_YOFFL 0x12 // Read/Write, Offset Drift Y LSB #define MMA7455_YOFFH 0x13 // Read/Write, Offset Drift Y MSB #define MMA7455_ZOFFL 0x14 // Read/Write, Offset Drift Z LSB #define MMA7455_ZOFFH 0x15 // Read/Write, Offset Drift Z MSB #define MMA7455_MCTL 0x16 // Read/Write, Mode Control Register #define MMA7455_INTRST 0x17 // Read/Write, Interrupt Latch Reset #define MMA7455_CTL1 0x18 // Read/Write, Control 1 Register #define MMA7455_CTL2 0x19 // Read/Write, Control 2 Register #define MMA7455_LDTH 0x1A // Read/Write, Level Detection Threshold Limit Value #define MMA7455_PDTH 0x1B // Read/Write, Pulse Detection Threshold Limit Value #define MMA7455_PD 0x1C // Read/Write, Pulse Duration Value #define MMA7455_LT 0x1D // Read/Write, Latency Time Value (between pulses) #define MMA7455_TW 0x1E // Read/Write, Time Window for Second Pulse Value #define MMA7455_RESERVED2 0x1F // Reserved Program 1 (interfejs I²C) cd 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd // Definicje bitów, wprowadzają zmianę // numeru bitu w definicję binarną. // Używając numer bitu, programowanie MMA7455 // przypomina mikrokontroler AVR. // Użycie "(1<<X)", lub "_BV(X)", // w Arduino powoduje ustawienie "bit(X)”. #define MMA7455_D0 0 #define MMA7455_D1 1 #define MMA7455_D2 2 #define MMA7455_D3 3 #define MMA7455_D4 4 #define MMA7455_D5 5 #define MMA7455_D6 6 #define MMA7455_D7 7 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd // Rejestr stanu #define MMA7455_DRDY MMA7455_D0 #define MMA7455_DOVR MMA7455_D1 #define MMA7455_PERR MMA7455_D2 // Rejestr sterowania trybem #define MMA7455_MODE0 MMA7455_D0 #define MMA7455_MODE1 MMA7455_D1 #define MMA7455_GLVL0 MMA7455_D2 #define MMA7455_GLVL1 MMA7455_D3 #define MMA7455_STON MMA7455_D4 #define MMA7455_SPI3W MMA7455_D5 #define MMA7455_DRPD MMA7455_D6 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd // Rejestr sterujący 1 #define MMA7455_INTPIN MMA7455_D0 #define MMA7455_INTREG0 MMA7455_D1 #define MMA7455_INTREG1 MMA7455_D2 #define MMA7455_XDA MMA7455_D3 #define MMA7455_YDA MMA7455_D4 #define MMA7455_ZDA MMA7455_D5 #define MMA7455_THOPT MMA7455_D6 #define MMA7455_DFBW MMA7455_D7 // Rejestr sterujący 2 #define MMA7455_LDPL MMA7455_D0 #define MMA7455_PDPL MMA7455_D1 #define MMA7455_DRVO MMA7455_D2 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd // Interrupt Latch Reset Register #define MMA7455_CLR_INT1 MMA7455_D0 #define MMA7455_CLR_INT2 MMA7455_D1 // Detection Source Register #define MMA7455_INT1 MMA7455_D0 #define MMA7455_INT2 MMA7455_D1 #define MMA7455_PDZ MMA7455_D2 #define MMA7455_PDY MMA7455_D3 #define MMA7455_PDX MMA7455_D4 #define MMA7455_LDZ MMA7455_D5 #define MMA7455_LDY MMA7455_D6 #define MMA7455_LDX MMA7455_D7 // I2C Device Address Register #define MMA7455_I2CDIS MMA7455_D7 // Default I2C address for the MMA7455 #define MMA7455_I2C_ADDRESS 0x1D 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd // When using an union for the registers and // the axis values, the byte order of the accelerometer // should match the byte order of the compiler and AVR chip. // Both have the lower byte at the lower address, // so they match. // This union is only used by the low level functions. typedef union xyz_union { struct { uint8_t x_lsb; uint8_t x_msb; uint8_t y_lsb; uint8_t y_msb; uint8_t z_lsb; uint8_t z_msb; } reg; struct { uint16_t x; uint16_t y; uint16_t z; } value; }; 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd int led = 13; void setup() { int error; uint8_t c; Serial.begin(9600); Serial.println("Freescale MMA7455 accelerometer"); Serial.println("May 2012"); // Initialize the 'Wire' class for I2C-bus communication. Wire.begin(); // Initialize the MMA7455, and set the offset. error = MMA7455_init(); if (error == 0) Serial.println("The MMA7455 is okay"); else Serial.println("Check your wiring !"); 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd // Read the Status Register MMA7455_read(MMA7455_STATUS, &c, 1); Serial.print("STATUS : "); Serial.println(c,HEX); // Read the "Who am I" value MMA7455_read(MMA7455_WHOAMI, &c, 1); Serial.print("WHOAMI : "); Serial.println(c,HEX); // Read the optional temperature output value (I always read zero) MMA7455_read(MMA7455_TOUT, &c, 1); Serial.print("TOUT : "); Serial.println(c,DEC); pinMode(led, OUTPUT); } 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd void loop() { uint16_t x,y,z, error; double dX,dY,dZ; // The function MMA7455_xyz returns the 'g'-force // as an integer in 64 per 'g'. // set x,y,z to zero (they are not written in case of an error). x = y = z = 0; error = MMA7455_xyz(&x, &y, &z); // get the accelerometer values. dX = (int16_t) x / 64.0; // calculate the 'g' values. dY = (int16_t) y / 64.0; dZ = (int16_t) z / 64.0; 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd Serial.print("error = "); Serial.print(error, DEC); Serial.print(", xyz g-forces = "); Serial.print(dX, 3); Serial.print(", "); Serial.print(dY, 3); Serial.print(", "); Serial.print(dZ, 3); Serial.println(""); 11-2014 Zygmunt Kubiak
Akcelerometr cyfrowy MMA7455 Program 1 (interfejs I²C) cd if (dZ < 0.8) { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) } else { digitalWrite(led, LOW); // turn the LED off by making the voltage LOW } delay(100); } 11-2014 Zygmunt Kubiak
Dziękuję Zygmunt Kubiak 09-2006