/
LIS3DSH_demo.ino
148 lines (108 loc) · 2.47 KB
/
LIS3DSH_demo.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
* Simple demo to test LIS3DSH found in STM32F4 Discovery board
* CS pin = PE3
* Use Arduino IDE serial plotter to visualize
*
* leds are used to visualize sensor position
*/
#include "Arduino.h"
#include <SPI.h>
#define RD 0x80
#define WR 0x00
#define CTRL_REG4 0x20
#define CTRL_REG5 0x24
#define CTRL_REG3 0x23
#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D
#define WHO_AM_I 0x0F
void readReg(uint8_t addr, uint8_t* data) {
digitalWrite(PE3, LOW);
uint8_t ret =SPI.transfer(addr|RD);
delayMicroseconds(50);
ret =SPI.transfer(0x00);
delayMicroseconds(50);
//Serial.print("R:");
//Serial.println(ret,HEX);
digitalWrite(PE3, HIGH);
*data=ret;
}
void printXYZ() {
uint8_t xl;
readReg(OUT_X_L, &xl);
uint8_t xh;
readReg(OUT_X_H, &xh);
int16_t X = (xh << 8) | (xl);
if (X<0) {
analogWrite(PD12,X*-1/64);
analogWrite(PD14,0);
} else {
analogWrite(PD14,X/64);
analogWrite(PD12,0);
}
uint8_t yl;
readReg(OUT_Y_L, &yl);
uint8_t yh;
readReg(OUT_Y_H, &yh);
int16_t Y = (yh << 8) | (yl);
if (Y<0) {
analogWrite(PD15,Y*-1/64);
analogWrite(PD13,0);
} else {
analogWrite(PD13,Y/64);
analogWrite(PD15,0);
}
uint8_t zl;
readReg(OUT_Z_L, &zl);
uint8_t zh;
readReg(OUT_Z_H, &zh);
int16_t Z = (zh << 8) | (zl);
Serial.print(X);
Serial.print(",");
Serial.print(Y);
Serial.print(",");
Serial.println(Z);
}
void initSensor() {
/*
taken from datasheet, init with two commands:
1. Write CTRL_REG4 = 67h
X, Y, Z enabled, ODR = 100 Hz
2. Write CTRL_REG3 = C8h
DRY active high on INT1 pin
*/
Serial.println("init LIS3DSH Sensor");
SPI.begin();
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);
//SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
digitalWrite(PE3, LOW);
uint8_t ret =SPI.transfer(CTRL_REG4);
delay(1);
ret =SPI.transfer(0x77);
//ret =SPI.transfer(CTRL_REG5);
//delay(10);
//ret =SPI.transfer(0x0);
digitalWrite(PE5, HIGH);
/* read ID, expect 0x3F for LIS3DSH */
uint8_t id;
readReg(WHO_AM_I, &id);
Serial.print("ID=");
Serial.println(id, HEX);
Serial.println("...done");
}
void setup() {
Serial.begin(115200);
pinMode(PE3, OUTPUT);
pinMode(PD15, OUTPUT);
pinMode(PD14, OUTPUT);
pinMode(PD13, OUTPUT);
initSensor();
}
void loop() {
printXYZ();
delay(20);
}