8000 Thu Feb 16 22:52:10 CST 2017 · programmer131/esp32-snippets@2edf093 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2edf093

Browse files
author
kolban
committed
Thu Feb 16 22:52:10 CST 2017
1 parent 7c00a98 commit 2edf093

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

hardware/compass/hmc5883l.c

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
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 0x1e
12+
13+
static char tag[] = "hmc5883l";
14+
15+
#undef ESP_ERROR_CHECK
16+
#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);
17+
18+
void task_hmc5883l(void *ignore) {
19+
ESP_LOGD(tag, ">> hmc5883l");
20+
i2c_config_t conf;
21+
conf.mode = I2C_MODE_MASTER;
22+
conf.sda_io_num = PIN_SDA;
23+
conf.scl_io_num = PIN_CLK;
24+
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
25+
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
26+
conf.master.clk_speed = 100000;
27+
ESP_ERROR_CHECK(i2c_param_config(I2C_NUM_0, &conf));
28+
ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0));
29+
30+
uint8_t data[6];
31+
32+
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
33+
i2c_master_start(cmd);
34+
i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1);
35+
i2c_master_write_byte(cmd, 0x02, 1); // Mode register
36+
i2c_master_write_byte(cmd, 0x00, 1); // value 0
37+
i2c_master_stop(cmd);
38+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
39+
i2c_cmd_link_delete(cmd);
40+
41+
cmd = i2c_cmd_link_create();
42+
i2c_master_start(cmd);
43+
i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1);
44+
i2c_master_write_byte(cmd, 0x01, 1); // Mode register
45+
i2c_master_write_byte(cmd, 0x20, 1); // value 0
46+
i2c_master_stop(cmd);
47+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
48+
i2c_cmd_link_delete(cmd);
49+
50+
cmd = i2c_cmd_link_create();
51+
ESP_ERROR_CHECK(i2c_master_start(cmd));
52+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1));
53+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, 10, 1)); // Data registers
54+
ESP_ERROR_CHECK(i2c_master_stop(cmd));
55+
ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_NUM_0, cmd, 100/portTICK_PERIOD_MS));
56+
i2c_cmd_link_delete(cmd);
57+
58+
cmd = i2c_cmd_link_create();
59+
ESP_ERROR_CHECK(i2c_master_start(cmd));
60+
ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_READ, 1));
61+
i2c_master_read_byte(cmd, data, 0);
62+
i2c_master_read_byte(cmd, data+1, 0);
63+
i2c_master_read_byte(cmd, data+2, 1);
64+
ESP_ERROR_CHECK(i2c_master_stop(cmd));
65+
ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_NUM_0, cmd, 100/portTICK_PERIOD_MS));
66+
i2c_cmd_link_delete(cmd);
67+
68+
while(1) {
69+
cmd = i2c_cmd_link_create();
70+
i2c_master_start(cmd);
71+
i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1);
72+
i2c_master_write_byte(cmd, 0x03, 1); // Data registers
73+
i2c_master_stop(cmd);
74+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
75+
i2c_cmd_link_delete(cmd);
76+
77+
cmd = i2c_cmd_link_create();
78+
i2c_master_start(cmd);
79+
i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_READ, 1);
80+
i2c_master_read_byte(cmd, data, 0);
81+
i2c_master_read_byte(cmd, data+1, 0);
82+
i2c_master_read_byte(cmd, data+2, 0);
83+
i2c_master_read_byte(cmd, data+3, 0);
84+
i2c_master_read_byte(cmd, data+4, 0);
85+
i2c_master_read_byte(cmd, data+5, 1);
86+
i2c_master_stop(cmd);
87+
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS);
88+
i2c_cmd_link_delete(cmd);
89+
90+
short x = data[0] << 8 | data[1];
91+
short z = data[2] << 8 | data[3];
92+
short y = data[4] << 8 | data[5];
93+
int angle = atan2((double)y,(double)x) * (180 / 3.141 5480 59265) + 180; // angle in degrees
94+
ESP_LOGD(tag, "angle: %d, x: %d, y: %d, z: %d", angle, x, y, z);
95+
vTaskDelay(1000/portTICK_PERIOD_MS);
96+
}
97+
98+
vTaskDelete(NULL);
99+
} // task_hmc5883l

0 commit comments

Comments
 (0)
0