halx_driver
読み取り中…
検索中…
一致する文字列を見つけられません
bno055.hpp
[詳解]
1#pragma once
2
3#include <array>
4#include <cmath>
5#include <cstddef>
6#include <cstdint>
7#include <optional>
8#include <utility>
9
10#include <Eigen/Geometry>
11
12#include <halx/core.hpp>
13#include <halx/peripheral/uart.hpp>
14
15namespace halx::driver {
16
17enum class Bno055Register : uint8_t {
18 // Page 0
19 CHIP_ID = 0x00,
20 ACC_ID = 0x01,
21 MAG_ID = 0x02,
22 GYR_ID = 0x03,
25 BL_REV_ID = 0x06,
26 PAGE_ID = 0x07,
71 TEMP = 0x34,
72 CALIB_STAT = 0x35,
73 ST_RESULT = 0x36,
74 INT_STA = 0x37,
76 SYS_STATUS = 0x39,
77 SYS_ERR = 0x3A,
78 UNIT_SEL = 0x3B,
79 OPR_MODE = 0x3D,
80 PWR_MODE = 0x3E,
107
108 // Page 1
115 INT_MSK = 0x0F,
116 INT_EN = 0x10,
125 GYR_DUR_X = 0x19,
127 GYR_DUR_Y = 0x1B,
129 GYR_DUR_Z = 0x1D,
132};
133
134class Bno055 {
135public:
136 Bno055(peripheral::UartBase &uart) : uart_{uart} {}
137
138 bool start(uint32_t timeout) {
139 core::TimeoutHelper timeout_helper{timeout};
140 while (!timeout_helper.is_timeout()) {
141 std::array<uint8_t, 1> data{0x00};
143 continue;
144 }
145 data[0] = 0x08;
147 continue;
148 }
149 return true;
150 }
151 return false;
152 }
153
154 std::optional<Eigen::Quaternionf> get_quaternion() {
156 if (!res) {
157 return std::nullopt;
158 }
159 return Eigen::Quaternionf{
160 static_cast<int16_t>(((*res)[1] << 8) | (*res)[0]) / 16384.0f,
161 static_cast<int16_t>(((*res)[3] << 8) | (*res)[2]) / 16384.0f,
162 static_cast<int16_t>(((*res)[5] << 8) | (*res)[4]) / 16384.0f,
163 static_cast<int16_t>(((*res)[7] << 8) | (*res)[6]) / 16384.0f};
164 }
165
166 template <size_t N>
168 const std::array<uint8_t, N> &data) {
169 std::array<uint8_t, 4> buf{0xAA, 0x00, std::to_underlying(address), N};
170 uart_.flush();
171 if (!uart_.transmit(buf.data(), buf.size(), 5)) {
172 return false;
173 }
174 if (!uart_.transmit(data.data(), data.size(), 5)) {
175 return false;
176 }
177 if (!uart_.receive(buf.data(), 2, 5)) {
178 return false;
179 }
180 return buf[0] == 0xEE && buf[1] == 0x01;
181 }
182
183 template <size_t N>
184 std::optional<std::array<uint8_t, N>> read_register(Bno055Register address) {
185 std::array<uint8_t, 4> tx_buf{0xAA, 0x01, std::to_underlying(address), N};
186 std::array<uint8_t, N> rx_buf;
187 uart_.flush();
188 if (!uart_.transmit(tx_buf.data(), tx_buf.size(), 5)) {
189 return std::nullopt;
190 }
191 if (!uart_.receive(tx_buf.data(), 2, 5)) {
192 return std::nullopt;
193 }
194 if (tx_buf[0] != 0xBB || tx_buf[1] != N) {
195 return std::nullopt;
196 }
197 if (!uart_.receive(rx_buf.data(), rx_buf.size(), 5)) {
198 return std::nullopt;
199 }
200 return rx_buf;
201 }
202
203private:
204 peripheral::UartBase &uart_;
205};
206
207} // namespace halx::driver
Bno055(peripheral::UartBase &uart)
Definition bno055.hpp:136
bool write_register(Bno055Register address, const std::array< uint8_t, N > &data)
Definition bno055.hpp:167
bool start(uint32_t timeout)
Definition bno055.hpp:138
std::optional< Eigen::Quaternionf > get_quaternion()
Definition bno055.hpp:154
std::optional< std::array< uint8_t, N > > read_register(Bno055Register address)
Definition bno055.hpp:184
Definition amt21.hpp:10
Bno055Register
Definition bno055.hpp:17
@ GYR_DATA_Y_MSB
Definition bno055.hpp:42
@ GYR_SLEEP_CONFIG
Definition bno055.hpp:114
@ EUL_DATA_X_LSB
Definition bno055.hpp:45
@ GYR_OFFSET_X_MSB
Definition bno055.hpp:98
@ GYR_HR_X_SET
Definition bno055.hpp:124
@ MAG_OFFSET_Y_MSB
Definition bno055.hpp:94
@ ACC_OFFSET_X_LSB
Definition bno055.hpp:85
@ CALIB_STAT
Definition bno055.hpp:72
@ QUA_DATA_X_LSB
Definition bno055.hpp:53
@ ACC_RADIUS_LSB
Definition bno055.hpp:103
@ GYR_OFFSET_Y_LSB
Definition bno055.hpp:99
@ GRV_DATA_Y_MSB
Definition bno055.hpp:68
@ ACC_HG_DURATION
Definition bno055.hpp:119
@ GRV_DATA_Y_LSB
Definition bno055.hpp:67
@ GYR_OFFSET_Z_LSB
Definition bno055.hpp:101
@ QUA_DATA_W_MSB
Definition bno055.hpp:52
@ AXIS_MAP_CONFIG
Definition bno055.hpp:83
@ MAG_OFFSET_X_LSB
Definition bno055.hpp:91
@ LIA_DATA_Z_MSB
Definition bno055.hpp:64
@ MAG_DATA_Y_MSB
Definition bno055.hpp:36
@ GRV_DATA_Z_LSB
Definition bno055.hpp:69
@ GYR_CONFIG_1
Definition bno055.hpp:112
@ GYR_OFFSET_X_LSB
Definition bno055.hpp:97
@ BL_REV_ID
Definition bno055.hpp:25
@ INT_MSK
Definition bno055.hpp:115
@ EUL_DATA_Z_MSB
Definition bno055.hpp:50
@ MAG_ID
Definition bno055.hpp:21
@ ACC_DATA_X_MSB
Definition bno055.hpp:28
@ ACC_AM_THRES
Definition bno055.hpp:117
@ GYR_DATA_X_MSB
Definition bno055.hpp:40
@ ACC_SLEEP_CONFIG
Definition bno055.hpp:113
@ UNIT_SEL
Definition bno055.hpp:78
@ GYR_DATA_Z_LSB
Definition bno055.hpp:43
@ GYR_DATA_Z_MSB
Definition bno055.hpp:44
@ ACC_RADIUS_MSB
Definition bno055.hpp:104
@ ACC_OFFSET_Y_LSB
Definition bno055.hpp:87
@ MAG_DATA_Z_LSB
Definition bno055.hpp:37
@ MAG_CONFIG
Definition bno055.hpp:110
@ MAG_RADIUS_LSB
Definition bno055.hpp:105
@ SYS_ERR
Definition bno055.hpp:77
@ MAG_DATA_X_MSB
Definition bno055.hpp:34
@ GYR_OFFSET_Z_MSB
Definition bno055.hpp:102
@ PAGE_ID
Definition bno055.hpp:26
@ ACC_OFFSET_Z_LSB
Definition bno055.hpp:89
@ QUA_DATA_Y_LSB
Definition bno055.hpp:55
@ EUL_DATA_Z_LSB
Definition bno055.hpp:49
@ ACC_DATA_X_LSB
Definition bno055.hpp:27
@ EUL_DATA_Y_LSB
Definition bno055.hpp:47
@ ACC_DATA_Z_LSB
Definition bno055.hpp:31
@ MAG_DATA_Z_MSB
Definition bno055.hpp:38
@ INT_EN
Definition bno055.hpp:116
@ LIA_DATA_X_LSB
Definition bno055.hpp:59
@ QUA_DATA_W_LSB
Definition bno055.hpp:51
@ MAG_OFFSET_Y_LSB
Definition bno055.hpp:93
@ GYR_ID
Definition bno055.hpp:22
@ CHIP_ID
Definition bno055.hpp:19
@ LIA_DATA_Y_MSB
Definition bno055.hpp:62
@ MAG_DATA_Y_LSB
Definition bno055.hpp:35
@ GRV_DATA_X_MSB
Definition bno055.hpp:66
@ SYS_CLK_STATUS
Definition bno055.hpp:75
@ MAG_OFFSET_Z_MSB
Definition bno055.hpp:96
@ GYR_OFFSET_Y_MSB
Definition bno055.hpp:100
@ QUA_DATA_Z_LSB
Definition bno055.hpp:57
@ QUA_DATA_Y_MSB
Definition bno055.hpp:56
@ GRV_DATA_X_LSB
Definition bno055.hpp:65
@ GRV_DATA_Z_MSB
Definition bno055.hpp:70
@ MAG_OFFSET_X_MSB
Definition bno055.hpp:92
@ SYS_STATUS
Definition bno055.hpp:76
@ LIA_DATA_Z_LSB
Definition bno055.hpp:63
@ ACC_DATA_Y_MSB
Definition bno055.hpp:30
@ LIA_DATA_X_MSB
Definition bno055.hpp:60
@ ST_RESULT
Definition bno055.hpp:73
@ ACC_ID
Definition bno055.hpp:20
@ GYR_HR_Y_SET
Definition bno055.hpp:126
@ TEMP
Definition bno055.hpp:71
@ ACC_OFFSET_X_MSB
Definition bno055.hpp:86
@ ACC_OFFSET_Z_MSB
Definition bno055.hpp:90
@ GYR_CONFIG_0
Definition bno055.hpp:111
@ ACC_NM_THRES
Definition bno055.hpp:121
@ MAG_DATA_X_LSB
Definition bno055.hpp:33
@ EUL_DATA_Y_MSB
Definition bno055.hpp:48
@ GYR_DUR_Y
Definition bno055.hpp:127
@ ACC_INT_SETTINGS
Definition bno055.hpp:118
@ GYR_INT_SETTING
Definition bno055.hpp:123
@ SW_REV_ID_MSB
Definition bno055.hpp:24
@ GYR_AM_SET
Definition bno055.hpp:131
@ ACC_CONFIG
Definition bno055.hpp:109
@ QUA_DATA_X_MSB
Definition bno055.hpp:54
@ GYR_DUR_X
Definition bno055.hpp:125
@ PWR_MODE
Definition bno055.hpp:80
@ ACC_OFFSET_Y_MSB
Definition bno055.hpp:88
@ MAG_RADIUS_MSB
Definition bno055.hpp:106
@ OPR_MODE
Definition bno055.hpp:79
@ GYR_DATA_X_LSB
Definition bno055.hpp:39
@ EUL_DATA_X_MSB
Definition bno055.hpp:46
@ MAG_OFFSET_Z_LSB
Definition bno055.hpp:95
@ GYR_HR_Z_SET
Definition bno055.hpp:128
@ SYS_TRIGGER
Definition bno055.hpp:81
@ ACC_HG_THRES
Definition bno055.hpp:120
@ SW_REV_ID_LSB
Definition bno055.hpp:23
@ LIA_DATA_Y_LSB
Definition bno055.hpp:61
@ ACC_NM_SET
Definition bno055.hpp:122
@ ACC_DATA_Y_LSB
Definition bno055.hpp:29
@ AXIS_MAP_SIGN
Definition bno055.hpp:84
@ GYR_DATA_Y_LSB
Definition bno055.hpp:41
@ GYR_DUR_Z
Definition bno055.hpp:129
@ TEMP_SOURCE
Definition bno055.hpp:82
@ QUA_DATA_Z_MSB
Definition bno055.hpp:58
@ ACC_DATA_Z_MSB
Definition bno055.hpp:32
@ GYR_AM_THRES
Definition bno055.hpp:130
@ INT_STA
Definition bno055.hpp:74