SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
drv2605_full.ino
Go to the documentation of this file.
1
30#include <HapticDrivers.hpp>
31
32#ifndef SENSOR_SDA
33#define SENSOR_SDA 3
34#endif
35
36#ifndef SENSOR_SCL
37#define SENSOR_SCL 2
38#endif
39
41
43{
44 Serial.println("");
45 Serial.println("╔══════════════════════════════════════════╗");
46 Serial.println("║ DRV2605 Haptic Driver Test ║");
47 Serial.println("╚══════════════════════════════════════════╝");
48 Serial.println("");
49}
50
52{
53 Serial.println("\n[TEST] Device Capabilities");
54 auto cap = haptic.getCapabilities();
55
56 Serial.print(" F0 Calibration: "); Serial.println(cap.hasF0Calibration ? "Yes" : "No");
57 Serial.print(" VBAT Compensation: "); Serial.println(cap.hasVbatCompensation ? "Yes" : "No");
58 Serial.print(" RTP Mode: "); Serial.println(cap.hasRTP ? "Yes" : "No");
59 Serial.print(" Sequence: "); Serial.println(cap.hasSequence ? "Yes" : "No");
60 Serial.print(" Auto Calibration: "); Serial.println(cap.hasAutoCalibration ? "Yes" : "No");
61 Serial.print(" Break Effect: "); Serial.println(cap.hasBreakEffect ? "Yes" : "No");
62 Serial.print(" Overdrive: "); Serial.println(cap.hasOverdrive ? "Yes" : "No");
63 Serial.print(" Continuous Mode: "); Serial.println(cap.hasContinuousMode ? "Yes" : "No");
64 Serial.print(" Max Effects: "); Serial.println(cap.maxEffectCount);
65 Serial.print(" Max Sequence: "); Serial.println(cap.maxSequenceLength);
66 Serial.println("[OK] Done");
67}
68
70{
71 Serial.println("\n=== Driver Initialization ===");
72 Serial.print("Wire: SDA="); Serial.print(SENSOR_SDA); Serial.print(", SCL="); Serial.println(SENSOR_SCL);
73
74 if (!haptic.begin(Wire, DRV2605_SLAVE_ADDRESS, SENSOR_SDA, SENSOR_SCL)) {
75 Serial.println("[FATAL] DRV2605 init failed!");
76 while (1) delay(1000);
77 }
78
79 Serial.println("[OK] Driver initialized");
80 Serial.print(" Chip Name: "); Serial.println(haptic.getChipName());
81 Serial.print(" Chip ID: 0x"); Serial.println(haptic.getChipID(), HEX);
82 Serial.print(" Actuator: "); Serial.println(haptic.getActuatorType() == HapticActuatorType::LRA ? "LRA" : "ERM");
83 Serial.print(" VBAT: "); Serial.print(haptic.getVbat()); Serial.println(" mV");
84 Serial.print(" Mode: "); Serial.println(static_cast<uint8_t>(haptic.getMode()));
85}
86
88{
89 Serial.println("\n[TEST] Actuator Type");
90
91 Serial.println(" Current: ");
92 haptic.getActuatorType() == HapticActuatorType::ERM ? Serial.println("ERM") : Serial.println("LRA");
93
94 Serial.println(" Switching to LRA...");
96 Serial.print(" Now: "); Serial.println(haptic.getActuatorType() == HapticActuatorType::LRA ? "LRA" : "ERM");
97
98 Serial.println(" Switching to ERM...");
100 Serial.print(" Now: "); Serial.println(haptic.getActuatorType() == HapticActuatorType::ERM ? "ERM" : "LRA");
101
102 Serial.println("[OK] Done");
103}
104
106{
107 Serial.println("\n[TEST] Library Selection");
108
109 Serial.println(" Selecting ERM Library 1 (Strong Click)...");
112 delay(500);
113
114 Serial.println(" Selecting ERM Library 2 (Sharp Click)...");
117 delay(500);
118
119 Serial.println(" Selecting ERM Library 5 (Buzz)...");
122 delay(500);
123
124 Serial.println(" Reset to Library 1...");
126 Serial.println("[OK] Done");
127}
128
130{
131 Serial.println("\n[TEST] playEffect() - HapticBase Interface");
132 Serial.println(" Playing effect 1...");
133 bool result = haptic.playEffect(1);
134 if (result) {
135 delay(300);
136 Serial.println("[OK] Done");
137 } else {
138 Serial.println("[FAIL] playEffect() returned false");
139 }
140}
141
143{
144 Serial.println("\n[TEST] playEffect() - Effect Range (1-10)");
145 for (uint8_t i = 1; i <= 10; i++) {
146 Serial.print(" Effect "); Serial.print(i); Serial.println("...");
148 delay(400);
149 }
150 Serial.println("[OK] Done");
151}
152
154{
155 Serial.println("\n[TEST] setSequence() - HapticBase Interface");
157 haptic.setSequence(0, 1);
158 haptic.setSequence(1, 2);
159 haptic.setSequence(2, 3);
160 haptic.setSequence(3, 0);
161 Serial.println(" Sequence set: [1, 2, 3, 0]");
162 Serial.println(" Playing sequence...");
164 delay(2000);
165 Serial.println("[OK] Done");
166}
167
169{
170 Serial.println("\n[TEST] setRealtimeValue() - HapticBase Interface");
171
173 Serial.println(" Mode set to RTP");
174
175 Serial.println(" Playing RTP values...");
176 uint8_t values[] = {0x00, 0x40, 0x80, 0xC0, 0xFF, 0xC0, 0x80, 0x40};
177 for (size_t i = 0; i < sizeof(values); i++) {
178 Serial.print(" Value: 0x"); Serial.println(values[i], HEX);
179 haptic.setRealtimeValue(values[i]);
180 delay(2000);
181 }
182
183 haptic.stop();
185 Serial.println("[OK] Done");
186}
187
189{
190 Serial.println("\n[TEST] stop() - HapticBase Interface");
192 Serial.println(" Started playback, waiting...");
193 delay(500);
194 Serial.println(" Calling stop()...");
195 haptic.stop();
196 Serial.print(" isPlaying: "); Serial.println(haptic.isPlaying() ? "Yes" : "No");
197 Serial.println("[OK] Done");
198}
199
201{
202 Serial.println("\n[TEST] getStatus() - HapticBase Interface");
203 HapticStatus status = haptic.getStatus();
204 const char *statusStr = "UNKNOWN";
205 switch (status) {
206 case HapticStatus::IDLE: statusStr = "IDLE"; break;
207 case HapticStatus::PLAYING: statusStr = "PLAYING"; break;
208 case HapticStatus::PAUSED: statusStr = "PAUSED"; break;
209 case HapticStatus::CALIBRATING: statusStr = "CALIBRATING"; break;
210 case HapticStatus::ERROR: statusStr = "ERROR"; break;
211 case HapticStatus::STANDBY: statusStr = "STANDBY"; break;
212 }
213 Serial.print(" Status: "); Serial.println(statusStr);
214 Serial.println("[OK] Done");
215}
216
218{
219 Serial.println("\n[TEST] Mode Switching");
220
221 Serial.println(" Mode: INTERNAL_TRIGGER");
223 Serial.print(" Current: "); Serial.println(static_cast<uint8_t>(haptic.getMode()));
224
225 Serial.println(" Mode: REAL_TIME_PLAYBACK");
227 Serial.print(" Current: "); Serial.println(static_cast<uint8_t>(haptic.getMode()));
228
229 Serial.println(" Mode: DIAGNOSTICS");
231 Serial.print(" Current: "); Serial.println(static_cast<uint8_t>(haptic.getMode()));
232
233 Serial.println(" Mode: STANDBY");
235 Serial.print(" Current: "); Serial.println(static_cast<uint8_t>(haptic.getMode()));
236
238 Serial.println("[OK] Done");
239}
240
242{
243 Serial.println("\n[TEST] calibrate() - HapticBase Interface");
244 Serial.println(" WARNING: May take a few seconds...");
245
246 if (haptic.calibrate()) {
247 Serial.println(" Calibration successful!");
248 } else {
249 Serial.println(" Calibration failed!");
250 }
251 Serial.println("[OK] Done");
252}
253
254void testF0()
255{
256 Serial.println("\n[TEST] getF0() - HapticBase Interface");
257 uint32_t f0 = haptic.getF0();
258 if (f0 > 0) {
259 Serial.print(" LRA F0: "); Serial.print(f0); Serial.println(" Hz");
260 } else {
261 Serial.println(" F0 not available or LRA not detected");
262 }
263 Serial.println("[OK] Done");
264}
265
267{
268 Serial.println("\n[TEST] setMode(STANDBY) - HapticBase Interface");
270 Serial.println("[OK] Done");
271}
272
274{
275 Serial.println("\n[TEST] setMode(NORMAL) - HapticBase Interface");
277 Serial.println("[OK] Done");
278}
279
281{
282 Serial.println("\n=== Auto Demo Sequence ===");
283 delay(1000);
284
285 Serial.println("\n[1/11] Basic playEffect()...");
287 delay(800);
288
289 Serial.println("\n[2/11] Library selection...");
291
292 Serial.println("\n[3/11] Effect range (1-10)...");
294
295 Serial.println("\n[4/11] Sequence test...");
297
298 Serial.println("\n[5/11] RTP test...");
299 testRTP();
300
301 Serial.println("\n[6/11] Status check...");
302 testStatus();
303
304 Serial.println("\n[7/11] Mode switching...");
305 testModes();
306
307 Serial.println("\n[8/11] Actuator type switching...");
309
310 Serial.println("\n[9/11] Stop test...");
312 delay(200);
313 haptic.stop();
314 delay(300);
315
316 Serial.println("\n[10/11] Calibration...");
318 delay(500);
319
320 Serial.println("\n[11/11] F0 reading...");
321 testF0();
322
323 Serial.println("\n=== Demo Complete ===");
324}
325
327{
328 Serial.println("\n========== Commands ==========");
329 Serial.println("Initialization:");
330 Serial.println(" i - Re-initialize driver");
331 Serial.println("");
332 Serial.println("HapticBase Interface:");
333 Serial.println(" e - playEffect(1)");
334 Serial.println(" E - playEffect() range (1-10)");
335 Serial.println(" S - setSequence() test");
336 Serial.println(" r - setRealtimeValue() (RTP)");
337 Serial.println(" p - stop() test");
338 Serial.println(" t - getStatus()");
339 Serial.println(" c - calibrate()");
340 Serial.println(" f - getF0()");
341 Serial.println(" k - Show capabilities");
342 Serial.println(" s - Enter standby mode");
343 Serial.println(" n - Return to normal mode");
344 Serial.println("");
345 Serial.println("DRV2605 Extended:");
346 Serial.println(" l - Library selection");
347 Serial.println(" a - Actuator type switch");
348 Serial.println(" m - Mode switching");
349 Serial.println("");
350 Serial.println("Special Tests:");
351 Serial.println(" d - Auto demo sequence");
352 Serial.println("");
353 Serial.println("Info:");
354 Serial.println(" v - Read voltage");
355 Serial.println(" h - Help (this message)");
356 Serial.println("==============================");
357}
358
359void setup()
360{
361 Serial.begin(115200);
362 delay(1000);
363
364 printBanner();
365 testInit();
367
368 Serial.println("\n========== Quick Test ==========");
369 Serial.println("Running auto demo sequence...");
370
371 testAutoDemo();
372
373 printHelp();
374}
375
376void loop()
377{
378 if (Serial.available()) {
379 char cmd = Serial.read();
380
381 switch (cmd) {
382 case 'i':
383 testInit();
384 break;
385 case 'k':
387 break;
388 case 'e':
390 break;
391 case 'E':
393 break;
394 case 'S':
396 break;
397 case 'r':
398 testRTP();
399 break;
400 case 'p':
401 testStop();
402 break;
403 case 't':
404 testStatus();
405 break;
406 case 'c':
408 break;
409 case 'f':
410 testF0();
411 break;
412 case 'l':
414 break;
415 case 'a':
417 break;
418 case 'm':
419 testModes();
420 break;
421 case 'd':
422 testAutoDemo();
423 break;
424 case 'v':
425 Serial.print("[VBAT] "); Serial.print(haptic.getVbat()); Serial.println(" mV");
426 break;
427 case 's':
428 testStandby();
429 break;
430 case 'n':
432 break;
433 case 'h':
434 case 'H':
435 case '?':
436 printHelp();
437 break;
438 default:
439 if (cmd != '\n' && cmd != '\r' && cmd != ' ') {
440 Serial.print("[?] Unknown: '"); Serial.print(cmd); Serial.print(" (0x"); Serial.print(cmd, HEX); Serial.println(")");
441 }
442 break;
443 }
444 }
445
446 delay(10);
447}
HapticStatus
Vibration playback status.
@ PLAYING
Currently playing.
@ PAUSED
Playback paused.
@ IDLE
Not playing.
@ CALIBRATING
Calibrating.
@ ERROR
Error state.
@ STANDBY
Standby mode.
@ LRA
Linear Resonant Actuator.
@ ERM
Eccentric Rotating Mass motor.
@ INTERNAL_TRIGGER
Play by selecting waveforms/effects and calling run()
@ DIAGNOSTICS
Diagnostics mode.
@ STANDBY
Standby mode.
@ REAL_TIME_PLAYBACK
RTP mode (direct drive value)
@license MIT License
Driver for the TI DRV2605/DRV2604 haptic motor controller.
uint32_t getVbat() override
Get the battery voltage.
bool setActuatorType(HapticActuatorType type) override
Set the actuator type.
HapticActuatorType getActuatorType() const override
Get the actuator type.
bool calibrate() override
Perform auto-calibration.
uint32_t getF0() const override
Get the measured resonant frequency (F0).
void selectLibrary(uint8_t lib)
Select the ROM waveform library.
bool isPlaying() const override
Check if haptic is currently playing.
bool setMode(HapticMode mode) override
Set the operating mode.
bool setSequence(uint8_t slot, HapticEffectId effect) override
Set a waveform in the sequence.
HapticStatus getStatus() const override
Get current playback status.
uint8_t getChipID() const override
Get the chip ID.
bool playSequence() override
Play the waveform sequence.
bool playEffect(HapticEffectId effect) override
Play a haptic effect.
const char * getChipName() const override
Get the chip name.
HapticMode getMode() const override
Get the current operating mode.
bool stop() override
Stop haptic playback immediately.
bool clearSequence() override
Clear the waveform sequence.
HapticCapabilities getCapabilities() const override
Get device capabilities.
bool setRealtimeValue(uint8_t value) override
Set RTP (real-time playback) value.
bool begin(SensorCommCustom::CustomCallback cb, SensorCommCustomHal::CustomHalCallback hal_cb, uint8_t addr)
Initialize the sensor using custom callback interface.
void testCapabilities()
void testInit()
void printHelp()
void testStop()
void testPlayEffectRange()
void testNormalMode()
void testLibrarySelection()
void setup()
void testPlayEffect()
void testModes()
void testRTP()
HapticDriver_DRV2605 haptic
void testSetSequence()
#define SENSOR_SCL
void testCalibration()
#define SENSOR_SDA
void testF0()
void testActuatorType()
void testStandby()
void testStatus()
void testAutoDemo()
void printBanner()
void loop()
uint8_t i