M-G354PDH0 library.

Dependents:   M-G354PDH0_serial_Lib INS_GNSS_logger_1 UBX_GPS_muliti_SPI_4_logger_ver

Files at this revision

API Documentation at this revision

Comitter:
Joeatsumi
Date:
Wed Apr 28 07:39:09 2021 +0000
Commit message:
M-G354PDH0 program that utilizes library.

Changed in this revision

MG354PDH0.cpp Show annotated file Show diff for this revision Revisions of this file
MG354PDH0.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 9e92f863fde5 MG354PDH0.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MG354PDH0.cpp	Wed Apr 28 07:39:09 2021 +0000
@@ -0,0 +1,278 @@
+#include "mbed.h"
+#include "MG354PDH0.h"
+
+MG354PDH0::MG354PDH0(Serial* ps): p_port(ps){
+    p_port->baud(460800);
+}
+
+void MG354PDH0::call_window1(){
+    p_port->putc(0xFE);
+    p_port->putc(0x01);
+    p_port->putc(0x0d);
+}
+
+void MG354PDH0::call_window0(){
+    p_port->putc(0xFE);
+    p_port->putc(0x00);
+    p_port->putc(0x0d);
+ }
+
+void MG354PDH0::GLOB_CMD_read(){//IMUが使えるかどうかの確認
+    
+    p_port->putc(0x0A);
+    p_port->putc(0x00);
+    p_port->putc(0x0d);
+      
+    while(p_port->getc()!=0x0A){
+      }
+    val_GLOB_CMD_read[0] = p_port->getc();
+    val_GLOB_CMD_read[1] = p_port->getc();
+    
+    i_GLOB_CMD_read=(val_GLOB_CMD_read[0]<<8)+val_GLOB_CMD_read[1];
+    if(i_GLOB_CMD_read==0){
+        //pc.printf("IMU is ready.1\r\n");
+        }else{
+            //pc.printf("IMU is not ready.1\r\n");
+            }
+            
+}
+
+void MG354PDH0::DIAG_STAT_read(){
+    
+    p_port->putc(0x04);
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x04){
+      }
+    val_DIAG_STAT_read[0] = p_port->getc();
+    val_DIAG_STAT_read[1] = p_port->getc();
+    
+    i_DIAG_STAT_read=(val_DIAG_STAT_read[0]<<8)+val_DIAG_STAT_read[1];
+    if(i_DIAG_STAT_read==0){
+        //pc.printf("IMU is ready.2\r\n");
+        }else{
+            //pc.printf("IMU is not ready.2\r\n");
+            }
+}
+
+void MG354PDH0::UART_CTRL_write(){//IMUのボーレートを480600,手動モードへ移行
+    
+    call_window1();
+    
+    p_port->putc(0x09);
+    p_port->putc(0x00);
+    p_port->putc(0x0d);
+    
+    p_port->putc(0x08);
+    p_port->putc(0x00);
+    p_port->putc(0x0d);
+        
+}
+
+/*IMUが動作可能かどうかの確認*/
+void MG354PDH0::power_on_sequence1(){
+    //pc.printf("power on sequence 1\r\n");
+    call_window1();
+    GLOB_CMD_read();
+}
+
+/*IMUが動作可能かどうかの確認*/
+void MG354PDH0::power_on_sequence2(){
+    //pc.printf("power on sequence 2\r\n");
+    call_window0();
+    DIAG_STAT_read();
+    }
+
+void MG354PDH0::move_to_sampling_mode(){
+    call_window0();
+    
+    p_port->putc(0x83);
+    p_port->putc(0x01);
+    p_port->putc(0x0d);    
+}
+
+float MG354PDH0::read_angular_rate_x(){
+    
+    call_window0();
+    
+    p_port->putc(0x12);//register of gyro x (High)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x12){
+      }
+    val_rate_x[0] = p_port->getc();
+    val_rate_x[1] = p_port->getc();
+
+    p_port->putc(0x14);//register of gyro x (Low)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x14){
+      }
+    val_rate_x[2] = p_port->getc();
+    val_rate_x[3] = p_port->getc();
+    
+    gyro_x=(val_rate_x[0]<<24)+(val_rate_x[1]<<16)+(val_rate_x[2]<<8)+val_rate_x[3];
+    //SCALE_FACTOR 0.016
+    gyro_x*=(SCALE_FACTOR_GYRO/65536);
+    
+    return gyro_x;
+    
+}
+    
+float MG354PDH0::read_angular_rate_y(){
+    
+    call_window0();
+    
+    p_port->putc(0x16);//register of gyro y (High)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x16){
+      }
+    val_rate_y[0] = p_port->getc();
+    val_rate_y[1] = p_port->getc();
+
+    p_port->putc(0x18);//register of gyro y (Low)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x18){
+      }
+    val_rate_y[2] = p_port->getc();
+    val_rate_y[3] = p_port->getc();
+    
+    gyro_y=(val_rate_y[0]<<24)+(val_rate_y[1]<<16)+(val_rate_y[2]<<8)+val_rate_y[3];
+    //SCALE_FACTOR 0.016
+    gyro_y*=(SCALE_FACTOR_GYRO/65536);
+    
+    return gyro_y;
+    
+}
+    
+float MG354PDH0::read_angular_rate_z(){
+    
+    call_window0();
+    
+    p_port->putc(0x1A);//register of gyro z (High)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x1A){
+      }
+    val_rate_z[0] = p_port->getc();
+    val_rate_z[1] = p_port->getc();
+
+    p_port->putc(0x1C);//register of gyro z (Low)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x1C){
+      }
+    val_rate_z[2] = p_port->getc();
+    val_rate_z[3] = p_port->getc();
+    
+    gyro_z=(val_rate_z[0]<<24)+(val_rate_z[1]<<16)+(val_rate_z[2]<<8)+val_rate_z[3];
+    //SCALE_FACTOR 0.016
+    gyro_z*=(SCALE_FACTOR_GYRO/65536);
+    
+    return gyro_z;
+    
+    }
+    
+
+float MG354PDH0::read_acceleration_x(){
+    
+    call_window0();
+    
+    p_port->putc(0x1E);//register of gyro z (High)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x1E){
+      }
+    val_acc_x[0] = p_port->getc();
+    val_acc_x[1] = p_port->getc();
+
+    p_port->putc(0x20);//register of gyro z (Low)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x20){
+      }
+    val_acc_x[2] = p_port->getc();
+    val_acc_x[3] = p_port->getc();
+    
+    acceleration_x=(val_acc_x[0]<<24)+(val_acc_x[1]<<16)+(val_acc_x[2]<<8)+val_acc_x[3];
+    //SCALE_FACTOR 0.016
+    acceleration_x*=((SCALE_FACTOR_ACC/65536)* (GRAVITIONAL_ACCELERATION/1000.0));
+    
+    return acceleration_x;
+    
+}
+    
+float MG354PDH0::read_acceleration_y(){
+    
+    call_window0();
+    
+    p_port->putc(0x22);//register of gyro z (High)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x22){
+      }
+    val_acc_y[0] = p_port->getc();
+    val_acc_y[1] = p_port->getc();
+
+    p_port->putc(0x24);//register of gyro z (Low)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x24){
+      }
+    val_acc_y[2] = p_port->getc();
+    val_acc_y[3] = p_port->getc();
+    
+    acceleration_y=(val_acc_y[0]<<24)+(val_acc_y[1]<<16)+(val_acc_y[2]<<8)+val_acc_y[3];
+    acceleration_y*=((SCALE_FACTOR_ACC/65536)* (GRAVITIONAL_ACCELERATION/1000.0));
+    
+    return acceleration_y;
+    
+    }
+
+float MG354PDH0::read_acceleration_z(){
+    
+    call_window0();
+    
+    p_port->putc(0x26);//register of gyro z (High)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x26){
+      }
+    val_acc_z[0] = p_port->getc();
+    val_acc_z[1] = p_port->getc();
+
+    p_port->putc(0x28);//register of gyro z (Low)
+    p_port->putc(0x00);
+    p_port->putc(0x0d);    
+    
+    while(p_port->getc()!=0x28){
+      }
+    val_acc_z[2] = p_port->getc();
+    val_acc_z[3] = p_port->getc();
+    
+    acceleration_z=(val_acc_z[0]<<24)+(val_acc_z[1]<<16)+(val_acc_z[2]<<8)+val_acc_z[3];
+    acceleration_z*=((SCALE_FACTOR_ACC/65536)* (GRAVITIONAL_ACCELERATION/1000.0));
+    
+    return acceleration_z;
+    
+}
+    
+
+
+
+
+
diff -r 000000000000 -r 9e92f863fde5 MG354PDH0.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MG354PDH0.h	Wed Apr 28 07:39:09 2021 +0000
@@ -0,0 +1,61 @@
+
+class MG354PDH0 {
+    
+public: 
+    MG354PDH0(Serial* ps);
+
+    void call_window1();
+    void call_window0();
+    void GLOB_CMD_read();
+    void DIAG_STAT_read();
+    void UART_CTRL_write();
+    /*サンプリングモードへの移行*/
+    void move_to_sampling_mode();
+    /*IMUが動作可能かどうかの確認*/
+    void power_on_sequence1();
+    /*IMUが動作可能かどうかの確認*/
+    void power_on_sequence2();
+    
+    /*X軸周りの角速度を算出*/
+    float read_angular_rate_x();
+    /*Y軸周りの角速度を算出*/
+    float read_angular_rate_y();
+    /*Z軸周りの角速度を算出*/
+    float read_angular_rate_z();
+    
+    /*X軸の加速度を算出*/
+    float read_acceleration_x();
+    /*Y軸の加速度を算出*/
+    float read_acceleration_y();
+    /*Z軸の加速度を算出*/
+    float read_acceleration_z();
+        
+    float gyro_val[3];//角速度の値
+    float acc_val[3];//加速度の値
+     
+    
+private: 
+    Serial* p_port;
+    
+    #define SCALE_FACTOR_GYRO 0.016
+    #define SCALE_FACTOR_ACC 0.20
+    #define GRAVITIONAL_ACCELERATION 9.80665
+
+    char val_GLOB_CMD_read[2];
+    short i_GLOB_CMD_read;
+    
+    char val_DIAG_STAT_read[2];
+    short i_DIAG_STAT_read;
+    
+    char val_rate_x[4];
+    char val_rate_y[4];
+    char val_rate_z[4];
+    
+    char val_acc_x[4];
+    char val_acc_y[4];
+    char val_acc_z[4];
+    
+    float gyro_x,gyro_y,gyro_z;
+    float acceleration_x,acceleration_y,acceleration_z;
+    
+};
\ No newline at end of file