This is a device driver of AK8963, which is 3-axis magnetometer manufactured by AKM.
Dependents: SimpleSample combination combination
ak8963.h@2:9dff393e5e86, 2015-09-04 (annotated)
- Committer:
- coisme
- Date:
- Fri Sep 04 23:39:10 2015 +0000
- Revision:
- 2:9dff393e5e86
- Parent:
- 1:a362b9e3aac2
maintainance
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
coisme | 0:fc56973c077a | 1 | #ifndef AK8963_H |
coisme | 0:fc56973c077a | 2 | #define AK8963_H |
coisme | 0:fc56973c077a | 3 | |
coisme | 0:fc56973c077a | 4 | #include "mbed.h" |
coisme | 0:fc56973c077a | 5 | |
coisme | 0:fc56973c077a | 6 | /** |
coisme | 0:fc56973c077a | 7 | * This is a device driver of AK8963. |
coisme | 0:fc56973c077a | 8 | * |
coisme | 1:a362b9e3aac2 | 9 | * @note AK8963 is a 3-axis magnetometer (magnetic sensor) device manufactured by AKM. |
coisme | 1:a362b9e3aac2 | 10 | * |
coisme | 1:a362b9e3aac2 | 11 | * Example: |
coisme | 1:a362b9e3aac2 | 12 | * @code |
coisme | 1:a362b9e3aac2 | 13 | * #include "mbed.h" |
coisme | 1:a362b9e3aac2 | 14 | * #include "ak8963.h" |
coisme | 1:a362b9e3aac2 | 15 | * |
coisme | 1:a362b9e3aac2 | 16 | * #define I2C_SPEED_100KHZ 100000 |
coisme | 1:a362b9e3aac2 | 17 | * #define I2C_SPEED_400KHZ 400000 |
coisme | 1:a362b9e3aac2 | 18 | * |
coisme | 1:a362b9e3aac2 | 19 | * int main() { |
coisme | 1:a362b9e3aac2 | 20 | * // Creates an instance of I2C |
coisme | 1:a362b9e3aac2 | 21 | * I2C connection(I2C_SDA0, I2C_SCL0); |
coisme | 1:a362b9e3aac2 | 22 | * connection.frequency(I2C_SPEED_100KHZ); |
coisme | 1:a362b9e3aac2 | 23 | * |
coisme | 1:a362b9e3aac2 | 24 | * // Creates an instance of AK8963 |
coisme | 1:a362b9e3aac2 | 25 | * AK8963 ak8963(&connection, AK8963::SLAVE_ADDR_1); |
coisme | 1:a362b9e3aac2 | 26 | * |
coisme | 1:a362b9e3aac2 | 27 | * // Checks connectivity |
coisme | 1:a362b9e3aac2 | 28 | * if(ak8963.checkConnection() != AK8963::SUCCESS) { |
coisme | 1:a362b9e3aac2 | 29 | * // Failed to check device connection. |
coisme | 1:a362b9e3aac2 | 30 | * // - error handling here - |
coisme | 1:a362b9e3aac2 | 31 | * } |
coisme | 1:a362b9e3aac2 | 32 | * |
coisme | 1:a362b9e3aac2 | 33 | * // Puts the device into continuous measurement mode. |
coisme | 1:a362b9e3aac2 | 34 | * if(ak8963.setOperationMode(AK8963::MODE_CONTINUOUS_1) != AK8963::SUCCESS) { |
coisme | 1:a362b9e3aac2 | 35 | * // Failed to set the device into continuous measurement mode. |
coisme | 1:a362b9e3aac2 | 36 | * // - error handling here - |
coisme | 1:a362b9e3aac2 | 37 | * } |
coisme | 1:a362b9e3aac2 | 38 | * |
coisme | 1:a362b9e3aac2 | 39 | * while(true) { |
coisme | 1:a362b9e3aac2 | 40 | * // checks DRDY |
coisme | 1:a362b9e3aac2 | 41 | * if (statusAK8963 == AK8963::DATA_READY) { |
coisme | 1:a362b9e3aac2 | 42 | * AK8963::MagneticVector mag; |
coisme | 1:a362b9e3aac2 | 43 | * ak8963.getMagneticVector(&mag); |
coisme | 1:a362b9e3aac2 | 44 | * // You may use serial output to see data. |
coisme | 1:a362b9e3aac2 | 45 | * // serial.printf("%d,%5.1f,%5.1f,%5.1f\n", |
coisme | 1:a362b9e3aac2 | 46 | * // mag.isOverflow, |
coisme | 1:a362b9e3aac2 | 47 | * // mag.mx, mag.my, mag.mz); |
coisme | 1:a362b9e3aac2 | 48 | * statusAK8963 = AK8963::NOT_DATA_READY; |
coisme | 1:a362b9e3aac2 | 49 | * } else if (statusAK8963 == AK8963::NOT_DATA_READY) { |
coisme | 1:a362b9e3aac2 | 50 | * // Nothing to do. |
coisme | 1:a362b9e3aac2 | 51 | * } else { |
coisme | 1:a362b9e3aac2 | 52 | * // - error handling here - |
coisme | 1:a362b9e3aac2 | 53 | * } |
coisme | 1:a362b9e3aac2 | 54 | * } |
coisme | 1:a362b9e3aac2 | 55 | * } |
coisme | 1:a362b9e3aac2 | 56 | * @endcode |
coisme | 0:fc56973c077a | 57 | */ |
coisme | 0:fc56973c077a | 58 | class AK8963 |
coisme | 0:fc56973c077a | 59 | { |
coisme | 0:fc56973c077a | 60 | public: |
coisme | 0:fc56973c077a | 61 | /** |
coisme | 0:fc56973c077a | 62 | * Possible slave address of AK8963. Selected by CAD1 and CAD0 pins. |
coisme | 0:fc56973c077a | 63 | */ |
coisme | 0:fc56973c077a | 64 | typedef enum { |
coisme | 0:fc56973c077a | 65 | SLAVE_ADDR_1 = 0x0c, /**< CAD0 = Low, CAD1 = Low */ |
coisme | 0:fc56973c077a | 66 | SLAVE_ADDR_2 = 0x0d, /**< CAD0 = High, CAD1 = Low */ |
coisme | 0:fc56973c077a | 67 | SLAVE_ADDR_3 = 0x0e, /**< CAD0 = Low, CAD1 = High */ |
coisme | 0:fc56973c077a | 68 | SLAVE_ADDR_4 = 0x0f, /**< CAD0 = High, CAD1 = High */ |
coisme | 0:fc56973c077a | 69 | } SlaveAddress; |
coisme | 0:fc56973c077a | 70 | |
coisme | 0:fc56973c077a | 71 | /** |
coisme | 0:fc56973c077a | 72 | * Available opration modes in AK8963. |
coisme | 0:fc56973c077a | 73 | */ |
coisme | 0:fc56973c077a | 74 | typedef enum { |
coisme | 0:fc56973c077a | 75 | MODE_POWER_DOWN = 0x00, /**< Power-down mode */ |
coisme | 0:fc56973c077a | 76 | MODE_SINGLE_MEASUREMENT = 0x01, /**< Single measurement mode */ |
coisme | 0:fc56973c077a | 77 | MODE_CONTINUOUS_1 = 0x02, /**< Continuous measurement mode 1, 8 Hz */ |
coisme | 0:fc56973c077a | 78 | MODE_CONTINUOUS_2 = 0x06, /**< Continuous measurement mode 2, 100 Hz */ |
coisme | 0:fc56973c077a | 79 | } OperationMode; |
coisme | 0:fc56973c077a | 80 | |
coisme | 0:fc56973c077a | 81 | /** |
coisme | 0:fc56973c077a | 82 | * Status of function. |
coisme | 0:fc56973c077a | 83 | */ |
coisme | 0:fc56973c077a | 84 | typedef enum { |
coisme | 0:fc56973c077a | 85 | SUCCESS, /**< The function processed successfully. */ |
coisme | 0:fc56973c077a | 86 | ERROR_I2C_READ, /**< Error related to I2C read. */ |
coisme | 0:fc56973c077a | 87 | ERROR_I2C_WRITE, /**< Error related to I2C write. */ |
coisme | 0:fc56973c077a | 88 | ERROR, /**< General Error */ |
coisme | 0:fc56973c077a | 89 | DATA_READY, /**< Data ready */ |
coisme | 0:fc56973c077a | 90 | NOT_DATA_READY, /**< Data ready is not asserted. */ |
coisme | 0:fc56973c077a | 91 | } Status; |
coisme | 0:fc56973c077a | 92 | |
coisme | 0:fc56973c077a | 93 | /** |
coisme | 0:fc56973c077a | 94 | * Structure to hold a magnetic vector. |
coisme | 0:fc56973c077a | 95 | */ |
coisme | 0:fc56973c077a | 96 | typedef struct { |
coisme | 0:fc56973c077a | 97 | float mx; /**< x component */ |
coisme | 0:fc56973c077a | 98 | float my; /**< y component */ |
coisme | 0:fc56973c077a | 99 | float mz; /**< z component */ |
coisme | 1:a362b9e3aac2 | 100 | bool isOverflow; /**< Indicating magnetic sensor overflow */ |
coisme | 0:fc56973c077a | 101 | } MagneticVector; |
coisme | 0:fc56973c077a | 102 | |
coisme | 0:fc56973c077a | 103 | /** |
coisme | 0:fc56973c077a | 104 | * Constructor. |
coisme | 0:fc56973c077a | 105 | * |
coisme | 0:fc56973c077a | 106 | * @param conn instance of I2C |
coisme | 0:fc56973c077a | 107 | * @param addr slave address of the device |
coisme | 0:fc56973c077a | 108 | */ |
coisme | 0:fc56973c077a | 109 | AK8963(I2C *conn, SlaveAddress addr); |
coisme | 0:fc56973c077a | 110 | |
coisme | 0:fc56973c077a | 111 | /** |
coisme | 0:fc56973c077a | 112 | * Check the connection. |
coisme | 0:fc56973c077a | 113 | * |
coisme | 0:fc56973c077a | 114 | * @note Connection check is performed by reading a register which has a fixed value and verify it. |
coisme | 0:fc56973c077a | 115 | * |
coisme | 0:fc56973c077a | 116 | * @return Returns SUCCESS when succeeded, otherwise returns another code. |
coisme | 0:fc56973c077a | 117 | */ |
coisme | 0:fc56973c077a | 118 | Status checkConnection(); |
coisme | 0:fc56973c077a | 119 | |
coisme | 0:fc56973c077a | 120 | /** |
coisme | 0:fc56973c077a | 121 | * Sets device operation mode. |
coisme | 0:fc56973c077a | 122 | * |
coisme | 0:fc56973c077a | 123 | * @param mode device opration mode |
coisme | 0:fc56973c077a | 124 | * |
coisme | 0:fc56973c077a | 125 | * @return Returns SUCCESS when succeeded, otherwise returns another code. |
coisme | 0:fc56973c077a | 126 | */ |
coisme | 0:fc56973c077a | 127 | Status setOperationMode(OperationMode mode); |
coisme | 0:fc56973c077a | 128 | |
coisme | 0:fc56973c077a | 129 | /** |
coisme | 0:fc56973c077a | 130 | * Check if data is ready, i.e. measurement is finished. |
coisme | 0:fc56973c077a | 131 | * |
coisme | 0:fc56973c077a | 132 | * @return Returns DATA_READY if data is ready or NOT_DATA_READY if data is not ready. If error happens, returns another code. |
coisme | 0:fc56973c077a | 133 | */ |
coisme | 0:fc56973c077a | 134 | Status isDataReady(); |
coisme | 0:fc56973c077a | 135 | |
coisme | 0:fc56973c077a | 136 | /** |
coisme | 0:fc56973c077a | 137 | * Gets magnetic vector from the device. |
coisme | 0:fc56973c077a | 138 | * |
coisme | 0:fc56973c077a | 139 | * @param vec Pointer to a instance of MagneticVector |
coisme | 0:fc56973c077a | 140 | * |
coisme | 0:fc56973c077a | 141 | * @return Returns SUCCESS when succeeded, otherwise returns another code. |
coisme | 0:fc56973c077a | 142 | */ |
coisme | 0:fc56973c077a | 143 | Status getMagneticVector(MagneticVector *vec); |
coisme | 0:fc56973c077a | 144 | |
coisme | 0:fc56973c077a | 145 | private: |
coisme | 0:fc56973c077a | 146 | /** |
coisme | 0:fc56973c077a | 147 | * Sensitivity adjustment data. |
coisme | 0:fc56973c077a | 148 | */ |
coisme | 0:fc56973c077a | 149 | typedef struct { |
coisme | 0:fc56973c077a | 150 | unsigned char x; /**< sensitivity adjustment value for x */ |
coisme | 0:fc56973c077a | 151 | unsigned char y; /**< sensitivity adjustment value for y */ |
coisme | 0:fc56973c077a | 152 | unsigned char z; /**< sensitivity adjustment value for z */ |
coisme | 0:fc56973c077a | 153 | } SensitivityAdjustment; |
coisme | 0:fc56973c077a | 154 | |
coisme | 0:fc56973c077a | 155 | /** |
coisme | 0:fc56973c077a | 156 | * Holds sensitivity adjustment values |
coisme | 0:fc56973c077a | 157 | */ |
coisme | 0:fc56973c077a | 158 | SensitivityAdjustment sensitivityAdjustment; |
coisme | 0:fc56973c077a | 159 | |
coisme | 0:fc56973c077a | 160 | /** |
coisme | 0:fc56973c077a | 161 | * Holds a pointer to an I2C object. |
coisme | 0:fc56973c077a | 162 | */ |
coisme | 0:fc56973c077a | 163 | I2C *connection; |
coisme | 0:fc56973c077a | 164 | |
coisme | 0:fc56973c077a | 165 | /** |
coisme | 0:fc56973c077a | 166 | * Holds the slave address of AK8963. |
coisme | 0:fc56973c077a | 167 | */ |
coisme | 0:fc56973c077a | 168 | SlaveAddress slaveAddress; |
coisme | 0:fc56973c077a | 169 | |
coisme | 0:fc56973c077a | 170 | /** |
coisme | 0:fc56973c077a | 171 | * Writes data to the device. |
coisme | 0:fc56973c077a | 172 | * @param registerAddress register address to be written |
coisme | 0:fc56973c077a | 173 | * @param data data to be written |
coisme | 0:fc56973c077a | 174 | * @param length of the data |
coisme | 0:fc56973c077a | 175 | * @return Returns SUCCESS when succeeded, otherwise returns another. |
coisme | 0:fc56973c077a | 176 | */ |
coisme | 0:fc56973c077a | 177 | Status write(char registerAddress, const char *data, int length); |
coisme | 0:fc56973c077a | 178 | |
coisme | 0:fc56973c077a | 179 | /** |
coisme | 0:fc56973c077a | 180 | * Reads data from device. |
coisme | 0:fc56973c077a | 181 | * @param registerAddress register address to be read |
coisme | 0:fc56973c077a | 182 | * @param buf buffer to store the read data |
coisme | 0:fc56973c077a | 183 | * @param length bytes to be read |
coisme | 0:fc56973c077a | 184 | * @return Returns SUCCESS when succeeded, otherwise returns another. |
coisme | 0:fc56973c077a | 185 | */ |
coisme | 0:fc56973c077a | 186 | Status read(char registerAddress, char *buf, int length); |
coisme | 0:fc56973c077a | 187 | |
coisme | 0:fc56973c077a | 188 | /** |
coisme | 0:fc56973c077a | 189 | * Gets magnetic data, from the register ST1 (0x02) to ST2 (0x09), from the device. |
coisme | 0:fc56973c077a | 190 | * |
coisme | 0:fc56973c077a | 191 | * @param buf buffer to store the data read from the device. |
coisme | 0:fc56973c077a | 192 | * |
coisme | 0:fc56973c077a | 193 | * @return Returns SUCCESS when succeeded, otherwise returns another. |
coisme | 0:fc56973c077a | 194 | */ |
coisme | 0:fc56973c077a | 195 | Status getData(char *buf); |
coisme | 0:fc56973c077a | 196 | |
coisme | 0:fc56973c077a | 197 | /** |
coisme | 0:fc56973c077a | 198 | * Gets sensitivity adjustment values from the register ASAX, ASAY, and ASAZ. |
coisme | 0:fc56973c077a | 199 | * |
coisme | 0:fc56973c077a | 200 | * @param buf buffer to store sensitivity adjustment data |
coisme | 0:fc56973c077a | 201 | * |
coisme | 0:fc56973c077a | 202 | * @return SUCCESS when succeeded, otherwise returns another. |
coisme | 0:fc56973c077a | 203 | */ |
coisme | 0:fc56973c077a | 204 | Status getSensitivityAdjustment(SensitivityAdjustment *sns); |
coisme | 0:fc56973c077a | 205 | |
coisme | 0:fc56973c077a | 206 | }; |
coisme | 0:fc56973c077a | 207 | |
coisme | 0:fc56973c077a | 208 | #endif |