10000 Thu Feb 23 14:38:07 CST 2017 · EagleSmith/esp32-snippets@d95258e · GitHub
[go: up one dir, main page]

Skip to content

Commit d95258e

Browse files
author
kolban
committed
Thu Feb 23 14:38:07 CST 2017
1 parent a8242b9 commit d95258e

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed

hardware/accelerometers/mpu6050.c

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include <driver/i2c.h>
2+
#include <esp_log.h>
3+
#include <freertos/FreeRTOS.h>
4+
#include <freertos/task.h>
5+
#include <math.h>
6+
7+
#include "sdkconfig.h"
8+
9+
#define PIN_SDA 21
10+
#define PIN_CLK 22
11+
#define I2C_ADDRESS 0x68 // I2C address of MPU6050
12+
13+
#define MPU6050_ACCEL_XOUT_H 0x3B
14+
#define MPU6050_PWR_MGMT_1 0x6B
15+
16+
/*
17+
* The following registers contain the primary data we are interested in
18+
* 0x3B MPU6050_ACCEL_XOUT_H
19+
* 0x3C MPU6050_ACCEL_XOUT_L
20+
* 0x3D MPU6050_ACCEL_YOUT_H
21+
* 0x3E MPU6050_ACCEL_YOUT_L
22+
* 0x3F MPU6050_ACCEL_ZOUT_H
23+
* 0x50 MPU6050_ACCEL_ZOUT_L
24+
* 0x41 MPU6050_TEMP_OUT_H
25+
* 0x42 MPU6050_TEMP_OUT_L
26+
* 0x43 MPU6050_GYRO_XOUT_H
27+
* 0x44 MPU6050_GYRO_XOUT_L
28+
* 0x45 MPU6050_GYRO_YOUT_H
29+
* 0x46 MPU6050_GYRO_YOUT_L
30+
* 0x47 MPU6050_GYRO_ZOUT_H
31+
* 0x48 MPU6050_GYRO_ZOUT_L
32+
*/
33+
34+
static char tag[] = "mpu6050";
35+
36+
#undef ESP_ERROR_CHECK
37+
#define ESP_ERROR_CHECK(x) do { esp_err_t rc = (x); if (rc != ESP_OK) { ESP_LOGE("err", "esp_err_t = %d", rc); assert(0 && #x);} } while(0);
38+
39+
void task_mpu6050(void *ignore) {
40+
ESP_LOGD(tag, ">> mpu6050");
41+
i2c_config_t conf;
42+
conf.mode = I2C_MODE_MASTER;
43+
conf.sda_io_num = PIN_SDA;
44+
conf.scl_io_num = PIN_CLK;
45+
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
46+
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
47+
conf.master.clk_speed = 100000;
48+
ESP_ERROR_CHECK(i2c_param_config(I2C_NUM_0, &conf));
49+
ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0));
50+
51+
i2c_cmd_handle_t cmd;
52+
vTaskDelay(200/portTICK_PERIOD_MS);
53+
54+
cmd = i2c_cmd_link_create();
55+
ESP_ERROR_CHECK(i2c_master_start(cmd));
56+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1));
57+
i2c_master_write_byte(cmd, MPU6050_ACCEL_XOUT_H, 1);
58+
ESP_ERROR_CHECK(i2c_master_stop(cmd));
59+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
60+
i2c_cmd_link_delete(cmd);
61+
62+
cmd = i2c_cmd_link_create();
63+
ESP_ERROR_CHECK(i2c_master_start(cmd));
64+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1));
65+
i2c_master_write_byte(cmd, MPU6050_PWR_MGMT_1, 1);
66+
i2c_master_write_byte(cmd, 0, 1);
67+
ESP_ERROR_CHECK(i2c_master_stop(cmd));
68+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
69+
i2c_cmd_link_delete(cmd);
70+
71+
72+
uint8_t data[14];
73+
74+
short accel_x;
75+
short accel_y;
76+
short accel_z;
77+
78+
while(1) {
79+
// Tell the MPU6050 to position the internal register pointer to register
80+
// MPU6050_ACCEL_XOUT_H.
81+
cmd = i2c_cmd_link_create();
82+
ESP_ERROR_CHECK(i2c_master_start(cmd));
83+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1));
84+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, MPU6050_ACCEL_XOUT_H, 1));
85+
ESP_ERROR_CHECK(i2c_master_stop(cmd));
86+
ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS));
87+
i2c_cmd_link_delete(cmd);
88+
89+
cmd = i2c_cmd_link_create();
90+
ESP_ERROR_CHECK(i2c_master_start(cmd));
91+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_READ, 1));
92+
93+
ESP_ERROR_CHECK(i2c_master_read_byte(cmd, data, 0));
94+
ESP_ERROR_CHECK(i2c_master_read_byte(cmd, data+1, 0));
95+
ESP_ERROR_CHECK(i2c_master_read_byte(cmd, data+2, 0));
96+
ESP_ERROR_CHECK(i2c_master_read_byte(cmd, data+3, 0));
97+
ESP_ERROR_CHECK(i2c_master_read_byte(cmd, data+4, 0));
98+
ESP_ERROR_CHECK(i2c_master_read_byte(cmd, data+5, 1));
99+
100+
//i2c_master_read(cmd, data, sizeof(data), 1);
101+
ESP_ERROR_CHECK(i2c_master_stop(cmd));
102+
ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS));
103+
i2c_cmd_link_delete(cmd);
104+
105+
accel_x = (data[0] << 8) | data[1];
106+
accel_y = (data[2] << 8) | data[3];
107+
accel_z = (data[4] << 8) | data[5];
108+
ESP_LOGD(tag, "accel_x: %d, accel_y: %d, accel_z: %d", accel_x, accel_y, accel_z);
109+
110+
vTaskDelay(500/portTICK_PERIOD_MS);
111+
}
112+
113+
vTaskDelete(NULL);
114+
} // task_hmc5883l

0 commit comments

Comments
 (0)
0