Introduce

ESPrtk also supports IMU peripheral sensor. (Accelerometer / Gyroscope / Magnetometer).

High-precision IMU / INS data is processed in real time with low delay, sensor read-up frequency can up to 200Hz.

When enabled, ESPrtk will communicate with MPU9250 and export raw data, calibration data and filter data to TX_UART0 port.

This function can run as a parallel task with the main action on both Rover and Base.

Rover :

Base :

Wiring MPU9250 to use with ESPrtk

ESPrtk IMU-MPU9250
3.3V out 3.3V
GND GND
SDA_I2C SDA
SCL_I2C SCL

Configure 

  • Update frequency (Hz) : “2”,”10″,”15″,”20″,”25″,”35″,”50″,”100″,
    “150”,”200″.
  • Gyroscope Scale range : ‘250’, ‘500’, ‘1000’,’2000′.
  • Accelerometer Scale range : ‘2’, ‘4’, ‘8’,’16’.
  • Low pass Filter (Hz):    ‘Not use’,’5′,’10’,’20’,’41’,’92’,’184′.
  • Shock tolerance Kalman Filter (input range):  1.000 ~ 20.000.

Format output data on TX_UART0

Please read ESPrtk datasheet to get detail $ESPIM1 and $ESPIM2 message :  Download ESPrtk datasheet .

$ESPIM1, GX,GY,GZ, MX,MY,MZ, AX,AY,AZ, T, MXc,MYc,MZc,* <CS><CR><LF>

  • GX,GY,GZ : Raw Gyroscope 3 Axis (Degree/second)
  • MX,MY,MZ :  Raw Magnetometer 3 Axis (uT) (micro-Tesla)
  • AX,AY,AZ : Raw Accelerometer 3 Axis ( scale 0.1 m/s^2)
  • T :  Temperature sensor (°C)    (degrees Celsius)
  • MXc,MYc,MZc : Magnetometer 3 Axis + Calibrated.

$EPIM2, QW,QX,QY,QZ, Yaw,Pitch,Roll, H, FQW,FQX,FQY,FQZ, FYaw,FPitch,FRoll, FH,*  <CS><CR><LF>

  • QW,QX,QY,QZ : DMP-Quaternion.
  • Yaw,Pitch,Roll: DMP-Euler 3 Axis. (Degree)
  • H :Compass Heading (using magnetometer calibrated) + Tilt compensation. (Degree)
  • FQW,FQX,FQY,FQZ : DMP-Quaternion + Extended Kalman Filter.
  • FYaw,FPitch,FRoll : DMP-Euler 3 Axis + Extended Kalman Filter. (Degree)
  • FH :Compass Heading (using magnetometer calibrated) + Tilt compensation +Extended Kalman Filter (Degree)

<CS><CR><LF> :

  • <CS> :  a checksum represented as a two-digit hexadecimal number. The checksum is the bitwise exclusive OR of ASCII codes of all characters between the ($ )and  (*).  (does not include $ and * ).
  • <CR> : “Carriage return”  or ‘\r’ or ‘0x0D in hex’ (13 in decimal) 
  • <LF> : “Line Feed” or ‘\n’ or ‘0x0A in hex ‘ (10 in decimal)   .

Calculate checksum – algorithm :

#include <stdio.h>

const char  MSG[]= "$ESPIM2|81|0.16|-0.09|-0.98|0.04|168.72|-172.96|-18.37|39.75|||||166.81|-163.44|19.96|53.70|*????\r\n";
  
  // Calculate CRC
  uint8_t FIRST_CRC  = 0 ;
  uint8_t SECOND_CRC = 0 ;
  uint16_t  i = 0 ;

  while ( MSG [i]  !=  '*' ){ 
    // CRC_Range calculate from after '$' to begin '*'  ( not contain '$' and '*') 
    if (  MSG [i]  != '$' ){ 
       FIRST_CRC     ^=  ( uint8_t  ) MSG [i];
       SECOND_CRC ^=  ( uint8_t ) FIRST_CRC; 
    }
    i++;
  }

  //Format CRC to [HEX_Up] string and store to buffer
  char CRC16_OUT  [4+1] ; 
  sprintf (  CRC16_OUT   ,  "%02X%02X" , FIRST_CRC , SECOND_CRC );

  //Print out result            
  printf ( "\n Your CRC16 is %s \n", CRC16_OUT);
  //Result should be [ Your CRC16 is 5172  ]


Example output on TX_UART0 :


$ESPIM2|81|0.16|-0.09|-0.98|0.04|168.72|-172.96|-18.37|39.75|||||166.81|-163.44|19.96|53.70|*5172
$ESPIM1|81|82.32|199.63|172.13|-2.40|-7.20|-50.41|0.54|-0.52|-0.57|29.17|-2.40|-7.20|-50.41|*186D
$ESPIM2|82|0.35|-0.25|-0.88|0.20|136.90|-141.23|-31.31|21.44|||||139.56|-141.49|-30.51|22.45|*750C
$ESPIM1|84|178.90|116.04|202.62|17.55|-21.91|-30.16|0.57|-0.76|-0.12|29.16|17.55|-21.91|-30.16|*2071
$ESPIM2|82|0.57|-0.51|-0.57|0.30|79.64|-100.98|-20.24|334.15|||||83.66|-106.79|-20.59|315.65|*7D05
$ESPIM1|82|117.38|127.38|185.91|37.51|-10.50|-8.85|-0.09|-0.79|0.14|29.16|37.51|-10.50|-8.85|*2211
$ESPIM2|77|0.66|-0.60|-0.20|0.40|51.81|-78.48|12.85|316.72|||||52.77|-79.97|6.36|316.71|*4774
$ESPIM1|76|-12.68|51.89|19.82|39.61|10.80|2.55|-0.66|-0.60|0.13|29.16|39.61|10.80|2.55|*3F7F
$ESPIM2|77|0.63|-0.64|0.03|0.45|41.11|-76.36|38.07|295.72|||||41.76|-76.70|35.26|303.99|*5E7E
$ESPIM1|79|-170.67|-256.16|-166.71|41.41|8.25|0.60|-0.30|-0.80|0.21|29.16|41.41|8.25|0.60|*004B
$ESPIM2|78|0.59|-0.60|-0.19|0.50|62.77|-77.32|21.63|314.30|||||54.44|-77.11|23.91|309.77|*7C09
$ESPIM1|86|-160.12|-91.22|-182.01|30.01|-17.70|-25.81|0.61|-0.86|-0.59|29.17|30.01|-17.70|-25.81|*3C50
$ESPIM2|81|0.45|-0.47|-0.71|0.25|99.49|-120.54|-23.98|344.87|||||93.43|-97.15|-19.13|336.54|*433B

 HOST send Disable/Enable type print IMU

During operation, can control Enable/Disable the export of $ESPIM1 and $ESPIM2 messages by sending command to ESPrtk .

Please see [“Control Enable Type Print on TX_UART0” → PL3 → BIT11 and BIT12] in ESPrtk datasheet to get detail Command Control infomation :  Download ESPrtk datasheet .

Put ESPrtk command to RX_UART0 Detail
$ESP_OK|19|T|P|0|000000000000|*2157 Disable Print ALL output UART_0
$ESP_OK|19|T|P|0|111111111100|*2156 Disable Print IMU 1 + IMU2
$ESP_OK|19|T|P|0|111111111110|*2057 Disable Print IMU 1 , Enable Print IMU2
$ESP_OK|19|T|P|0|111111111101|*2056 Enable Print IMU1 , Disable Print IMU 2
$ESP_OK|19|T|P|0|111111111111|*2157 Enable Print ALL output UART_0

 Calibration for magnetomter data

Compensating hard-iron-and-soft-iron-effects on compass sensor using trasnsformation matrix.

Go to this post to learn more : IMU MPU9250 ; Calibrate magnetometer on ESPrtk using Magneto1.2. 

Calibration Helper.

Display and collect XYZ 3-axis magnetometer data to make calibration magnetometer more simple and professional with wireless connection (WIFI).

See detail here: IMU MPU9250 ; Calibration Helper .

Wiring MPU9250 to use with ESPrtk

ESP32 IMU-MPU9250
3.3V out 3.3V
GND GND
SDA_I2C SDA
SCL_I2C SCL

Introduce 

This feature is supported on version 2.7.5 or higher.

When enabled, ESPrtk will communicate with MPU9250 and export raw data, calibration data and filter data to TX_UART0 port.

  • Update frequency (Hz) : “2”,”10″,”15″,”20″,”25″,”35″,”50″,”100″,
    “150”,”200″.
  • Gyroscope Scale range : ‘250’, ‘500’, ‘1000’,’2000′.
  • Accelerometer Scale range : ‘2’, ‘4’, ‘8’,’16’.
  • Low pass Filter (Hz):    ‘Not use’,’5′,’10’,’20’,’41’,’92’,’184′.
  • Shock tolerance Kalman Filter (input range):  1.000 ~ 20.000.

Format output data on TX_UART0

$ESPIM1, GX,GY,GZ, MX,MY,MZ, AX,AY,AZ, T, MXc,MYc,MZc,* <CS><CR><LF>

  • GX,GY,GZ : Raw Gyroscope 3 Axis (Degree/second)
  • MX,MY,MZ :  Raw Magnetometer 3 Axis (uT) (micro-Tesla)
  • AX,AY,AZ : Raw Accelerometer 3 Axis ( scale 0.1 m/s^2)
  • T :  Temperature sensor (°C)    (degrees Celsius)
  • MXc,MYc,MZc : Magnetometer 3 Axis + Calibrated.

$EPIM2, QW,QX,QY,QZ, Yaw,Pitch,Roll, H, FQW,FQX,FQY,FQZ, FYaw,FPitch,FRoll, FH,*  <CS><CR><LF>

  • QW,QX,QY,QZ : DMP-Quaternion.
  • Yaw,Pitch,Roll: DMP-Euler 3 Axis. (Degree)
  • H :Compass Heading (using magnetometer calibrated) + Tilt compensation. (Degree)
  • FQW,FQX,FQY,FQZ : DMP-Quaternion + Extended Kalman Filter.
  • FYaw,FPitch,FRoll : DMP-Euler 3 Axis + Extended Kalman Filter. (Degree)
  • FH :Compass Heading (using magnetometer calibrated) + Tilt compensation +Extended Kalman Filter (Degree)

<CS><CR><LF> :

  • <CS> :  a checksum represented as a two-digit hexadecimal number. The checksum is the bitwise exclusive OR of ASCII codes of all characters between the ($ )and  (*).  (does not include $ and * ).
  • <CR> : “Carriage return”  or ‘\r’ or ‘0x0D in hex’ (13 in decimal) 
  • <LF> : “Line Feed” or ‘\n’ or ‘0x0A in hex ‘ (10 in decimal)   .

Calculate checksum – algorithm :

#include <stdio.h>

int checksum(const char *s) {
    int c = 0;
    while(*s)
        c ^= *s++;
    return c;
}

int main()
{
    char mystring[] = "EPIM1,0.06,0.00,-0.06,48.86,-58.79,88.12,-0.19,-0.92,0.42,32.91,47.90,-59.29,87.77,";
    printf("Your checksum is : 0x%02X\n", checksum(mystring));
    // result  -> Checksum:0x2F 
    return 0;
}

Example output on TX_UART0 :

$ESPIM1,-0.18,-0.12,0.06,46.91,-60.74,87.67,-0.19,-0.93,0.43,33.56,45.97,-61.23,87.35,*05
$EPIM2,-0.18,0.22,0.49,-0.82,148.76,-65.10,10.62,231.27,,,,,148.87,-65.09,10.61,231.41,*04
$ESPIM1,0.30,-0.12,-0.12,49.16,-59.54,88.12,-0.19,-0.92,0.43,33.52,48.20,-60.04,87.77,*09
$EPIM2,-0.18,0.22,0.49,-0.82,148.76,-65.10,10.62,231.24,,,,,148.87,-65.09,10.61,231.41,*07
$ESPIM1,-0.55,-0.12,0.00,48.11,-60.59,88.87,-0.19,-0.92,0.43,33.55,47.15,-61.09,88.54,*08
$EPIM2,-0.18,0.22,0.49,-0.82,148.76,-65.11,10.62,231.05,,,,,148.87,-65.09,10.61,231.41,*05

 Calibration for magnetomter data

Compensating hard-iron-and-soft-iron-effects on compass sensor using trasnsformation matrix.

Go to this post to learn more : IMU MPU9250 ; Calibrate magnetometer on ESPrtk using Magneto1.2. 

Calibration Helper.

Display and collect XYZ 3-axis magnetometer data to make calibration magnetometer more simple and professional with wireless connection (WIFI).

See detail here: IMU MPU9250 ; Calibration Helper .


Old school Easter eggs.