Statistics
| Branch: | Revision:

brix5 / firmware / demo / QuadDRV-HwTest / Adafruit_DRV2605.cpp @ master

History | View | Annotate | Download (3.717 KB)

1 9e4d9eb1 Jan
/***************************************************
2
  This is a library for the Adafruit DRV2605L Haptic Driver
3

4
  ----> http://www.adafruit.com/products/2306
5

6
  Check out the links above for our tutorials and wiring diagrams
7
  This motor/haptic driver uses I2C to communicate
8

9
  Adafruit invests time and resources providing this open source code,
10
  please support Adafruit and open-source hardware by purchasing
11
  products from Adafruit!
12

13
  Written by Limor Fried/Ladyada for Adafruit Industries.
14
  MIT license, all text above must be included in any redistribution
15
 ****************************************************/
16
17
18
#if ARDUINO >= 100
19
#include "Arduino.h"
20
#else
21
#include "WProgram.h"
22
#endif
23
24
#include "Adafruit_DRV2605.h"
25
26
/**************************************************************************/
27
/*!
28
    @brief  Instantiates a new DRV2605 class
29
*/
30
/**************************************************************************/
31
// I2C, no address adjustments or pins
32
Adafruit_DRV2605::Adafruit_DRV2605(uint8_t channel) {
33
  _channel = channel;
34
}
35
36
37
/**************************************************************************/
38
/*!
39
    @brief  Setups the HW
40
*/
41
/**************************************************************************/
42
boolean Adafruit_DRV2605::begin() {
43
  uint8_t id = readRegister8(DRV2605_REG_STATUS);
44
  //Serial.print("Status 0x"); Serial.println(id, HEX);
45
46
  writeRegister8(DRV2605_REG_MODE, 0x00); // out of standby
47
48
  writeRegister8(DRV2605_REG_RTPIN, 0x00); // no real-time-playback
49
50
  writeRegister8(DRV2605_REG_WAVESEQ1, 1); // strong click
51
  writeRegister8(DRV2605_REG_WAVESEQ2, 0);
52
53
  writeRegister8(DRV2605_REG_OVERDRIVE, 0); // no overdrive
54
55
  writeRegister8(DRV2605_REG_SUSTAINPOS, 0);
56
  writeRegister8(DRV2605_REG_SUSTAINNEG, 0);
57
  writeRegister8(DRV2605_REG_BREAK, 0);
58
  writeRegister8(DRV2605_REG_AUDIOMAX, 0x64);
59
60
  // ERM open loop
61
62
  // turn off N_ERM_LRA
63
  writeRegister8(DRV2605_REG_FEEDBACK, readRegister8(DRV2605_REG_FEEDBACK) & 0x7F);
64
  // turn on ERM_OPEN_LOOP
65
  writeRegister8(DRV2605_REG_CONTROL3, readRegister8(DRV2605_REG_CONTROL3) | 0x20);
66
67
  return true;
68
}
69
70
void Adafruit_DRV2605::setWaveform(uint8_t slot, uint8_t w) {
71
  writeRegister8(DRV2605_REG_WAVESEQ1 + slot, w);
72
}
73
74
void Adafruit_DRV2605::selectLibrary(uint8_t lib) {
75
  writeRegister8(DRV2605_REG_LIBRARY, lib);
76
}
77
78
void Adafruit_DRV2605::go() {
79
  writeRegister8(DRV2605_REG_GO, 1);
80
}
81
82
void Adafruit_DRV2605::setMode(uint8_t mode) {
83
  writeRegister8(DRV2605_REG_MODE, mode);
84
}
85
86
void Adafruit_DRV2605::setRealtimeValue(uint8_t rtp) {
87
  writeRegister8(DRV2605_REG_RTPIN, rtp);
88
}
89
90
/********************************************************************/
91
92
uint8_t Adafruit_DRV2605::readRegister8(uint8_t reg) {
93
  selectChannel(_channel);
94
  uint8_t x ;
95
  // use i2c
96
  Wire.beginTransmission(DRV2605_ADDR);
97
  Wire.write((byte)reg);
98
  Wire.endTransmission();
99
  Wire.requestFrom((byte)DRV2605_ADDR, (byte)1);
100
  x = Wire.read();
101
  //  Serial.print("$"); Serial.print(reg, HEX);
102
  //  Serial.print(": 0x"); Serial.println(x, HEX);
103
  return x;
104
}
105
106
void Adafruit_DRV2605::writeRegister8(uint8_t reg, uint8_t val) {
107
  selectChannel(_channel);
108
  // use i2c
109
  Wire.beginTransmission(DRV2605_ADDR);
110
  Wire.write((byte)reg);
111
  Wire.write((byte)val);
112
  Wire.endTransmission();
113
}
114
115
/****************/
116
117
118
// Allow users to use ERM motor or LRA motors
119
120
void Adafruit_DRV2605::useERM ()
121
{ 
122
  writeRegister8(DRV2605_REG_FEEDBACK, readRegister8(DRV2605_REG_FEEDBACK) & 0x7F);
123
}
124
125
void Adafruit_DRV2605::useLRA ()
126
{
127
  writeRegister8(DRV2605_REG_FEEDBACK, readRegister8(DRV2605_REG_FEEDBACK) | 0x80);
128
}
129
130
void Adafruit_DRV2605::selectChannel (uint8_t channel)
131
{
132
  // choose channel, all address bits to gnd on PCA9546A/TCA9548A = 0x70
133
  Wire.beginTransmission(0x70);
134
  Wire.write(1 << channel);
135
  Wire.endTransmission();
136
}