Simple library to read XV 11 Lidar

LIDAR.h

Committer:
achmad_fathoni
Date:
2017-10-02
Revision:
0:b5c7dc5f1fc8

File content as of revision 0:b5c7dc5f1fc8:

#ifndef MBED_LIDAR_H
#define MBED_LIDAR_H

#include "mbed.h"

/** A Library used to read data from Low-cost NEATO LIDAR
 *
 * Example:
 * @code
 * #include "mbed.h"
 * #include "LIDAR.h"
 * 
 * int main() {
 *   // The tx pin is PC_10
 *   // The rx pin is PC_11
 *   // The PWM pin to control motor is PA_15
 *   LIDAR lidar (PC_10, PC_11, PA_15);
 *  
 *   // Activate serial to PC for debugging
 *   Serial pc(USBTX, USBRX);
 *
 *   // Set duty cycle for motor PWM
 *   lidar.SetDuty(0.25);
 *
 *   // Start data aquisition
 *   lidar.StartData();
 *
 *   while (1) {
 *       // Aquire LIDAR data from angle 0, 45, 90, 135... 315
 *       // Then send it to serial PC with 9600 baud
 *       data = lidar.GetData(i);
 *       speed = lidar.GetSpeed();
 *       pc.printf("Spd=%.1f; D[%d]=%.1f\n", speed, i, data);
 *       i += 45;
 *       if(i >= 360) i = 0;
 *       wait(0.5);
 *   }
 * }
 * @endcode
 */
class LIDAR {

public:
    /** Create an LIDAR object connected to the specified serial port and 
     *  PWM port for LIDAR motor control
     *
     * @param tx Transmit pin
     * @param rx Receive Pin
     * @param motor_pwm PWM pin for motor control 
     *
     * @note
     *   The LIDAR will be initiated with 1kHz PWM with 0% duty-cycle
     *   and 115200 baud (standard baud for NEATO LIDAR)
     */
    LIDAR(PinName tx, PinName rx, PinName motor_pwm);
    
    /** Start data aquisition after setting up other initial parameter
     *  such as motor duty cycle and period.
     *
     * @note
     *   This function will activate Rx interrupt each time data is received
     */
    void StartData(void);
    
    /** Stop data aquisition
     *
     * @note
     *   This function will deactivate Rx Interrupt
     */
    void StopData(void);
    
    /** Set the PWM duty cycle precentage for LIDAR motor
     *
     * @param duty The duty cycle ranged from 0.0(0%) to 1.0(100%) 
     *
     */
    void SetPWMDuty(float duty);
    
    /** Set the PWM duty cycle for LIDAR motor in microseconds. The
     *  generated frequency will be f = 1000000/period
     *
     * @param microseconds The PWM period in microseconds 
     *
     */
    void SetPWMPeriodUs(int microseconds);
    
    /** Obtain the distance data read by LIDAR in certain angle
     *
     * @param degree The angle where the data want to be read, it is integer ranged from 0-359  
     *
     * @return Distance data in cm
     */
    float GetData(int degree);
    
    /** Obtain the rotation speed of LIDAR motor
     * 
     * @return Speed data in rpm
     */
    float GetSpeed(void);

private:
    Serial _lidar;
    PwmOut _motor;
    
    short _data[360];
    char* _data_ptr;
    unsigned short _speed;
    char* _speed_ptr;
    
    char _fsm_state;
    char _fsm_count;
    unsigned short _fsm_angle;
    
    void data_parser(void);
};

#endif