@@ -67,6 +67,20 @@ Arduino_AlvikCarrier::Arduino_AlvikCarrier(){
6767 ipKnobs = &iKnobs;
6868 imu_delta_time = MOTION_FX_ENGINE_DELTATIME;
6969 sample_to_discard = 0 ;
70+ is_shaking = 0 ;
71+ first_wakeup = true ;
72+ shake_time = 0 ;
73+ shake_counter = 0 ;
74+ tilt_status = 0x80 ;
75+ xl = 0 ;
76+ xh = 0 ;
77+ yl = 0 ;
78+ yh = 0 ;
79+ zl = 0 ;
80+ zh = 0 ;
81+ tilt_time = 0 ;
82+ tmp_tilt_status = 0 ;
83+ tilt_filter = 0 ;
7084
7185 // version
7286 version_high = VERSION_BYTE_HIGH;
@@ -619,6 +633,11 @@ int Arduino_AlvikCarrier::beginImu(){
619633 imu->Set_G_FS (2000 );
620634 imu->Enable_X ();
621635 imu->Enable_G ();
636+ imu->Enable_Wake_Up_Detection (LSM6DSO_INT1_PIN);
637+ imu->Set_Wake_Up_Threshold (1 );
638+ imu->Set_Wake_Up_Duration (3 );
639+ imu->Enable_6D_Orientation (LSM6DSO_INT1_PIN);
640+
622641
623642 delay (10 );
624643
@@ -664,6 +683,60 @@ void Arduino_AlvikCarrier::updateImu(){
664683 sample_to_discard++;
665684 }
666685
686+ imu->Get_X_Event_Status (&imu_status);
687+
688+ if (imu_status.WakeUpStatus &&
689+ (motor_control_left->getRPM ()<1 && motor_control_left->getRPM ()>-1 ) &&
690+ (motor_control_right->getRPM ()<1 && motor_control_right->getRPM ()>-1 )){
691+ if (first_wakeup){
692+ shake_time = millis ();
693+ first_wakeup = false ;
694+ shake_counter = 0 ;
695+ }
696+ shake_counter++;
697+ }
698+
699+ if (millis ()-shake_time>500 ){
700+ if (shake_counter>10 ){
701+ is_shaking = true ;
702+ shake_counter = 0 ;
703+ shake_time_sig = millis ();
704+ }
705+ }
706+ if (is_shaking && (millis ()-shake_time_sig>1000 )){
707+ is_shaking = false ;
708+ tilt_time = millis ();
709+ }
710+
711+ if ((!is_shaking) && (millis ()-tilt_time>1000 )){
712+ imu->Get_6D_Orientation_XL (&xl);
713+ imu->Get_6D_Orientation_XH (&xh);
714+ imu->Get_6D_Orientation_YL (&yl);
715+ imu->Get_6D_Orientation_YH (&yh);
716+ imu->Get_6D_Orientation_ZL (&zl);
717+ imu->Get_6D_Orientation_ZH (&zh);
718+
719+ tmp_tilt_status = 0 ;
720+ tmp_tilt_status |= xl<<4 ;
721+ tmp_tilt_status |= xh<<5 ;
722+ tmp_tilt_status |= zl<<7 ;
723+ tmp_tilt_status |= zh<<6 ;
724+ tmp_tilt_status |= yh<<3 ;
725+ tmp_tilt_status |= yl<<2 ;
726+
727+ if (tilt_status != tmp_tilt_status){
728+ tilt_filter++;
729+ }else {
730+ tilt_filter = 0 ;
731+ }
732+
733+ if (tilt_filter>20 ){
734+ tilt_status = tmp_tilt_status;
735+ tilt_filter = 0 ;
736+ }
737+
738+ }
739+
667740}
668741
669742float Arduino_AlvikCarrier::getAccelerationX (){
@@ -702,6 +775,14 @@ float Arduino_AlvikCarrier::getYaw(){
702775 return 360.0 -filter_data.rotation [0 ];
703776}
704777
778+ bool Arduino_AlvikCarrier::isShaking (){
779+ return is_shaking;
780+ }
781+
782+ uint8_t Arduino_AlvikCarrier::getMotion (){
783+ return tilt_status | isShaking ();
784+ }
785+
705786
706787
707788/* *****************************************************************************************************/
0 commit comments