#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
Adafruit_MPU6050 mpu;
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pca9685 = Adafruit_PWMServoDriver(0x40);
#define SERVOMIN 114 // this is the 'minimum' pulse length count (out of 4096) for 0°最小パルス幅
#define SERVOMAX 488 // this is the 'maximum' pulse length count (out of 4096) for 180°最大パルス幅
#define SERVOMID 301
int16_t angle[16];
int16_t anglePulse[16];
uint8_t i;
uint8_t GyroOn;
// 端子設定
uint8_t svPin[16];
uint8_t interruptPin = 5;
uint8_t ledPin = 18;
// 動作関連
#define Stop 0
#define Standard_pose 1
#define Hans_up 2
#define Bow_pose 3
#define Sit_down_pose 4
#define Sit_hans_up 5
#define Forward_walk 6
#define Backward_walk 7
#define Left_shift 8
#define Right_shift 9
#define Left_turn 10
#define Right_turn 11
#define Left_right_shoot 12
#define Double_arms_pushing_up 13
#define Left_attack 14
#define Right_attack 15
#define Left_forward_attack 16
#define Right_forward_attack 17
#define Fast_walk 18
#define Wing_move 19
#define Handstanding 20
#define Single_left_arm_push_up 21
#define Single_right_arm_push_up 22
#define Forward_stand_up 23
#define Backward_stand_up 24
#define Forward_tumbling 25
#define Left_tumbling 26
#define Right_tumbling 27
#define Backward_tumbling 28
//#define Left_foot_back_attack 27
//#define Right_foot_back_attack 28
// 動作関連
int16_t offset[] = { -12, 9,-56,-17,-12, -12,-77,-32, -13, 57, 12, -11,-32, 33, -3,-12}; //my robonova offset
int16_t tempAngles[16] = { 100,100,100,100,100, 100,100,100, 100,100,100, 100,100,100,100,100}; //standard_pose
int16_t tempAngles1[16] = { 100,100,100,100,100, 100,100,100, 100,100,100, 100,100,100,100,100};
int16_t action[32][17] = {
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60},
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60}
};
//回転方向 1:正 0:逆 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
//パターン補正量 0 -24 +45 +7 0 0 +70 +20 0 -70 -20 0 +24 -45 -7 0
//G6A________________ G6B________ G6C________ G6D________________
int16_t standard_pose[][17]= {// 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60 },
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60 }
};
int16_t hans_up[][17] = {
{ 100, 100, 100, 100, 100, 100, 238, 170, 100, -38, 30, 100, 100, 100, 100, 100, 60 },
{ 100, 100, 100, 100, 100, 100, 238, 170, 100, -38, 30, 100, 100, 100, 100, 100, 60 }
};
int16_t bow_pose[][17] = {
{ 100, 118, 110, 167, 100, 100, 100, 100, 100, 100, 100, 100, 82, 90, 33, 100, 60 },
{ 100, 118, 110, 167, 100, 100, 100, 100, 100, 100, 100, 100, 82, 90, 33, 100, 60 }
};
int16_t sit_down_pose[][17] = {
{ 100, 25, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 175, -22, 53, 101, 60 },
{ 100, 25, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 175, -22, 53, 101, 60 }
};
int16_t sit_hans_up[][17] = {
{ 100, 25, 222, 147, 99, 100, 238, 170, 100, -38, 30, 100, 175, -22, 53, 101, 60 },
{ 100, 25, 222, 147, 99, 100, 238, 170, 100, -38, 30, 100, 175, -22, 53, 101, 60 }
};
int16_t forward_walk[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 90, 69, 140, 112, 86, 90, 110, 100, 100, 90, 100, 90, 100, 100, 100, 90, 5}, //SPEED 14 left up
{ 90, 120, 102, 129, 86, 80, 110, 100, 95, 90, 100, 90, 104, 100, 103, 90, 5}, //SPEED 14 left down
{ 90, 130, 82, 119, 86, 80, 110, 100, 95, 90, 100, 91, 104, 100, 103, 90, 5}, //SPEED 14
{ 100, 110, 104, 120, 100, 90, 110, 100, 100, 90, 100, 100, 107, 111, 113, 100, 9}, //SPEED 10 left center
{ 110, 98, 103, 112, 110, 100, 110, 100, 100, 90, 100, 110, 126, 91, 108, 114, 9}, //SPEED 10
{ 110, 100, 100, 100, 110, 100, 110, 100, 110, 90, 100, 110, 131, 60, 88, 114, 5}, //SPEED 14 right up
{ 110, 96, 100, 97, 110, 105, 110, 100, 120, 90, 100, 110, 80, 98, 71, 114, 5}, //SPEED 14 right down
{ 109, 96, 100, 97, 110, 105, 110, 100, 120, 90, 100, 110, 70, 118, 81, 114, 5}, //SPEED 14
{ 100, 93, 89, 87, 100, 100, 110, 100, 110, 90, 100, 100, 90, 96, 80, 100, 9}, //SPEED 10 right center
{ 90, 74, 109, 92, 86, 100, 110, 100, 100, 90, 100, 90, 102, 97, 88, 90, 9} //SPEED 10
};
int16_t backward_walk[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 90, 69, 140, 112, 86, 90, 110, 100, 100, 90, 100, 90, 102, 100, 100, 90, 7}, //SPEED 13 left up
{ 90, 80, 109, 92, 86, 100, 110, 100, 100, 90, 100, 90, 100, 97, 88, 90, 12}, //SPEED 7
{ 100, 88, 105, 93, 100, 100, 110, 100, 110, 90, 100, 100, 86, 101, 85, 100, 12}, //SPEED 7 right center
{ 110, 96, 100, 97, 110, 105, 110, 100, 120, 90, 100, 110, 80, 98, 71, 114, 12}, //SPEED 7 right down
{ 110, 98, 100, 100, 110, 100, 110, 100, 110, 90, 100, 110, 131, 60, 88, 114, 6}, //SPEED 13 right up
{ 110, 100, 103, 112, 110, 100, 110, 100, 100, 90, 100, 110, 120, 91, 108, 114, 12}, //SPEED 7
{ 100, 114, 99, 115, 100, 90, 110, 100, 100, 90, 100, 100, 112, 95, 107, 100, 12}, //SPEED 7 left center
{ 90, 120, 102, 129, 86, 80, 110, 100, 95, 90, 100, 90, 104, 100, 103, 90, 12}, //SPEED 7 left down
}; //
int16_t left_shift[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 85, 105, 93, 98, 88, 100, 110, 100, 100, 90, 100, 88, 100, 100, 100, 92, 14}, //SPEED 5
{ 76, 104, 85, 89, 72, 100, 105, 110, 100, 95, 90, 90, 116, 79, 96, 93, 10}, //SPEED 9
{ 93, 100, 100, 101, 91, 100, 105, 110, 100, 95, 90, 107, 100, 100, 99, 109, 10}, //SPEED 9
{ 110, 84, 121, 104, 107, 100, 105, 110, 100, 95, 90, 124, 96, 115, 111, 128, 10}, //SPEED 9
{ 113, 98, 100, 100, 107, 100, 110, 100, 110, 90, 100, 114, 107, 90, 96, 114, 10}, //SPEED 9
{ 112, 100, 100, 100, 108, 100, 110, 100, 100, 90, 100, 115, 95, 107, 102, 112, 10} //SPEED 9
}; //
int16_t right_shift[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 112, 100, 100, 100, 108, 100, 110, 100, 100, 90, 100, 115, 95, 107, 102, 112, 14}, //SPEED 5
{ 110, 84, 121, 104, 107, 100, 105, 110, 100, 95, 90, 124, 96, 115, 111, 128, 10}, //SPEED 9
{ 93, 100, 100, 101, 91, 100, 105, 110, 100, 95, 90, 107, 100, 100, 99, 109, 10}, //SPEED 9
{ 76, 104, 85, 89, 72, 100, 105, 110, 100, 95, 90, 90, 116, 79, 96, 93, 10}, //SPEED 9
{ 86, 93, 110, 104, 86, 90, 110, 100, 100, 90, 100, 87, 102, 100, 100, 93, 10}, //SPEED 9
{ 85, 105, 93, 98, 88, 100, 110, 100, 100, 90, 100, 88, 100, 100, 100, 92, 10} //SPEED 9
}; //
int16_t left_turn[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 112, 100, 100, 100, 108, 100, 110, 100, 100, 90, 100, 115, 90, 107, 102, 112, 13}, //SPEED 6
{ 112, 101, 100, 104, 107, 105, 110, 90, 110, 90, 110, 110, 69, 112, 78, 112, 10}, //SPEED 9
{ 108, 98, 100, 105, 107, 105, 110, 90, 120, 90, 110, 105, 62, 124, 83, 110, 10}, //SPEED 9
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80, 100, 100, 100, 100, 100, 10}, //SPEED 9
{ 85, 105, 93, 98, 88, 100, 110, 100, 100, 90, 100, 88, 100, 100, 100, 92, 12}, //SPEED 7
{ 95, 96, 76, 74, 90, 105, 110, 90, 110, 90, 110, 87, 99, 100, 101, 93, 10}, //SPEED 9
{ 95, 96, 76, 74, 90, 105, 110, 90, 120, 90, 110, 92, 102, 100, 100, 93, 10}, //SPEED 9
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80, 100, 100, 100, 100, 100, 9} //SPEED 10
}; //
int16_t left_back_turn[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 85, 105, 93, 98, 88, 100, 110, 100, 100, 90, 100, 88, 100, 100, 100, 92, 15}, //SPEED 4
{ 95, 96, 76, 74, 90, 105, 110, 90, 110, 90, 110, 87, 99, 100, 101, 93, 13}, //SPEED 6
{ 95, 96, 76, 74, 90, 105, 110, 90, 120, 90, 110, 92, 102, 100, 100, 93, 13}, //SPEED 6
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80, 100, 100, 100, 100, 100, 9} //SPEED 10
}; //
int16_t right_turn[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 85, 110, 93, 98, 88, 100, 110, 100, 100, 90, 100, 88, 100, 100, 100, 92, 13}, //SPEED 6
{ 90, 131, 88, 122, 88, 90, 110, 90, 95, 90, 110, 87, 99, 100, 96, 93, 10}, //SPEED 9
{ 95, 138, 76, 117, 90, 80, 110, 90, 95, 90, 110, 92, 102, 100, 95, 93, 10}, //SPEED 9
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80, 100, 100, 100, 100, 100, 10}, //SPEED 9
{ 112, 100, 100, 100, 108, 100, 110, 100, 100, 90, 100, 115, 95, 107, 102, 112, 12}, //SPEED 7
{ 113, 101, 100, 99, 107, 90, 110, 90, 95, 90, 110, 105, 104, 124, 126, 110, 10}, //SPEED 9
{ 108, 98, 100, 100, 107, 80, 110, 90, 95, 90, 110, 105, 104, 124, 126, 110, 10}, //SPEED 9
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80, 100, 100, 100, 100, 100, 9} //SPEED 10
}; //
int16_t right_back_turn[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 112, 100, 100, 100, 108, 100, 110, 100, 100, 90, 100, 115, 95, 107, 102, 112, 15}, //SPEED 4
{ 113, 101, 100, 99, 107, 90, 110, 90, 95, 90, 110, 105, 104, 124, 126, 110, 13}, //SPEED 6
{ 108, 98, 100, 100, 107, 80, 110, 90, 95, 90, 110, 105, 104, 124, 126, 110, 13}, //SPEED 6
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80, 100, 100, 100, 100, 100, 9} //SPEED 10
}; //
int16_t left_right_shoot[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 70, 123, 65, 86, 98, 90, 115, 90, 90, 85, 110, 89, 77, 135, 114, 104, 15}, //SPEED 4
{ 90, 89, 118, 72, 84, 140, 115, 90, 140, 85, 110, 86, 81, 135, 114, 95, 13}, //SPEED 6
{ 90, 89, 118, 154, 84, 60, 115, 90, 60, 85, 110, 86, 73, 135, 114, 95, 5}, //SPEED 14
{ 90, 89, 118, 154, 84, 60, 115, 90, 60, 85, 110, 86, 73, 135, 114, 95, 30}, //wait500ms
{ 70, 100, 100, 100, 96, 90, 115, 90, 90, 85, 110, 86, 100, 100, 100, 102, 14}, //SPEED 5
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 40}, //wait
{ 111, 123, 65, 86, 96, 110, 115, 90, 110, 85, 110, 130, 77, 135, 114, 102, 15}, //SPEED 4
{ 114, 119, 65, 86, 105, 80, 115, 90, 80, 85, 110, 110, 111, 82, 128, 116, 13}, //SPEED 6
{ 114, 127, 65, 86, 105, 140, 115, 90, 140, 85, 110, 110, 111, 82, 46, 116, 5}, //SPEED 14
{ 114, 127, 65, 86, 105, 140, 115, 90, 140, 85, 110, 110, 111, 82, 46, 116, 30}, //wait500ms
{ 114, 100, 100, 100, 98, 110, 115, 90, 110, 85, 110, 130, 100, 100, 100, 104, 14}, //SPEED 5
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait
}; //
int16_t left_attack[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 85, 108, 93, 98, 93, 130, 110, 100, 70, 90, 100, 92, 97, 100, 100, 100, 12}, //SPEED 7
{ 107, 15, 224, 132, 107, 189, 110, 97, 150, 58, 94, 134, 184, 40, 128, 130, 7}, //SPEED 12
{ 107, 15, 224, 132, 107, 189, 110, 97, 150, 58, 94, 134, 184, 40, 128, 130, 40}, //wait
{ 100, 28, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 172, -22, 53, 101, 9}, //SPEED 10
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 40}, //wait
{ 85, 106, 93, 98, 93, 100, 110, 100, 100, 90, 100, 92, 99, 100, 100, 100, 12}, //SPEED 7
{ 98, 20, 225, 141, 90, 107, 205, 128, 88, 38, 81, 143, 138, 32, 68, 134, 7}, //SPEED 12
{ 98, 20, 225, 141, 90, 107, 205, 128, 88, 38, 81, 143, 138, 32, 68, 134, 40}, //wait
{ 100, 26, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 174, -22, 53, 101, 4}, //SPEED 15
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait
}; //
int16_t right_attack[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 108, 103, 100, 100, 100, 70, 110, 100, 70, 90, 100, 115, 92, 107, 102, 107, 12}, //SPEED 7
{ 66, 16, 160, 72, 70, 50, 142, 106, 11, 90, 103, 93, 185, -24, 68, 93, 7}, //SPEED 12
{ 66, 16, 160, 72, 70, 50, 142, 106, 11, 90, 103, 93, 185, -24, 68, 93, 40}, //wait
{ 100, 28, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 172, -22, 53, 101, 9}, //SPEED 10
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 40}, //wait
{ 108, 101, 100, 100, 100, 100, 110, 100, 100, 90, 100, 115, 94, 107, 102, 107, 12}, //SPEED 7
{ 57, 62, 168, 132, 66, 112, 162, 119, 93, -5, 72, 102, 180, -25, 59, 110, 7}, //SPEED 12
{ 57, 62, 168, 132, 66, 112, 162, 119, 93, -5, 72, 102, 180, -25, 59, 110, 40}, //wait
{ 100, 26, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 174, -22, 53, 101, 4}, //SPEED 15
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait
}; //
int16_t left_forward_attack[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 85, 108, 93, 98, 93, 130, 110, 100, 70, 90, 100, 92, 97, 100, 100, 100, 12}, //SPEED 7
{ 107, 15, 224, 132, 107, 189, 110, 97, 150, 58, 94, 134, 184, 40, 128, 130, 7}, //SPEED 12
{ 107, 15, 224, 132, 107, 189, 110, 97, 150, 58, 94, 134, 184, 40, 128, 130, 40}, //wait
{ 100, 28, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 172, -22, 53, 101, 9}, //SPEED 10
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait
}; //
int16_t right_forward_attack[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 108, 103, 100, 100, 100, 70, 110, 100, 70, 90, 100, 115, 92, 107, 102, 107, 12}, //SPEED 7
{ 66, 16, 160, 72, 70, 50, 142, 106, 11, 90, 103, 93, 185, -24, 68, 93, 7}, //SPEED 12
{ 66, 16, 160, 72, 70, 50, 142, 106, 11, 90, 103, 93, 185, -24, 68, 93, 40}, //wait
{ 100, 28, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 172, -22, 53, 101, 9}, //SPEED 10
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 3
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait
}; //
int16_t fast_walk[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 100, 100, 100, 100, 100, 100, 110, 100, 100, 90, 100, 100, 100, 100, 100, 9}, //SPEED 10
{ 90, 104, 97, 100, 90, 100, 100, 110, 100, 100, 90, 92, 99, 100, 100, 95, 12}, //SPEED 7rightG
{ 90, 81, 140, 122, 90, 90, 100, 110, 90, 100, 90, 88, 99, 100, 100, 95, 4}, //SPEED 15rightG left up
//
{ 100, 96, 126, 125, 94, 80, 100, 110, 80, 100, 90, 95, 99, 100, 100, 100, 4}, //SPEED 15left leg up
{ 105, 102, 105, 113, 100, 100, 100, 110, 100, 100, 90, 105, 129, 79, 100, 106, 4}, //SPEED 15right up0
{ 105, 101, 100, 100, 100, 120, 100, 110, 120, 100, 90, 100, 104, 74, 75, 106, 4}, //SPEED 15right leg up
{ 95, 71, 121, 100, 94, 100, 100, 110, 100, 100, 90, 95, 98, 95, 87, 100, 4}, //SPEED 15left up0
//
{ 100, 96, 126, 125, 94, 80, 100, 110, 80, 100, 90, 95, 99, 100, 100, 100, 3}, //SPEED 15
{ 105, 102, 105, 113, 100, 100, 100, 110, 100, 100, 90, 105, 129, 79, 100, 106, 3}, //SPEED 15
{ 105, 101, 100, 100, 100, 120, 100, 110, 120, 100, 90, 100, 104, 74, 75, 106, 3}, //SPEED 15
{ 95, 71, 121, 100, 94, 100, 100, 110, 100, 100, 90, 95, 98, 95, 87, 100, 3}, //SPEED 15
{ 100, 96, 126, 125, 94, 80, 100, 110, 80, 100, 90, 95, 99, 100, 100, 100, 3}, //SPEED 15
{ 105, 102, 105, 113, 100, 100, 100, 110, 100, 100, 90, 105, 129, 79, 100, 106, 3}, //SPEED 15
{ 105, 101, 100, 100, 100, 120, 100, 110, 120, 100, 90, 100, 104, 74, 75, 106, 3}, //SPEED 15
{ 95, 71, 121, 100, 94, 100, 100, 110, 100, 100, 90, 95, 98, 95, 87, 100, 3}, //SPEED 15
{ 100, 96, 126, 125, 94, 80, 100, 110, 80, 100, 90, 95, 99, 100, 100, 100, 3}, //SPEED 15
{ 105, 102, 105, 113, 100, 100, 100, 110, 100, 100, 90, 105, 129, 79, 100, 106, 3}, //SPEED 15
{ 105, 101, 100, 100, 100, 120, 100, 110, 120, 100, 90, 100, 104, 74, 75, 106, 3}, //SPEED 15
{ 95, 71, 121, 100, 94, 100, 100, 110, 100, 100, 90, 95, 98, 95, 87, 100, 3}, //SPEED 15
{ 85, 96, 115, 102, 94, 80, 100, 110, 80, 100, 90, 92, 97, 100, 100, 100, 4}, //SPEED 8rightGleft leg up0
{ 90, 104, 97, 100, 90, 80, 100, 110, 80, 100, 90, 92, 99, 100, 100, 93, 12}, //SPEED 8rightG
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14} //SPEED 5
}; //
int16_t wing_move[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 85, 105, 93, 98, 88, 100, 110, 100, 100, 90, 100, 88+3, 100, 100, 100, 92, 30}, //slow
{ 90, 78, 140, 122, 85, 100, 220, 170, 100, -20, 30, 84+3, 98, 100, 95, 93, 30}, //slow
{ 90, 55, 209, 112, 85, 100, 220, 170, 100, -20, 30, 84+3, 84-2, 101, 55, 93, 30}, //slow
{ 90, 78, 140, 71, 85, 145, 180, 130, 55, 20, 70, 84+3, 74-2, 115, 40, 93, 30}, //slow
{ 90, 78, 140, 71, 85, 145, 150, 100, 55, 50, 100, 84+3, 74-2, 115, 33, 93, 9}, //SPEED 10
{ 90, 78, 140, 71, 85, 145, 190, 140, 55, 10, 60, 84+3, 74-2, 115, 33, 93, 9}, //SPEED 10
{ 90, 78, 140, 71, 85, 145, 150, 100, 55, 50, 100, 84+3, 74-2, 115, 33, 93, 8}, //SPEED 11
{ 90, 78, 140, 71, 85, 145, 190, 140, 55, 10, 60, 84+3, 74-2, 115, 33, 93, 8}, //SPEED 11
{ 90, 78, 140, 71, 85, 145, 150, 100, 55, 50, 100, 84+3, 74-2, 115, 33, 93, 7}, //SPEED 12
{ 90, 78, 140, 71, 85, 145, 190, 140, 55, 10, 60, 84+3, 74-2, 115, 33, 93, 7}, //SPEED 12
{ 90, 78, 140, 71, 85, 145, 150, 100, 55, 50, 100, 84+3, 74-2, 115, 33, 93, 6}, //SPEED 13
{ 90, 78, 140, 71, 85, 145, 190, 140, 55, 10, 60, 84+3, 74-2, 115, 33, 93, 6}, //SPEED 13
{ 90, 78, 140, 71, 85, 145, 150, 100, 55, 50, 100, 84+3, 74-2, 115, 33, 93, 5}, //SPEED 14
{ 90, 78, 140, 71, 85, 145, 190, 140, 55, 10, 60, 84+3, 74-2, 115, 33, 93, 5}, //SPEED 14
{ 90, 78, 140, 71, 85, 145, 150, 100, 55, 50, 100, 84+3, 74-2, 115, 33, 93, 4}, //SPEED 15
{ 90, 78, 140, 71, 85, 145, 190, 140, 55, 10, 60, 84+3, 74-2, 115, 33, 93, 4}, //SPEED 15
{ 90, 78, 140, 71, 85, 145, 190, 140, 55, 10, 60, 84+3, 74-2, 115, 33, 93, 20}, //wait
{ 90, 78, 140, 71, 85, 145, 180, 130, 55, 20, 70, 84+3, 74-2, 115, 36, 93, 14}, //SPEED 5
{ 90, 55, 209, 112, 85, 100, 220, 170, 100, -20, 30, 84+3, 84-2, 101, 55, 93, 14}, //SPEED 5
{ 90, 78, 140, 122, 85, 100, 220, 170, 100, -20, 30, 84+3, 98, 100, 95, 93, 14}, //SPEED 5
{ 85, 105, 93, 98, 88, 100, 110, 100, 100, 90, 100, 88+3, 100, 100, 100, 92, 14}, //SPEED 5
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait
}; //
int16_t handstanding[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 30}, //Slow
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 140, 30}, //Slow
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 30}, //Slow
{ 75, 11, 190, 172, 45, 185, 80, 120, 15, 120, 80, 125, 189, 10, 28, 155, 30}, //Slow
{ 80, 21, 160, 157, 50, 185, 110, 80, 15, 90, 120, 120, 179, 40, 43, 150, 30}, //Slow
{ 100, 46, 125, 87, 90, 125, 230, 32, 75, -30, 168, 100, 154, 75, 113, 110, 30}, //Slow
// fall forwaed
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 51, 180, 17, 100, 110, 100, 100, 90, 100, 100, 100, 149, 20, 183, 100, 13}, //SPEED 6
{ 100, 51, 180, 17, 100, 170, 100, 100, 30, 100, 100, 100, 149, 20, 183, 100, 16}, //SPEED 3
{ 100, 51, 180, 17, 100, 170, 100, 100, 30, 100, 100, 100, 149, 20, 183, 100, 20}, //wait 200
{ 100, 87, 116, 64, 100, 180, 100, 100, 13, 100, 100, 100, 113, 84, 136, 100, 13}, //SPEED 6
{ 100, 112, 66, 64, 100, 190, 120, 100, 13, 80, 100, 100, 88, 134, 136, 100, 13}, //SPEED 6
{ 100, 112, 66, 64, 100, 190, 120, 100, 13, 80, 100, 100, 88, 134, 136, 100, 40}, //wait 2000
{ 100, 112, 66, 64, 100, 190, 120, 100, 13, 80, 100, 100, 88, 134, 136, 100, 13}, //SPEED 6
{ 100, 87, 116, 64, 100, 180, 100, 100, 13, 100, 100, 100, 113, 84, 136, 100, 13}, //SPEED 6
{ 100, 51, 180, 17, 100, 170, 100, 100, 30, 100, 100, 100, 149, 20, 183, 100, 16}, //SPEED 3
{ 100, 51, 180, 17, 100, 110, 100, 100, 90, 100, 100, 100, 149, 20, 183, 100, 13}, //SPEED 6
// foot up2
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 46, 125, 87, 90, 150, 230, 32, 50, -30, 168, 100, 154, 75, 113, 110, 12}, //SPEED 7
{ 80, 21, 160, 157, 50, 185, 110, 80, 13, 90, 120, 120, 179, 40, 43, 150, 12}, //SPEED 7
{ 75, 11, 190, 172, 45, 185, 80, 120, 13, 120, 80, 125, 189, 10, 28, 155, 12}, //SPEED 7
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 12}, //SPEED 7
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 145, 12}, //SPEED 7
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; // forward stand up
int16_t single_left_arm_push_up[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 30}, //Slow
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 140, 30}, //Slow
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 30}, //Slow
{ 75, 11, 190, 172, 45, 185, 80, 120, 15, 120, 80, 125, 189, 10, 28, 155, 30}, //Slow
{ 80, 21, 160, 157, 50, 185, 110, 80, 15, 90, 120, 120, 179, 40, 43, 150, 30}, //Slow
{ 100, 46, 125, 87, 90, 125, 230, 32, 75, -30, 168, 100, 154, 75, 113, 110, 30}, //Slow
// fall forwaed
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 100, 100, 100, 100, 100, 220, 40, 100, -20, 160, 100, 100, 100, 100, 100, 11}, //SPEED 8
{ 100, 100, 100, 100, 100, 180, 220, 40, 20, -20, 160, 100, 100, 100, 100, 100, 11}, //SPEED 8
{ 100, 100, 100, 100, 100, 180, 120, 40, 20, 80, 160, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 120, 40, 20, 80, 160, 100, 99, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 120, 40, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 130, 32, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 95, 90, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 130, 32, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 95, 90, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 130, 32, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 95, 90, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 130, 32, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 95, 90, 20, 10, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 130, 32, 20, 70, 168, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 180, 120, 40, 20, 80, 160, 100, 100, 100, 80, 145, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 103, 100, 100, 97, 100, 100, 100, 100, 100, 16}, //SPEED 3
// single_left_arm_push_up
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 46, 125, 87, 90, 150, 230, 32, 50, -30, 168, 100, 154, 75, 113, 110, 12}, //SPEED 7
{ 80, 21, 160, 157, 50, 185, 110, 80, 13, 90, 120, 120, 179, 40, 43, 150, 12}, //SPEED 7
{ 75, 11, 190, 172, 45, 185, 80, 120, 13, 120, 80, 125, 189, 10, 28, 155, 12}, //SPEED 7
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 12}, //SPEED 7
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 145, 12}, //SPEED 7
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; // forward stand up
int16_t single_right_arm_push_up[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 30}, //Slow
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 140, 30}, //Slow
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 30}, //Slow
{ 75, 11, 190, 172, 45, 185, 80, 120, 15, 120, 80, 125, 189, 10, 28, 155, 30}, //Slow
{ 80, 21, 160, 157, 50, 185, 110, 80, 15, 90, 120, 120, 179, 40, 43, 150, 30}, //Slow
{ 100, 46, 125, 87, 90, 125, 230, 32, 75, -30, 168, 100, 154, 75, 113, 110, 30}, //Slow
// fall forwaed
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 100, 100, 100, 100, 100, 220, 40, 100, -20, 160, 100, 100, 100, 100, 100, 11}, //SPEED 8
{ 100, 100, 100, 100, 100, 180, 220, 40, 20, -20, 160, 100, 100, 100, 100, 100, 11}, //SPEED 8
{ 100, 100, 100, 100, 100, 180, 120, 40, 20, 80, 160, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 120, 55, 180, 120, 40, 20, 80, 160, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 80, 160, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 70, 168, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 105, 110, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 70, 168, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 105, 110, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 70, 168, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 105, 110, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 70, 168, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 190, 32, 20, 105, 110, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 130, 32, 20, 70, 168, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 120, 55, 180, 120, 40, 20, 80, 160, 100, 100, 100, 100, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 103, 100, 100, 97, 100, 100, 100, 100, 100, 16}, //SPEED 3
// single_right_arm_push_up
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 46, 125, 87, 90, 150, 230, 32, 50, -30, 168, 100, 154, 75, 113, 110, 12}, //SPEED 7
{ 80, 21, 160, 157, 50, 185, 110, 80, 13, 90, 120, 120, 179, 40, 43, 150, 12}, //SPEED 7
{ 75, 11, 190, 172, 45, 185, 80, 120, 13, 120, 80, 125, 189, 10, 28, 155, 12}, //SPEED 7
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 12}, //SPEED 7
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 145, 12}, //SPEED 7
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; // forward stand up
int16_t double_arms_pushing_up[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 30}, //Slow
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 140, 30}, //Slow
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 30}, //Slow
{ 75, 11, 190, 172, 45, 185, 80, 120, 15, 120, 80, 125, 189, 10, 28, 155, 30}, //Slow
{ 80, 21, 160, 157, 50, 185, 110, 80, 15, 90, 120, 120, 179, 40, 43, 150, 30}, //Slow
{ 100, 46, 125, 87, 90, 125, 230, 32, 75, -30, 168, 100, 154, 75, 113, 110, 30}, //Slow
// fall forwaed
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 101, 100, 100, 100, 100, 220, 40, 100, -20, 160, 100, 99, 100, 100, 100, 11}, //SPEED 8
{ 100, 101, 100, 100, 100, 180, 220, 40, 20, -20, 160, 100, 99, 100, 100, 100, 11}, //SPEED 8
{ 100, 101, 100, 100, 100, 180, 120, 40, 20, 80, 160, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 130, 32, 20, 70, 168, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 95, 90, 20, 105, 110, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 130, 32, 20, 70, 168, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 95, 90, 20, 105, 110, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 130, 32, 20, 70, 168, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 95, 90, 20, 105, 110, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 130, 32, 20, 70, 168, 100, 99, 100, 100, 100, 12}, //SPEED 7
{ 100, 101, 100, 100, 100, 180, 120, 40, 20, 80, 160, 100, 99, 100, 100, 100, 12}, //SPEED 7
// double_arms_pushing_up
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 46, 125, 87, 90, 150, 230, 32, 50, -30, 168, 100, 154, 75, 113, 110, 12}, //SPEED 7
{ 80, 21, 160, 157, 50, 185, 110, 80, 13, 90, 120, 120, 179, 40, 43, 150, 12}, //SPEED 7
{ 75, 11, 190, 172, 45, 185, 80, 120, 13, 120, 80, 125, 189, 10, 28, 155, 12}, //SPEED 7
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 12}, //SPEED 7
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 145, 12}, //SPEED 7
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; // forward stand up
int16_t forward_stand_up[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 46, 125, 87, 90, 150, 230, 32, 50, -30, 168, 100, 154, 75, 113, 110, 12}, //SPEED 7
{ 80, 21, 160, 157, 50, 185, 110, 80, 13, 90, 120, 120, 179, 40, 43, 150, 12}, //SPEED 7
{ 75, 11, 190, 172, 45, 185, 80, 120, 13, 120, 80, 125, 189, 10, 28, 155, 12}, //SPEED 7
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 12}, //SPEED 7
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 145, 12}, //SPEED 7
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; // forward stand up
int16_t backward_stand_up[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 14}, //SPEED 5
// std pose
{ 100, 166, 145, 122, 100, 100, 200, 32, 100, 0, 168, 100, 34, 55, 78, 100, 12}, //SPEED 7
{ 100, 166, 162, 147, 100, 20, 200, 32, 180, 0, 168, 100, 34, 38, 53, 100, 12}, //SPEED 7
{ 100, 50, 185, 57, 100, 20, 100, 110, 180, 100, 90, 100, 150, 15, 143, 100, 12}, //SPEED 7
{ 100, 11, 175, 22, 100, 30, 90, 115, 170, 110, 85, 100, 189, 25, 178, 100, 12}, //SPEED 7
{ 100, 11, 205, 107, 100, 110, 140, 70, 90, 60, 130, 100, 189, -5, 93, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; // backward stand up
int16_t forward_tumbling[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 21, 225, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -25, 53, 100, 20}, //Slow
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 20}, //Slow
{ 75, 11, 190, 172, 45, 185, 80, 120, 15, 120, 80, 125, 189, 10, 28, 155, 20}, //Slow
{ 80, 21, 160, 157, 50, 185, 110, 80, 15, 90, 120, 120, 179, 40, 43, 150, 20}, //Slow
{ 100, 46, 125, 87, 90, 130, 230, 32, 70, -30, 168, 100, 154, 75, 113, 110, 20}, //Slow
{ 100, 16, 135, 147, 100, 140, 140, 40, 60, 60, 160, 100, 184, 65, 53, 100, 20}, //Slow
{ 100, 120, 135, 33, 100, 170, 110, 70, 30, 90, 130, 100, 95, 132, 31, 100, 4}, //SPEED 15
{ 100, 114, 135, 22, 100, 190, 110, 70, 13, 90, 130, 100, 95, 83, 80, 100, 4}, //SPEED 15
{ 100, 121, 135, 22, 100, 190, 110, 70, 13, 90, 130, 100, 79, 65, 178, 100, 4}, //SPEED 15
{ 100, 66, 145, 22, 100, 170, 230, 135, 30, -30, 65, 100, 134, 55, 178, 100, 9}, //SPEED 10
{ 100, 6, 175, 22, 100, 190, 240, 140, 13, -40, 60, 100, 194, 25, 178, 100, 9}, //SPEED 10
{ 100, 6, 215, 117, 100, 190, 110, 80, 13, 90, 120, 100, 194, -15, 83, 100, 11}, //SPEED 8
{ 100, 25, 222, 147, 99, 100, 100, 100, 100, 100, 100, 100, 175, -22, 53, 101, 14}, //SPEED 5
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; //
int16_t backward_tumbling[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 6, 174, 30, 100, 80, 120, 90, 120, 80, 110, 100, 194, 26, 170, 100, 18}, //SPEED 4
{ 100, 43, 174, 30, 100, 10, 166, 35, 190, 34, 166, 100, 157, 26, 170, 100, 18}, //SPEED 4
{ 100, 43, 196, 30, 100, 45, 186, 35, 155, 14, 166, 100, 157, 4, 170, 100, 18}, //SPEED 4
{ 100, 43, 196, 30, 100, 45, 120-35, 90, 155, 80+35, 110, 100, 94, 135, 33, 100, 18}, //SPEED 4
{ 100, 43, 65, 167, 100, 10, 120-35, 90, 190, 80+35, 110, 100, 157, 135, 33, 100, 4}, //SPEED 15
{ 100, 43, 65, 167, 100, 10, 120-35, 90, 190, 80+35, 110, 100, 157, 135, 33, 100, 5}, //wait
{ 100, 81, 65, 167, 100, 160, 120-35, 90, 40, 80+35, 110, 100, 119, 135, 33, 100, 4}, //SPEED 15
{ 100, 46, 125, 87, 90, 130, 230, 32, 70, -30, 168, 100, 154, 75, 113, 110, 4}, //SPEED 15
{ 100, 46, 125, 87, 90, 150, 230, 32, 50, -30, 168, 100, 154, 75, 113, 110, 12}, //SPEED 7
{ 80, 21, 160, 157, 50, 185, 110, 80, 13, 90, 120, 120, 179, 40, 43, 150, 12}, //SPEED 7
{ 75, 11, 190, 172, 45, 185, 80, 120, 13, 120, 80, 125, 189, 10, 28, 155, 12}, //SPEED 7
{ 60, 11, 215, 172, 45, 170, 80, 120, 30, 120, 80, 140, 189, -15, 28, 155, 12}, //SPEED 7
{ 60, 11, 220, 167, 55, 150, 130, 110, 50, 70, 90, 140, 189, -20, 33, 145, 12}, //SPEED 7
{ 100, 21, 220, 147, 100, 130, 120, 105, 70, 80, 95, 100, 179, -20, 53, 100, 12}, //SPEED 7
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; //
int16_t left_tumbling[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 41, 185-4, 130, 100, 100, 190, 160, 100, 10, 40, 100, 159, 15, 70, 100, 40}, //slow
{ 114, 41, 185-4, 130, 95, 100, 190, 160, 100, 10, 40, 112, 134, 46, 77, 100, 16}, //SPEED 3
{ 114, 41, 185-4, 130, 95, 100, 190, 160, 100, 10, 40, 111, 159, 15, 70, 100, 16}, //SPEED 3
{ 120, 41, 185-4, 130, 90, 100, 190, 160, 100, 10, 40, 111, 159, 15, 70, 130, 16}, //SPEED 3
{ 120, 41, 185-4, 130, 80, 100, 235, 205, 100, -35, -5, 111, 159, 15, 70, 158, 15}, //SPEED 4
{ 120, 45, 185-4, 130, 15, 100, 235, 205, 100, -35, -5, 80, 155, 15, 70, 183, 11}, //SPEED 8
{ 120, 45, 185-4, 130, 15, 100, 235, 205, 100, -35, -5, 80, 155, 15, 70, 183, 5}, //wait
{ 120, 45, 185-4, 130, 15, 100, 190, 165, 100, 10, 35, 80, 155, 15, 70, 183, 14}, //SPEED 5
{ 86, 64, 172, 134, 99, 100, 190, 165, 100, 10, 35, 95, 155, 15, 70, 183, 13}, //SPEED 6
{ 86, 58, 172, 134, 99, 100, 150, 100, 100, 50, 100, 88, 155, 17, 70, 133, 16}, //SPEED 3
{ 88, 61, 159, 122, 110, 100, 150, 100, 100, 50, 100, 93, 159, 17, 70, 113, 16}, //SPEED 3
{ 100, 41, 185-4, 130, 100, 100, 150, 100, 100, 50, 100, 100, 159, 15, 70, 100, 15}, //SPEED 4
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; //
int16_t right_tumbling[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 100, 41, 185, 130, 100, 100, 190, 160, 100, 10, 40, 100, 159, 15, 70, 100, 40}, //slow
{ 83, 66, 154, 123, 100, 100, 190, 160, 100, 10, 40, 86, 159, 15, 70, 105, 16}, //SPEED 3
{ 89, 41, 185, 130, 100, 100, 190, 160, 100, 10, 40, 86, 159, 15, 70, 105, 16}, //SPEED 3
{ 89, 41, 185, 130, 70, 100, 190, 160, 100, 10, 40, 80, 159, 15, 70, 110, 16}, //SPEED 3
{ 89, 41, 185, 130, 42, 100-1, 235-1, 205-2, 100+1, -35+1, -5+2, 80, 159, 15, 70, 120, 15}, //SPEED 4
{ 120+4, 45-4, 185, 130, 17, 100-1, 235-1, 205-2, 100+1, -35+1, -5+2, 80, 155, 15, 70, 185, 11}, //SPEED 8
{ 120+4, 45-4, 185, 130, 17, 100-1, 235-1, 205-2, 100+1, -35+1, -5+2, 80, 155, 15, 70, 185, 5}, //wait
{ 120+4, 45-4, 185, 130, 17, 100, 190, 165, 100, 10, 35, 80, 155, 15, 70, 185, 14}, //SPEED 5
{ 105, 45-4, 185-2, 130, 17, 100, 190, 165, 100, 10, 35, 114, 136, 28, 66, 101, 13}, //SPEED 6
{ 112-2, 45-4, 183-2, 130, 67, 100, 150, 100, 100, 50, 100, 114, 142, 28, 66, 101, 16}, //SPEED 3
{ 107, 41, 183, 130, 87, 100, 150, 100, 100, 50, 100, 112, 139, 44, 78, 90, 16}, //SPEED 3
{ 100, 41, 185-2, 130, 100, 100, 150, 100, 100, 50, 100, 100, 159, 15, 70, 100, 15}, //SPEED 4
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; //
int16_t left_foot_back_attack[][17] = { // 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1
{ 90, 103, 97, 100, 90, 100, 120, 90, 100, 70, 110, 92, 99, 100, 100, 93, 4}, //SPEED 15
{ 93, 45, 222, 164, 95, 100, 120, 90, 100, 27, 66, 83, 99, 100, 100, 99, 4}, //SPEED 15
//{ 93, 45, 222, 164, 95, 100, 120, 90, 100, 27, 66, 83, 99, 100, 100, 99, 20}, //delay 200
{ 94, 83, 162, 141, 38, 103, 178, 139, 100, 13, 54, 83, 99, 100, 104, 133, 11}, //SPEED 8
{ 95, 114, 87, 91, 16, 103, 178, 139, 100, 13, 54, 98, 99, 100, 104, 172, 11}, //SPEED 8
{ 95, 114, 87, 91, 16, 157, 178, 139, 100, 13, 54, 98, 99, 100, 104, 172, 11}, //SPEED 8
{ 95, 114, 87, 91, 16, 181, 86, 43, 100, 13, 54, 98, 99, 7, 104, 172, 11}, //SPEED 8
{ 95, 114, 87, 91, 16, 181, 86, 43, 100, 13, 54, 98, 99, 7, 104, 172, 40}, //wait
{ 101, 15, 223, 138, 103, 100, 174, 132, 98, 29, 63, 101, 182, -28, 57, 101, 14}, //SPEED 5
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 20}, //SPEED 1
{ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60} //wait 1000
}; //
uint8_t maxRows;
uint8_t divCounter;
uint8_t keyFrame;
uint8_t nextKeyFrame;
uint8_t nextKeyFrame1;
uint8_t actionMode;
uint8_t prevbtnData1;
//RCB controller 関連
BLEUUID SERVICE_UUID = BLEUUID((uint16_t)0xFFF0); // RCBController Service UUID
BLEUUID CHARACTERISTIC_UUID = BLEUUID((uint16_t)0xFFF1); // RCBController Characteristic UUID
int v120 = 0; //1バイト目 リアルタイムでの取り込み値(BLE通信)
int vv120 = 0; //1バイト目 ボタンが押された時にこの変数に値を格納する(ボタン離したとき0値にならないように)
int ex120 = 0; //1バイト目 前回押されたボタン値を格納しておいて、次に押されたボタン値と比較する
// 変動してなかったら(=ボタンから指を離したままか押したままの時) vv120は0値でリセット
int v121 = 0; //2バイト目 リアルタイムでの取り込み値(BLE通信)
int vv121 = 0; //2バイト目 ボタンが押された時にこの変数に値を格納する
int ex121 = 0; //2バイト目 前回押されたボタン値を格納しておいて、次に押されたボタン値と比較する
// 変動してなかったら(=ボタンから指を離したままか押したままの時) vv121は0値でリセット
uint16_t btnData = 0;
uint16_t prevbtnData = 0; //初期設定
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
printf("connectionCallback\n\r");
};
void onDisconnect(BLEServer* pServer) {
printf("disconnectionCallback\n\r");
}
};
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() >= 10) {
//Serial.printf("Data received: length = %d, data = 0x",value.length());
for(int x=0; x < value.length(); x++) {
if (x==0) {
v120 = value[x];
if (v120 > 0) { vv120 = v120; }
}
if (x==1) {
v121 = value[x];
if (v121 > 0) { vv121 = v121; }
}
}
}
}
};
void setup() {
// Initialize PCA9685
pca9685.begin();
// Set PWM Frequency to 50Hz
pca9685.setPWMFreq(50);
// I2Cサーボ用端子設定
svPin[0] = 0; //G6A 正回転 左足首ロール
svPin[1] = 1; //G6A 逆回転 左足首ピッチ
svPin[2] = 2; //G6A 逆回転 左膝ピッチ
svPin[3] = 3; //G6A 正回転 左腰ピッチ
svPin[4] = 4; //G6A 逆回転 左腰ロール
svPin[5] = 5; //G6B 正回転 左肩ピッチ
svPin[6] = 6; //G6B 正回転 左肩ロール
svPin[7] = 7; //G6B 正回転 左肘ロール
svPin[8] = 13; //G6C 逆回転 右肩ピッチ
svPin[9] = 14; //G6C 逆回転 右肩ロール
svPin[10] = 15; //G6C 逆回転 右肘ロール
svPin[11] = 8; //G6D 逆回転 右足首ロール
svPin[12] = 9; //G6D 正回転 右足首ピッチ
svPin[13] = 10; //G6D 正回転 右膝ピッチ
svPin[14] = 11; //G6D 逆回転 右腰ピッチ
svPin[15] = 12; //G6D 正回転 右腰ロール
// 動作モード初期化
actionMode = Stop;
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
maxRows = 2; //action配列の初期値に対するmaxRows
// LED用端子設定
pinMode(ledPin, OUTPUT);
// RCBcontroller 関連設定
Serial.begin(115200);
// Create the BLE Device
BLEDevice::init("ROBONOVA-I");
// Create the BLE Server
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);
// Create a BLE Characteristic
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_WRITE_NR
);
pCharacteristic->setCallbacks(new MyCallbacks());
// Start the service
pService->start();
// Start advertising
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
// MPU6050 関連設定
Serial.begin(115200);
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console opens
Serial.println("Adafruit MPU6050 test!");
// Try to initialize!
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
Serial.println("MPU6050 Found!");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
Serial.print("Accelerometer range set to: ");
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.println("+-2G");
break;
case MPU6050_RANGE_4_G:
Serial.println("+-4G");
break;
case MPU6050_RANGE_8_G:
Serial.println("+-8G");
break;
case MPU6050_RANGE_16_G:
Serial.println("+-16G");
break;
}
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
Serial.print("Gyro range set to: ");
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.println("+- 250 deg/s");
break;
case MPU6050_RANGE_500_DEG:
Serial.println("+- 500 deg/s");
break;
case MPU6050_RANGE_1000_DEG:
Serial.println("+- 1000 deg/s");
break;
case MPU6050_RANGE_2000_DEG:
Serial.println("+- 2000 deg/s");
break;
}
mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
Serial.print("Filter bandwidth set to: ");
switch (mpu.getFilterBandwidth()) {
case MPU6050_BAND_260_HZ:
Serial.println("260 Hz");
break;
case MPU6050_BAND_184_HZ:
Serial.println("184 Hz");
break;
case MPU6050_BAND_94_HZ:
Serial.println("94 Hz");
break;
case MPU6050_BAND_44_HZ:
Serial.println("44 Hz");
break;
case MPU6050_BAND_21_HZ:
Serial.println("21 Hz");
break;
case MPU6050_BAND_10_HZ:
Serial.println("10 Hz");
break;
case MPU6050_BAND_5_HZ:
Serial.println("5 Hz");
break;
}
Serial.println("");
delay(100);
// MPU6050 関連設定ここまで
}
void loop() {
//チャタリングなのか、新しいボタン入力なのか 判断するための処理
if ((vv120!=ex120)&&(vv121!=ex121)) {
//ボタンが押された時のvv120とvv121値が前回押されたボタンの時と違う場合 vv120とvv121を次回のためにex120とex121に格納しておく
ex120 = vv120;
ex121 = vv121;
}
if ((vv120==ex120)&&(vv121!=ex121)) {
//ボタンが押された時のvv121値だけが 前回押されたボタンの時と違う場合 vv120をリセットしvv120、vv121を次回のためにex120とex121に格納しておく
vv120 = 0;
ex120 = vv120;
ex121 = vv121;
}
if ((vv120!=ex120)&&(vv121==ex121)) {
//ボタンが押された時のvv120値だけが 前回押されたボタンの時と違う場合 vv121をリセットしvv120、vv121を次回のためにex120とex121に格納しておく
vv121 = 0;
ex120 = vv120;
ex121 = vv121;
}
Serial.printf("RCBController Button DATA:%d %d \n\r",vv120,vv121); //ボタンの状態(値)
//確定したRCB Controller Buttonの値をbtnData変数に入れる
btnData = vv120*256 + vv121;
//ボタン値が変わった時に 次は何のアクションか選定する
if (btnData != prevbtnData) { //今の読取り値が前回の値と違う時 以下を実行
switch(btnData){
case 512:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" B ボタン");
actionMode = Left_turn;
memcpy(action, left_turn, sizeof(left_turn));
maxRows = sizeof(left_turn) / sizeof(*left_turn) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 1024:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" R ボタン");
actionMode = Left_shift;
memcpy(action, left_shift, sizeof(left_shift));
maxRows = sizeof(left_shift) / sizeof(*left_shift) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 4096:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" G ボタン");
actionMode = Right_shift;
memcpy(action, right_shift, sizeof(right_shift));
maxRows = sizeof(right_shift) / sizeof(*right_shift) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 2048:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" Y ボタン");
actionMode = Right_turn;
memcpy(action, right_turn, sizeof(right_turn));
maxRows = sizeof(right_turn) / sizeof(*right_turn) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 12:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" SELECT ボタン");
// /*
actionMode = Backward_tumbling;
memcpy(action, backward_tumbling, sizeof(backward_tumbling));
maxRows = sizeof(backward_tumbling) / sizeof(*backward_tumbling) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
// */
break;
case 3:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" POWER ボタン");
break;
case 272:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 1 ボタン");
actionMode = Left_attack;
memcpy(action, left_attack, sizeof(left_attack));
maxRows = sizeof(left_attack) / sizeof(*left_attack) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 16:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 2 ボタン");
actionMode = Left_right_shoot;
memcpy(action, left_right_shoot, sizeof(left_right_shoot));
maxRows = sizeof(left_right_shoot) / sizeof(*left_right_shoot) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 80:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 3 ボタン");
actionMode = Right_attack;
memcpy(action, right_attack, sizeof(right_attack));
maxRows = sizeof(right_attack) / sizeof(*right_attack) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 256:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 4 ボタン");
actionMode = Single_left_arm_push_up;
memcpy(action, single_left_arm_push_up, sizeof(single_left_arm_push_up));
maxRows = sizeof(single_left_arm_push_up) / sizeof(*single_left_arm_push_up) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 128:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 5 ボタン");
actionMode = Double_arms_pushing_up;
memcpy(action, double_arms_pushing_up, sizeof(double_arms_pushing_up));
maxRows = sizeof(double_arms_pushing_up) / sizeof(*double_arms_pushing_up) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 64:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 6 ボタン");
actionMode = Single_right_arm_push_up;
memcpy(action, single_right_arm_push_up, sizeof(single_right_arm_push_up));
maxRows = sizeof(single_right_arm_push_up) / sizeof(*single_right_arm_push_up) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 288:
Serial.println(" 7 ボタン");
Serial.print("btnData = ");
Serial.print(btnData);
actionMode = Left_tumbling;
memcpy(action, left_tumbling, sizeof(left_tumbling));
maxRows = sizeof(left_tumbling) / sizeof(*left_tumbling) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 32:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 8 ボタン");
actionMode = Forward_tumbling;
memcpy(action, forward_tumbling, sizeof(forward_tumbling));
maxRows = sizeof(forward_tumbling) / sizeof(*forward_tumbling) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 96:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 9 ボタン");
actionMode = Right_tumbling;
memcpy(action, right_tumbling, sizeof(right_tumbling));
maxRows = sizeof(right_tumbling) / sizeof(*right_tumbling) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 9:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 10 ボタン");
actionMode = Handstanding;
memcpy(action, handstanding, sizeof(handstanding));
maxRows = sizeof(handstanding) / sizeof(*handstanding) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 1:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 11 ボタン");
actionMode = Fast_walk;
memcpy(action, fast_walk, sizeof(fast_walk));
maxRows = sizeof(fast_walk) / sizeof(*fast_walk) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 5:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" 12 ボタン");
actionMode = Wing_move;
memcpy(action, wing_move, sizeof(wing_move));
maxRows = sizeof(wing_move) / sizeof(*wing_move) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 8:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" + ボタン");
actionMode = Forward_stand_up;
memcpy(action, forward_stand_up, sizeof(forward_stand_up));
maxRows = sizeof(forward_stand_up) / sizeof(*forward_stand_up) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 10:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" - ボタン");
actionMode = Backward_stand_up;
memcpy(action, backward_stand_up, sizeof(backward_stand_up));
maxRows = sizeof(backward_stand_up) / sizeof(*backward_stand_up) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 0;
break;
case 2:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" Sound ボタン");
actionMode = Stop;
digitalWrite(ledPin, LOW);
keyFrame = 0;
nextKeyFrame = 0;
divCounter = 0;
GyroOn = 1;
break;
case 4:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" UP ボタン");
actionMode = Forward_walk;
memcpy(action, forward_walk, sizeof(forward_walk));
maxRows = sizeof(forward_walk) / sizeof(*forward_walk) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
case 6:
Serial.print("btnData = ");
Serial.print(btnData);
Serial.println(" DOWN ボタン");
actionMode = Backward_walk;
memcpy(action, backward_walk, sizeof(backward_walk));
maxRows = sizeof(backward_walk) / sizeof(*backward_walk) - 1;
digitalWrite(ledPin, HIGH);
divCounter = 0;
keyFrame = 0;
nextKeyFrame = 0;
GyroOn = 1;
break;
default:
break;
} //switch
//delay(1000); //for serial monitor
} //if (btnData != prevbtnData)
prevbtnData = btnData ; //次の読み取りにそなえて 今の値をprevbtnDataに入れる
Serial.print("prevbtnData = ");
Serial.print(prevbtnData);
//アクションモードにのっとった動作出力処理
if(actionMode != Stop){ // Stopモード以外
// フレーム処理
divCounter++;
if(divCounter >= action[nextKeyFrame][16]) {
divCounter = 0;
keyFrame = nextKeyFrame;
nextKeyFrame++;
if(nextKeyFrame > maxRows) {
nextKeyFrame = 0;
nextKeyFrame1 = maxRows+1;
}
}// フレーム処理end
// サーボ角度計算
// STOPからaction[][17]に他のアクション配列が読み込まれた時 直立姿勢100度からアクションモードの始まりに移行する時にゆっくり動く
// ただしloop開始時の(divCounter >= action[nextKeyFrame][16])を満たさない間だけ
if(keyFrame == 0 && nextKeyFrame == 0){ //アクションモードの始まり 最初のdivCounter >= action[nextKeyFrame][16]を満たさない時
divCounter++;
if(divCounter <= 60) {
// サーボ角度計算@Stopモード
if (prevbtnData1 == 1) { //前がStopだった時
for(int i=0; i<16; i++) {
tempAngles[i] = 100 +
int8_t((action[nextKeyFrame][i] - 100)
* divCounter / action[nextKeyFrame][16]);
}
for(i = 0; i < 16; i++) { // サーボ信号出力
angle[i] = tempAngles[i]+offset[i];
anglePulse[i] = map(angle[i], 0, 180, SERVOMIN, SERVOMAX);
pca9685.setPWM(svPin[i], 0, anglePulse[i]);
}
delay(30);
}else{
for(int i = 0; i < 16; i++) { //tempAngles[i]はactionmode変化時のservo角度
tempAngles1[i] = tempAngles[i] +
int8_t((action[keyFrame][i] - tempAngles[i])
* divCounter / 60);
}
// サーボ信号出力
for(i = 0; i < 16; i++) {
angle[i] = tempAngles1[i]+offset[i];
anglePulse[i] = map(angle[i], 0, 180, SERVOMIN, SERVOMAX);
pca9685.setPWM(svPin[i], 0, anglePulse[i]);
}
delay(30);
}
}
if ((divCounter > 60) && (prevbtnData != 1)) { //同じactionが連続する時のため前のtempAngles1[i]をtempAngles[i]に入れておく
for(int i = 0; i < 16; i++) {
tempAngles[i] = tempAngles1[i];
}
}
}else{
prevbtnData1 = 0; //1から0に戻す
for(int i = 0; i < 16; i++) { //通常のアクションモード中の角度計算(keyFrame = 0 nextKeyFrame = 1 からは)
tempAngles[i] = action[keyFrame][i] +
int8_t((action[nextKeyFrame][i] - action[keyFrame][i])
* divCounter / action[nextKeyFrame][16]);
}
if (GyroOn == 1) {
// Get new sensor events with the readings
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
/*
// Print out the values
Serial.print("Acceleration X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");
Serial.print("Rotation X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s");
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degC");
Serial.println("");
delay(500);
*/
//Serial.print(", gY: ");
//Serial.println(g.gyro.y);
int gyro=(int)g.gyro.y;
//int gyro=((int)g.gyro.y>>1); //Gyroの効き幅を半分にした
tempAngles[1]-=gyro; //tempAngles[1]=tempAngles[1]-gyro; //左足首ピッチ
tempAngles[12]+=gyro; //tempAngles[12]=tempAngles[12]+gyro; //右足首ピッチ
}
// サーボ信号出力
for(i = 0; i < 16; i++) {
angle[i] = tempAngles[i]+offset[i];
anglePulse[i] = map(angle[i], 0, 180, SERVOMIN, SERVOMAX);
pca9685.setPWM(svPin[i], 0, anglePulse[i]);
}
delay(30);
}
} //if(actionMode != Stop)
if(actionMode == Stop){ //Stopを受け取った時 直立姿勢100度にゆっくり移行する(差分を60分割したステップで)
prevbtnData1 = 1;
divCounter++;
if(divCounter <= 60) {
// サーボ角度計算@Stopモード
for(int i = 0; i < 16; i++) { //tempAngles[i]は動作停止した時の角度または連続STOP時の100
tempAngles1[i] = tempAngles[i] +
int8_t((100 - tempAngles[i])
* divCounter / 60);
}
// サーボ信号出力
for(i = 0; i < 16; i++) {
angle[i] = tempAngles1[i]+offset[i];
anglePulse[i] = map(angle[i], 0, 180, SERVOMIN, SERVOMAX);
pca9685.setPWM(svPin[i], 0, anglePulse[i]);
}
}
delay(30);
if (divCounter > 60) { //Stopが連続する時のため前のStopの100をtempAngles[i]に入れておく
for(int i = 0; i < 16; i++) {
tempAngles[i] = 100;
}
}
}//if(actionMode == Stop){ // Stopモード
}//loop