diff --git a/ADIS_tinyK22_SplitFlap/source/application.c b/ADIS_tinyK22_SplitFlap/source/application.c index 1183c76..bb40569 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -72,21 +72,25 @@ void App_Init(void){ /* Application run */ void App_Run(void){ - PRINTF("Initializing split flap motors."); - SF_MoveMotorToZeroPosition(splitflap0); - PRINTF("Init of motors done."); - - // go through the whole dictionary - char* letters[] = {"A", "B", "C", "A"}; - - for(int i = 0; i < 4; i++){ - McuWait_Waitms(1000); - PRINTF("Moving to letter '%s', position is %i", letters[i], (int)SF_GetMotorPosition(splitflap0)); - SF_MoveToFlap(splitflap0, letters[i]); - PRINTF("Position is %i", (int)SF_GetMotorPosition(splitflap0)); + PRINTF("Initializing split flap motors.\n"); + SF_MoveMotorToZeroPosition(splitflap0, 2); + PRINTF("Init of motors done.\n\n"); + + // go through the following letters + char* letters[] = {"J", "O", "N", "A", "S", "!"}; + PRINTF("Amount of letters %i\n", sizeof(letters)/sizeof(letters[0])); + + while(1){ + for(int i = 0; i < sizeof(letters)/sizeof(letters[0]); i++){ + McuWait_Waitms(1000); + PRINTF("Moving to letter '%s', position is %i\n", letters[i], (int)SF_GetMotorPosition(splitflap0)); + SF_MoveToFlap(splitflap0, letters[i]); + PRINTF("Position after move is is %i\n", (int)SF_GetMotorPosition(splitflap0)); + } } + /* TEST PATTERN */ /*while(1) { if(SF_GetMagSensorAtZeroPosition(splitflap0)){ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index 6145e97..47510b9 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -20,46 +20,47 @@ void SF_InitConfig(void){ ((dict_t*)splitFlapDict)->key=NULL; ((dict_t*)splitFlapDict)->value=NULL; ((dict_t*)splitFlapDict)->next=NULL; - addItem(splitFlapDict, SF_A, (int32_t*)13); - addItem(splitFlapDict, SF_B, (int32_t*)26); - addItem(splitFlapDict, SF_C, (int32_t*)39); - addItem(splitFlapDict, SF_D, (int32_t*)52); - addItem(splitFlapDict, SF_E, (int32_t*)65); - addItem(splitFlapDict, SF_F, (int32_t*)78); - addItem(splitFlapDict, SF_G, (int32_t*)91); - addItem(splitFlapDict, SF_H, (int32_t*)104); - addItem(splitFlapDict, SF_I, (int32_t*)117); - addItem(splitFlapDict, SF_J, (int32_t*)130); - addItem(splitFlapDict, SF_K, (int32_t*)143); - addItem(splitFlapDict, SF_L, (int32_t*)156); - addItem(splitFlapDict, SF_M, (int32_t*)169); - addItem(splitFlapDict, SF_N, (int32_t*)182); - addItem(splitFlapDict, SF_O, (int32_t*)195); - addItem(splitFlapDict, SF_P, (int32_t*)208); - addItem(splitFlapDict, SF_Q, (int32_t*)221); - addItem(splitFlapDict, SF_R, (int32_t*)234); - addItem(splitFlapDict, SF_S, (int32_t*)247); - addItem(splitFlapDict, SF_T, (int32_t*)260); - addItem(splitFlapDict, SF_U, (int32_t*)273); - addItem(splitFlapDict, SF_V, (int32_t*)286); - addItem(splitFlapDict, SF_W, (int32_t*)299); - addItem(splitFlapDict, SF_X, (int32_t*)312); - addItem(splitFlapDict, SF_Y, (int32_t*)325); - addItem(splitFlapDict, SF_Z, (int32_t*)338); - addItem(splitFlapDict, SF_0, (int32_t*)351); - addItem(splitFlapDict, SF_1, (int32_t*)364); - addItem(splitFlapDict, SF_2, (int32_t*)377); - addItem(splitFlapDict, SF_3, (int32_t*)390); - addItem(splitFlapDict, SF_4, (int32_t*)403); - addItem(splitFlapDict, SF_5, (int32_t*)416); - addItem(splitFlapDict, SF_6, (int32_t*)429); - addItem(splitFlapDict, SF_7, (int32_t*)442); - addItem(splitFlapDict, SF_8, (int32_t*)455); - addItem(splitFlapDict, SF_9, (int32_t*)468); - addItem(splitFlapDict, SF_EXCLAMATION, (int32_t*)481); - addItem(splitFlapDict, SF_QUESTION, (int32_t*)494); - addItem(splitFlapDict, SF_COLON, (int32_t*)507); - addItem(splitFlapDict, SF_SPACE, (int32_t*)0); + float stepsPerSegment = SPLITFLAP_STEPS_PER_SEGMENT; // do division once + addItem(splitFlapDict, SF_SPACE, (int32_t*)0); + addItem(splitFlapDict, SF_A, (int32_t*)(int32_t)(stepsPerSegment * 1.0 + 0.5)); // +0.5 so that the rounding is + addItem(splitFlapDict, SF_B, (int32_t*)(int32_t)(stepsPerSegment * 2.0 + 0.5)); // done correctly + addItem(splitFlapDict, SF_C, (int32_t*)(int32_t)(stepsPerSegment * 3.0 + 0.5)); + addItem(splitFlapDict, SF_D, (int32_t*)(int32_t)(stepsPerSegment * 4.0 + 0.5)); + addItem(splitFlapDict, SF_E, (int32_t*)(int32_t)(stepsPerSegment * 5.0 + 0.5)); + addItem(splitFlapDict, SF_F, (int32_t*)(int32_t)(stepsPerSegment * 6.0 + 0.5)); + addItem(splitFlapDict, SF_G, (int32_t*)(int32_t)(stepsPerSegment * 7.0 + 0.5)); + addItem(splitFlapDict, SF_H, (int32_t*)(int32_t)(stepsPerSegment * 8.0 + 0.5)); + addItem(splitFlapDict, SF_I, (int32_t*)(int32_t)(stepsPerSegment * 9.0 + 0.5)); + addItem(splitFlapDict, SF_J, (int32_t*)(int32_t)(stepsPerSegment * 10.0 + 0.5)); + addItem(splitFlapDict, SF_K, (int32_t*)(int32_t)(stepsPerSegment * 11.0 + 0.5)); + addItem(splitFlapDict, SF_L, (int32_t*)(int32_t)(stepsPerSegment * 12.0 + 0.5)); + addItem(splitFlapDict, SF_M, (int32_t*)(int32_t)(stepsPerSegment * 13.0 + 0.5)); + addItem(splitFlapDict, SF_N, (int32_t*)(int32_t)(stepsPerSegment * 14.0 + 0.5)); + addItem(splitFlapDict, SF_O, (int32_t*)(int32_t)(stepsPerSegment * 15.0 + 0.5)); + addItem(splitFlapDict, SF_P, (int32_t*)(int32_t)(stepsPerSegment * 16.0 + 0.5)); + addItem(splitFlapDict, SF_Q, (int32_t*)(int32_t)(stepsPerSegment * 17.0 + 0.5)); + addItem(splitFlapDict, SF_R, (int32_t*)(int32_t)(stepsPerSegment * 18.0 + 0.5)); + addItem(splitFlapDict, SF_S, (int32_t*)(int32_t)(stepsPerSegment * 19.0 + 0.5)); + addItem(splitFlapDict, SF_T, (int32_t*)(int32_t)(stepsPerSegment * 20.0 + 0.5)); + addItem(splitFlapDict, SF_U, (int32_t*)(int32_t)(stepsPerSegment * 21.0 + 0.5)); + addItem(splitFlapDict, SF_V, (int32_t*)(int32_t)(stepsPerSegment * 22.0 + 0.5)); + addItem(splitFlapDict, SF_W, (int32_t*)(int32_t)(stepsPerSegment * 23.0 + 0.5)); + addItem(splitFlapDict, SF_X, (int32_t*)(int32_t)(stepsPerSegment * 24.0 + 0.5)); + addItem(splitFlapDict, SF_Y, (int32_t*)(int32_t)(stepsPerSegment * 25.0 + 0.5)); + addItem(splitFlapDict, SF_Z, (int32_t*)(int32_t)(stepsPerSegment * 26.0 + 0.5)); + addItem(splitFlapDict, SF_0, (int32_t*)(int32_t)(stepsPerSegment * 27.0 + 0.5)); + addItem(splitFlapDict, SF_1, (int32_t*)(int32_t)(stepsPerSegment * 28.0 + 0.5)); + addItem(splitFlapDict, SF_2, (int32_t*)(int32_t)(stepsPerSegment * 29.0 + 0.5)); + addItem(splitFlapDict, SF_3, (int32_t*)(int32_t)(stepsPerSegment * 30.0 + 0.5)); + addItem(splitFlapDict, SF_4, (int32_t*)(int32_t)(stepsPerSegment * 31.0 + 0.5)); + addItem(splitFlapDict, SF_5, (int32_t*)(int32_t)(stepsPerSegment * 32.0 + 0.5)); + addItem(splitFlapDict, SF_6, (int32_t*)(int32_t)(stepsPerSegment * 33.0 + 0.5)); + addItem(splitFlapDict, SF_7, (int32_t*)(int32_t)(stepsPerSegment * 34.0 + 0.5)); + addItem(splitFlapDict, SF_8, (int32_t*)(int32_t)(stepsPerSegment * 35.0 + 0.5)); + addItem(splitFlapDict, SF_9, (int32_t*)(int32_t)(stepsPerSegment * 36.0 + 0.5)); + addItem(splitFlapDict, SF_EXCLAMATION, (int32_t*)(int32_t)(stepsPerSegment * 37.0 + 0.5)); + addItem(splitFlapDict, SF_QUESTION, (int32_t*)(int32_t)(stepsPerSegment * 38.0 + 0.5)); + addItem(splitFlapDict, SF_COLON, (int32_t*)(int32_t)(stepsPerSegment * 39.0 + 0.5)); } void SF_DeInitConfig(void){ @@ -79,12 +80,10 @@ SF_Handle_t SF_Init(SF_Config_t* instance, int id){ splitflap->motor = McuULN2003_InitMotor(&instance->motorConfig); splitflap->id = id; - /* TODO IMPLEMENT ACTUAL INITIALIZATION of Motor */ - return splitflap; } -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments){ int numStepsMoved = 0; // move out of sensor @@ -102,7 +101,9 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ // one more segment if not already one round if(numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND){ - for(int i=0; imotor); McuWait_Waitms(20); numStepsMoved++; @@ -115,11 +116,10 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ } void SF_MoveSteps(SF_Handle_t instance, int32_t steps){ - // run move with acceleration & deceleration McuULN2003_AccelerationStart(((SF_t*)instance)->motor); while(steps>0){ - if(McuULN2003_StepCallback(((SF_t*)instance)->motor, true) == true){ + if(McuULN2003_StepCallback(((SF_t*)instance)->motor, true)){ steps--; } McuWait_Waitms(1); @@ -140,7 +140,7 @@ void SF_MoveToFlap(SF_Handle_t instance, char* flap){ // get flap pos from dictonary int32_t flapPos = (int32_t)getItem(*splitFlapDict, flap); // get current motor pos - int32_t currentPos = SF_GetMotorPosition(instance); + int32_t currentPos = SF_GetMotorPosition(instance) % SPLITFLAP_STEPS_ONE_ROUND; // calc steps to move int32_t stepsToReachFlap = 0; // not already there @@ -150,12 +150,12 @@ void SF_MoveToFlap(SF_Handle_t instance, char* flap){ }else if(flapPos > currentPos){ stepsToReachFlap = flapPos - currentPos; } - SF_MoveSteps(((SF_t*)instance)->motor, stepsToReachFlap); + SF_MoveSteps(instance, stepsToReachFlap); } } int32_t SF_GetMotorPosition(SF_Handle_t instance){ - return McuULN2003_GetPos(((SF_t*)instance)->motor) % SPLITFLAP_STEPS_ONE_ROUND; + return McuULN2003_GetPos(((SF_t*)instance)->motor); } void SF_Deinit(SF_Handle_t instance){ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.h b/ADIS_tinyK22_SplitFlap/source/splitflap.h index 9ee2f52..4de8ea6 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.h @@ -16,8 +16,9 @@ /****** SETTINGS ******/ #define SPLITFLAP_CONFIG_USE_FREERTOS_HEAP 0 -#define SPLITFLAP_STEPS_ONE_ROUND 520 // 40 segments a 13 steps -#define SPLITFLAP_STEPS_PER_SEGMENT 13 +#define SPLITFLAP_STEPS_ONE_ROUND 512 +#define SPLITFLAP_AMOUNT_OF_SEGMENTS 40 +#define SPLITFLAP_STEPS_PER_SEGMENT (float)SPLITFLAP_STEPS_ONE_ROUND/(float)SPLITFLAP_AMOUNT_OF_SEGMENTS /****** TYPES ******/ @@ -50,8 +51,9 @@ SF_Handle_t SF_Init(SF_Config_t* instance, int id); /* Moves split flap slowly to zero position. * returns true if the move was successful, false if not - * (depending on if the sensor was hit before one round) */ -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance); + * (depending on if the sensor was hit before one round) + * with the offsetSegments parameter, the amount of segments to offset can be given */ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments); /* split flap moves number of steps maybe uint16_t? */ void SF_MoveSteps(SF_Handle_t instance, int32_t steps);