Library for TI's DRV 2605

Dependents:   sonar_vibrator

DRV2605.h

Committer:
takuhachisu
Date:
2017-11-10
Revision:
0:d47ac72f4048
Child:
1:0747096351be

File content as of revision 0:d47ac72f4048:

#ifndef DRV2605_H
#define DRV2605_H

#include "mbed.h"

/**  Modifined from Bryce WilliamsBryce Williams's code
 *  References:
 *  http://www.ti.com/product/DRV2605L/description&lpos=Middle_Container&lid=Alternative_Devices
 *  http://www.ti.com/lit/ds/symlink/drv2605l.pdf (Datasheet)
 *  http://www.ti.com/lit/an/sloa189/sloa189.pdf (Setup Guide; SLOA189)
 *  https://developer.mbed.org/users/electromotivated/code/DRV2605/
 */

// DRV2605 Slave Address
#define DRV2605_SLAVE_ADDR 0x5A

// DRV2605 Registers
#define STATUS                               0x00
#define MODE                                 0x01
#define REAL_TIME_PLAYBACK                   0x02
#define LIBRARY_SELECTION                    0x03
#define WAVEFORM_SEQUENCER_1                 0x04
#define WAVEFORM_SEQUENCER_2                 0x05
#define WAVEFORM_SEQUENCER_3                 0x06
#define WAVEFORM_SEQUENCER_4                 0x07
#define WAVEFORM_SEQUENCER_5                 0x08
#define WAVEFORM_SEQUENCER_6                 0x09
#define WAVEFORM_SEQUENCER_7                 0x0A
#define WAVEFORM_SEQUENCER_8                 0x0B
#define GO                                   0x0C
#define OVERDRIVE_TIME_OFFSET                0x0D
#define POSITIVE_SUSTAIN_TIME_OFFSET         0x0E
#define NEGATIVE_SUSTAIN_TIME_OFFSET         0x0F
#define BRAKE_TIME_OFFSET                    0x10
#define AUDIO_TO_VIBE_CONTROL                0x11
#define AUDIO_TO_VIBE_MINIMUM_INPUT_LEVEL    0x12
#define AUDIO_TO_VIBE_MAXIMUM_INPUT_LEVEL    0x13
#define AUDIO_TO_VIBE_MINIMUM_OUPUT_DRIVE    0x14
#define AUDIO_TO_VIBE_MAXIMUM_OUTPUT_DRIVE   0x15
#define RATED_VOLTAGE                        0x16
#define OVERDRIVE_CLAMP_VOLTAGE              0x17
#define AUTO_CALIBRATION_COMPENSATION_RESULT 0x18
#define AUTO_CALIBRATION_BACK_EMF_RESULT     0x19
#define FEEDBACK_CONTROL                     0x1A
#define CONTROL                              0x1B
#define CONTROL2                             0x1C
#define CONTROL3                             0x1D
#define CONTROL4                             0x1E
#define CONTROL5                             0x1F
#define LRA_OPEN_LOOP_PERIOD                 0x20
#define VBAT_VOLTAGE_MONITOR                 0x21
#define LRA_RESONANCE_PERIOD                 0x22

// Modes defines the possible modes of the DRV2605L (Register Addr: 0x01)
#define Mode_INTERNAL_TRIG   0x00 // Waveforms fired by Setting GO bit in Register 0x0C
#define Mode_EXTERNAL_EDGE   0x01 // Rising Edge on IN/TRIG pin set GO Bit.
#define Mode_EXTERNAL_LEVEL  0x02 // GO bit follows state of edge on IN/TRIG pin.
#define Mode_PWM_ANALOG      0x03 // PWM or Analog Signal accepted at IN/TRIG pin.
#define Mode_AUDIO_TO_VIBE   0x04 // An AC-coupled audio signal is accepted at the IN/TRIG pin.
#define Mode_RTP             0x05 // Real- Time Playback
#define Mode_DIAG            0x06 // Set to perform actuator diagnostics
#define Mode_AUTO_CAL        0x07 // Set to perform auto calibration of device for actuator
#define Mode_STANDBY         0x40 // Set Device to Software Standby (Low- Power Mode)
#define Mode_RESET           0x80 // Reset Device (equivalent of power cycling the device)

// FeedBack_Controls Fields Bitmasks (Register Addr: 0x1A)
#define Actuator_ERM            0x00
#define Actuator_LRA            0x80
#define Brake_FACTORTx1         0x00
#define Brake_FACTORTx2         0x10
#define Brake_FACTORTx3         0x20
#define Brake_FACTORTx4         0x40
#define Brake_FACTORTx6         0x80
#define Brake_FACTORTx8         0x50
#define Brake_FACTORTx16        0x60
#define Brake_FACTORTxDISABLE   0x70
#define Loop_GainLOW            0x00
#define Loop_GainMED            0x04
#define Loop_GainHIGH           0x08
#define Loop_GainVERYHIGH       0x0C

// ROM Waveform Library Selections
#define LibraryEMPTY            0x00
#define LibraryA                0x01
#define LibraryB                0x02
#define LibraryC                0x03
#define LibraryD                0x04
#define LibraryE                0x05
#define LibraryLRA              0x06
#define LibraryF                0x07


/** Library for the TI DRV2605
 *
 */

class DRV2605
{

public:
    /**
    * Create a DRV2605 object
    *
    * @param &i2c pointer of I2C object
    * @param isERM Set the actuator type
    */
    DRV2605(I2C &i2c, bool isERM);

    /**
    * Write value to specified register of device
    *
    * @param reg      The device register to write
    * @param value    The value to write to the register
    */
    void i2cWriteByte(char reg, char value);

    /**
    * Read value from register of device
    * @param reg  The device register to read
    * @return     The result
    */
    uint8_t i2cReadByte(char reg);

    /**
    * Place device into specified mode
    * @param mode     The mode to place device into
    */
    void mode(char mode);

    /**
    * Runs diagnostics on the Actuator and Device and returns the results.
    * The results indicate if an actuator is detected, over- current events,
    * etc. Refer to STATUS Register (0x00) in device datasheet for more
    * description register values.
    *
    * Note: This should be run if the user is having trouble getting the actuator
    * to work.
    *
    * @return The results of the diagnostics (i.e. Status Reg (0x00))
    */
    uint8_t diagnostics();
    
    
    /**
    * Set ROM Library
    *
    * Note: This should be run before setWaveform function
    * @param lib Set library (see library's macro)
    */
    void setLibrary(char lib);

    /**
    * Play single waveform from ROM Library
    *
    * Note: This should be run after setLibrary function
    * @param effect  The Waveform Effect Library Index value to play
    * (valid values are 1 to 123)
    */
    void setWaveform(int effect);

    /**
    * Load Wave Sequence into DRV2605 Sequence Registers
    *
    * Note: This should be run before setWaveform function
    * @param effect1... effect8   The effect to play. Valid inputs are 
    * 0 to 123;
    * 0: Stop Condition,
    * 1- 123: Waveform Index
    */
    void setWaveformSequence(int effect1 = 0, int effect2 = 0,
                                int effect3 = 0, int effect4 = 0,
                                int effect5 = 0, int effect6 = 0,
                                int effect7 = 0, int effect8 = 0);

    /**
    *    Plays the currently loaded waveform or waveform sequence.
    */
    void play();
    
    /**
    *    Stops the currently loaded waveform or waveform sequence.
    */
    void stop();

    /**
    * Real time play back
    *
    * @param rtp  intensity of the vibration (0 - 255)
    */
    void playRtp(char rtp);

    /**
        TODO: Add Closed Loop Calibration

        Run basic DRV2605L Auto- Calibration as detailed in Section 2 of
        the Device Setup Guide for OPEN- LOOP ONLY.
        This must be done before using the device in closed- loop mode
        (unless cal has been done before with values stored in non-volatile
         mem; see datasheet for more info).

        NOTE: It is NOT recommended to store cal values into device
        non-volatile memory as this can be done only once. Thus do not
        use this feature unless the device is being used in a final
        project AND values have been confirmed to result in satisfactory
        performance).

        This uses many of the default device register values such as
        the default DRIVE_TIME .

        @param actuator_peak_voltage The maximum/peak voltage rating of the actuator
    */
    uint8_t auto_cal_open_loop(float actuator_peak_voltage);

    /**
    * Battery voltage monitor
    *
    * @return battery voltage
    */
    float battery_voltage(void);

private:
    I2C *_i2c;
};

#endif