diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 52c0d68dde1cb584907981a20bb9e95182c56b6e..d2466f05dc71ec5780be6225d4023709c78f2ec6 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,4 +1,5 @@
-SET(DARWIN_FW_PATH ~/humanoids/darwin_stm32_fw)
+#SET(DARWIN_FW_PATH ~/humanoids/darwin_stm32_fw)
+SET(DARWIN_FW_PATH ~/Desktop/IRI/humanoids/darwin_stm32_fw)
 
 ADD_SUBDIRECTORY(xml)
 IF(HAVE_XSD)
@@ -38,10 +39,10 @@ ENDIF(EIGEN3_FOUND)
 
 # add the necessary include directories
 INCLUDE_DIRECTORIES(.)
+INCLUDE_DIRECTORIES(${DARWIN_FW_PATH}/include)
 INCLUDE_DIRECTORIES(${iriutils_INCLUDE_DIR})
 INCLUDE_DIRECTORIES(${dynamixel_INCLUDE_DIR})
 INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIR})
-INCLUDE_DIRECTORIES(${DARWIN_FW_PATH}/include)
 # create the shared library
 ADD_LIBRARY(darwin_robot SHARED ${robot_sources} ${XSD_SOURCES})
 ADD_DEPENDENCIES(darwin_robot xsd_files_gen)
diff --git a/src/darwin_robot.cpp b/src/darwin_robot.cpp
index 578a6cbe9149eb43688c75e4834e8708f43fc838..a2b3b0b2e804a04dee72ee7b054ee1272b8ea9a4 100644
--- a/src/darwin_robot.cpp
+++ b/src/darwin_robot.cpp
@@ -80,6 +80,9 @@ CDarwinRobot::CDarwinRobot(const std::string &name,std::string &bus_id,int bus_s
       this->robot_device->read_byte_register(DARWIN_MM_NUM_SERVOS,&this->manager_num_servos);
       /* get the current action status */
       this->robot_device->read_byte_register(DARWIN_ACTION_CNTRL,&this->action_status);
+      /* get the current smart charger status (detected or not)*/
+      this->robot_device->read_byte_register(DARWIN_SMART_CHARGER_CNTRL,&this->smart_charger_status);
+      
     }
     else
     {
@@ -1776,6 +1779,137 @@ void CDarwinRobot::head_get_current_target(double *pan,double *tilt)
     throw CDarwinRobotException(_HERE_,"Invalid robot device");
 }
 
+//Smart charger interface
+void CDarwinRobot::smart_charger_enable(void)
+{
+  if(this->robot_device!=NULL)
+  {
+    this->smart_charger_status|=SMART_CHARGER_EN;
+    this->robot_device->write_byte_register(DARWIN_SMART_CHARGER_CNTRL,this->smart_charger_status);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+/* Disables the smart charger module
+ */
+void CDarwinRobot::smart_charger_disable(void)
+{
+  if(this->robot_device!=NULL)
+  {
+    this->smart_charger_status&=(~SMART_CHARGER_EN);
+    this->robot_device->write_byte_register(DARWIN_SMART_CHARGER_CNTRL,this->smart_charger_status);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+/* Set period of reading operation
+ */
+void CDarwinRobot::smart_charger_set_period(unsigned short int period_ms)
+{
+  unsigned short period;
+
+  if(this->robot_device!=NULL)
+  {
+    period=period_ms;
+    this->robot_device->write_word_register(DARWIN_SMART_CHARGER_PERIOD_L,period);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+unsigned short int CDarwinRobot::smart_charger_get_period(void)
+{
+  unsigned short int period;
+
+  if(this->robot_device!=NULL)
+  {
+    this->robot_device->read_word_register(DARWIN_SMART_CHARGER_PERIOD_L,&period);
+    return period;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+TChargerData CDarwinRobot::smart_charger_get_data(void)
+{
+ // unsigned short charger_data[3];
+  TChargerData smart_charger_data;
+
+  if(this->robot_device!=NULL)
+  {
+    this->robot_device->read_registers(DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L,(uint8_t *)&smart_charger_data,6);
+    return smart_charger_data;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+
+unsigned int CDarwinRobot::smart_charger_read_time_empty(void)
+{
+  unsigned char data[2];
+  unsigned int avg_time_empty;
+  
+    if(this->robot_device!=NULL)
+  {
+    this->robot_device->read_byte_register(DARWIN_SMART_CHARGER_AVG_TIME_EMPTY_L,data);
+    avg_time_empty=(data[0]+(data[1]<<8));
+    return avg_time_empty;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+unsigned char CDarwinRobot::smart_charger_read_control(void)
+{
+  unsigned char smart_charger_control;
+    if(this->robot_device!=NULL)
+  {
+    this->robot_device->read_byte_register(DARWIN_SMART_CHARGER_CNTRL,&smart_charger_control);
+    return smart_charger_control;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+unsigned char CDarwinRobot::smart_charger_read_status(void)
+{
+  unsigned char smart_charger_stat;
+    if(this->robot_device!=NULL)
+  {
+    this->robot_device->read_byte_register(DARWIN_SMART_CHARGER_STATUS,&smart_charger_stat);
+    return smart_charger_stat;
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+void CDarwinRobot::smart_charger_write_limit_current(unsigned short int limit_current)
+{
+  //unsigned short limit_current;
+
+  if(this->robot_device!=NULL)
+  {
+    this->robot_device->write_word_register(DARWIN_SMART_CHARGER_LIMIT_CURRENT_L,limit_current);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+
+/* void CDarwinRobot::smart_charger_read_limit_current(double limit_current)
+{
+  unsigned short limit_current;
+
+  if(this->robot_device!=NULL)
+  {
+    this->robot_device->read_word_register(BATTERY_INPUT_MAX_CURRENT_L,&limit_current);
+  }
+  else
+    throw CDarwinRobotException(_HERE_,"Invalid robot device");
+}
+*/
 
 CDarwinRobot::~CDarwinRobot()
 {
diff --git a/src/darwin_robot.h b/src/darwin_robot.h
index 597128f3f46817be92cb85f108a7432821483404..d7bd0e08f1f785255d5a11f158911e46e2a29de8 100644
--- a/src/darwin_robot.h
+++ b/src/darwin_robot.h
@@ -40,6 +40,18 @@ typedef enum {ADC_CH1=0,ADC_CH2=1,ADC_CH3=2,ADC_CH4=3,ADC_CH5=4,ADC_CH6=5,ADC_CH
 
 typedef enum {JOINTS_GRP0=0,JOINTS_GRP1=1,JOINTS_GRP2=2,JOINTS_GRP3=2} joints_grp_t;
 
+//smart charger read data
+#pragma pack (push, 1)
+typedef struct{
+// uint16_t limit_current;
+// uint8_t rel_soc;
+// uint8_t abs_soc;
+unsigned short int avg_time_empty;
+unsigned short int avg_time_full;
+unsigned short int bat_status;
+}TChargerData;
+#pragma pack (pop)
+
 class CDarwinRobot
 {
   private:
@@ -52,6 +64,8 @@ class CDarwinRobot
     unsigned char manager_status;
     /* action status */
     unsigned char action_status;
+    //smart charger status
+    unsigned char smart_charger_status;
   public:
     CDarwinRobot(const std::string &name,std::string &bus_id,int bus_speed, unsigned char id);
     // GPIO interface
@@ -183,6 +197,48 @@ class CDarwinRobot
     bool head_is_tracking(void);
     void head_set_new_target(double pan,double tilt);
     void head_get_current_target(double *pan,double *tilt);
+    
+    // smart charger interface
+/**
+ * \brief Function to enable smart charger module
+ */
+    void smart_charger_enable(void);
+ /**
+ * \brief Function to disable smart charger module
+ */
+    void smart_charger_disable(void);
+ /**
+ * \brief Function to set smart charger's read operation period
+ * \param period_ms Period in ms of smart charger module
+ */
+    void smart_charger_set_period(unsigned short int period_ms);
+ /**
+ * \brief Function to get smart charger's read operation period
+ */
+    unsigned short int smart_charger_get_period(void);
+ /**
+ * \brief Function to get smart charger's data: Battery average time to empty and to full and battery status
+ */
+    TChargerData smart_charger_get_data(void);
+ /**
+ * \brief Function to set smart charger's period
+ * \param limit_current Value of limit current
+ */
+    void smart_charger_write_limit_current(unsigned short int limit_current);
+ /**
+ * \brief Function to get smart charger's control register
+ * 
+ * Control register shows if the smart charger is detected or not and enabled or not
+ */   
+    unsigned char smart_charger_read_control(void);
+ /**
+ * \brief Function to get smart charger status
+ * 
+ * Smart charger status register indicates whether AC and/or battery are present or not
+ */
+    unsigned char smart_charger_read_status(void);
+    unsigned int smart_charger_read_time_empty(void);
+   
     ~CDarwinRobot();
 };