Programa

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
darley_gonzalez
Date:
Tue Mar 02 22:37:23 2021 +0000
Commit message:
I2c Slave

Changed in this revision

MMA8451Q.cpp Show annotated file Show diff for this revision Revisions of this file
MMA8451Q.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA8451Q.cpp	Tue Mar 02 22:37:23 2021 +0000
@@ -0,0 +1,64 @@
+#include "MMA8451Q.h"
+ 
+#define REG_WHO_AM_I      0x0D
+#define REG_CTRL_REG_1    0x2A
+#define REG_OUT_X_MSB     0x01
+#define REG_OUT_Y_MSB     0x03
+#define REG_OUT_Z_MSB     0x05
+ 
+#define UINT14_MAX        16383
+ 
+MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) {
+    // activate the peripheral
+    uint8_t data[2] = {REG_CTRL_REG_1, 0x01};
+    writeRegs(data, 2);
+}
+ 
+MMA8451Q::~MMA8451Q() { }
+ 
+uint8_t MMA8451Q::getWhoAmI() {
+    uint8_t who_am_i = 0;
+    readRegs(REG_WHO_AM_I, &who_am_i, 1);
+    return who_am_i;
+}
+ 
+float MMA8451Q::getAccX() {
+    return (float(getAccAxis(REG_OUT_X_MSB))/4096.0);
+}
+ 
+float MMA8451Q::getAccY() {
+    return (float(getAccAxis(REG_OUT_Y_MSB))/4096.0);
+}
+ 
+float MMA8451Q::getAccZ() {
+    return (float(getAccAxis(REG_OUT_Z_MSB))/4096.0);
+}
+ 
+void MMA8451Q::getAccAllAxis(float * res) {
+    res[0] = getAccX();
+    res[1] = getAccY();
+    res[2] = getAccZ();
+}
+ 
+int16_t MMA8451Q::getAccAxis(uint8_t addr) {
+    int16_t acc;
+    uint8_t res[2];
+    readRegs(addr, res, 2);
+ 
+    acc = (res[0] << 6) | (res[1] >> 2);
+    if (acc > UINT14_MAX/2)
+        acc -= UINT14_MAX;
+ 
+    return acc;
+}
+ 
+void MMA8451Q::readRegs(int addr, uint8_t * data, int len) {
+    char t[1] = {0};
+    t[1] =addr;
+    m_i2c.write(m_addr, t, 1, true);
+    m_i2c.read(m_addr, (char *)data, len);
+}
+ 
+void MMA8451Q::writeRegs(uint8_t * data, int len) {
+    m_i2c.write(m_addr, (char *)data, len);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA8451Q.h	Tue Mar 02 22:37:23 2021 +0000
@@ -0,0 +1,92 @@
+#ifndef MMA8451Q_H
+#define MMA8451Q_H
+ 
+#include "mbed.h"
+ 
+/**
+* MMA8451Q accelerometer example
+*
+* @code
+* #include "mbed.h"
+* #include "MMA8451Q.h"
+* 
+* #define MMA8451_I2C_ADDRESS (0x1d<<1)
+* 
+* int main(void) {
+* 
+* MMA8451Q acc(P_E25, P_E24, MMA8451_I2C_ADDRESS);
+* PwmOut rled(LED_RED);
+* PwmOut gled(LED_GREEN);
+* PwmOut bled(LED_BLUE);
+* 
+*     while (true) {       
+*         rled = 1.0 - abs(acc.getAccX());
+*         gled = 1.0 - abs(acc.getAccY());
+*         bled = 1.0 - abs(acc.getAccZ());
+*         wait(0.1);
+*     }
+* }
+* @endcode
+*/
+class MMA8451Q
+{
+public:
+  /**
+  * MMA8451Q constructor
+  *
+  * @param sda SDA pin
+  * @param sdl SCL pin
+  * @param addr addr of the I2C peripheral
+  */
+  MMA8451Q(PinName sda, PinName scl, int addr);
+ 
+  /**
+  * MMA8451Q destructor
+  */
+  ~MMA8451Q();
+ 
+  /**
+   * Get the value of the WHO_AM_I register
+   *
+   * @returns WHO_AM_I value
+   */
+  uint8_t getWhoAmI();
+ 
+  /**
+   * Get X axis acceleration
+   *
+   * @returns X axis acceleration
+   */
+  float getAccX();
+ 
+  /**
+   * Get Y axis acceleration
+   *
+   * @returns Y axis acceleration
+   */
+  float getAccY();
+ 
+  /**
+   * Get Z axis acceleration
+   *
+   * @returns Z axis acceleration
+   */
+  float getAccZ();
+ 
+  /**
+   * Get XYZ axis acceleration
+   *
+   * @param res array where acceleration data will be stored
+   */
+  void getAccAllAxis(float * res);
+ 
+private:
+  I2C m_i2c;
+  int m_addr;
+  void readRegs(int addr, uint8_t * data, int len);
+  void writeRegs(uint8_t * data, int len);
+  int16_t getAccAxis(uint8_t addr);
+ 
+};
+ 
+#endif  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 02 22:37:23 2021 +0000
@@ -0,0 +1,72 @@
+#include "MMA8451Q.h"
+#include "mbed.h"
+
+#if defined(TARGET_KL25Z) || defined(TARGET_KL46Z)
+PinName const SDA = PTE25;
+PinName const SCL = PTE24;          //pines acelerometro
+#elif defined(TARGET_KL05Z)
+PinName const SDA = PTB4;
+PinName const SCL = PTB3;
+#elif defined(TARGET_K20D50M)
+PinName const SDA = PTB1;
+PinName const SCL = PTB0;
+#else
+#error TARGET NOT DEFINED
+#endif
+#define MMA8451_I2C_ADDRESS (0x1d << 1)
+I2CSlave slave(PTE0, PTE1);
+MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+PwmOut rled(D3);
+PwmOut gled(D4);
+PwmOut bled(D5);
+Serial pc(USBTX, USBRX); 
+
+DigitalOut led1(LED2);
+
+float datos()
+{
+    float x, y, z;
+    x = abs(acc.getAccX());
+    y = abs(acc.getAccY());
+    z = abs(acc.getAccZ());
+    rled = 1.0f - x;
+    gled = 1.0f - y;
+    bled = 1.0f - z;
+    wait_us(100000);
+    return y;
+    // printf("X: %f, Y: %f, Z: %f\n", x,y,z);
+}
+int main(void)
+{
+    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+    PwmOut rled(D3);
+    PwmOut gled(D4);
+    PwmOut bled(D5);
+    char buf[13];       //recibir datos para guardar en un buffer
+    printf("MMA8451 ID: %d\n", acc.getWhoAmI());        //identifica que el sensor esta en funcionamiento en serial
+    slave.address(0xA0);        //10100000
+    while (true) {
+// 10 0111  110 0100
+        int i = slave.receive();
+        switch (i) {
+            case I2CSlave::WriteAddressed:
+                slave.read(buf, 13);
+                // sprintf(buf, "%f\n", datos);
+                float x, y, z;                      //enviar datos de acelerometro
+                x = abs(acc.getAccX());
+                y = abs(acc.getAccY());
+                z = abs(acc.getAccZ());
+                sprintf(buf,"%f%f%f\n",x,y,z);
+                pc.printf("%f%f%f\n",x,y,z);
+                
+                printf("%s\n", buf);
+                slave.write(buf, 13);
+                led1 = !led1;
+                break;                      //rompe el ciclo y reinicia el buffer
+        }
+        
+        for (int i = 0; i < 10; i++) {
+            buf[i] = 0; // Clear buffer
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Mar 02 22:37:23 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file